《AD0809简易数字电压表课件》由会员分享,可在线阅读,更多相关《AD0809简易数字电压表课件(19页珍藏版)》请在金锄头文库上搜索。
1、AD0809简易数字电压表简易数字电压表AD0809简易数字电压表一一AD0809电压表设计要求电压表设计要求要求要求: 设计一个简易的数字电压表,用来测量我们焊接的单片机开发板中AD0809模块前端电位器R40的实时电压值,并用电路板中左位数码管的前三位显示当前模拟电压的十进制数字量值,同时用右数码管显示当前的模拟电压值附加要求:附加要求: 为了防止数字电压表使用时出现测量值与实际值存在误差的问题,须增加能通过按键对十进制数字量测量值进行100以内补偿值设定的功能.AD0809简易数字电压表二、转换的流程图开始左右数码管显示十进制初始化在中显示数码管中的数值判断是否按键按下?判断是加1还是减
2、1?否是加1减1结束AD0809简易数字电压表三、设计中的问题三、设计中的问题n1、串口在线下载问题;、串口在线下载问题;n2、数码管的显示问题;、数码管的显示问题;n3、用周立公芯片实现按键加一;、用周立公芯片实现按键加一;n4、LCD的显示;的显示;n5、调试中遇到显示不稳定;、调试中遇到显示不稳定;AD0809简易数字电压表四、解答上述问题四、解答上述问题硬件问题: 串口不能下载程序,通过一步步检测MAX232是否与串口连通,是否 与单片机接受和发送的端口连接上,借助万用表查看电阻、电容以及芯片是否正常工作。 软件问题: 经过了解zlg7290.h文件、zlg7290.c文件、VIIC_
3、C51.h文件以 及 VIIC_C51.c文件,主要是zlg7290.c文件中Test_Key子函数、 DispValue子函数、ZLG7290_Download子函数。通过在主函数中调用子函数,并且多处的运用for、while、if语句,经过编译,再一步步排查问题。AD0809简易数字电压表 五、程序五、程序#include #includeZLG7290.h#includeI2C.h#include/#include#define data_point P0#define uchar unsigned chartypedef unsigned char BYTE;/重新定义typedef
4、unsigned int WORD; /重新定义typedef bit BOOL;/重新定义BYTE code disp21=V;BYTE code disp33=.-+;BYTE code disp4=Stander:;sbit rs=P13;/定义P13端口为rssbit ep=P15;sbit rw=P14; /lcdAD0809简易数字电压表sbit EOC=P33;sbit ADDA=P20;sbit ADDB=P21;sbit ADDC=P22;sbit OE=P25;sbit START=P26;/sbit CLK=P27;volatile bit FlagINT = 0;uns
5、igned char AD=0;char count=0;unsigned char disp7=0,0,0,0,0,0,0;unsigned int t0count=0;void delay(unsigned char t)doTH1 = 0xD8;TL1 = 0xf0;TR1 = 1;while ( !TF1 );TF1= 0;TR1 = 0; while (-t);AD0809简易数字电压表BOOL lcd_bz()BOOL result;rs=0;rw=1;ep=1;_nop_();_nop_();_nop_();_nop_();result=(BOOL)(P0 & 0x80);ep=
6、0;return result;lcd_wcmd(BYTE cmd)while(lcd_bz()=1);rs=0;rw=0;ep=0;_nop_();_nop_();P0=cmd;AD0809简易数字电压表_nop_();_nop_();_nop_();_nop_();ep=1;_nop_();_nop_();_nop_();_nop_();ep=0;lcd_pos(BYTE pos)lcd_wcmd(pos | 0x80); lcd_wdat(BYTE dat)while(lcd_bz();rs=1;rw=0;ep=0;P0=dat;AD0809简易数字电压表_nop_();_nop_();
7、_nop_();_nop_();ep=1;_nop_();_nop_();_nop_();_nop_();ep=0;lcd_init()lcd_wcmd(0x38);lcd_wcmd(0x0c);lcd_wcmd(0x06);/lcd_wcmd(0x00);/delay(1);/lcd_wcmd(0x14);/delay(1);lcd_wcmd(0x01);/lcd_pos(12);/lcd_wdat(disp21);AD0809简易数字电压表 void INT0_SVC() interrupt 0FlagINT = 1;void SystemInit()I2C_Init();TMOD = 0
8、x01; delay(1);/等待ZLG7290复位完毕void ClearAll()unsigned char x;for ( x=0; x8; x+ )ZLG7290_Download(x,0,0,31);AD0809简易数字电压表void display()unsigned int i,j,k=0xfb; for(i=0;i=1; for(j=200;j0;j-);/P1=0xff;unsigned int ADC0809() unsigned int d;ADDC=0;ADDB=0;ADDA=0;TR1=1;START=1;START=0;while(EOC=0);OE=1;d=dat
9、a_point;OE=0;TR1=0;return d;AD0809简易数字电压表void covert(unsigned char x)unsigned int X; char code dispcode=0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09 ; X=x * (1.0) * 5000 / 255;/x=(x*100*1.0)/51;disp0=dispcodeX/1000; disp1=dispcodeX%1000/100; / x/50 x/100; /disp0=disp0+0x80;disp2=dispcodeX%1000%
10、100/10;/x/10 x%100/10;disp3=dispcodeX%1000%100%10;/ x%100%10;/disp4=k/100;/disp5=k%100/10;/disp6=k%100%10; void DispValue(char x, unsigned char dat)unsigned char d;d = dat/100;ZLG7290_Download(x+2,0,0,d); d = dat % 100/10;ZLG7290_Download(x+1,0,0,d);d = dat%100%10;ZLG7290_Download(x,0,0,d);disp4=dat
11、/100;disp5=dat % 100/10; disp6= dat%100%10;AD0809简易数字电压表void Test_Key() char fuhao;unsigned char KeyValue;/BYTE i;/i=0;unsigned char i=0,k=0,l=0;/unsigned char RepeatCnt;/unsigned char FnKeyValue;ClearAll();EA = 0;IT0 = 1; /负边沿触发中断EX0 = 1;/允许外部中断EA = 1;for (;)if ( FlagINT )/如果有键按下/清除中断标志FlagINT = 0;
12、/读取键值、连击计数器值、功能键值ZLG7290_ReadReg(ZLG7290_Key,&KeyValue);/ZLG7290_ReadReg(ZLG7290_RepeatCnt,&RepeatCnt);AD0809简易数字电压表/ZLG7290_ReadReg(ZLG7290_FunctionKey,&FnKeyValue);/显示键值、连击计数器值、功能键值 if(KeyValue=2) count+;/DispValue(0,count);if(KeyValue=3) count-;/DispValue(0,count); if(count=100) count=100;if(coun
13、t=0) /AD=ADC0809();AD0809简易数字电压表/DispValue(0,KeyValue);/DispHexValue(3,RepeatCnt);/DispHexValue(6,FnKeyValue); lcd_pos(0); /for(i=0;i6;i+)/AD=ADC0809();covert(AD+count);display();DispValue(5,AD+count);while(disp4i!=0)lcd_wdat(disp4i);i+;lcd_pos(0x09);lcd_wdat(0x30+disp0);lcd_pos(0x0A);lcd_wdat(disp3
14、0);/ 0x30+lcd_pos(0x0B);lcd_wdat(0x30+disp1);lcd_pos(0x0C);lcd_wdat(0x30+disp2);lcd_pos(0x0D);lcd_wdat(0x30+disp3);lcd_pos(0x0E); lcd_wdat(disp20); /0x30+AD0809简易数字电压表lcd_pos(0x46); for(l=4;l7;l+) lcd_wdat(0x30+displ);/lcd_wdat(0x30+disp5);/lcd_wdat(0x30+disp6);delay(100); i=0;/PCON |= 0x01;/使CPU进入空
15、闲状态,任一中断可唤醒void main()BYTE i;i=0;TMOD=0x10;/TH1=(65536-10000)/256;/TL1=(65536-10000)%256;/TH1=256-2;/TL1=256-2;AD0809简易数字电压表/ET0=1;/ET1=1;/EA=1;/TR0=1;OE=0;START=0;EOC=1;SystemInit();lcd_init();while(1)Test_Key();/delay(100);/if(t0count=100)/t0count=0;/ covert(ADC0809();/ delay(500);/display();/void time0() interrupt 3/TH1=(65536-10000)/256;/TL1=(65536-10000)%256;/t0count+;/void time1() interrupt 3/CLK=CLK;AD0809简易数字电压表