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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1621|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)DS18b20溫度檢測(cè)程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:907553 發(fā)表于 2022-9-21 00:37 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  1. #include<reg51.h>                                  //51單片機(jī)的頭文件
  2. #define uchar unsigned char           //宏定義,用uchar來(lái)代替unsigned char(無(wú)符號(hào)字符型變量,也即是無(wú)符號(hào)的8位變量),
  3.                                                                 //宏定義的原因就是書(shū)寫(xiě)方便,宏定義后,uchar可直接用來(lái)定義變量
  4. #define uint unsigned int                //原因同上,不過(guò)要注意,unsigned int為無(wú)符號(hào)的整型變量

  5. uint present;                    // 實(shí)際溫度(擴(kuò)大了10倍)  
  6. uint setting=30;                                 //設(shè)定值

  7. sbit led=P3^5;                                        //sbit是用來(lái)管腳的。此處定義LED燈由P3.5口控制
  8. sbit buzzer=P3^6;                                //蜂鳴器由P3.6口控制
  9. sbit DS=P3^7;                                        //讀取溫度引腳

  10. sbit NixieTube0_DIG1=P1^2;                 //        實(shí)際溫度顯示十位數(shù)字的數(shù)碼管位選端
  11. sbit NixieTube0_DIG2=P1^3;                 ////        實(shí)際溫度顯示個(gè)位數(shù)字的數(shù)碼管位選端
  12. sbit NixieTube1_DIG1=P1^4;                 ////        設(shè)定溫度顯示十位數(shù)字的數(shù)碼管位選端
  13. sbit NixieTube1_DIG2=P1^5;                 ////        設(shè)定溫度顯示個(gè)位數(shù)字的數(shù)碼管位選端
  14.          
  15. sbit add=P1^0; //按鍵加
  16. sbit sub=P1^1; //按鍵減

  17. unsigned char code table[]={0x82,0xF3,0x4A,0x62,0x33,0x26,0x06,0xE3,0x02,0x22};        //數(shù)碼管端碼表,相當(dāng)于顯示緩沖區(qū),依次是0——9.



  18. void delay(uint count)     //延時(shí)函數(shù),用來(lái)進(jìn)行延時(shí),應(yīng)該是毫秒級(jí)延時(shí)
  19. {
  20.   uint i;
  21.   while(count)                          // count為函數(shù)的形參,當(dāng)count為0時(shí),跳出此處while循環(huán)
  22.   {
  23.     i=200;
  24.     while(i>0)                         //
  25.     i--;                                 //此i--和while(i>0)可以看成是一個(gè)整體,當(dāng)i=0時(shí),就會(huì)跳出,執(zhí)行count--。
  26.     count--;                          //count自減一次,i就會(huì)由200減到0
  27.   }
  28. }
  29. /***********************************************************
  30. void initialize(void)//初始化函數(shù)
  31. 溫度傳感器采用的是DS18b20,此傳感器采用的
  32. 是“單總線”來(lái)傳輸數(shù)據(jù)。
  33. 在使用DS18b20時(shí),要對(duì)其進(jìn)行初始化操作,其初始化的要求是(根據(jù)DS18b20的時(shí)序圖得):
  34. (1)先將數(shù)據(jù)線置1,但是置1的時(shí)間要盡可能短(可以直接忽略此操作,因?yàn)?1單片機(jī)引腳上電默認(rèn)就是高電平。)。
  35. (2)將數(shù)據(jù)線(DS)拉低
  36. (3)延時(shí)750us左右
  37. (4)再將數(shù)據(jù)線(DS)拉高
  38. (5)進(jìn)行短暫延時(shí)
  39. *****************************************************************/
  40. void initialize(void)                //初始化
  41. {
  42.                
  43.   uint i;
  44.   DS=0;                //將DS(P3.7)引腳拉低。請(qǐng)注意,這里的DS不是變量,而是單片機(jī)的引腳!!!                       
  45.   i=103;
  46.   while(i>0)i--;   //延時(shí)
  47.   DS=1;                           //將DS拉高
  48.   i=4;
  49.   while(i>0)i--;   //短暫延時(shí)
  50. }
  51. /*************************************************************************************
  52. 說(shuō)明:DS18b20采用的是單總線,一次只能讀取溫度的1個(gè)Bit。
  53. 函數(shù)作用:bit tmpreadbit(void)  //溫度讀取函數(shù),此處讀取的是溫度的1個(gè)bit,帶返回值
  54. 函數(shù)使用舉例:A=tmpreadbit();        // 變量A保存的只是溫度的一個(gè)bit
  55. DS18B20溫度讀取時(shí)序用單片機(jī)來(lái)實(shí)現(xiàn)的步驟如下:
  56. (1) 數(shù)據(jù)線DS拉低
  57. (2) 延時(shí)6us左右
  58. (3)將數(shù)據(jù)線DS拉高
  59. (4)延時(shí)4us左右
  60. (5) 此時(shí)DS便會(huì)得到一個(gè)狀態(tài)位,即1個(gè)Bit的數(shù)據(jù)
  61. (6)延時(shí)30us左右

  62. **************************************************************************************/
  63. bit tmpreadbit(void)  //溫度讀取函數(shù),此處讀取的是溫度的1個(gè)bit.帶返回值
  64. {
  65.    uint i;
  66.    bit dat;
  67.    DS=0;i++;                  //將數(shù)據(jù)線拉低并延時(shí)
  68.    DS=1;i++;i++;          //將數(shù)據(jù)線拉高并延時(shí)
  69.    dat=DS;                          //讀取1個(gè)bit數(shù)據(jù),此處注意,DS變成了輸入引腳,DS18b20的數(shù)據(jù)會(huì)保存到局部變量dat中
  70.    i=8;while(i>0)i--;  //延時(shí)
  71.    return (dat);          //將讀取的數(shù)據(jù)返回
  72. }
  73. /***********************************************************************************************
  74. 說(shuō)明:DS18b20采用的是單總線,一次只能讀取溫度的1個(gè)Bit。溫度一共8個(gè)bit,此函數(shù)共讀了8次
  75. 函數(shù)作用:uchar tmpread(void)  //溫度讀取函數(shù),此處讀取的是溫度數(shù)據(jù)的原始數(shù)據(jù),帶返回值
  76. 函數(shù)使用舉例:A=tmpread();        // 變量A保存的是溫度的原始數(shù)據(jù)
  77. *************************************************************************************************/
  78. uchar tmpread(void)
  79. {
  80.   uchar i,j,dat;
  81.   dat=0;
  82.   for(i=1;i<=8;i++)        //采用for 循環(huán),讀取原始溫度數(shù)據(jù)
  83.   {
  84.     j=tmpreadbit();         //讀取一個(gè)位
  85.     dat=(j<<7)|(dat>>1);//讀取的溫度最低位在前,這樣剛好一個(gè)字節(jié)的溫度在dat中
  86.   }
  87.   return(dat);        //將溫度數(shù)據(jù)返回
  88. }

  89. void tmpwritebyte(uchar dat) // 寫(xiě)指令函數(shù), dat為形參。
  90. {
  91.   uint i;
  92.   uchar j;
  93.   bit testb;
  94.   for(j=1;j<=8;j++)        //for循環(huán),8次,剛好寫(xiě)一個(gè)字節(jié)
  95.   {
  96.     testb=dat&0x01;        //將形參的最低位與1相與,1&1=1,0&1=0;
  97.     dat=dat>>1;                //執(zhí)行完testb=dat&0x01;把傳入的形參右移一位,方便判斷下一位數(shù)據(jù)是0還是1,共移位8次,保證寫(xiě)入一個(gè)字節(jié)
  98.     if(testb)     //write 1
  99.     {
  100.       DS=0;
  101.       i++;i++;
  102.       DS=1;                         //DS=1的延時(shí)比較長(zhǎng),寫(xiě)入的就是1
  103.       i=8;while(i>0)i--;
  104.     }
  105.     else
  106.     {
  107.       DS=0;       //write 0
  108.       i=8;while(i>0)i--;        //DS=0的延時(shí)比較長(zhǎng),寫(xiě)入的就是0
  109.       DS=1;
  110.       i++;i++;
  111.     }

  112.   }
  113. }

  114. void tmpchange(void)         //溫度轉(zhuǎn)換函數(shù),
  115. {
  116.   initialize();         //初始
  117.   delay(1);
  118.   tmpwritebyte(0xcc); //跳過(guò)讀ROM指令
  119.   tmpwritebyte(0x44); //告訴DS18b20轉(zhuǎn)換溫度
  120. }

  121. uint tmp() //轉(zhuǎn)換函數(shù),將原始數(shù)據(jù)轉(zhuǎn)化成實(shí)際的溫度數(shù)據(jù)      
  122. {
  123.   float tt;
  124.   uchar a,b;
  125.   initialize();         //初始化
  126.   delay(1);                 //延時(shí)
  127.   tmpwritebyte(0xcc);//跳過(guò)讀ROM指令
  128.   tmpwritebyte(0xbe); //讀溫度指令
  129.   a=tmpread();        // 低8位數(shù)據(jù),即溫度的小數(shù)部分
  130.   b=tmpread(); //高8位,即溫度的整數(shù)部分
  131.   present=b;
  132.   present<<=8;  //將整數(shù)部分右移8位        
  133.   present=present|a;  //將兩個(gè)字節(jié)組合成一個(gè)字
  134.   tt=present*0.0625;   //分辨率是0.0625,即原始數(shù)據(jù)*分辨率=實(shí)際溫度
  135.   present=tt*10+0.5;   //乘10表示小數(shù)點(diǎn)后面只取一位,+0.5是表示四舍五入
  136.   return present;           //返回實(shí)際溫度
  137. }

  138.         //用的是共陽(yáng)極數(shù)碼管,顯示原理采用的是動(dòng)態(tài)顯示
  139. void display0(uint temp)   //溫度顯示函數(shù) ,temp 為形參   
  140. {
  141.         uchar A1,A2,A2t;
  142.                                         ////此處注意!因溫度讀取函數(shù)中 present=tt*10+0.5;即將溫度擴(kuò)大了10倍,所以原始溫度的十位變成了百位,
  143.                                         //各位變成了十位,十分位變成了個(gè)位,因此我們只需取百位上的數(shù)字和十位上的數(shù)字即可。注意,是數(shù)字,不是數(shù)!
  144.            A1=temp/100;         //取模,將百位數(shù)字取下,存到變量A1中,
  145.         A2t=temp%100;        //取余,比如傳進(jìn)來(lái)的temp=325,則325%100=25;
  146.         A2=A2t/10;                //將余數(shù)對(duì)10取模,比如 25/10=2;
  147.    
  148.     NixieTube0_DIG1=1; //打開(kāi)數(shù)碼管位選端
  149.     if(A1<=9|A1>=0)           //判斷A1是否位一位數(shù)字,實(shí)際溫度的十位上的數(shù)字
  150.     P2=table[A1];          //送入顯示
  151.     delay(1);                   //延時(shí),待顯示穩(wěn)定
  152.     NixieTube0_DIG1=0;        // 關(guān)斷數(shù)碼管

  153.     NixieTube0_DIG2=1;        //打開(kāi)數(shù)碼管位選端
  154.     if(A2<=9|A2>=0)            //判斷A2是否位一位數(shù)字,實(shí)際溫度的個(gè)位上的數(shù)字
  155.     P2=table[A2];                //送入顯示
  156.     delay(1);                         //延時(shí),待顯示穩(wěn)定
  157.     NixieTube0_DIG2=0;          // 關(guān)斷數(shù)碼管
  158.    

  159. }

  160. void display1(uint spare)   //設(shè)定溫度顯示      
  161. {
  162.     uchar B1,B2;
  163.     B1=spare/10;        //將設(shè)定溫度對(duì)10取模,獲取十位上的數(shù)字
  164.     B2=spare%10;        //將設(shè)定溫度對(duì)10取余,獲取個(gè)位上的數(shù)字

  165.     NixieTube1_DIG1=1; ////打開(kāi)數(shù)碼管位選端
  166.     P2=table[B1];           //送入十位上的數(shù)字
  167.     delay(1);                   ////延時(shí),待顯示穩(wěn)定
  168.     NixieTube1_DIG1=0; //關(guān)斷顯示
  169.    
  170.     NixieTube1_DIG2=1;        //打開(kāi)顯示
  171.     P2=table[B2];                //送入個(gè)位上的數(shù)字
  172.     delay(1);                        //延時(shí),待顯示穩(wěn)定
  173.     NixieTube1_DIG2=0;        //關(guān)斷顯示
  174. }

  175. void main()         //主函數(shù)
  176. {
  177.    
  178.         uchar a;
  179.         uchar b;
  180.         uchar c;

  181.         P2=0xf7; //對(duì)P2口初始化,開(kāi)機(jī)先不讓數(shù)碼管顯示
  182.         NixieTube0_DIG1=1; //初始化,數(shù)碼管位選端拉高
  183.         NixieTube0_DIG2=1;        //同上
  184.         NixieTube1_DIG1=1;        //同上
  185.         NixieTube1_DIG2=1;        //同上
  186.         buzzer=0; //蜂鳴器引腳拉低,上電,蜂鳴器響一秒
  187.         delay(1000); //延時(shí)1S左右

  188.     while(1)
  189.     {
  190.         tmpchange();//向溫度傳感器寫(xiě)入溫度轉(zhuǎn)換指令
  191.         if(add==1)         //如果 按鍵加 沒(méi)有按下
  192.                 b=1;         //b=1;b的作用相當(dāng)于松手檢測(cè)
  193.         if(add==0&b==1)        //如果按鍵按下
  194.         {
  195.                         if(setting==99)
  196.                         {}
  197.                         else
  198.                         {
  199.                                 setting++;//設(shè)定值自加一次
  200.                             b=0;   //只有按下松手后,再按 按鍵加 才能再次使設(shè)定值自加一次
  201.                         }       
  202.         };
  203.         if(sub==1)        //按鍵減未被按下
  204.                 c=1;        //作用與b相同
  205.         if(sub==0&c==1)         //如果按鍵減 被按下
  206.         {
  207.                         if(setting==0)
  208.                         {}
  209.                         else
  210.                         {
  211.                         setting--;//設(shè)定值自減一次
  212.                             c=0;   //作用同上面的b
  213.                         }

  214.         };

  215.             if(present<=setting*10)         //如果實(shí)際溫度小于設(shè)定溫度
  216.         {
  217.             buzzer=0;                 //蜂鳴器不響
  218.             led=0;                         //燈亮
  219.         }
  220.         else
  221.         {
  222.             buzzer=0;         //否則 蜂鳴器響
  223.                       led=1;                //燈不亮
  224.         }

  225.         for(a=10;a>0;a--)
  226.             {
  227.                 display0(tmp());  //顯示實(shí)際溫度
  228.                 display1(setting); //顯示設(shè)定溫度
  229.         }
  230.     }
  231. }
