微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > ds18b20在数码管上显示,温度准确,但是数字有点闪烁,不知那里有问题,那位大神给看看!

ds18b20在数码管上显示,温度准确,但是数字有点闪烁,不知那里有问题,那位大神给看看!

时间:10-02 整理:3721RD 点击:
程序延迟可能有问题
#include "reg51.h"
#include "absacc.h"
#define  uchar unsigned char
#define  uint  unsigned  int
code uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar dspbuf[8] = {10,10,10,10,10,10,10,10};
uchar dspcom=0;
uchar temp;
sbit DQ=P1^4;
void delay(uint t);
void init_ds18b20();
void write_ds18b20(uchar dat);
uchar read_ds18b20();
uchar readtemperature();
void  display();
void main()
{
    TMOD|=0X01;
                TH0=(65536-2000)/256;
                TL0=(65536-2000)%256;
                EA=1;
                ET0=1;
                TR0=1;
                while(1)
                {
                temp=readtemperature();
                dspbuf[6]=temp/10;
                dspbuf[7]=temp%10;       
                }
}
void zhongduan () interrupt 1
{
    TH0=(65536-2000)/256;
                TL0=(65336-2000)%256;
                display();
}
void delay(uint t)
{
                while(t--);
}
void init_ds18b20()
{
                        uchar n;
                        DQ=1;
                        delay(8);
                        DQ=0;
                        delay(80);
                        DQ=1;
                        delay(8);
                        n=DQ;
                        delay(4);                       
}
void write_ds18b20(uchar dat)
{
      uchar i;
                        for(i=0;i<8;i++)
                        {
                          DQ=0;
                                DQ=dat&0x01;
                                delay(4);
                                DQ=1;
                                dat>>=1;
                        }
                delay(4);
}
uchar read_ds18b20()
{
                        uchar i,value;
                        for(i=0;i<8;i++)
                        {
                                        DQ=0;
                                        value>>=1;
                                        DQ=1;
                                        if(DQ)
                                        value|=0x80;
                                        delay(4);
                        }
       return value;
}
uchar readtemperature()
{
                        uchar a,b;
                        init_ds18b20();
                        write_ds18b20(0xcc);
                        write_ds18b20(0x44);
                        delay(300);
                       
                        init_ds18b20();
                        write_ds18b20(0xcc);
                        write_ds18b20(0xbe);
                        a=read_ds18b20();
                        b=read_ds18b20();
                        b<<=4;
                        b+=(a&0xf0)>>4;
                  return b;
}
void  display()
{
                XBYTE[0xE000]=0xff;
                XBYTE[0XC000]=1<<dspcom;
                XBYTE[0XE000]=table[dspbuf[dspcom]];
               
                if(++dspcom==8)
                dspcom=0;
}


错误是uchar dspbuf[8]写入和读出时序错误,一次读出的内容包含两次写入的部分拼接的结果,显示必然闪烁
readtemperature()应当也放入中断,display()可以跟在后面,最好用定时器中断

主函数中:
                 temp=readtemperature();
                dspbuf[6]=temp/10;
                 dspbuf[7]=temp%10;        

                dspbuf[6]=temp/10;
                 dspbuf[7]=temp%10;        
之前关中断,之后开中断,中断响应中调用的display()函数读取这两个字节时数据就是同步的

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top