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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機DS18B20溫度計制作 帶仿真和源碼

  [復制鏈接]
跳轉到指定樓層
樓主
1、溫度可通過調整DS18B20“+”“-”進行調整。
2、當溫度超出范圍,會有聲光報警
3、因為在proteus中找不到三極管8550,所以拿了NPN管MSP8098代替,其原理是相同的,但程序稍做修改,位選本來用低電平,現在高電平位選。
4、如何裝載程序?雙擊單片機—program file—找到相應的hex文件。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. #include<reg52.h>     //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
  2. #include<math.h>
  3. #include<INTRINS.H>

  4. #define uchar unsigned char
  5. #define uint   unsigned int

  6. /******************************************************************/
  7. /*                    定義端口                                    */
  8. /******************************************************************/
  9. sbit buzzer=P1^0;//蜂鳴器端口
  10. sbit led1=P1^1;  //led指示燈,當前溫度高于設置的最高溫度時點亮
  11. sbit led2=P1^2;  //led指示燈,當前溫度低于設置的最低溫度時點亮
  12. sbit DQ=P1^4;         //ds18b20 端口

  13. sbit key1=P3^4;  //按鍵
  14. sbit key2=P3^5;
  15. sbit key3=P3^6;
  16. sbit key4=P3^7;

  17. /******************************************************************/
  18. /*                    全局變量                                    */
  19. /******************************************************************/
  20. uint temp;//當前溫度值
  21. uchar TempH=0,TempL=0;
  22. int temp_max,temp_min;//設定溫度的最大值和最小值
  23. uchar flag_get,count,num;
  24. uchar tab[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //0~~9段碼
  25. uchar  str[4];//四位數碼管顯示字符
  26. uchar display_mod;//數碼管顯示模式
  27. /******************************************************************/
  28. /*                   函數聲明                                     */
  29. /******************************************************************/
  30. unsigned int ReadTemperature(void);//讀取溫度函數
  31. void Init_DS18B20(void);//18b20初始化函數
  32. unsigned char ReadOneChar(void);//18B20讀一個字節
  33. void WriteOneChar(unsigned char dat);//18B20寫一個字節
  34. void delay(unsigned int i);//短延時
  35. void delay_ms(uint z);//長延時
  36. void alarm();//報警
  37. void keyscan();//鍵盤掃描
  38. /******************************************************************/
  39. /*                    主函數                                      */
  40. /******************************************************************/
  41. main()
  42. {
  43.         uchar buzzer_delay=0;//蜂鳴器延時計數
  44.         uchar buzzer_work=0;//蜂鳴器開始工作
  45.         display_mod=0;//顯示當前溫度
  46.         temp_min=10;//設置最低溫  
  47.         temp_max=40;//設置最高溫
  48.         TMOD|=0x01;//定時器設置
  49.         TH0=0xef;  //定時器初值
  50.         TL0=0xf0;
  51.         IE=0x82;//EA=1,ET0=1
  52.         TR0=1;  //開定時器
  53.         P2=0xff;  
  54.         count=0;
  55.         buzzer=0;
  56.         while(1)
  57.         {
  58.                   keyscan();//獨立按鍵掃描
  59.                        
  60.                 if(flag_get==1)
  61.                 {   buzzer_delay++;
  62.                         flag_get=0;// 獲取溫度標志清零
  63.                         temp=ReadTemperature();//讀溫度值
  64.                 }                       

  65.                 if(display_mod==0)
  66.                 {
  67.                         if(temp&0x8000)
  68.                      {
  69.                              str[0]=0xbf;//負號標志
  70.                              temp=~temp; //取反加1
  71.                                  temp +=1;
  72.                          }
  73.                         else
  74.                         {
  75.                                 str[0]=0xff;
  76.                         }
  77.                         TempH=temp>>4;
  78.                           TempL=temp&0x0F;
  79.                           TempL=TempL*6/10;//小數近似處理
  80.                        
  81.                         str[1]=tab[(TempH%100)/10]; //十位溫度
  82.                            str[2]=tab[(TempH%100)%10]&0x7f; //個位溫度,帶小數點
  83.                            str[3]=tab[TempL];                       
  84.                 }
  85.                 else if(display_mod==1)//顯示最低溫
  86.                 {
  87.                         str[0]=0xc7;//顯示L
  88.                         str[1]=tab[temp_min/100]; //溫度百位
  89.                            str[2]=tab[(temp_min%100)/10]; //溫度十位
  90.                            str[3]=tab[temp_min%10];//溫度個位
  91.                 }
  92.                 else if(display_mod==2)//顯示最高溫
  93.                 {
  94.                         str[0]=0x89;//顯示H
  95.                         str[1]=tab[temp_max/100]; //溫度百位
  96.                            str[2]=tab[(temp_max%100)/10]; //溫度十位
  97.                            str[3]=tab[temp_max%10];//溫度個位       
  98.                 }
  99.                 if(buzzer_delay>5)//為了防止溫度獲取前就會出現報警
  100.                 {
  101.                         buzzer_work=1;
  102.                 }
  103.                 if(buzzer_work==1)
  104.                         alarm();

  105.           }
  106. }


  107. /******************************************************************/
  108. /*                  定時器中斷                                    */
  109. /******************************************************************/
  110. void tim(void) interrupt 1 using 1//中斷,用于數碼管掃描和溫度檢測間隔
  111. {
  112.         TH0=0xea;//定時器重裝值
  113.         TL0=0xf0;
  114.         num++;
  115.         if (num==100)
  116.     {
  117.                 num=0;
  118.                   flag_get=1;//獲取溫度標志位有效
  119.         }
  120.         count++;
  121.         if(count==1)
  122.            {
  123.                 //P2=0Xfe;
  124.                 P2=0x01;
  125.             P0=str[0];
  126.         }//數碼管掃描
  127.         if(count==2)
  128.    {
  129.                 if(str[1]==tab[0])
  130.                         str[1]=0xff;//顯示為空
  131.                    //P2=0Xfd;
  132.                 P2=0x02;
  133.             P0=str[1];
  134.         }
  135.         if(count==3)
  136.    {
  137.                 //P2=0Xfb;
  138.                 P2=0x04;
  139.              P0=str[2];
  140.    }
  141.         if(count==4)
  142.    {
  143.                 //P2=0Xf7;
  144.                 P2=0x08;
  145.              P0=str[3];
  146.                 count=0;
  147.    }
  148. }
  149. /******************************************************************/
  150. /*                    長延時函數                                  */
  151. /******************************************************************/
  152. void delay_ms(uint z) //長延時函數
  153. {
  154.         uint x,y;
  155.         for(x=z;x>0;x--)
  156.                 for(y=110;y>0;y--);
  157. }
  158. /******************************************************************/
  159. /*                    短延時函數                                  */
  160. /******************************************************************/
  161. void delay(unsigned int i)//短延時函數
  162. {
  163.         while(i--);
  164. }

  165. /******************************************************************/
  166. /*                    初始化                                      */
  167. /******************************************************************/
  168. void Init_DS18B20(void)
  169. {
  170.         /*unsigned char x=0;
  171.         DQ = 1;    //DQ復位
  172.         delay(8);  //稍做延時
  173.         DQ = 0;    //單片機將DQ拉低
  174.         delay(80); //精確延時 大于 480us
  175.         DQ = 1;    //拉高總線
  176.         delay(10);
  177.         x=DQ;      //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
  178.         delay(5);*/
  179.         unsigned char x=0;
  180.         DQ = 1;    //DQ復位
  181.         delay(8);  //稍做延時
  182.         DQ = 0;    //單片機將DQ拉低
  183.         delay(80); //精確延時 大于 480us
  184.         DQ = 1;    //拉高總線
  185.         delay(14);
  186.         x=DQ;      //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
  187.         delay(20);
  188. }

  189. /******************************************************************/
  190. /*                    讀一個字節                                  */
  191. /******************************************************************/
  192. unsigned char ReadOneChar(void)
  193. {
  194.         unsigned char i=0;
  195.         unsigned char dat = 0;
  196.         for (i=8;i>0;i--)
  197.         {
  198.                   DQ = 0; // 給脈沖信號
  199.                   dat>>=1;
  200.                   DQ = 1; // 給脈沖信號
  201.                   if(DQ)
  202.                            dat|=0x80;
  203.                   delay(5);
  204.         }
  205.         return(dat);
  206. }

  207. /******************************************************************/
  208. /*                 寫一個字節                                     */
  209. /******************************************************************/
  210. void WriteOneChar(unsigned char dat)
  211. {
  212.         unsigned char i=0;
  213.         for (i=8; i>0; i--)
  214.         {
  215.           DQ = 0;
  216.           DQ = dat&0x01;
  217.           delay(5);
  218.           DQ = 1;
  219.           dat>>=1;
  220.         }
  221.         delay(5);
  222. }

  223. /******************************************************************/
  224. /*                   讀取溫度                                     */
  225. /******************************************************************/
  226. unsigned int ReadTemperature(void)
  227. {       
  228.         unsigned char a=0;
  229.         unsigned int b=0;
  230.         unsigned int t=0;
  231.         Init_DS18B20();
  232.         WriteOneChar(0xCC); // 跳過讀序號列號的操作
  233.         WriteOneChar(0x44); // 啟動溫度轉換
  234.         delay(200);
  235.         Init_DS18B20();
  236.         WriteOneChar(0xCC); //跳過讀序號列號的操作
  237.         WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
  238.         a=ReadOneChar();   //低位
  239.         b=ReadOneChar();   //高位
  240.         b<<=8;
  241.         t=a+b;
  242.         return(t);
  243. }

  244. /******************************************************************/
  245. /*              獨立鍵盤掃描函數并顯示設定的溫度                  */
  246. /******************************************************************/
  247. void keyscan()  
  248. {       
  249.         static uchar keynum;//用于切換界面時按鍵計數
  250.         P3=0xff;//拉高P3口,以讀取P3口的值
  251.         if(key4==0)//設置鍵
  252.         {
  253.                 delay_ms(5);//延時消抖
  254.                 if(key4==0)
  255.                 {
  256.                         keynum++;
  257.                         keynum%=2;//在0、1間變化
  258.                         if(keynum==1)
  259.                         {
  260.                                 display_mod=1;
  261.                         }
  262.                         else
  263.                         {
  264.                                 display_mod=2;
  265.                         }
  266.                 }
  267.                 while(!key4);//松手檢測
  268.         }
  269.         if(key3==0)//確定鍵
  270.         {
  271.                 delay_ms(5);
  272.                 if(key3==0)
  273.                 {
  274.                         keynum=0;
  275.                         display_mod=0;
  276.                 }
  277.                 while(!key3);
  278.         }
  279.         if(key2==0)//加鍵
  280.         {
  281.                 delay_ms(5);//延時消抖
  282.                 if(key2==0)
  283.                 {
  284.                         if(display_mod==2)
  285.                         {
  286.                                 temp_max++;
  287.                                 if(temp_max>=99)
  288.                                         temp_max=99;
  289.                         }
  290.                         if(display_mod==1)
  291.                         {
  292.                                 temp_min++;
  293.                                 if(temp_min>=temp_max)
  294.                                         temp_min=temp_max;
  295.                         }
  296.                        
  297.                 }
  298.                 while(!key2);//松手檢測
  299.         }
  300.         if(key1==0)//減鍵
  301.         {
  302.                 delay_ms(5);
  303.                 if(key1==0)
  304.                 {
  305.                         if(display_mod==2)
  306.                         {
  307.                                 temp_max--;
  308.                                 if(temp_max<=temp_min)
  309.                                         temp_max=temp_min;
  310.                         }
  311.                         if(display_mod==1)
  312.                         {
  313.                                 temp_min--;
  314.                                 if(temp_min<=0)
  315.                                         temp_min=0;
  316.                         }
  317.                 }
  318.                 while(!key1);//松手檢測
  319.         }

  320. }

  321. /******************************************************************/
  322. /*                  蜂鳴器報警程序                                */
  323. /******************************************************************/
  324. void alarm()
  325. {
  326.         if(display_mod==0)//在顯示當前溫度時報警才會動作
  327.         {
  328.         if(TempH<(temp_min))
  329.         {
  330.                 led1=0;
  331.                 led2=1;
  332.                 buzzer=~buzzer;
  333.         }
  334.         else if(TempH>=(temp_max))
  335.         {
  336.                 led1=1;
  337.                 led2=0;
  338.                 buzzer=~buzzer;
  339.         }
  340.         else
  341.         {
  342.                 led1=1;
  343.                 led2=1;
  344.                 buzzer=0;
  345.         }
  346.         }
  347. }

復制代碼

所有資料51hei提供下載:
3 protues仿真.zip (71.5 KB, 下載次數: 308)


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:348549 發表于 2018-6-10 15:34 來自手機 | 只看該作者
我用msps6534三極管,這個設計該怎么該
回復

使用道具 舉報

板凳
ID:356418 發表于 2018-6-23 01:00 | 只看該作者
看好,不錯,學習了
回復

使用道具 舉報

地板
ID:358464 發表于 2018-9-21 12:46 | 只看該作者
參考一下,感謝!
回復

使用道具 舉報

5#
ID:356963 發表于 2018-9-22 00:06 來自手機 | 只看該作者
注釋好詳細呀,感謝分享
回復

使用道具 舉報

6#
ID:367428 發表于 2018-9-24 09:41 | 只看該作者
求教如何寫這個代碼

new image - 1wnty.jpg (121.62 KB, 下載次數: 64)

new image - 1wnty.jpg
回復

使用道具 舉報

7#
ID:255559 發表于 2018-9-25 17:18 | 只看該作者
我按照原理圖焊了板子,數碼管顯示亂碼,我用的共陽數碼管
回復

使用道具 舉報

8#
ID:402375 發表于 2018-9-25 20:30 | 只看該作者
學習了 謝謝樓主
回復

使用道具 舉報

9#
ID:402394 發表于 2018-9-25 21:13 | 只看該作者
頂一下
回復

使用道具 舉報

10#
ID:401656 發表于 2018-9-26 16:26 | 只看該作者
這是用的陽極數碼管還是陰極的?
回復

使用道具 舉報

11#
ID:313459 發表于 2018-9-26 20:30 來自手機 | 只看該作者
正在學這個很有幫助
回復

使用道具 舉報

12#
ID:120930 發表于 2018-10-24 13:18 | 只看該作者
下載了  解壓后 沒有wendu.dsn文件
回復

使用道具 舉報

13#
ID:443131 發表于 2018-12-13 11:49 | 只看該作者
數碼管不顯示負號怎么辦
回復

使用道具 舉報

14#
ID:463623 發表于 2019-1-7 17:09 | 只看該作者
新手村村長 發表于 2018-12-13 11:49
數碼管不顯示負號怎么辦

能發我一份嗎謝謝,1179364571@qq.com
回復

使用道具 舉報

15#
ID:617770 發表于 2019-9-28 23:11 | 只看該作者
這個設計真的秀
回復

使用道具 舉報

16#
ID:617770 發表于 2019-9-28 23:11 | 只看該作者
學到了
回復

使用道具 舉報

17#
ID:623610 發表于 2019-10-14 08:38 來自手機 | 只看該作者
學習了 謝謝樓主
回復

使用道具 舉報

18#
ID:555539 發表于 2019-10-26 14:21 | 只看該作者
學習學習
回復

使用道具 舉報

19#
ID:845576 發表于 2020-12-7 12:38 | 只看該作者

這個要自己慢慢研究
回復

使用道具 舉報

20#
ID:845549 發表于 2020-12-8 15:12 | 只看該作者
請問百位和負號不顯示該怎么解決呢
回復

使用道具 舉報

21#
ID:848824 發表于 2021-1-9 09:38 來自手機 | 只看該作者
這個做個保溫箱挺好
回復

使用道具 舉報

22#
ID:848824 發表于 2021-1-12 08:07 來自手機 | 只看該作者
怎么改低電平輸出啊!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩欧美二区 | 亚洲欧美一区二区三区国产精品 | 91色网站 | 最新国产视频 | www久久| 韩日一区二区 | 欧美视频一区 | 欧美精品一区二区免费 | 黄色毛片大全 | 青青草在线视频免费观看 | 亚洲精品久久国产高清情趣图文 | 在线 丝袜 欧美 日韩 制服 | 欧美激情久久久 | 精品国产欧美一区二区三区成人 | 亚洲一区二区免费电影 | 91香蕉视频在线观看 | 欧美在线视频一区 | 欧美日韩在线一区二区三区 | 超碰520 | 瑟瑟视频在线看 | 欧美激情一区 | 午夜影晥 | 精品99在线 | 欧美日一区| caoporn国产| 殴美成人在线视频 | 国产精品免费看 | 中文字幕在线免费观看 | 国产精品明星裸体写真集 | 91原创视频在线观看 | 怡红院免费的全部视频 | 国产一区二区免费电影 | 日韩一区不卡 | www.9191.com| 国产中文区二幕区2012 | 欧美一级视频免费看 | 国产黄色精品在线观看 | 国产传媒| 欧美日韩在线免费观看 | 一区二区三区在线 | 亚洲精品国产电影 |