您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > AD0809简易数字电压表1
AD0809简易数字电压表一.AD0809电压表设计要求要求:设计一个简易的数字电压表,用来测量我们焊接的单片机开发板中AD0809模块前端电位器R40的实时电压值,并用电路板中左4位数码管的前三位显示当前模拟电压的十进制数字量值,同时用右数码管显示当前的模拟电压值.附加要求:为了防止数字电压表使用时出现测量值与实际值存在误差的问题,须增加能通过按键对十进制数字量测量值进行100以内补偿值设定的功能.二、A/D转换的流程图开始左右数码管显示十进制初始化在LCD中显示数码管中的数值判断是否按键按下?判断是加1还是减1?否是加1减1结束三、设计中的问题1、串口在线下载问题;2、数码管的显示问题;3、用周立公芯片实现按键加一;4、LCD的显示;5、调试中遇到显示不稳定;四、解答上述问题硬件问题:串口不能下载程序,通过一步步检测MAX232是否与串口连通,是否与单片机接受和发送的端口连接上,借助万用表查看电阻、电容以及芯片是否正常工作。软件问题:经过了解zlg7290.h文件、zlg7290.c文件、VIIC_C51.h文件以及VIIC_C51.c文件,主要是zlg7290.c文件中Test_Key子函数、DispValue子函数、ZLG7290_Download子函数。通过在主函数中调用子函数,并且多处的运用for、while、if语句,经过编译,再一步步排查问题。五、程序#includereg52.h#includeZLG7290.h#includeI2C.h#includeINTRINS.H//#includeintrins.h#definedata_pointP0#defineucharunsignedchartypedefunsignedcharBYTE;//重新定义typedefunsignedintWORD;//重新定义typedefbitBOOL;//重新定义BYTEcodedisp2[1]={V};BYTEcodedisp3[3]={.-+};BYTEcodedisp4[]={Stander:};sbitrs=P1^3;//定义P13端口为rssbitep=P1^5;sbitrw=P1^4;//lcdsbitEOC=P3^3;sbitADDA=P2^0;sbitADDB=P2^1;sbitADDC=P2^2;sbitOE=P2^5;sbitSTART=P2^6;//sbitCLK=P2^7;volatilebitFlagINT=0;unsignedcharAD=0;charcount=0;unsignedchardisp[7]={0,0,0,0,0,0,0};unsignedintt0count=0;voiddelay(unsignedchart){do{TH1=0xD8;TL1=0xf0;TR1=1;while(!TF1);TF1=0;TR1=0;}while(--t);}BOOLlcd_bz(){BOOLresult;rs=0;rw=1;ep=1;_nop_();_nop_();_nop_();_nop_();result=(BOOL)(P0&0x80);ep=0;returnresult;}lcd_wcmd(BYTEcmd){while(lcd_bz()==1);rs=0;rw=0;ep=0;_nop_();_nop_();P0=cmd;_nop_();_nop_();_nop_();_nop_();ep=1;_nop_();_nop_();_nop_();_nop_();ep=0;}lcd_pos(BYTEpos){lcd_wcmd(pos|0x80);}lcd_wdat(BYTEdat){while(lcd_bz());rs=1;rw=0;ep=0;P0=dat;_nop_();_nop_();_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(disp2[1]);}voidINT0_SVC()interrupt0{FlagINT=1;}voidSystemInit(){I2C_Init();TMOD=0x01;delay(1);//等待ZLG7290复位完毕}voidClearAll(){unsignedcharx;for(x=0;x8;x++){ZLG7290_Download(x,0,0,31);}}voiddisplay(){unsignedinti,j,k=0xfb;for(i=0;i4;i++){//P1=0xff;if(i==0){ZLG7290_Download(3,1,0,disp[i]);delay(1);}if(i==1){ZLG7290_Download(2,0,0,disp[i]);delay(1);}if(i==2){ZLG7290_Download(1,0,0,disp[i]);delay(1);}if(i==3){ZLG7290_Download(0,0,0,disp[i]);delay(1);}//ZLG7290_Download(7,0,0,disp[4]);//ZLG7290_Download(6,0,0,disp[5]);//ZLG7290_Download(5,0,0,disp[6]);//P1=k;//k=k=1;for(j=200;j0;j--);}//P1=0xff;}unsignedintADC0809(){unsignedintd;ADDC=0;ADDB=0;ADDA=0;TR1=1;START=1;START=0;while(EOC==0);OE=1;d=data_point;OE=0;TR1=0;returnd;}voidcovert(unsignedcharx){unsignedintX;charcodedispcode[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};X=x*(1.0)*5000/255;//x=(x*100*1.0)/51;disp[0]=dispcode[X/1000];disp[1]=dispcode[X%1000/100];//x/50x/100;//disp[0]=disp[0]+0x80;disp[2]=dispcode[X%1000%100/10];//x/10x%100/10;disp[3]=dispcode[X%1000%100%10];//x%100%10;//disp[4]=k/100;//disp[5]=k%100/10;//disp[6]=k%100%10;}voidDispValue(charx,unsignedchardat){unsignedchard;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);disp[4]=dat/100;disp[5]=dat%100/10;disp[6]=dat%100%10;}voidTest_Key(){charfuhao;unsignedcharKeyValue;//BYTEi;//i=0;unsignedchari=0,k=0,l=0;//unsignedcharRepeatCnt;//unsignedcharFnKeyValue;ClearAll();EA=0;IT0=1;//负边沿触发中断EX0=1;//允许外部中断EA=1;for(;;){if(FlagINT)//如果有键按下{//清除中断标志FlagINT=0;//读取键值、连击计数器值、功能键值ZLG7290_ReadReg(ZLG7290_Key,&KeyValue);//ZLG7290_ReadReg(ZLG7290_RepeatCnt,&RepeatCnt);//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(count=0){}//AD=ADC0809();//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(disp4[i]!='\0'){lcd_wdat(disp4[i]);i++;}lcd_pos(0x09);lcd_wdat(0x30+disp[0]);lcd_pos(0x0A);lcd_wdat(disp3[0]);//0x30+lcd_pos(0x0B);lcd_wdat(0x30+disp[1]);lcd_pos(0x0C);lcd_wdat(0x30+disp[2]);lcd_pos(0x0D);lcd_wdat(0x30+disp[3]);lcd_pos(0x0E);lcd_wdat(disp2[0]);//0x30+lcd_pos(0x46);for(l=4;l7;l++){lcd_wdat(0x30+disp[l]);//lcd_wdat(0x30+disp[5]);//lcd_wdat(0x30+disp[6]);}delay(100);i=0;//}//PCON|=0x01;//使CPU进入空闲状态,任一中断可唤醒}}voidmain(){BYTEi;i=0;TMOD=0x10;//TH1=(65536-10000)/256;//TL1=(65536-10000)%256;//TH1=256-2;//TL1=256-2;//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();}}//voidtime0()interrupt3//{//TH1=(65536-10000)/256;//TL1=(65536-10000)%256;//t0count++;}//voidtime1()interrupt3//{CLK=~CLK;}
本文标题:AD0809简易数字电压表1
链接地址:https://www.777doc.com/doc-3402389 .html