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

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

QQ登錄

只需一步,快速開始

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

單片機(jī)DS18B20溫度監(jiān)控系統(tǒng)程序+Proteus仿真

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主


單片機(jī)源程序如下:
  1. #include <reg51.h>                         //包含頭文件
  2. #define uint unsigned int
  3. #define uchar unsigned char //宏定義
  4. sbit SET=P3^1;                            //定義設(shè)置鍵
  5. sbit DEC=P3^2;                            //定義減少鍵
  6. sbit ADD=P3^3;                            //定義增加鍵
  7. sbit BEEP=P3^6;                            //定義蜂鳴器
  8. sbit ALAM=P1^4;                                //定義加熱繼電器
  9. sbit ALAM1=P1^2;                        //定義制冷繼電器
  10. sbit DQ=P3^7;                             //定義DS18B20總線I/O       
  11. bit shanshuo_st;                            //閃爍間隔標(biāo)志
  12. bit beep_st;                                     //蜂鳴器間隔標(biāo)志
  13. sbit DIAN = P0^5;                        //小數(shù)點(diǎn)
  14. uchar x=0;                                      //計(jì)數(shù)器
  15. signed char m;                                     //溫度值全局變量
  16. uchar n;                                              //溫度值全局變量
  17. uchar set_st=0;                             //設(shè)置狀態(tài)標(biāo)志
  18. signed char shangxian=30;                  //上限報(bào)警溫度,默認(rèn)值為30
  19. signed char xiaxian=20;                   //下限報(bào)警溫度,默認(rèn)值為20
  20. uchar code  LEDData[]={0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x47,0xDF,0xD7,0xCF,0xDA,0x9B,0xDC,0x9B,0x8B}; //數(shù)碼管顯示碼表
  21. //====================================DS18B20=================================
  22. /*****18b20延時(shí)子程序*****/
  23. void Delay_DS18B20(int num)
  24. {
  25.   while(num--) ;
  26. }
  27. /*****初始化DS18B20*****/
  28. void Init_DS18B20(void)
  29. {
  30.   unsigned char x=0;
  31.   DQ = 1;         //DQ復(fù)位
  32.   Delay_DS18B20(8);    //稍做延時(shí)
  33.   DQ = 0;         //單片機(jī)將DQ拉低
  34.   Delay_DS18B20(80);   //精確延時(shí),大于480us
  35.   DQ = 1;         //拉高總線
  36.   Delay_DS18B20(14);
  37.   x = DQ;           //稍做延時(shí)后,如果x=0則初始化成功,x=1則初始化失敗
  38.   Delay_DS18B20(20);
  39. }
  40. /*****讀一個(gè)字節(jié)*****/
  41. unsigned char ReadOneChar(void)
  42. {
  43.   unsigned char i=0;
  44.   unsigned char dat = 0;
  45.   for (i=8;i>0;i--)        //循環(huán)8次,讀出一個(gè)字節(jié)
  46.   {
  47.     DQ = 0;     // 給脈沖信號(hào)
  48.     dat>>=1;        //數(shù)據(jù)右移一位
  49.     DQ = 1;     // 給脈沖信號(hào)
  50.     if(DQ)                //如果該位為1
  51.     dat|=0x80;        //將數(shù)據(jù) | 0x80后,存入dat
  52.     Delay_DS18B20(4);  //延時(shí)
  53.   }
  54.   return(dat);        //返回一字節(jié)數(shù)據(jù)
  55. }
  56. /*****寫一個(gè)字節(jié)*****/
  57. void WriteOneChar(unsigned char dat)
  58. {
  59.   unsigned char i=0;
  60.   for (i=8; i>0; i--)         //循環(huán)8次,寫入一個(gè)字節(jié)
  61.   {
  62.     DQ = 0;                                 //拉低
  63.     DQ = dat&0x01;                 //將dat數(shù)據(jù)&0x01后,送入IO口
  64.     Delay_DS18B20(5);         //保持一會(huì)
  65.     DQ = 1;                                 //io口拉高
  66.     dat>>=1;                         //dat右移一位
  67.   }
  68. }
  69. /*****讀取溫度*****/
  70. unsigned int ReadTemperature(void)
  71. {
  72.   unsigned char a=0;
  73.   unsigned char b=0;
  74.   unsigned int t=0;
  75.   float tt=0;
  76.   Init_DS18B20();
  77.   WriteOneChar(0xCC);  //跳過讀序號(hào)列號(hào)的操作
  78.   WriteOneChar(0x44);  //啟動(dòng)溫度轉(zhuǎn)換
  79.   Init_DS18B20();
  80.   WriteOneChar(0xCC);  //跳過讀序號(hào)列號(hào)的操作
  81.   WriteOneChar(0xBE);  //讀取溫度寄存器
  82.   a=ReadOneChar();     //讀低8位
  83.   b=ReadOneChar();    //讀高8位
  84.   t=b;                                  //將高8位數(shù)據(jù)存入t
  85.   t<<=8;                          //t左移8位
  86.   t=t|a;                          //將t|a得到一個(gè)16位的溫度數(shù)據(jù)
  87.   tt=t*0.0625;                  //一個(gè)最低位代表0.0625°C,所以要*0.0625得到實(shí)際溫度,因?yàn)橛行?shù)運(yùn)算,所以定義的tt是float浮點(diǎn)型變量
  88.   t= tt*10+0.5;     //放大10倍輸出并四舍五入(將溫度放大10倍可以得到小數(shù)部分)
  89.   return(t);                //返回得到的溫度值
  90. }
  91. //=====================================================================================
  92. /*****延時(shí)子程序*****/
  93. void Delay(uint num)
  94. {
  95. while( --num );
  96. }
  97. /*****初始化定時(shí)器0*****/
  98. void InitTimer(void)
  99. {
  100.         TMOD=0x1;          //工作方式1
  101.         TH0=0x3c;
  102.         TL0=0xb0;     //50ms(晶振12M)
  103. }
  104. /*****讀取溫度*****/
  105. void check_wendu(void)
  106. {
  107.         uint a,b,c;
  108.         c=ReadTemperature()-5;                          //獲取溫度值并減去DS18B20的溫漂誤差
  109.         a=c/100;                                                     //計(jì)算得到十位數(shù)字
  110.         b=c/10-a*10;                                            //計(jì)算得到個(gè)位數(shù)字
  111.         m=c/10;                                                      //計(jì)算得到整數(shù)位
  112.         n=c-a*100-b*10;                                    //計(jì)算得到小數(shù)位
  113.         if(m<0){m=0;n=0;}                                   //設(shè)置溫度顯示上限
  114.         if(m>99){m=99;n=9;}                                   //設(shè)置溫度顯示上限   
  115. }
  116. /*****顯示開機(jī)初始化等待畫面*****/
  117. void Disp_init(void)   
  118. {
  119.         P0 = ~0x80;      //顯示----
  120.         P2 = 0x7F;                 //依次打開各位
  121.         Delay(200);                 //延時(shí)
  122.         P2 = 0xDF;
  123.         Delay(200);   
  124.         P2 = 0xF7;
  125.         Delay(200);
  126.         P2 = 0xFD;
  127.         Delay(200);
  128.         P2 = 0xFF;         //關(guān)閉顯示
  129. }
  130. /*****顯示溫度子程序*****/
  131. void Disp_Temperature(void)     //顯示溫度
  132. {
  133.         P0 = ~0x98;      //顯示C
  134.         P2 = 0x7F;                 //打開位
  135.         Delay(400);                 //延時(shí)
  136.         P2 = 0xff;         //關(guān)閉顯示
  137.         P0=~LEDData[n];    //顯示個(gè)位
  138.         P2 = 0xDF;
  139.         Delay(400);
  140.         P2 = 0xff;         //關(guān)閉顯示
  141.         P0 =~LEDData[m%10];    //顯示十位
  142.         DIAN = 0;         //顯示小數(shù)點(diǎn)
  143.         P2 = 0xF7;
  144.         Delay(400);
  145.         P2 = 0xff;         //關(guān)閉顯示
  146.         P0 =~LEDData[m/10];    //顯示百位
  147.         P2 = 0xFD;
  148.         Delay(400);
  149.         P2 = 0xff;         //關(guān)閉顯示
  150. }
  151. /*****顯示報(bào)警溫度子程序*****/
  152. void Disp_alarm(uchar baojing)
  153. {
  154.         P0 =~0x98;      //顯示C
  155.         P2 = 0x7F;                //選中位
  156.         Delay(200);
  157.         P2 = 0xff;         //關(guān)閉顯示
  158.         P0 =~LEDData[baojing%10]; //顯示十位
  159.         P2 = 0xDF;
  160.         Delay(200);
  161.         P2 = 0xff;         //關(guān)閉顯示
  162.         P0 =~LEDData[baojing/10]; //顯示百位
  163.         P2 = 0xF7;
  164.         Delay(200);
  165.         P2 = 0xff;         //關(guān)閉顯示
  166.         if(set_st==1)P0 =~0xCE;                 //設(shè)置上限時(shí)顯示H
  167.         else if(set_st==2)P0 =~0x1A;  //設(shè)置下限時(shí)顯示L
  168.         P2 = 0xFD;
  169.         Delay(200);
  170.         P2 = 0xff;         //關(guān)閉顯示
  171. }
  172. /*****報(bào)警子程序*****/
  173. void Alarm()
  174. {
  175.         if(x>=10){beep_st=~beep_st;x=0;} //控制閃爍(x隨定時(shí)器每50ms加1,10次時(shí)500ms,這里閃爍就是500ms亮500ms滅)
  176.         if(m>=shangxian)  //溫度大于上限時(shí)
  177.         {
  178.                 ALAM=0;                  //降溫繼電器吸合
  179.                 ALAM1=1;
  180.                 if(beep_st==1)//控制蜂鳴器閃爍變量為1時(shí)
  181.                 BEEP=0;                  //蜂鳴器響
  182.                 else                  //控制蜂鳴器閃爍變量為0時(shí)
  183.                 BEEP=1;                  //蜂鳴器停止
  184.         }
  185.         else if(m<xiaxian)//溫度小于下限時(shí)
  186.         {
  187.                 ALAM1=0;          //升溫繼電器吸合
  188.                 ALAM=1;
  189.                 if(beep_st==1)//控制蜂鳴器閃爍
  190.                 BEEP=0;
  191.                 else
  192.                 BEEP=1;
  193.         }
  194.         else                          //溫度在上下限范圍內(nèi)時(shí)
  195.         {
  196.                 BEEP=1;                  //關(guān)閉蜂鳴器
  197.                 ALAM=1;                  //關(guān)閉加熱和降溫繼電器
  198.                 ALAM1=1;
  199.         }
  200. }
  201. /*****主函數(shù)*****/
  202. void main(void)
  203. {
  204.         uint z;
  205.         InitTimer();    //初始化定時(shí)器
  206.         EA=1;      //全局中斷開關(guān)
  207.         TR0=1;                 //打開定時(shí)器定時(shí)開關(guān)
  208.         ET0=1;      //開啟定時(shí)器0
  209.         IT0=1;      //外部中斷下降沿有效  
  210.         IT1=1;
  211.         check_wendu();
  212.         check_wendu();          //讀取兩次溫度,防止開機(jī)讀取到85°C,使繼電器誤操作
  213.         for(z=0;z<300;z++)        //開機(jī)畫面
  214.         {
  215.                 Disp_init();        
  216.         }
  217.         while(1)                   //while循環(huán)
  218.         {
  219.                 if(SET==0)           //判斷設(shè)置鍵是否按下
  220.                 {
  221.                         Delay(2000);         //延時(shí)去抖
  222.                         do{}while(SET==0);         //執(zhí)行空語(yǔ)句,判斷按鍵是否松開,松開向下執(zhí)行,否則重新執(zhí)行空語(yǔ)句
  223.                         set_st++;x=0;shanshuo_st=1;        //設(shè)置鍵松開后將設(shè)置變量加1,閃爍標(biāo)志位置1
  224.                         if(set_st>2)set_st=0;        //當(dāng)設(shè)置完成時(shí),退出設(shè)置
  225.                 }
  226.                 if(set_st==0) //正常工作時(shí)
  227.                 {
  228.                         EX0=0;    //關(guān)閉外部中斷0
  229.                         EX1=0;    //關(guān)閉外部中斷1
  230.                         check_wendu();
  231.                         Disp_Temperature();        //檢測(cè)溫度
  232.                         Alarm();   //報(bào)警檢測(cè)
  233.                 }
  234.                 else if(set_st==1)        //設(shè)置上限時(shí)
  235.                 {
  236.                         BEEP=1;    //關(guān)閉蜂鳴器
  237.                         ALAM=1;
  238.                         ALAM1=1;  //繼電器關(guān)閉
  239.                         EX0=1;    //開啟外部中斷0
  240.                         EX1=1;    //開啟外部中斷1
  241.                         if(x>=10){shanshuo_st=~shanshuo_st;x=0;}
  242.                         if(shanshuo_st) {Disp_alarm(shangxian);}  //閃爍
  243.                 }
  244.                 else if(set_st==2)        //設(shè)置下限時(shí)
  245.                 {
  246.                         BEEP=1;    //關(guān)閉蜂鳴器
  247.                         ALAM=1;
  248.                         ALAM1=1;   //關(guān)閉繼電器
  249.                         EX0=1;    //開啟外部中斷0
  250.                         EX1=1;    //開啟外部中斷1
  251.                         if(x>=10){shanshuo_st=~shanshuo_st;x=0;}
  252.                         if(shanshuo_st) {Disp_alarm(xiaxian);}         //閃爍
  253.                 }
  254.         }
  255. }
  256. /*****定時(shí)器0中斷服務(wù)程序*****/
  257. void timer0(void) interrupt 1
  258. {
  259. TH0=0x3c;
  260. TL0=0xb0;                 //12MHz晶振時(shí)定時(shí)50ms
  261. x++;
  262. }
  263. /*****外部中斷0服務(wù)程序*****/
  264. void int0(void) interrupt 0
  265. {
  266.         EX0=0;      //關(guān)外部中斷0
  267.         if(DEC==0&&set_st==1)           //設(shè)置上限時(shí)按下減按鍵
  268.         {
  269.                 do
  270.                 {
  271.                         Disp_alarm(shangxian);        //顯示設(shè)置
  272.                 }
  273.                 while(DEC==0);
  274.                 shangxian--;                                //將上限值減1
  275.                 if(shangxian<=xiaxian)shangxian=xiaxian+1;          //上限值最小比下限值大1
  276.         }
  277.         else if(DEC==0&&set_st==2)         //設(shè)置下限時(shí)按下減按鍵
  278.         {
  279.                 do
  280.                 {
  281.                         Disp_alarm(xiaxian);
  282.                 }
  283.                 while(DEC==0);
  284.                 xiaxian--;                                  //下限減1
  285.                 if(xiaxian<0)xiaxian=0;          //減到0時(shí)停止
  286.         }
  287. }
  288. /*****外部中斷1服務(wù)程序*****/
  289. void int1(void) interrupt 2
  290. {
  291.         EX1=0;      //關(guān)外部中斷1
  292.         if(ADD==0&&set_st==1)                 //設(shè)置上限時(shí)按下加按鍵
  293.         {
  294.                 do
  295.                 {
  296.                         Disp_alarm(shangxian);
  297.                 }
  298.                 while(ADD==0);
  299.                 shangxian++;                                 //上限值加1
  300.                 if(shangxian>99)shangxian=99;//最大加到99
  301.         }
  302.         else if(ADD==0&&set_st==2)           //設(shè)置下限時(shí)按下加按鍵
  303.         {
  304.                 do
  305.                 {
  306.                         Disp_alarm(xiaxian);
  307.                 }
  308.                 while(ADD==0);
  309.                 xiaxian++;                                   //下限加
  310.                 if(xiaxian>=shangxian)xiaxian=shangxian-1;         //下限最大加到上限值減1
  311.         }  
  312. }
