第一次请教问题:led显示不稳定,电路没问题,请高人指点

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

慎用浮点数

  
hqgboy 发表于 2007-6-7 20:57 | 显示全部楼层

如何不稳定,动态静态?注意关断时间。

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

2

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部