找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1030|回复: 2
收起左侧

STC12C5A60S2单片机驱动18b20显示整数,12m晶振 串口全是00

[复制链接]
ID:56694 发表于 2021-8-13 14:26 | 显示全部楼层 |阅读模式
STC12C5A60S2驱动18b20显示整数   12m晶振    串口全是00
请各位大佬指教
单片机源程序如下:
  1. #include "STC12C5A60S2.h"      //调用51单片机的头文件
  2. #include <Intrins.h>

  3. sbit ds18b20=P3^2;


  4. //---------------------------------------         
  5. unsigned char temp1;
  6. unsigned int temp2;
  7. unsigned char xiaoshu1;//小数第一位
  8. unsigned char xiaoshu2;//小数第二位
  9. unsigned char xiaoshu;//两位小数
  10. //---------------------------------------





  11. void Timer0Init(void)                //1微秒@12MHz
  12. {
  13.         AUXR |= 0x80;                //定时器时钟1T模式
  14.         TMOD &= 0xF0;                //设置定时器模式
  15.         TMOD |= 0x01;                //设置定时器模式
  16.         TL0 = 0xF4;                //设置定时初始值
  17.         TH0 = 0xFF;                //设置定时初始值
  18.         TF0 = 0;                //清除TF0标志
  19.         TR0 = 1;                //定时器0开始计时
  20. }



  21. /* 微秒延时函数 参数给几 就延时几微秒 */
  22. void delay_us(unsigned int us)
  23. {
  24.         while(us--)
  25.         {
  26.           Timer0Init();
  27.         }
  28. }


  29. //---------------------------------------
  30. //名称:复位DS18B20函数

  31. bit Reset(void)
  32. {
  33.         
  34.    bit k;
  35.    ds18b20=1;
  36.    ds18b20=0;                             //拉低DQ总线开始复位        
  37.    delay_us(870);                            //保持DQ低大约870uS,符合不低于48US的要求            
  38.    ds18b20=1;                             //拉高准备接收数据   
  39.    delay_us(80);                        //大约80uS后
  40.    k=ds18b20;                               //读出数据并保存   
  41.    delay_us(400);                     //维持约400US,符合总读时隙不低于480US的要求
  42.    return k;               //k=0为复位成功,k=1为复位失败
  43. }

  44. //---------------------------------------
  45. //名称:读一字节函数

  46. unsigned char ReadByte(void)
  47. {
  48.         
  49.    unsigned char j,buf=0;
  50.    for(j=0;j<8;j++)                        //接收8次还原一个字节数据
  51.    {
  52.         buf=buf>>1;                          //接收前,想将接收缓冲区右移
  53.         ds18b20=0;                                 //拉低      
  54.         delay_us(2);
  55.         ds18b20=1;                                  //拉高,为读数据做准备
  56.         delay_us(6);
  57.         if(ds18b20==1) buf|=0x80;  //读出1位数据保存于buf中
  58.                                                          //维持约52US,符合总读时隙不低于60US的要求
  59.         delay_us(52);
  60.         }
  61.    return buf;             //退出的同时将接收缓冲区参数返回
  62. }

  63. //---------------------------------------
  64. //名称:写一字节函数

  65. void WriteByte(unsigned char dat)
  66. {
  67.         
  68.    unsigned char j;
  69.    for(j=0;j<8;j++)
  70.    {            
  71.          if(dat&0x01)                        //如果写1
  72.       {      
  73.          ds18b20=0;                         //拉低      
  74.         delay_us(2);
  75.         ds18b20=1;                          //拉高        
  76.         delay_us(63);
  77.                 }
  78.       else                                                //如果写0
  79.       {            
  80.         ds18b20=0;                         //拉低                 
  81.         delay_us(63);      
  82.         ds18b20=1;                         //拉高               
  83.         delay_us(2);
  84.       }
  85.        dat=dat>>1;                                //写入字节右移1位
  86.         }
  87. }

  88. //---------------------------------------
  89. //名称:DS18B20温度转换函数

  90. bit Convert()
  91. {   
  92.         if(Reset()==0)          //复位DS18B20
  93.         {               
  94.       WriteByte(0xcc);                //写入跳过序列号命令字 Skip Rom
  95.       WriteByte(0x44);                //写入温度转换命令字 Convert T  
  96.                   return 1;            //启动温度转换成功
  97.         }
  98.         else
  99.         {         
  100.                   return 0;            //启动温度转换失败
  101.         }
  102. }

  103. //---------------------------------------
  104. //名称:转换结束处理函数

  105. void ReadFlash(void)
  106. {   
  107.         unsigned char Lsb,Msb;        
  108.    if(Reset()==0)          //复位DS18B20
  109.         {
  110.       WriteByte(0xcc);                //写入跳过序列号命令字 Skip Rom
  111.       WriteByte(0xbe);                //写入读取数据令字 Read Scratchpad
  112.       Lsb=ReadByte();                //读出第一个字节暂存于LSB
  113.       Msb=ReadByte();                //读出第二个字节暂存于MSB        
  114.       temp1=Lsb&0x0f;                //temp1内装温度参数的小数部分
  115.       temp2=(Lsb>>4)|(Msb<<4);//temp2内装温度参数的整数部分
  116.       xiaoshu1 = (temp1&0x0f)*10/16; //小数第一位
  117.       xiaoshu2 = (temp1&0x0f)*100/16%10;//小数第二位
  118.       xiaoshu=xiaoshu1*10+xiaoshu2; //小数两位
  119.       temp2=((temp2/100)<<8)+(temp2/10%10)*16+(temp2%10);
  120.       
  121.         }        
  122.         else
  123.         {
  124.           temp1=0;                                        //如果复位失败,温度参数清零
  125.           temp2=0;                                        //如果复位失败,温度参数清零        
  126.         }
  127. }





  128. void main(void)            //主函数,单片机开机后就是从这个函数开始运行
  129. {
  130.         
  131.         
  132.         SCON = 0x50;                //8位数据,可变波特率
  133.         AUXR |= 0x40;                //定时器时钟1T模式
  134.         AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
  135.         TMOD &= 0x0F;                //设置定时器模式
  136.         TL1 = 0xC7;                //设置定时初始值
  137.         TH1 = 0xFE;                //设置定时初始值
  138.         ET1 = 0;                //禁止定时器%d中断
  139.         TR1 = 1;                //定时器1开始计时  
  140.    
  141.      while(1)               //死循环,单片机初始化后,将一直运行这个死循环
  142.    {
  143.                
  144.       if(Convert()==1)                                                 //启动转换
  145.         {               
  146.             ReadFlash();                       //读取温度                           
  147.                
  148.         }
  149.            SBUF=temp2;
  150.         while(TI == 0);        //检查发送中断标志位
  151.                 TI = 0;                //令发送中断标志位为0(软件清零)
  152.    }
  153. }
复制代码



回复

使用道具 举报

ID:94031 发表于 2021-8-13 15:20 | 显示全部楼层
查18b20与串口硬件接线是否正确。
回复

使用道具 举报

ID:1111456 发表于 2024-3-17 10:46 | 显示全部楼层
你好,请问解决了吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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