数字电压表仿真图及程序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define key_state0 0 //键盘扫描的各个状态
#define key_state1 1
#define key_state2 2
#define key_state3 3
}
uint read_value()
{
long float dq;
long float dat_v;
dq=read_AD(0);//把读取得的AD转换值给变量dq
if(!flag_3)
dat_v=(200*dq)/4096*100*2.2988;//三档,量程为200V
else if(!flag_2)
if(t==20)
{
t=0;
dat1[flag]=dat;
flag++;
}
if(flag==5)
{
dat_aver=(dat1[0]+dat1[1]+dat1[2]+dat1[3]+dat1[4])/5;
if(dat_aver>=100)//当电压值大于1V时,用V显示,否则用mV显示
{
//display_zifu(0,1,tab2);
delay(2);
lcde=0;
lcdw=0;
}
void write_dat(uchar x)
{
lcdrs=1;
lcdw=0;
P0=x;
lcde=1;
delay(2);
lcde=0;
}
void init_1602()
{
write_com(0x38);
write_com(0x0c);
write_com(0x06);
key_state=key_state0;
break;
case key_state2:
if(key)
key_state=key_state0;
break;
}
}
void main()
{
long float dat;
long float dat_aver,dat1[5];//定义5个随机电压值变量
uchar flag;//后五秒取随机电压的标志
init_timer0();
init_1602();
delay(10);
while(1)
{
dat=read_value();
if(dat>=100)//当电压值大于1V时,用V显示,否则用mV显示
{
display_zifu(0,1,tab2);
display(0,7,dat);
display_zifu(0,13,tab0);
{
TMOD=0x01;//方式一
TH0=(65536-50000)/256;//每50ms中断一次
TL0=(65536-50000)%256;
IE=0x82;//打开中断
TR0=0;//定时器首先不可工作
}
void write_com(uchar x)
{P0=x;
lcdrs=0;
lcdw=0;
lcde=1;
uchar code tab2[]="Power:";
uchar code tab3[]="Aver_V:";//平均电压值标志符
uchar t;
void delay(int z)//延时函数
{
int x,y;
for(x=z;x>0;x--)
for(y=10;y>0;y--);
}
void init_timer0()//定时计数器0初值化函数,
switch(key_state)
{
case key_state0:
if(key==0)
key_state=key_state1;
break;
case key_state1:
if(key==0)
{
TR0=1;
display_zifu(1,0,tab3);
key_state=key_state2;
}
else
TR0=0;
}
}
}
void timer0() interrupt 1//定时器中断函数
{
TH0=(65536-50000)/256;//重新放入初始值
TL0=(65536-50000)%256;
t++;
}
}
else
{
display_zifu(0,1,tab2);
display(0,7,dat*1000);
display_zifu(0,13,tab1);
}
//read_key();//当键盘按下时,计算后五秒的平均电压值
if(key==0)
{
TR0=1;
display_zifu(1,0,tab3);
}
add=add+y;
write_com(add);
for(i=0;i<5;i++)
{
a[i]=dat%10;
dat=dat/10;
}
write_dat(a[4]+0x30);
write_dat(a[3]+0x30);
write_dat(a[2]+0x30);
write_dat('.');
write_dat(a[1]+0x30);
}
void display(uchar x,uchar y,unsigned long dat)//显示电压值的函数,x行y列开始显示
{
uint add;
uchar i,a[5];
switch(x)
{
case 0:add=0x80;break;
case 1:add=0x80+0x40;break;
}
for(i=0;i<12;i++)
{
con_way<<=1;/*选择0通道,在输入该控制数据的同时输出前一次AD转结果*/
input=CY;
dat<<=1;
if(output)/*输出AD转换结果*/
dat=dat|0x01;
delay(2);
clk=1;
delay(5);
clk=0;
}
cs=1;
return dat;
display(1,7,dat_aver);
display_zifu(1,13,tab0);
}
else
{
//display_zifu(0,1,tab2);
display(1,7,dat_aver*1000);
display_zifu(1,13,tab1);
}
}百度文库
if(flag==8)
{
flag=0;
write_com(0x01);
sbit lcdrs=P1^2;//1602液晶写命令/数据标志,0时写命令
sbit lcdw=P1^1;//1602液晶写入/读出标志,0时写入数据
sbit lcde=P1^0;
sbit input=P1^4;
sbit output=P1^3;
sbit cs=P1^5;
sbit clk=P1^6;
sbit key=P2^0;
sbit flag_1=P2^1;//定义电压表档位相关标志
sbit flag_2=P2^2;
sbit flag_3=P2^3;
sbit flag_4=P2^4;
uchar code tab0[]="V "; //显示的单位及有关的字符
uchar code tab1[]="MV";
}
add=add+y;
write_com(add);
while(*str!='\0')
{
write_dat(*str);
str++;
}
}
uint read_AD(uchar con_way)//读取AD转换值操作函数
{
uint dat=0;
uchar i;
cs=0;
clk=0;
//con_way<<=4;
write_dat(a[0]+0x30);
}
void display_zifu(uchar x,uchar y,uchar *str)//显示字符函数,x行y列开始显示
{
uint add;
switch(x)
{
case 0:add=0x80;break;
case 1:add=0x80+0x40;break;
dat_v=(20*dq)/4096*100*2.50272;//二档,量程为20V
else if(!flag_1)
dat_v=(2*dq)/4096*100*2.5;//一档,量程2V
return dat_v;
}
void read_key()//键盘扫描函数
{
static uchar key_state=0;
相关文档
最新文档