• STC单片机26——串口发送DS18B20温度值


    #include
    #define uchar unsigned char                        
    #define uint unsigned int
    sbit DQ = P2^0;//定义ds18B20总线IO
     //发送数据
     void tmpDelay(int num)//延时函数
    {
        while(num--) ;
    }
    void Send(unsigned char dat)
    {
       SBUF=dat;
       while(TI==0)         //等待发送完毕
          ;
        TI=0;
        //tmpDelay(1000);
    }
      void wendu_init()
      {
       TMOD=0x20;  //定时器T1工作于方式2 ,八位自动重装
       SCON=0x50;  //SCON=0101 0000B,串口工作方式1,允许接收(REN=1)
       PCON=0x00;  //PCON=0000 0000B,波特率2400
       TH1=0xF3 ;  //根据规定给定时器T1赋初值
       TL1=0x00;  //根据规定给定时器T1赋初值      
       TR1=1;    //启动定时器T1   
       REN=1;    //允许接收
      }

    //温度采集模块    
    /******************************************************************************/
    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 ;                   //定义的时候用uchar宏定义就会出错
        unsigned char shi,ge,xiaoshu;        //这里的num,shi,ge,xiaoshu 必须用unsigned int无符号整数来表示,用unshigned char  字符型则显示错误
        num=Readtemp();
        shi=num/100+48;
        ge=num/10%10+48;
        xiaoshu=num%10+48;
        Send(shi);
        Send(ge);
        Send('.');
        Send(xiaoshu);
    }

    void main()
    {    
       wendu_init();
       REN=0;          //禁止接受数据
       while(1)
        {
            display();
            tmpDelay(65000);
            tmpDelay(65000);
        }
    }

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

    STC51单片机26-串口发送DS18B20温度值资源-单片机文档类资源-CSDN下载

  • 相关阅读:
    6.24 学习内容
    232.用栈实现队列(LeetCode)
    记账软件哪个好用,亲测有效
    rust 引用详解
    产品研发流程
    写一个项目中使用的单例模式
    JS构造函数与class类中的封装、继承和多态
    springboot集成qq邮箱
    【Java第31期】:Spring中存储Bean的注解以及用法
    论文超详细精读|五千字:PB-GCN
  • 原文地址:https://blog.csdn.net/fengyuzhe13/article/details/127859282