做了一个电压电流表,制作过程见:http://bbs.mydigit.cn/read.php?tid=2487981对于程序我水平比较差,到处抄,然后自己乱改。现在将程序贴上希望高人给看看。
这是主程序:#include <STC15F.h>
#include <intrins.h>
#include <sys\sys.h>
#include <lcd\lcd.h>
#include <font\font.h>
unsigned int VREF,VA,VB,VC,UA,UB,UC; //VREF p1.0口测量值(参考电压),VA p1.1测量值,VB p1.2测量值 VC p1.3测量值 UA,UB,UC计算值
//............AD采集子程序.................//
void ADCINT()
{
P1ASF=0xff;//设置 P1.0~P1.7全为AD口,根据实际设置。
ADC_RES=0;//ad清0
ADC_RESL=0;
AUXR1=0x00;//设置数据方式,高8位+低2位方式,易于运算。
}
unsigned int ADCwrite(unsigned ch)
{ //由于所检测的电压不用快,所以采用查询或延时法,没用中断法。 ch通道值从0-7,对应为P1.0-P1.7
unsigned int x;
ADC_CONTR=0xc8+ch;//设置启动 11001000 ,power=1,speed=10,ADC_FLAG=0,ADC_START=1,CHS=0
_nop_(); _nop_(); _nop_(); _nop_();//要经过4个CPU时钟的延时
while ( !(ADC_CONTR & 0x10) );//等待A/D转换结束(ADC_FLAG==0)
ADC_CONTR &= 0xE7; //11100111,置ADC_FLAG=0清除结束标记, 置ADC_START=0关闭A/D 转换
x=(ADC_RES*4+ADC_RESL); //ADC_RES*4相当于前移两位
delayms(1);
return x;
}
//..........以下是采集过程,电压采集10次,全相加存入存贮...........
void ADvolcaiji()
{
unsigned char x;
unsigned long y;
VREF=0;VA=0;VB=0;VC=0; //先清空电压存贮。
for(x=0;x<10;x++)//采集10次。
{
VREF=ADCwrite(0)+VREF; //电压基准 p1.0接的TL431电压基准
delayms(1);
VA=ADCwrite(1)+VA; //测量电流 p1.1口
delayms(1);
VB=ADCwrite(2)+VB; //测量的电压 p1.2口
delayms(1);
VC=ADCwrite(3)+VC; //测量的电压 p1.3口
delayms(1);
}
//以下为计算
/******************************************************************
显示函数转换函数:
VV=模拟量采样值,UREF=基准电压源采样值(需要实测为2.503V),UV=模拟量输入值(待显示值)
UREF=1024*TL431REF/Vcc;变形后得Vcc=1024*TL431REF/UREF; 代入VV=1024*UV/Vcc;得到VV=UV*UREF/TL431REF;
变形后得UV=(VV*TL431REF/UREF)/分压比 。
******************************************************************/
y=(long)(VA-*2.507*1000/VREF)*0.5; //电流0.01欧的取样电阻,运放放大倍数50,为了计算方便乘以1000(三位小数)
UA=y;
y=(long)((VB+5)*2.507*1000/VREF)*0.5;// 电流的值变动较大,各位高人怎样处理?
UB=y;
y=(long)VC*3.05*100*2.507/VREF; //6.1是分压比,2.507为TL431基准电压,100是为了方便计算(电压取两位小数),
UC=y; // 结果显示出来不知道为什么大了一倍,改成3.05就对了 ,好奇怪
}
/**************************************************
文件名称: main.c
**************************************************/
main()
{
P1M1=0xff;
P1M0=0x00;
Lcd_Init(); //tft初始化
LCD_Clear(BLACK); //清屏
BACK_COLOR=BLACK;
POINT_COLOR=BLUE;
// 横坐标,纵坐标,第几个字从0个字开始计算
showchar816(0,0,13);
showchar816(8,0,13);
showchar816(16,0,13);
showchar816(24,0,13);
showchar816(32,0,13);
showchar816(48,0,11); //V
showchar816(56,0,6); //o
showchar816(64,0,4); //l
showchar816(72,0,8); // t
showchar816(80,0,0); //a
showchar816(88,0,3); //g
showchar816(96,0,2); //e
showchar816(112,0,13);
showchar816(120,0,13);
showchar816(128,0,13);
showchar816(136,0,13);
showchar816(144,0,13);
showchar816(152,0,13);
POINT_COLOR=RED;
showchar1632(32,16,0); //0
showchar1632(48,16,0); //0
showchar1632(64,16,10); //.
showchar1632(80,16,0); //0
showchar1632(96,16,0); //0
showchar1632(128,16,12); //V
POINT_COLOR=BLUE;
showchar816(0,48,13);
showchar816(8,48,13);
showchar816(16,48,13);
showchar816(24,48,13);
showchar816(32,48,13);
showchar816(48,48,10); //C
showchar816(56,48,12); //u
showchar816(64,48,7); //r
showchar816(72,48,7); // r
showchar816(80,48,2); //e
showchar816(88,48,5); //n
showchar816(96,48,8); //t
showchar816(112,48,13);
showchar816(120,48,13);
showchar816(128,48,13);
showchar816(136,48,13);
showchar816(144,48,13);
showchar816(152,48,13);
POINT_COLOR=BRRED;
showchar1632(0,64,13);
showchar1632(16,64,15);
showchar1632(32,64,16);
POINT_COLOR=CYAN;
showchar1632(64,64,0); //0
showchar1632(80,64,10); //0
showchar1632(96,64,0); //.
showchar1632(112,64,0); //0
showchar1632(128,64,0); //0
showchar1632(144,64,11); //A
POINT_COLOR=BRRED;
showchar1632(0,96,17);
showchar1632(16,96,14);
showchar1632(32,96,16);
POINT_COLOR=CYAN;
showchar1632(64,96,0); //0
showchar1632(80,96,10); //0
showchar1632(96,96,0); //.
showchar1632(112,96,0); //0
showchar1632(128,96,0); //0
showchar1632(144,96,11); //A
while(1)
{
ADvolcaiji(); //数据采集
//显示电压V
if(UC<1000) //如果电压小于
{
POINT_COLOR=RED;
showchar1632(32,16,18); //显示“空格”
showchar1632(48,16,UC/100); //个位
showchar1632(64,16,10); // 小数点
showchar1632(80,16,UC%100/10); //十分位
showchar1632(96,16,UC%10); //百分位
}
else
{
POINT_COLOR=RED;
showchar1632(32,16,UC/1000);
showchar1632(48,16,UC%1000/100);
showchar1632(64,16,10);
showchar1632(80,16,UC%100/10);
showchar1632(96,16,UC%10);
}
//显示电流A 设置值
if(UA>9999) //如果电流大于
{
POINT_COLOR=CYAN;
showchar1632(64,64,11); //显示A表示超量程
showchar1632(80,64,18); //显示空格
showchar1632(96,64,18); //显示空格
showchar1632(112,64,18); //显示空格
showchar1632(128,64,18); //显示空格
}
else
{
if(UA>1)
{
POINT_COLOR=CYAN;
showchar1632(64,64,UA/1000); //0.000三位小数电流值显示
showchar1632(80,64,10);
showchar1632(96,64,UA%1000/100);
showchar1632(112,64,UA%100/10);
showchar1632(128,64,UA%10);
}
else
{
POINT_COLOR=CYAN;
showchar1632(64,64,0); //显示0
showchar1632(80,64,10); //显示.
showchar1632(96,64,0); //显示0
showchar1632(112,64,0); //显示0
showchar1632(128,64,0); //显示0
}
}
//显示电流A 实测值
if(UB>9999) //如果电流大于
{
POINT_COLOR=CYAN;
showchar1632(64,96,11); //显示A表示超量程
showchar1632(80,96,18); //显示空格
showchar1632(96,96,18); //显示空格
showchar1632(112,96,18); //显示空格
showchar1632(128,96,18); //显示空格
}
else
{
if(UB>1)
{
POINT_COLOR=CYAN;
showchar1632(64,96,UB/1000); //0.000三位小数电流值显示
showchar1632(80,96,10);
showchar1632(96,96,UB%1000/100);
showchar1632(112,96,UB%100/10);
showchar1632(128,96,UB%10);
}
else
{
POINT_COLOR=CYAN;
showchar1632(64,96,0); //显示0
showchar1632(80,96,10); //显示.
showchar1632(96,96,0); //显示0
showchar1632(112,96,0); //显示0
showchar1632(128,96,0); //显示0
}
}
delayms(200);
}
}