您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 数字电压表程序及仿真图
//************************************************//**用adc0809进行电压测量,lcd1602显示,精度0.001v**//************************************************#includereg51.h#includeintrins.h#defineucharunsignedchar#defineuintunsignedintucharcodetable[]=ID:;//欢迎显示,包括空格在内=16ucharcodetable1[]=Name:;//欢迎显示,包括空格在内=16//************管脚定义************************sbitADC_OE=P3^0;//ADC输入允许信号端口sbitADC_EOC=P3^1;//ADC转换结束信号输出端sbitADC_START=P3^2;//ADC启动转换信号输入端sbitADC_CLK=P3^3;//ADC时钟输入端sbitlcd_rs=P3^4;//液晶数据命令选择端sbitlcd_en=P3^5;//液晶使能//************参数定义************************ucharnum;//LCD1602开机显示数组数ucharAD_data;//AD转换原始数据uchardis1[]=CurrentVoltage;uchardis2[]={'','','','','V','=','0','.','0','0','0','v','','','','',};//初始化数组,用来保存电压显示//************子函数定义************************voiddelay(ucharz);//delay延时子程序voidinit_lcd();//LCD1602初始化函数voidInitTimer0();//定时器0初始化函数voidwrite_com(ucharcom);//LCD1602写指令函数voidwrite_data(uchardate);//LCD1602写数据函数voidwrite_welcome();//LCD1602开启显示欢迎函数voidinit_ADC();//ADC初始化函数voidAD_covert();//AD转换子程序voidADC_change();//ADC转换函数voidwrite_adc();//ADC显示函数//************主函数************************voidmain(){init_lcd();//LCD1602初始化write_welcome();//LCD1602开启显示欢迎InitTimer0();//定时器0初始化init_lcd();//LCD1602初始化init_ADC();//ADC初始化while(1){AD_covert();//AD转换ADC_change();//ADC转换函数write_adc();//ADC显示}}//************delay延时子程序************************voiddelay(ucharz){ucharx,y;for(x=0;xz;x++)for(y=0;y114;y++);}//************LCD1602初始化函数************************voidinit_lcd(){lcd_en=0;//将使能端置0write_com(0x38);//设置16*2显示,5*7点阵,8位数据接口write_com(0x08);//写一个字符后地址指针加1write_com(0x01);//显示清零,数据指针清零write_com(0x06);//写一个字符后地址指针加1write_com(0x0c);//关显示,光标不显示不闪烁}//************定时器0初始化函数************************voidInitTimer0(){TMOD=0x02;//定时器0工作方式2TH0=0x14;//初值位20TL0=0x14;EA=1;//开总中断ET0=1;//允许T0中断TR0=1;//启动T0}//************LCD1602写指令函数************************voidwrite_com(ucharcom){lcd_rs=0;//选择写指令P2=com;//将要写的命令送到数据总线上delay(5);//延时5ms,待数据稳定lcd_en=1;//由于初始化已将lcd_en置为0,使能端给一个高脉冲,delay(5);//延时5ms,待数据稳定lcd_en=0;//将使能端置0以完成脉冲}//************LCD1602写数据函数************************voidwrite_data(uchardate){lcd_rs=1;//选择写数据P2=date;//将要写的数据送到数据总线上delay(5);//延时5ms,待数据稳定lcd_en=1;//由于初始化已将lcd_en置为0,使能端给一个高脉冲,delay(5);//延时5ms,待数据稳定lcd_en=0;//将使能端置0以完成脉冲}//************LCD1602开启显示欢迎函数******************voidwrite_welcome(){write_com(0x80);//现将数据指针定位到第一行第一个字处for(num=0;num16;num++)//做简短延时{write_data(table[num]);delay(5);}write_com(0x80+0x40);//现将数据指针定位到第二行第一个字处for(num=0;num16;num++)//做简短延时{write_data(table1[num]);delay(20);}delay(50000);}//************中断函数************************voidTimer0()interrupt1{ADC_CLK=~ADC_CLK;//时钟不断取反}//***********ADC初始化函数************************voidinit_ADC(){ADC_OE=0;//ADC输入允许信号端口置1ADC_EOC=1;//ADC转换结束信号输出端置1ADC_START=1;//ADC启动转换信号输入端置1ADC_CLK=1;//ADC时钟输入端置1}//***********AD转换子程序***********************voidAD_covert(){ADC_START=0;ADC_CLK=0;_nop_();//延时空循环,一个机器指令的时间ADC_START=1;ADC_CLK=1;_nop_();//延时空循环,一个机器指令的时间ADC_START=0;ADC_CLK=0;//在START上产生一个正脉冲while(ADC_EOC);//等待上次转换完成_nop_();delay(100);while(ADC_EOC==0){ADC_CLK=1;delay(1);ADC_CLK=0;delay(1);}P1=0xff;_nop_();ADC_OE=1;_nop_();AD_data=P1;ADC_OE=0;}//***********ADC转换函数************************voidADC_change(){doublev;ucharval_integer;uintval_decimal;v=AD_data*0.0196078;//5v时输出的数字量是2.55,为使5v时输出5.00val_integer=(uchar)v;//电压整数部分val_decimal=(uint)((v-val_integer)*1000);//将电压小数点后三位转换为整数(dis2[6])=val_integer+0x30;//电压整数转换为ASSII(dis2[8])=val_decimal/100+0x30;//电压小数第一位转换为ASSII(dis2[9])=val_decimal/10%10+0x30;//电压小数第二位转换为ASSII(dis2[10])=val_decimal/10%10+0x30;//电压小数第三位转换为ASSII}//************LCD1602显示adc函数******************voidwrite_adc(){write_com(0x80);//现将数据指针定位到第一行第一个字处for(num=0;num16;num++)//做简短延时{write_data(dis1[num]);delay(1);}write_com(0x80+0x40);//现将数据指针定位到第二行第一个字处for(num=0;num16;num++)//做简短延时{write_data(dis2[num]);delay(1);}}
本文标题:数字电压表程序及仿真图
链接地址:https://www.777doc.com/doc-5625635 .html