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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

DS18B20溫度傳感器程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:912927 發(fā)表于 2021-4-27 11:21 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  1. #include<reg52.h>                    //包含頭文件
  2. #include<math.h>
  3. #define ui unsigned int
  4. #define uc unsigned char           //宏定義


  5. sbit DQ =P3^7;                             //定義DS18B20總線I/O


  6. sbit LEDR=P1^2;
  7. sbit LEDG=P1^1;
  8. sbit LEDB=P1^0;      


  9. bit bdata fuhao;                        //符號
  10. uc qian,bai,shi,ge;                        //讀取溫度值的千、百、十和個(gè)位(例如實(shí)際溫度是123.4攝氏度,在程序里處理數(shù)據(jù)時(shí)會放大10倍,就是小數(shù)點(diǎn)右移一位,方便處理,就是處理的是1234)
  11. uc code led[]                =        {0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x47,0xDF,0xD7};           //數(shù)碼管對應(yīng)的數(shù)字的段碼
  12. uc code led_dian[]        =        {0x7f,0x64,0xbd,0xf5,0xe6,0xf3,0xfb,0x67,0xff,0xf7};           //有小數(shù)點(diǎn)的數(shù)字段碼表
  13. uc m;
  14. uc NUM_R=0,NUM_G=0,NUM_B=0;
  15. uc DIS;
  16. ui zan=25;
  17. //============================================================================================
  18. //====================================DS18B20=================================================
  19. //============================================================================================


  20. /*****延時(shí)子程序*****/
  21. void Delay(int num)
  22. {
  23.         while(num--) ;           //num減占用系統(tǒng)資源,用于延時(shí)
  24. }
  25. /*****初始化DS18B20*****/
  26. void Init_DS18B20()
  27. {
  28.         DQ = 1;         //DQ復(fù)位,就是拉高電平
  29.         Delay(8);    //稍做延時(shí)
  30.         DQ = 0;         //單片機(jī)將DQ拉低
  31.         Delay(80);   //精確延時(shí),大于480us
  32.         DQ = 1;         //拉高總線
  33.         Delay(40);                //延時(shí)
  34. }
  35. /*****讀一個(gè)字節(jié)*****/
  36. uc ReadOneChar()
  37. {
  38.         uc i=0;
  39.         uc dat = 0;                                 //定義變量用于循環(huán)和讀取數(shù)據(jù)
  40.         for (i=8;i>0;i--)                 //循環(huán)8次
  41.         {
  42.                 DQ = 0;     //拉低
  43.                 dat>>=1;        //數(shù)據(jù)右移一位
  44.                 DQ = 1;     //拉高
  45.                 if(DQ)                //判斷是否是高電平
  46.                 dat|=0x80;        //是高電平的話,就讓dat的最好為為1
  47.                 Delay(4);        //延時(shí)
  48.         }
  49.         return(dat);        //返回讀取到的數(shù)據(jù)
  50. }
  51. /*****寫一個(gè)字節(jié)*****/
  52. void WriteOneChar(uc dat)
  53. {
  54.         uc i=0;                                        //定義變量用于循環(huán)
  55.         for (i=8; i>0; i--)                //循環(huán)八次
  56.         {
  57.                 DQ = 0;                                //低電平
  58.                 DQ = dat&0x01;                //最低位是0的話,DQ就等于0;最低位是1的話,DQ就等于1
  59.                 Delay(5);                        //延時(shí)
  60.                 DQ = 1;                                //拉高
  61.                 dat>>=1;                        //右移一位
  62.         }
  63. }
  64. /*****讀取溫度*****/
  65. ui ReadTemperature()
  66. {
  67.   ui a=0,b=0,t=0;                 
  68.   float tt=0;                         //定義讀取溫度變量
  69.   Init_DS18B20();                 //初始化18B20
  70.   WriteOneChar(0xCC);  //跳過讀序號列號的操作
  71.   WriteOneChar(0x44);  //啟動溫度轉(zhuǎn)換
  72.   Init_DS18B20();           //初始化18B20
  73.   WriteOneChar(0xCC);  //跳過讀序號列號的操作
  74.   WriteOneChar(0xBE);  //讀取溫度寄存器
  75.   a=ReadOneChar();     //讀低8位
  76.   b=ReadOneChar();    //讀高8位
  77.   t=b;                                   //高八位的數(shù)據(jù)提取到t
  78.   t<<=8;                           //高八位數(shù)據(jù)左移八位
  79.   t=t|a;                           //高位和低八位數(shù)據(jù)組成一個(gè)數(shù)據(jù)
  80.   if(t&0xf800)                   //判斷是否是負(fù)溫度
  81.   {
  82.         t=~t+1;                           //將負(fù)溫度值取反加一得到實(shí)際溫度值
  83.         fuhao=1;                   //符號位為負(fù)
  84.   }
  85.   else                                   //如果是正溫度
  86.   fuhao=0;                           //符號位為正
  87.   tt=t*0.0625;                   //乘以0.0625得到實(shí)際溫度
  88.   t=tt*10+0.5;     //放大10倍輸出并四舍五入
  89.   return(t);           //返回溫度數(shù)據(jù)
  90. }


  91. /*****讀取溫度*****/
  92. void check_wendu()
  93. {
  94.         ui f;
  95. //        TR0=0;
  96. //        zan=f;
  97.         f=ReadTemperature();                          //獲取溫度值并減去DS18B20的溫漂誤差
  98. //        TR0=1;
  99. //        if(abs(f-zan)>50) f=zan;
  100.         qian=f/1000;                                                                //計(jì)算得到實(shí)際的百位數(shù)字
  101.         bai=(f%1000)/100;                                                     //計(jì)算得到實(shí)際的十位數(shù)字
  102.         shi=((f%1000)%100)/10;                                            //計(jì)算得到實(shí)際的個(gè)位數(shù)字
  103.         ge=((f%1000)%100)%10;                                                      //計(jì)算得到實(shí)際的小數(shù)位
  104. }
  105. /*****顯示開機(jī)初始化等待畫面*****/
  106. void Disp_init()
  107. {
  108.         P0 = 0x7f;      //顯示----
  109.         P2 = 0x7f;
  110.         Delay(100);
  111.         P2 = 0xdf;
  112.         Delay(100);   
  113.         P2 = 0xf7;
  114.         Delay(100);
  115.         P2 = 0xfd;
  116.         Delay(100);
  117.         P2 = 0xff;         //關(guān)閉顯示
  118. }
  119. /*****顯示溫度子程序*****/
  120. void Disp_Temperature()     //顯示溫度
  121. {
  122.                         if(qian==0)                  //千位等于0
  123.                         {
  124.                                 if(fuhao==1)  //是負(fù)溫度
  125.                                 P0=0x7f;      //顯示-
  126.                                 else                  //是正溫度
  127.                                 P0=0xff;          //不顯示
  128.                         }
  129.                         else if(qian!=0)          //千位不等于0
  130.                         P0 =~led[qian];          //顯示千位數(shù)據(jù)
  131.                         P2 = 0xfd;                  //打開第一位位選
  132.                         Delay(10);
  133.                         P2 = 0xff;                  //關(guān)閉位選


  134.                         if((bai==0)&&(qian==0))//百位千位都是0
  135.                         P0=0xff;    //不顯示
  136.                         else if((bai!=0)||(qian!=0))//千位或者百位不等于0
  137.                         P0=~led[bai];                        //正常顯示百位數(shù)據(jù)
  138.                         P2=0xf7;                 //打開第二位
  139.                         Delay(10);
  140.                         P2 = 0xff;                  //關(guān)閉位選


  141.                         P0=~led_dian[shi];    //顯示十位數(shù)據(jù)
  142.                         P2=0xdf;                          //打開第三位
  143.                         Delay(10);
  144.                         P2 = 0xff;                  //關(guān)閉位選


  145.                         P0=~led[ge];                     //顯示個(gè)位數(shù)據(jù)
  146.                         P2=0x7f;                          //打開第四位
  147.                         Delay(10);
  148.                         P2 = 0xff;                  //關(guān)閉位選


  149. }
  150. /*****主函數(shù)*****/
  151. void main()
  152. {
  153.         uc z;                        //定義變量用于for循環(huán)
  154.         for(z=0;z<100;z++)        //循環(huán)100次讀取溫度并顯示開機(jī)畫面,防止開機(jī)顯示85
  155.         {
  156.                 Disp_init();        //開機(jī)初始化顯示
  157.                 ReadTemperature();
  158.         }
  159.         while(1)                //進(jìn)入while循環(huán)
  160.         {
  161.                 check_wendu();        //讀取溫度
  162. //                Delay(20000);
  163.                 if(fuhao==0)
  164.                 {
  165.                         if((qian*100+bai*10+shi)>=0&&(qian*100+bai*10+shi)<10)                  {NUM_R=0;        NUM_G=2;        NUM_B=8;}         //溫度在0-10度之間,顏色:青色偏藍(lán),狀態(tài):寒冷
  166.                         else if((qian*100+bai*10+shi)>=10&&(qian*100+bai*10+shi)<20) {NUM_R=0;        NUM_G=3;        NUM_B=5;}         //溫度在10-20度之間,顏色:青色,狀態(tài):冷
  167.                         else if((qian*100+bai*10+shi)>=20&&(qian*100+bai*10+shi)<30) {NUM_R=0;        NUM_G=5;        NUM_B=0;}         //溫度在20-30度之間,顏色:綠色,狀態(tài):舒適
  168.                         else if((qian*100+bai*10+shi)>=30&&(qian*100+bai*10+shi)<35) {NUM_R=7;        NUM_G=2;        NUM_B=0;}         //溫度在30-35度之間,顏色:黃色,狀態(tài):熱
  169.                         else if((qian*100+bai*10+shi)>=35) {NUM_R=10;        NUM_G=0;        NUM_B=0;}                                                         //溫度在35度以上,顏色:紅色,狀態(tài):炎熱




  170. //                        if((qian*100+bai*10+shi)>=24&&(qian*100+bai*10+shi)<25)                  {NUM_R=0;        NUM_G=2;        NUM_B=8;}         //溫度在0-10度之間,顏色:青色偏藍(lán),狀態(tài):寒冷
  171. //                        else if((qian*100+bai*10+shi)>=25&&(qian*100+bai*10+shi)<26) {NUM_R=0;        NUM_G=3;        NUM_B=5;}         //溫度在10-20度之間,顏色:青色,狀態(tài):冷
  172. //                        else if((qian*100+bai*10+shi)>=26&&(qian*100+bai*10+shi)<27) {NUM_R=0;        NUM_G=5;        NUM_B=0;}         //溫度在20-30度之間,顏色:綠色,狀態(tài):舒適
  173. //                        else if((qian*100+bai*10+shi)>=27&&(qian*100+bai*10+shi)<28) {NUM_R=7;        NUM_G=2;        NUM_B=0;}         //溫度在30-35度之間,顏色:黃色,狀態(tài):熱
  174. //                        else if((qian*100+bai*10+shi)>=28) {NUM_R=10;        NUM_G=0;        NUM_B=0;}                                                         //溫度在35度以上,顏色:紅色,狀態(tài):炎熱
  175. //                        else if((qian*100+bai*10+shi)<24) {NUM_R=0;NUM_G=0;NUM_B=10;}
  176.                 }
  177.                 else                                                                                                                                                                                                 //溫度為負(fù)值,零下,顏色:藍(lán)色,狀態(tài):冰凍
  178.                 {
  179.                         NUM_R=0;NUM_G=0;NUM_B=10;
  180.                 }


  181.                 for(z=0;z<10;z++)        //顯示10次
  182.                 {
  183.                         Disp_Temperature();        //調(diào)用顯示函數(shù)
  184.                         m++;
  185.                         if(m<NUM_R) LEDR=0;
  186.                         else LEDR=1;
  187.                         if(m<NUM_G) LEDG=0;
  188.                         else LEDG=1;
  189.                         if(m<NUM_B) LEDB=0;
  190.                         else LEDB=1;
  191.                         if(m>=10) m=0;
  192.                 }
  193.         }
  194. }
