久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2222|回復: 6
打印 上一主題 下一主題
收起左側

單片機ds18b20程序讀取溫度數據異常

[復制鏈接]
跳轉到指定樓層
樓主
通過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 (162.1 KB, 下載次數: 73)

51hei截圖20230321164628773.jpg
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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
回復

使用道具 舉報

5#
ID:577554 發表于 2023-3-22 09:00 | 只看該作者
排除串口,通過debug查看變量的方式,依舊都是0xff

51hei截圖20230322085316936.jpg (136.71 KB, 下載次數: 68)

通過debug查看變量的方式依舊都是0xff

通過debug查看變量的方式依舊都是0xff
回復

使用道具 舉報

6#
ID:577554 發表于 2023-3-22 09:03 | 只看該作者
wuyimin456 發表于 2023-3-21 23:30
我遇到過ds18b20壞的,應答都有但讀不出數據,后來換了一個才發現這個問題

我遇到的問題和你差不多,有應答但返回數據錯誤,因為我更換過兩個數據都是這樣,所以才覺得會不會是程序問題導致的
回復

使用道具 舉報

7#
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 美女艹b| 三级成人片 | 久久福利电影 | 欧美精品91 | 亚洲高清在线观看 | 日韩成人在线观看 | 国产激情一区二区三区 | 超碰超碰 | 午夜视频导航 | 成人福利网 | 久久久毛片 | 在线不卡视频 | 亚洲一区二区三区欧美 | 精品国产一区二区 | 成人免费观看视频 | 热久久性 | 久久久久国产精品www | 日韩中文字幕视频在线观看 | 91av在线视频观看 | 91精品国产自产在线老师啪 | 韩日在线观看视频 | 久久久精品一区 | 亚洲成人av | 国产精品99999999 | 国产在线精品一区 | 日韩精品在线一区二区 | 国产一级在线观看 | 成人欧美一区二区三区在线观看 | 久久精品在线播放 | 欧美在线一区二区三区 | 精品久久久久久国产 | 日韩国产中文字幕 | 五月综合激情在线 | 99热在线免费 | 国产日韩欧美中文 | 国产中的精品av涩差av | 日本激情视频中文字幕 | 久久精品欧美一区二区三区不卡 | 在线免费观看黄色 | 日韩欧美二区 | 欧美一级大片免费看 |