• STC单片机19——ds18b20 液晶显示温度


    #include
    #define uchar unsigned char                        
    #define uint unsigned int  
    uchar i;
    sbit lcdrs=P3^0;
    sbit lcdrw=P3^1;
    sbit lcden=P3^2;
    sbit  d1=P1^0;
    sbit  d2=P1^1;
    uchar code t0[]="the temperature ";
    uchar code t1[]=" is             ";
    uchar code wendu[]="0123456789";        //利用一个温度表解决温度显示乱码
    sbit DQ = P3^7;//定义ds18B20总线IO

    //液晶显示模块
    void delay(uint z)
    {
        uint x,y;
        for(x=100;x>1;x--)
            for(y=z;y>1;y--);
    }

    void write_com(uchar com)
    {
        lcdrs=0;
        P2=com;    
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
    }
    void write_date(uchar date)
    {
        lcdrs=1;
        P2=date;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
    }
    void init_lcd()
    {
        lcden=0;
        lcdrw=0;
        write_com(0x38);
        write_com(0x01);
        write_com(0x0c);
        write_com(0x06);

        write_com(0x80);    
        for(i=0;i<16;i++)
            {
                write_date(t0[i]);
                delay(0);
            }
        write_com(0x80+0x40);
        for(i=0;i<16;i++)
            {
                write_date(t1[i]);
                delay(0);
            }
    }

    //温度采集模块
    void tmpDelay(int num)//延时函数
    {
        while(num--) ;
    }    
    /******************************************************************************/
    void Init_DS18B20()//初始化ds1820
    {
        unsigned char x=0;
        DQ = 1;    //DQ复位
        tmpDelay(8);  //稍做延时
        DQ = 0;    //单片机将DQ拉低
        tmpDelay(80); //精确延时 大于 480us
        DQ = 1;    //拉高总线
        tmpDelay(14);
        x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
        tmpDelay(20);
    }

    unsigned char ReadOneChar()//读一个字节
    {
        unsigned char i=0;
        unsigned char dat = 0;
        for (i=8;i>0;i--)
        {
            DQ = 0; // 给脉冲信号
            dat>>=1;
            DQ = 1; // 给脉冲信号
            if(DQ)
            dat|=0x80;
            tmpDelay(4);
        }
        return(dat);
    }
    void WriteOneChar(unsigned char dat)//写一个字节
    {
        unsigned char i=0;
        for (i=8; i>0; i--)
        {
            DQ = 0;
            DQ = dat&0x01;
            tmpDelay(5);
            DQ = 1;
            dat>>=1;
        }
    }

    unsigned int Readtemp()//读取温度
    {
        unsigned char a=0;
        unsigned char b=0;
        unsigned int t=0;
        float tt=0;    
        Init_DS18B20();
        WriteOneChar(0xCC); // 跳过读序号列号的操作
        WriteOneChar(0x44); // 启动温度转换
        Init_DS18B20();
        WriteOneChar(0xCC); //跳过读序号列号的操作
        WriteOneChar(0xBE); //读取温度寄存器
        a=ReadOneChar();   //连续读两个字节数据   //读低8位
        b=ReadOneChar();                          //读高8位
        t=b;
        t<<=8;
        t=t|a; //两字节合成一个整型变量。
        tt=t*0.0625;  //得到真实十进制温度值,因为DS18B20可以精确到0.0625度,所以读回数据的最低位代表的是0.0625度
        t= tt*10+0.5; //放大十倍,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作。
        return(t);


    }

    void display()
    {
        unsigned int num,num1;                   //定义的时候用uchar宏定义就会出错
        unsigned int shi,ge,xiaoshu;        //这里的num,shi,ge,xiaoshu 必须用unsigned int无符号整数来表示,用unshigned char  字符型则显示错误
        num=Readtemp();
        num1=num/10;
        if(num1>37)
          {d1=0;d2=1;delay(500);}
        if(num1<10)
          {d1=1;d2=0;delay(500);}
        else
          {d1=1;d2=1;}
        shi=num/100;
        ge=num/10%10;
        xiaoshu=num%10;

        write_com(0x80+0x40+5);
        write_date(wendu[shi]);

        write_com(0x80+0x40+6);
        write_date(wendu[ge]);

        write_com(0x80+0x40+7);
        write_date(0x2e);

        write_com(0x80+0x40+8);
        write_date(wendu[xiaoshu]);
    }
    void main()
    {
        init_lcd();
        while(1)
        {
            display();
            delay(10);
        }
    }

    完整资料打包(含仿真):

    STC51单片机19-ds18b20温度LCD1602液晶显示-单片机文档类资源-CSDN下载

  • 相关阅读:
    2023国赛数学建模C题思路分析 - 蔬菜类商品的自动定价与补货决策
    演讲笔记|《一个ppt者的成长故事》
    Spring MVC中如何对异常进行处理呢?
    写在冬日的第一天--一个女程序员第十九年工作总结
    Redis快速入门
    java基于微信小程序的师生答疑交流平台 uniAPP小程序
    你真的了解CPU和GPU?
    SpringBoot的Spring Security用户授权和认证
    LeetCode 636. 函数的独占时间
    JVM内存模型和结构详解(五大模型图解)
  • 原文地址:https://blog.csdn.net/fengyuzhe13/article/details/127802641