51单片机DS18B20测温程序 数码管显示不正确

2019-07-15 16:56发布

#include <reg52.h>
#include <intrins.h>//头文件

sbit DS  =P1^7;//温度传感器接口6
sbit dian=P0^7;//小数点

unsigned int  t;//温度值
unsigned char num;//延时函数入口参数
unsigned char  table[]={0x00,0x00,0x00};//装温度转换值
unsigned code table1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x39};//最后一个是温度符号


delay_us(unsigned char num)//微妙级延时
{
        while(num--);
}

delay_ms(unsigned char num)//毫秒级延时
{
        unsigned int j;
        for(;num>0;num--)
                for(j=0;j<121;j++);        
}

void DS_18B20_start()//18B20初始化
{
          unsigned char x=0;
          DS = 1;         //DQ复位
          delay_us(8);    //稍做延时
          DS = 0;         //单片机将DQ拉低
          delay_us(80);   //精确延时,大于480us
          DS = 1;         //拉高总线
          delay_us(14);
          x = DS;           //稍做延时后,如果x=0则初始化成功,x=1则初始化失败
          delay_us(20);
}

unsigned int Readonechar()//读取一个字节
{
        unsigned char i=0;
          unsigned char dat = 0;
          for (i=8;i>0;i--)
          {
            DS = 0;     // 给脉冲信号
            dat>>=1;
            DS = 1;     // 给脉冲信号
            if(DS)
            dat|=0x80;
            delay_us(4);
          }
          return(dat);
}

void Writeonechar(unsigned char dat)//写一个字节
{
        unsigned char i=0;
          for (i=8; i>0; i--)
          {
            DS = 0;
            DS = dat&0x01;
            delay_us(5);
            DS = 1;
            dat>>=1;
          }
}

unsigned int Get_temperature(void)//温度获取
{
        unsigned char a=0;
          unsigned char b=0;
          unsigned char  tt=0;
        unsigned char  temp=0;
        DS_18B20_start();
        Writeonechar(0xCC);  //跳过读序号列号的操作
        Writeonechar(0x44);  //启动温度转换
        DS_18B20_start();
        Writeonechar(0xCC);  //跳过读序号列号的操作
        Writeonechar(0xBE);  //读取温度寄存器
        a=Readonechar();     //读低8位
        b=Readonechar();    //读高8位
        tt=b;
        tt<<=8;
        tt=tt|a;
        temp=tt*0.0625;
        t=temp*10+0.5;     //放大10倍输出并四舍五入
        t=temp*10;
    return(t);
}

void convdata()//温度转换
{
        unsigned int T;
        T=Get_temperature();
        table[0]=T/1000;
        table[1]=T%1000/100;
        table[2]=T%1000%100;
}  

void display()//温度显示
{
        
        
        P0=table1[table[0]];//十位
        P3=0xfe;
        delay_ms(10);
        P3=0xff;

        P0=table1[table[1]];//个位
        P3=0xfd;
        dian=1;
        delay_ms(10);
        P3=0xff;

        P0=table1[table[2]];//小数点后一位
        P3=0xfb;
        delay_ms(10);
        P3=0xff;

        P0=table1[10];//单位
        P3=0xf7;
        delay_ms(10);
        P3=0xff;
        
}

void main()//主函数
{
        unsigned char p,q;
        p=0;
        q=0;
        P0=0xff;
        P3=0xff;
        DS_18B20_start();
/*        for(q=0;q<10;q++)
        {
                Get_temperature();
                convdata();
                display();
        }         */
        while(1)
        {        
                Get_temperature();
                convdata();
                for(p=0;p<50;p++)
                {        
                        
                        display();
                }
        }
}


无标题.png
TRY_DS.rar 下载积分: 积分 -1 分
64.61 KB, 下载次数: 10, 下载积分: 积分 -1 分 P0口为输出
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。