復(fù)制代碼

所有資料51hei提供下載:
仿真+燒錄文件+c源碼.7z (5.43 MB, 下載次數(shù): 160)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:727755 發(fā)表于 2020-4-24 13:40 | 只看該作者
仿真是Proteus8.8才能打開的
回復(fù)

使用道具 舉報(bào)

板凳
ID:737311 發(fā)表于 2020-4-24 21:24 | 只看該作者
單片機(jī)AT89C51為核心的嗎?
回復(fù)

使用道具 舉報(bào)

地板
ID:736111 發(fā)表于 2020-4-25 01:04 來(lái)自手機(jī) | 只看該作者
想問一下這個(gè)溫度傳感器不用進(jìn)行采樣轉(zhuǎn)換嗎?可以直接用嗎?
回復(fù)

使用道具 舉報(bào)

5#
ID:700149 發(fā)表于 2020-4-26 19:03 來(lái)自手機(jī) | 只看該作者
大神還在嗎!!!那個(gè)升溫模塊為什么也是電風(fēng)扇啊,如果換成電熱絲的話要怎么操作啊
回復(fù)

使用道具 舉報(bào)

6#
ID:653838 發(fā)表于 2020-4-26 21:12 | 只看該作者
學(xué)習(xí)了,給你點(diǎn)贊。
回復(fù)

