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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC12C5A60單片機程序實現DS18B20溫度檢測

[復制鏈接]
跳轉到指定樓層
樓主
ID:1020872 發表于 2023-9-13 14:40 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
要想成功讀取DS18B20的溫度,那么時序很重要,因為STC12C5A60是1T的單片機,跟STC89C52的延時是不一樣的,所以在程序處理時,一定要特別注意延時是否正確,我在DS18B20身上研究了很久,一開始還以為是接線的問題或者是元件壞了,溫度一直顯示-0.006,后面查了很多資料才發現是時序不對,導致初始化不成功,如果看到我的帖子,希望對大家有所幫助
  1. /*-----------------------------------------------
  2.   名稱:18B20溫度傳感器
  3. ------------------------------------------------*/
  4. #include"delay.h"
  5. #include"18b20.h"
  6. #include"LCD1602.h"
  7. uchar fu;
  8. /*------------------------------------------------
  9.                     端口定義
  10. ------------------------------------------------*/
  11. sbit DQ=P1^3;//ds18b20 端口
  12. sbit beep=P2^3;

  13. /*------------------------------------------------
  14.                     18b20初始化
  15. ------------------------------------------------*/
  16. unsigned char ds18b20_init(void)
  17. {
  18. unsigned char presence;

  19. DQ = 1;
  20. delay_us(2);
  21. DQ = 0;
  22. delay_us(500);
  23. DQ = 1;
  24. delay_us(70);
  25. presence = DQ;
  26. delay_us(500);
  27. return presence;
  28. }
  29. /*------------------------------------------------
  30.                     讀一位
  31. ------------------------------------------------*/
  32. bit tmpreadbit(void)      
  33. {
  34. unsigned char a;
  35. DQ = 0;
  36. delay_us(5);
  37. DQ = 1;
  38. delay_us(5);
  39. a = DQ;
  40. delay_us(50);
  41. return a;
  42. }
  43. /*------------------------------------------------
  44.                     讀一個字節
  45. ------------------------------------------------*/
  46. unsigned char ReadOneChar(void)  //read a byte date
  47. {
  48.   uchar i,j,dat;
  49.   dat=0;
  50.   for(i=1;i<=8;i++)
  51.   {
  52.     j=tmpreadbit();
  53.     dat=(j<<7)|(dat>>1);   //讀出的數據最低位在最前面,這樣剛好一個字節在DAT里
  54.   }
  55.   return(dat);
  56. }

  57. /*------------------------------------------------
  58.                     寫入一位
  59. ------------------------------------------------*/
  60. void ds18b20_writebit(unsigned char a)
  61. {

  62. DQ = 0;
  63. delay_us(10);
  64. DQ = a;
  65. delay_us(50);
  66. DQ = 1;
  67. }

  68. /*------------------------------------------------
  69.                     寫入一個字節
  70. ------------------------------------------------*/
  71. void WriteOneChar(unsigned char dat)
  72. {
  73. unsigned char j;
  74.   bit testb;
  75.   for(j=1;j<=8;j++)
  76.   {
  77.     testb=dat&0x01;
  78.     dat=dat>>1;
  79.                 ds18b20_writebit(testb);
  80. }
  81. }


  82. void tmpchange(void)  //DS18B20開始獲取溫度并轉換
  83. {
  84.   ds18b20_init();
  85.   DelayMs(1);
  86.   WriteOneChar(0xcc);  // address all drivers on bus
  87.   WriteOneChar(0x44);  //  initiates a single temperature conversion
  88. }

  89. /*------------------------------------------------
  90.                     讀取溫度
  91. ------------------------------------------------*/
  92. unsigned int ReadTemperature(void)
  93. {
  94.   unsigned char a,b;
  95.         unsigned int g,c,d,e;
  96. ds18b20_init();
  97. DelayMs(1);
  98. WriteOneChar(0xCC); //跳過讀序號列號的操作
  99. WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
  100. a=ReadOneChar();   //先讀低位
  101. b=ReadOneChar();   //再讀高位
  102. if(!(b&0x08))
  103. {
  104.         fu=1;
  105.         g=b;
  106.         c=((g<<8)|a)*6.25;        
  107. }
  108. else
  109. {
  110.   fu=0;
  111.         d=((b<<8)|a);
  112.         e=((~d)+1);
  113.         c=e*6.25;        
  114. }
  115. return(c);
  116. }


  117. void warn(uint s,uchar led)//蜂鳴器報警和燈閃爍 s控制音調,led控制燈
  118. {
  119.         uchar i;
  120.         i=s;
  121.         beep=0;     //蜂鳴器響
  122.         P1=~(led);  //控制相應的燈亮
  123.         while(i--)
  124.         {
  125.                 distemperature();//用溫度顯示函數起到延時的作用
  126.         }
  127.         beep=1;   //蜂鳴器不響
  128.         P1=0xff;  //控制相應的燈滅
  129.         i=s;
  130.         while(i--)
  131.         {
  132.                 distemperature();//用溫度顯示函數起到延時的作用
  133.         }        
  134. }

  135. void deal(uint t) //溫度區間報警
  136. {
  137.         uchar i;
  138.         if((t>2700)&&(t<=2500)) //大于25度小于27度
  139.         {
  140.                 warn(40,0x01);  //第一個燈亮,蜂鳴器發出"滴"聲
  141.         }
  142.         else if(t<=2500) //小于25度
  143.         {
  144.                 warn(10,0x03);//第一個和第二燈亮,蜂鳴器發出"滴"聲
  145.         }
  146.         else if((t<3200)&&(t>=3000)) //小于32度大于30度
  147.         {
  148.                 warn(40,0x04);//第三個燈亮,蜂鳴器發出"滴"聲
  149.         }
  150.         else if(t>=3200)//大于32度
  151.         {
  152.                 warn(10,0x0C);//第三個和第四個燈亮,蜂鳴器發出"滴"聲
  153.         }
  154.         else //在27度和30度之間時只是調用顯示函數延時
  155. {
  156.         i=40;
  157.         while(i--)
  158.         {
  159.           distemperature();        //用溫度顯示函數起到延時的作用
  160.         }
  161. }
  162. }


  163. void distemperature(void)
  164. {
  165.          unsigned int m1,m2,m3,m4,m5,temperature;
  166.          tmpchange();
  167.    temperature=ReadTemperature();//讀取溫度
  168.    if(fu==0)
  169.          {
  170.     LCD_Write_Char(5,1,'-');//寫入負號的位置,如果是負溫度就顯示
  171.          }
  172.    else
  173.          {
  174.           LCD_Write_Char(5,1,0x20);//是正溫度就顯示空格,0x20在ASCII字符表里表示空格
  175.          }
  176.          m1=temperature/10000+48;  //1602字符顯示ASCII的地址位0X30,0~9,對應的地址是48~57,所以計算出來的數要加48,48=0x30  /號是求整 %是求余  
  177.          m2=temperature%10000/1000+48;//為什么要除于10000呢,因為一開始溫度換算的時就已經乘以100倍了,如果溫度是110度,此時得出來的數就是11000,所以要除于10000
  178.          m3=temperature%1000/100+48;
  179.          m4=temperature%100/10+48;
  180.          m5=temperature%10+48;
  181.          LCD_Write_Char(6,1,m1);
  182.    LCD_Write_Char(7,1,m2);
  183.           LCD_Write_Char(8,1,m3);
  184.          LCD_Write_Char(9,1,'.');
  185.          LCD_Write_Char(10,1,m4);
  186.    LCD_Write_Char(11,1,m5);
  187. }
