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