使用道具 舉報(bào)

7#
ID:1035250 發(fā)表于 2022-6-20 17:45 來(lái)自手機(jī) | 只看該作者
我想把數(shù)碼管換成1602液晶屏,代碼和仿真怎么改,有人幫我一下嗎
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 噜噜噜噜狠狠狠7777视频 | 成人深夜福利在线观看 | 久久精彩 | 亚洲成人一区 | 亚洲免费在线 | 精品久久久久久久 | 成人国产精品色哟哟 | 欧美日韩一区二区三区在线观看 | a在线观看| 国产精品二区三区 | 国产免费高清 | 国产激情偷乱视频一区二区三区 | 亚洲精品乱码 | 欧美性猛交一区二区三区精品 | 亚洲成人av | 国产中文 | 精品久久久久香蕉网 | av中文字幕在线播放 | www.中文字幕.com | 久久久www | 超碰成人免费 | 久久久久久黄 | 成人欧美一区二区三区黑人孕妇 | 国产福利观看 | 91视频在线 | 免费视频一区二区 | 另类专区亚洲 | 国产在线二区 | 成人精品国产一区二区4080 | 亚洲高清av | 亚洲免费在线观看 | 国产精品亚洲成在人线 | 亚洲欧洲中文日韩 | 尤物视频在线免费观看 | 午夜在线观看视频 | 久久精彩 | 亚洲精品一| 精品国产一区二区三区久久久四川 | 91九色porny首页最多播放 | 久久久久久国产精品免费 | 精品久久九九 |