微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 18b20显示不正常

18b20显示不正常

时间:10-02 整理:3721RD 点击:
这两天在弄DS18B20,但是现在有个问题,就是在-25-25℃的时候能够正常显示,但一过这个区间就开始乱了,谁能帮我看一下。
    原来出现的是-15-15℃,但那个是我将int型写成了char型了,这个我实在是找不到问题所在了。希望各位帮帮忙!
#include <reg51.h>
#include <INTRINS.H>
#define uchar unsigned char
#define uint unsigned int
bit Tflag;//温度正负标志
sbit DQ = P3^7;
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,
                                                0x66,0x6d,0x7d,0x07,
                                                0x7f,0x6f,0x77,0x7c,
                                                0x39,0x5e,0x79,0x71,0x63,0x00,0x40};           //0x40  负
unsigned char dispbitcode[]={0xfe,0xfd,0xfb,0xf7,
                                        0xef,0xdf,0xbf,0x7f};
//0-9数码管的编码(共阳极), 带小数点
uchar code table1[]={0x40, 0x79, 0x24, 0x30,
0x19, 0x12, 0x02,0x78, 0x00, 0x10};
unsigned char dispbuf[8]={0,0,0,0,0,0,0,0};
void dmsec (unsigned int count)
{     
        unsigned int i;                        // 1ms延时
        while (count--)
        {
                for (i=0;i<125;i++){}
        }
}
void display(uint temp)
{
        dispbuf[0]=temp/100;
        dispbuf[1]=temp/10%10;
        dispbuf[2]=temp%10;
        if (Tflag)
        {
                P2=0xff;
                P0=dispcode[12];
                P2=dispbitcode[0];
                dmsec(3);
       
                P2=0xff;
                P0=dispcode[16];
                P2=dispbitcode[1];
                dmsec(3);
       
                P2=0xff;      //关闭所有显示       
                P0=dispcode[dispbuf[2]];
                P2=dispbitcode[2];
                dmsec(3);       
                       
                P2=0xff;      //关闭所有显示       
                P0=~table1[dispbuf[1]];
                P2=dispbitcode[3];
                dmsec(5);
       
                P2=0xff;      //关闭所有显示       
                P0=dispcode[dispbuf[0]];
                P2=dispbitcode[4];
                dmsec(3);
       
                P2=0xff;      //关闭所有显示       
                P0=dispcode[18];
                P2=dispbitcode[5];
                dmsec(3);               
        }
        else
        {
                P2=0xff;
                P0=dispcode[12];
                P2=dispbitcode[0];
                dmsec(3);
       
                P2=0xff;
                P0=dispcode[16];
                P2=dispbitcode[1];
                dmsec(3);
       
                P2=0xff;      //关闭所有显示       
                P0=dispcode[dispbuf[2]];
                P2=dispbitcode[2];
                dmsec(3);       
                       
                P2=0xff;      //关闭所有显示       
                P0=~table1[dispbuf[1]];
                P2=dispbitcode[3];
                dmsec(3);
       
                P2=0xff;      //关闭所有显示       
                P0=dispcode[dispbuf[0]];
                P2=dispbitcode[4];
                dmsec(3);
       
                P2=0xff;      //关闭所有显示       
                P0=dispcode[17];
                P2=dispbitcode[5];
                dmsec(3);               
        }         
}
/********** 该程序为总线上只有一个器件 **********/
//毫秒延时 11.0592 Mhz
void Delay(unsigned int num)// 延时函数
{
        while( --num );
}
//复位脉冲
void tmreset (void)
{                  
        DQ = 0;
        Delay(90);                                // 精确延时 大于 480us
        DQ = 1;
        Delay(4);                                // 90,4 可以小范围变化
}
//存在脉冲
void tmpre (void)
{                    
        while (DQ);
        while (~DQ);
        Delay(4);
}
//读一个位
bit tmrbit (void)
{                    
        unsigned int i;
        bit dat;
        DQ = 0; i++;                         // i++;大概1us
        DQ = 1; i++; i++;          
        dat = DQ;
        Delay(8);            
        return (dat);
}
//读一个比特
unsigned char tmrbyte (void)
{         
        unsigned char i,j,dat;
        dat = 0;
        for (i=1;i<=8;i++)
        {
                j = tmrbit ();
                dat = (j << 7) | (dat >> 1);
        }
        return (dat);
}
//写一个比特
void tmwbyte (unsigned char dat)
{              
        unsigned int i;
        unsigned char j;
        bit testb;
        for (j=1;j<=8;j++)
        {
                testb = dat & 0x01;
                dat = dat >> 1;                // 从低位开始?
                if (testb)
                {// Write 1
                        DQ = 0;                 // 先拉低
                        i++; i++;                // >1us                          
                        DQ = 1;
                        Delay(4);            
                }
                else
                {// Write 0
                        DQ = 0;
                        Delay(4);                 // 大一点 没影响,但不能太大,写一个位在30us内         
                        DQ = 1;
                        i++; i++;                 // 再拉高                        
                }
        }
}
//ds1820开始转换
void tmstart (void)
{   
        dmsec(1);              
    tmreset ();
    tmpre ();
    dmsec (1);
    tmwbyte (0xcc);                 // skip rom       
    tmwbyte (0x44);                 // 转换
}
//读取温度
unsigned char tmrtemp (void)
{                  
        uchar a,b;
        uint wendu;
        float y1;
        tmreset ();
        tmpre ();
        dmsec (1);
        tmwbyte (0xcc);                 // skip rom
        tmwbyte (0xbe);                        // 转换
        a = tmrbyte ();                 // LSB低8位
        b = tmrbyte ();                        // MSB高8位
        if((b & 0x80)==0x80)         //判断温度正负
        {       
                wendu=b;
                wendu<<=8;
                wendu=wendu|a;
                wendu=~wendu+1;
                y1=wendu*0.0625;
                wendu=y1*10-0.5;
                Tflag=1;
        }
        else
        {
                wendu=b;
                wendu<<=8;
                wendu=wendu|a;
                y1=wendu*0.0625;
                wendu=y1*10+0.5;
                Tflag=0;
        }
        return(wendu);
}
/********** MAIN **********/
void main (void)
{
    uint last;
        tmstart();       
        dmsec(450);                                // 初始化ds18b20
    while(1)
        {               
                tmstart();                        // ds1820开始转换
                dmsec(2);   
                last=tmrtemp();         // 读取温度
                display(last);                                                                                       
        }      
}

这是25.5℃的显示


这是26.5℃的显示


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

网站地图

Top