找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2519|回复: 1
收起左侧

STC89C52单片机串口通信发送DS18B20的数据给串口助手

[复制链接]
ID:435708 发表于 2019-3-19 22:13 | 显示全部楼层 |阅读模式
如上所述:
在串口助手输入任意指令后单片机接受到指令,向电脑一直发送DS18B20的温度

仿真结果

仿真结果

原理图

原理图

代码如下:
#include<reg52.h>

#include<intrins.h>
#include<absacc.h>
#include<stdio.h>

void Delay1000ms()                //@11.0592MHz
{
        unsigned char i, j, k;

        _nop_();
        i = 8;
        j = 1;
        k = 243;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}



sbit DQ=P1^3;
unsigned char x=0;                                      
signed char m;                                    
unsigned char n;                                             
unsigned int z;
unsigned int c;
unsigned char a;
unsigned char i;                                            
                     









/*****延时子程序*****/
void Delay_DS18B20(int num)
{
        while(num--) ;
}
/*****初始化DS18B20*****/
void Init_DS18B20(void)
{
        unsigned char x=0;
        DQ = 1;                 //DQ复位
        Delay_DS18B20(8);   //稍做延时
        DQ = 0;                           //单片机将DQ拉低
        Delay_DS18B20(80);  //精确延时,大于480us
        DQ = 1;                 //拉高总线
        Delay_DS18B20(14);
        x = DQ;                   //稍做延时后,如果x=0则初始化成功,x=1则初始化失败
        Delay_DS18B20(20);
}
/*****读一个字节*****/
unsigned char ReadOneChar(void)
{
        unsigned char i=0;
        unsigned char dat = 0;
        for (i=8;i>0;i--)
          {
            DQ = 0;                         //给脉冲信号
            dat>>=1;
            DQ = 1;                     //给脉冲信号
            if(DQ)
            dat|=0x80;
            Delay_DS18B20(4);
          }
          return(dat);
}
/*****写一个字节*****/
void WriteOneChar(unsigned char dat)
{
        unsigned char i=0;
          for (i=8; i>0; i--)
          {
            DQ = 0;
            DQ = dat&0x01;
            Delay_DS18B20(5);
            DQ = 1;
            dat>>=1;
          }
}
/*****读取温度*****/
unsigned int ReadTemperature(void)
{
        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;                                 //高8位转移到t
          t<<=8;                             //t数据左移8位
          t=t|a;                             //将t和a按位或,得到一个16位的数
          tt=t*0.0625;                 //将t乘以0.0625得到实际温度值
                                             //(温度传感器设置12位精度,最小分辨率是0.0625)
          t= tt*10+0.5;        //放大10倍(将小数点后一位显示出来)输出并四舍五入
          return(t);                     //返回温度值
}
/*****延时子程序*****/
void Delay1(unsigned int num)
{
        while( --num );
}                        
/*****读取温度*****/
void check_wendu(void)
{
        unsigned int a,b;
        c=ReadTemperature();                  //获取温度值
        a=c/100;                                     //计算得到十位数字
        b=c/10-a*10;                            //计算得到个位数字
        m=c/10;                                      //计算得到整数位
        if(m<=0)                                    //如果温度小于0,限制显示为0
        {
                m=0;
        }
        n=c-a*100-b*10;                            //计算得到小数位
}





unsigned char flag_uart;
unsigned char ge,shi,KeyValue,j,b;
unsigned char temp,temp1;
unsigned char flag=0;



/*****初始化函数*****/
void InitUART(void)
{
   TMOD=0x20;
   SCON=0x50;
   TH1=0xFD;
   TL1=TH1;
   PCON=0x00;  
   EA=1;  
   ES=1;   
   TR1=1;
   SM0=0;
   SM1=1;
   REN=1;  
}  

/*****串口通信中断*****/
void send(unsigned char x)
{
       SBUF=x;  
       while(TI==0);   
       TI=0;      
}

/*****显示函数*****/
void xianshi()   
{
   ge=m%10;  
   shi=m/10;



          send(shi+48);
                  

             Delay1(200);   

          send(ge+48);
                  

              Delay1(200);            



}
void ser() interrupt 4
{RI=0;
a=SBUF;


flag=1;


}


/*****主函数*******/
void main()
{
   InitUART();
   Delay1000ms();        
   while(1)
   {if(flag==1)
   {ES=0;

   while(1)
   {  check_wendu();
      xianshi();
         

   }
   SBUF=a;
   while(!TI);
   TI=0;
   ES=1;
   flag=0;
   }
   }

         
}

回复

使用道具 举报

ID:435708 发表于 2019-3-20 16:17 | 显示全部楼层

刚琢磨的,一开始的85是应该DS18B20初始化自带的,现在准备琢磨如何发送停止指令让单片机停止传输温度
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表