http://img.photo.163.com/ipU_CdpGQ_27v_ODBWNBnQ==/161848111611600706.jpg<br />http://img.photo.163.com/SkITRmfAqyRO4CJSF0Qu3A==/170292360910196477.jpg<br />电路部分没问题,这段程序之前跑没问题,显示都正常,后来突然就不正常,LED部分开始跳跃显示不正确的数字,极不稳定,怀疑是程序部分有问题,电路部分图片已经上传<br />#include<at89x51.h><br />#define uchar unsigned char<br />#define uint unsigned int<br />sbit st=P3^0; //定义通信端口<br />sbit oe=P3^1;<br />sbit eoc=P3^2;<br />float getdata;<br />uint ad_data1,ad_data2,ad_data3;<br />uchar led_data[]={0x5f,0x0a,0x9d,0x9e,0xca,0xd6,0xd7,0x1a,0xdf,0xda,0x80,0x75,0x4f,0xd9,0xc7,0xda,0x00}; //数码管显示段码0~9、-、C、U、P、B、无<br />void delaynms(uint x); //可获得1ms的整数n倍延时时间的延时程序<br />uchar td[]={0x07,0x0b,0x0d,0x0e,0x0f}; //数码管通道选择,将数码管反向显示,便于显示℃符号<br />void display(); //显示程序<br />void ad0809(); //芯片启动程序<br />void display()<br />{ <br /> uchar a;<br /> if(getdata*49/25-273>=0)<br /> {<br /> ad_data1=(uint)(getdata*49/25-273)/100; //百位<br /> ad_data2=((uint)(getdata*49/25-273)%100)/10; //十位<br /> ad_data3=(((uint)(getdata*49/25-273)%100)%10); //个位<br /> }<br /> else<br /> {<br /> ad_data1=10; //百位<br /> ad_data2=((uint)(273-getdata*49/25)%100)/10; //十位<br /> ad_data3=(((uint)(273-getdata*49/25)%100)%10); //个位<br /> }<br /> for(a=0;a<200;a++)<br /> {<br /> P1=led_data[ad_data1];<br /> if(ad_data1==0||(ad_data1==0&&ad_data2==0&&ad_data3==0))P2=td[4];//避免显示-00<br /> else P2=td[0];<br /> delaynms(3);<br /> P1=led_data[ad_data2];<br /> if(ad_data2==0) P2=td[4];<br /> else P2=td[1];<br /> delaynms(3);<br /> P1=led_data[ad_data3];<br /> P2=td[2];<br /> delaynms(3);<br /> P1=led_data[11];<br /> P2=td[3];<br /> delaynms(3);<br /> }<br />}<br />void delaynms(uint x)<br />{ <br /> uchar i;<br /> while(x-->0)<br /> {<br /> for(i=0;i<125;i++)<br /> {;}<br /> }<br />}<br /><br />void ad0809()<br />{<br /> oe=0; //输出数据线呈高阻状态,以下三条指令启动AD0809<br /> st=0; //开始进行AD转换<br /> P3=P3&0x0F;//写入通道号<br /> st=1; //所有内部寄存器清零<br /> st=0; //开始进行AD转换<br /> delaynms(1);<br /> while(!eoc); //等待转换结束,当EOC为高电平时,表明转换结束<br /> oe=1; //输出转换等到的数据<br /> getdata=P0; //取出读得的数据<br /> oe=0; //三态输出锁存器OE为低电平 <br />} <br /> <br /> <br /><br />void main()<br />{ <br /> P1=0x00;<br /> while(1)<br /> { <br /> ad0809(); //调AD0809启动程序<br /> display();<br /> }<br />} <br /> <br />不稳定:比如应该显示是26℃,他一会儿显示26℃,一会儿又显示48℃,一会儿又显示34℃,没有什么规律,来回跳跃显示多个数据,有时还是负值<br />采用的是动态扫描方法来实现对所有LED的显示驱动 |
|