復(fù)制代碼


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

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 韩日精品在线观看 | 产真a观专区 | 久久精品一区 | 久久久久国产精品 | 日本高清中文字幕 | 久久亚洲天堂 | 中文字字幕一区二区三区四区五区 | 亚洲一区视频 | 日本不卡一区二区三区在线观看 | 精品欧美一区二区精品久久 | 久久久高清 | 久久久黄色 | 噜啊噜在线 | 成人在线视频一区 | 久久久久久天堂 | 久久区二区 | 美女黄网站视频免费 | 在线精品一区二区三区 | 天天操天天操 | avhd101在线成人播放 | 久久久www成人免费精品 | 国产精品久久精品 | 久久久黄色 | 日韩久久久久 | 九色网址| 国产精品永久在线观看 | 伊人伊成久久人综合网站 | 久久精品国产一区二区电影 | 亚洲成人福利在线观看 | 中日字幕大片在线播放 | 国产精品片 | 午夜三级在线观看 | 日韩中文av在线 | 精品久久久久久18免费网站 | 亚洲毛片网站 | 91亚洲精品国偷拍自产在线观看 | 亚洲精品视频三区 | av在线免费播放 | 欧美精品乱码久久久久久按摩 | 成年人网站免费视频 | 中文字幕一区二区三区精彩视频 |