復(fù)制代碼


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

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久九九99 | 97超碰人人草 | 免费国产视频 | 日韩在线播放中文字幕 | 色网站在线免费观看 | 国产片侵犯亲女视频播放 | 国产美女特级嫩嫩嫩bbb片 | 做a网站| 亚洲国产精品视频 | 久久激情视频 | 国产九九九九 | 网站黄色在线免费观看 | 日韩欧美在线视频 | 伊人春色成人 | 亚洲视频中文 | 日韩av成人在线观看 | 久久久久久国产精品mv | 密色视频 | 国产精品久久久久久久岛一牛影视 | 中文字幕一区在线观看视频 | 羞羞视频在线观看 | 精品一区二区三区免费视频 | 91视频在线看 | 九九色综合 | 国产精品99久久久久久动医院 | 巨大荫蒂视频欧美另类大 | 亚洲欧美在线观看 | 中文在线一区 | 天天影视亚洲综合网 | 欧美二区三区 | 亚洲欧洲小视频 | 欧美视频一区二区三区 | 欧美一区二区另类 | 男女又爽又黄视频 | 日韩色在线 | 91精品国产一区二区三区蜜臀 | 日韩一区二区三区视频 | 日屁网站 | 久久久久国产 | 亚洲久久久 | 免费看一区二区三区 |