找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1053|回复: 6
收起左侧

单片机ds18b20程序读取温度数据异常

[复制链接]
ID:577554 发表于 2023-3-21 17:03 | 显示全部楼层 |阅读模式
通过8h8单片机获取ds18b20原始数据分为低8位和高8位,后通过串口3高低位数据发送到上位机显示,不知道是哪里程序出现了问题,上位机显示只有一个8位数据而且一直都是0xff不变动,一开始是以为是ds18b2的读写程序出现问题,但拔掉DQ线现之后数据就停止发送到上位机了,烦请前辈们帮忙指点指点

单片机源程序如下:
  1. #include <stc8h.h>
  2. #include <intrins.h>

  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. bit busy;   //P0.0-RXD;P0.1-TXD
  6. sbit DQ = P1^0;                             //定义DS18B20总线I/O        

  7. uint a,b,c,m,n;

  8. unsigned char h=0;
  9.   unsigned char l=0;

  10. void gpio_int()
  11. {
  12. P_SW2 |= 0x80; //必须要加这句

  13. P0M0=0X00;
  14. P0M1=0X00;
  15. P1M0=0X00;
  16. P1M1=0X00;        

  17. }


  18. //延时子程序
  19. void Delay_DS18B20(int num)
  20. {
  21.   while(num--) ; // Delay_DS18B20(100) 12Mhz晶振下约为85.5us    11.0592Mhz约为下93us
  22. }



  23. //初始化DS18B20
  24. void Init_DS18B20(void)
  25. {
  26.   uchar x=0;
  27.   DQ = 1;         
  28.   Delay_DS18B20(8);    //稍做延时,等高电平稳定后开始复位
  29.   DQ = 0;         //单片机将DQ拉低
  30.   Delay_DS18B20(600);   //主机拉低约480-950us
  31.   DQ = 1;         //释放总线
  32.   while(DQ);       //DQ会拉低大约60-240us表示应答,之后会释放总线
  33.   while(!DQ);      //等待从机释放总线
  34. }

  35. //写一个字节
  36. void WriteOneChar(unsigned char dat)
  37. {
  38.   unsigned char i=0;
  39.   for (i=8; i>0; i--)
  40.   {
  41.     DQ = 0;
  42.     DQ = dat&0x01;
  43.     Delay_DS18B20(13);//无论0或1发送钱先拉低10-15us
  44.                 Delay_DS18B20(30);//0或1电平保持20-45us
  45.     DQ = 1;        //释放总线
  46.     dat>>=1;
  47.   }
  48. }


  49. //读一个字节
  50. unsigned char ReadOneChar(void)
  51. {
  52.   uchar i=0;
  53.   uchar dat = 0;
  54.   for (i=8;i>0;i--)
  55.   {        
  56.                 DQ = 1;
  57.     DQ = 0;     // 给脉冲信号
  58.     dat>>=1;
  59.     DQ = 1;     // 给脉冲信号
  60.                 if(DQ)         //释放总线后读取电平
  61.                 dat|=0x80;
  62.      DQ = 1;
  63.                 Delay_DS18B20(43);  //读取后延迟40-45us
  64.   }
  65.   return(dat);
  66. }


  67. //读取温度
  68. void ReadTemperature()
  69. {

  70.   unsigned int t=0;
  71.   float tt=0;
  72.   Init_DS18B20();
  73.   WriteOneChar(0xCC);  //跳过读序号列号的操作
  74.   WriteOneChar(0x44);  //启动温度转换
  75.   Delay_DS18B20(9);
  76.         Init_DS18B20();
  77.   WriteOneChar(0xCC);  //跳过读序号列号的操作
  78.   WriteOneChar(0xBE);  //读取温度寄存器
  79.   l=ReadOneChar();     //读低8位
  80.   h=ReadOneChar();    //读高8位

  81.         }




  82. void Uart3Init()//串口3初始化
  83. {
  84. S3CON = 0x10;
  85. T2L = 0xe8;
  86. T2H = 0xff;
  87. AUXR = 0x10;
  88. busy = 0;
  89. }

  90. void Uart3Send(unsigned char dat)//发送8位数据
  91. {
  92. while (busy);
  93. busy = 1;
  94. S3BUF = dat;
  95. busy = 0;
  96. }


  97. void Uart3SendStr(char *p)//发送字符
  98. {
  99. while (*p)
  100. {
  101. Uart3Send(*p++);
  102. }
  103. }

  104. void delay_13us(uint t)
  105. {

  106. while(t--)
  107. {_nop_();}
  108. }

  109. void delay_1s()//1秒延时
  110. {
  111. unsigned char x,y;
  112.         for(x=0;x<100;x++)
  113.         {
  114.         for(y=0;y<100;y++)
  115.          {
  116.    delay_13us(100);
  117.          }
  118.          }
  119. }

  120. void main()
  121. {
  122.         gpio_int();
  123.         Uart3Init();

  124.         while(1)
  125. {  
  126.         ReadTemperature();
  127.         
  128.         Uart3Send(h);
  129.         Uart3Send(l);
  130. delay_1s();


  131. }        
  132. }

复制代码


51hei截图20230321164628773.jpg
回复

使用道具 举报

ID:883242 发表于 2023-3-21 19:11 | 显示全部楼层
如果第一个数据不是ff的话,应该是119行写的太草率了,118行给SBUF赋值不意味着发送已经完成,9600bps这么低的波特率给SBUF赋值后1ms发送才会完成,而单片机可以执行几千条指令。
回复

使用道具 举报

ID:1063134 发表于 2023-3-21 23:30 | 显示全部楼层
我遇到过ds18b20坏的,应答都有但读不出数据,后来换了一个才发现这个问题
回复

使用道具 举报

ID:577554 发表于 2023-3-22 08:58 | 显示全部楼层
Hephaestus 发表于 2023-3-21 19:11
如果第一个数据不是ff的话,应该是119行写的太草率了,118行给SBUF赋值不意味着发送已经完成,9600bps这么 ...

这个问题确实没有想到,其实这个程序还有一个问题就是:我发送的是两个8位数据,但上位机一次只显示出一个8位,根据你的建议加延时后,确实解决这个问题,但是排除串口,通过debug硬件仿真查看变量发现两个变量也都是ffC:\Users\dell\Desktop\360截图20230322085316936.jpg
回复

使用道具 举报

ID:577554 发表于 2023-3-22 09:00 | 显示全部楼层
排除串口,通过debug查看变量的方式,依旧都是0xff

通过debug查看变量的方式依旧都是0xff

通过debug查看变量的方式依旧都是0xff
回复

使用道具 举报

ID:577554 发表于 2023-3-22 09:03 | 显示全部楼层
wuyimin456 发表于 2023-3-21 23:30
我遇到过ds18b20坏的,应答都有但读不出数据,后来换了一个才发现这个问题

我遇到的问题和你差不多,有应答但返回数据错误,因为我更换过两个数据都是这样,所以才觉得会不会是程序问题导致的
回复

使用道具 举报

ID:1063134 发表于 2023-3-22 11:31 | 显示全部楼层
LUREN1 发表于 2023-3-22 09:03
我遇到的问题和你差不多,有应答但返回数据错误,因为我更换过两个数据都是这样,所以才觉得会不会是程序 ...

网上18b20十个九个坏,用那种带线的质量好,我就是用带线的后才知道原来的18B20是坏的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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