打印

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

[复制链接]
1660|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
stillstone|  楼主 | 2007-6-6 09:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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的显示驱动

相关帖子

沙发
high| | 2007-6-6 12:17 | 只看该作者

慎用浮点数

使用特权

评论回复
板凳
hqgboy| | 2007-6-7 20:57 | 只看该作者

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

2

帖子

0

粉丝