復制代碼
原理圖: 無
仿真: 無
代碼: 1602 18b20.zip (58.15 KB, 下載次數: 50)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:852195 發表于 2023-9-23 17:15 | 只看該作者
感謝分享,移植到1T機的確成功。
回復

使用道具 舉報

板凳
ID:1094355 發表于 2023-9-23 20:27 | 只看該作者
真是及時雨.正在找stc讀取溫度的資料
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲综合99 | 成人午夜免费福利视频 | 日本在线视频中文字幕 | 亚洲精品免费在线观看 | 91青娱乐在线 | 91精品国产91久久久久久密臀 | 精品久久久久国产 | av中文字幕在线播放 | 日本欧美国产在线观看 | 日韩免费毛片视频 | 日韩精品免费视频 | 日韩精品一区二区三区中文在线 | 欧美一区二区在线观看视频 | 亚洲精品国产第一综合99久久 | 91av视频在线免费观看 | 桃色五月| 国产伦精品一区二区三区精品视频 | 亚洲人成在线观看 | 国产精品精品视频一区二区三区 | 美女久久久久久久久 | 精品国产一区二区三区日日嗨 | 欧美国产精品一区二区 | 日韩精品一区二区三区免费观看 | 999www视频免费观看 | 国产9999精品 | 色婷婷av一区二区三区软件 | 天堂久久网 | 免费超碰 | 波多野结衣亚洲 | 国产一区二区在线免费观看 | 日韩欧美高清 | 亚洲国产一区二区三区在线观看 | 成人激情视频免费在线观看 | 激情网站在线观看 | 99久久免费观看 | 亚洲成人网在线 | 国产女人叫床高潮大片免费 | 国产精品成人一区二区三区吃奶 | 国产精品欧美一区二区 | 欧美电影免费观看高清 | 黄色免费网址大全 |