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

標(biāo)題: 單片機(jī)ds18b20程序讀取溫度數(shù)據(jù)異常 [打印本頁]

作者: LUREN1    時(shí)間: 2023-3-21 17:03
標(biāo)題: 單片機(jī)ds18b20程序讀取溫度數(shù)據(jù)異常
通過8h8單片機(jī)獲取ds18b20原始數(shù)據(jù)分為低8位和高8位,后通過串口3高低位數(shù)據(jù)發(fā)送到上位機(jī)顯示,不知道是哪里程序出現(xiàn)了問題,上位機(jī)顯示只有一個(gè)8位數(shù)據(jù)而且一直都是0xff不變動(dòng),一開始是以為是ds18b2的讀寫程序出現(xiàn)問題,但拔掉DQ線現(xiàn)之后數(shù)據(jù)就停止發(fā)送到上位機(jī)了,煩請(qǐng)前輩們幫忙指點(diǎn)指點(diǎn)

單片機(jī)源程序如下:
  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. //延時(shí)子程序
  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);    //稍做延時(shí),等高電平穩(wěn)定后開始復(fù)位
  29.   DQ = 0;         //單片機(jī)將DQ拉低
  30.   Delay_DS18B20(600);   //主機(jī)拉低約480-950us
  31.   DQ = 1;         //釋放總線
  32.   while(DQ);       //DQ會(huì)拉低大約60-240us表示應(yīng)答,之后會(huì)釋放總線
  33.   while(!DQ);      //等待從機(jī)釋放總線
  34. }

  35. //寫一個(gè)字節(jié)
  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發(fā)送錢先拉低10-15us
  44.                 Delay_DS18B20(30);//0或1電平保持20-45us
  45.     DQ = 1;        //釋放總線
  46.     dat>>=1;
  47.   }
  48. }


  49. //讀一個(gè)字節(jié)
  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;     // 給脈沖信號(hào)
  58.     dat>>=1;
  59.     DQ = 1;     // 給脈沖信號(hào)
  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);  //跳過讀序號(hào)列號(hào)的操作
  74.   WriteOneChar(0x44);  //啟動(dòng)溫度轉(zhuǎn)換
  75.   Delay_DS18B20(9);
  76.         Init_DS18B20();
  77.   WriteOneChar(0xCC);  //跳過讀序號(hào)列號(hào)的操作
  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)//發(fā)送8位數(shù)據(jù)
  91. {
  92. while (busy);
  93. busy = 1;
  94. S3BUF = dat;
  95. busy = 0;
  96. }


  97. void Uart3SendStr(char *p)//發(fā)送字符
  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秒延時(shí)
  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. }

復(fù)制代碼


51hei截圖20230321164628773.jpg (162.1 KB, 下載次數(shù): 73)

51hei截圖20230321164628773.jpg

作者: Hephaestus    時(shí)間: 2023-3-21 19:11
如果第一個(gè)數(shù)據(jù)不是ff的話,應(yīng)該是119行寫的太草率了,118行給SBUF賦值不意味著發(fā)送已經(jīng)完成,9600bps這么低的波特率給SBUF賦值后1ms發(fā)送才會(huì)完成,而單片機(jī)可以執(zhí)行幾千條指令。
作者: wuyimin456    時(shí)間: 2023-3-21 23:30
我遇到過ds18b20壞的,應(yīng)答都有但讀不出數(shù)據(jù),后來換了一個(gè)才發(fā)現(xiàn)這個(gè)問題
作者: LUREN1    時(shí)間: 2023-3-22 08:58
Hephaestus 發(fā)表于 2023-3-21 19:11
如果第一個(gè)數(shù)據(jù)不是ff的話,應(yīng)該是119行寫的太草率了,118行給SBUF賦值不意味著發(fā)送已經(jīng)完成,9600bps這么 ...

這個(gè)問題確實(shí)沒有想到,其實(shí)這個(gè)程序還有一個(gè)問題就是:我發(fā)送的是兩個(gè)8位數(shù)據(jù),但上位機(jī)一次只顯示出一個(gè)8位,根據(jù)你的建議加延時(shí)后,確實(shí)解決這個(gè)問題,但是排除串口,通過debug硬件仿真查看變量發(fā)現(xiàn)兩個(gè)變量也都是ffC:\Users\dell\Desktop\360截圖20230322085316936.jpg
作者: LUREN1    時(shí)間: 2023-3-22 09:00
排除串口,通過debug查看變量的方式,依舊都是0xff

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

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

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

作者: LUREN1    時(shí)間: 2023-3-22 09:03
wuyimin456 發(fā)表于 2023-3-21 23:30
我遇到過ds18b20壞的,應(yīng)答都有但讀不出數(shù)據(jù),后來換了一個(gè)才發(fā)現(xiàn)這個(gè)問題

我遇到的問題和你差不多,有應(yīng)答但返回?cái)?shù)據(jù)錯(cuò)誤,因?yàn)槲腋鼡Q過兩個(gè)數(shù)據(jù)都是這樣,所以才覺得會(huì)不會(huì)是程序問題導(dǎo)致的
作者: wuyimin456    時(shí)間: 2023-3-22 11:31
LUREN1 發(fā)表于 2023-3-22 09:03
我遇到的問題和你差不多,有應(yīng)答但返回?cái)?shù)據(jù)錯(cuò)誤,因?yàn)槲腋鼡Q過兩個(gè)數(shù)據(jù)都是這樣,所以才覺得會(huì)不會(huì)是程序 ...

網(wǎng)上18b20十個(gè)九個(gè)壞,用那種帶線的質(zhì)量好,我就是用帶線的后才知道原來的18B20是壞的




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 伊人青青久久 | 久久国产一区 | 狠狠色综合欧美激情 | 国产精品视频一二三区 | 9191在线观看 | 国产1区2区3区 | 久久综合久色欧美综合狠狠 | 精一区二区 | 免费国产视频在线观看 | 久草视频在 | 黄片毛片| 久久久久国产精品午夜一区 | www国产成人免费观看视频 | 在线日韩中文字幕 | 国产中文字幕在线 | 欧美高清hd| 不卡一区二区三区四区 | 天堂综合网久久 | 午夜小电影 | 亚洲黄色av网站 | 欧美一级毛片免费观看 | 欧美全黄 | 一级欧美一级日韩片免费观看 | 在线观看免费av网站 | 欧美成人一区二免费视频软件 | 一区二区三区四区视频 | 亚洲日本视频 | 久久精品视频9 | 国产一区二区三区四区区 | 91精品国产自产在线老师啪 | 久久久久久久综合 | 欧美一区视频在线 | 久久精品aaa | 天天爱爱网 | 中文字幕在线人 | 免费久久网站 | 国产成人一区 | 成人午夜网站 | 日本精品一区二区三区在线观看视频 | 日本不卡免费新一二三区 | 日韩一级免费电影 |