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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2098|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产高清高潮精品美女 | 欧洲一级毛片 | 日韩在线一区二区 | 人人人艹 | 久久成人人人人精品欧 | 九九热最新视频 | 女人牲交视频一级毛片 | 久久91 | 在线观看国产精品一区二区 | 国产伦精品一区二区三区高清 | 日本久久一区二区三区 | 成人在线网 | www.黄色片视频 | 欧美成人激情 | 精品成人佐山爱一区二区 | 国产成人免费一区二区60岁 | 91xxx在线观看 | 久久这里只有精品首页 | 99re视频| 中文字幕国产一区 | 国产精品久久久久久久久 | 色婷婷综合久久久中字幕精品久久 | 亚洲免费视频网站 | 国产精品视频在线免费观看 | 请别相信他免费喜剧电影在线观看 | 91大神新作在线观看 | 欧美中文在线 | 亚洲国产精品一区二区第一页 | 99精品视频免费观看 | 国产成人免费 | 成人永久免费视频 | 成人深夜福利网站 | 国产最好的av国产大片 | 免费看av大片 | 欧美三级电影在线播放 | 成人动漫一区二区 | 亚洲国产网址 | 国产精品日日做人人爱 | 亚洲一区二区在线 | 欧美一区二区三区四区五区无卡码 | 亚洲三区在线播放 |