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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機檢測環境溫度,可通過按鍵設置溫度,當環境溫度高于上下限時,蜂鳴器報警,L...

[復制鏈接]
跳轉到指定樓層
樓主
ID:595055 發表于 2019-8-15 21:38 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
檢測環境溫度,可通過按鍵設置上下限溫度,當環境溫度高于上下限溫度時,蜂鳴器和LED報警,同時LED顯示當前溫度值和設定溫度值

單片機源程序如下:
  1. #include<reg52.h>
  2. #include "intrins.h"
  3. typedef unsigned char uint8;
  4. typedef unsigned int uint16;
  5. sbit rs=P2^6;         // 數據命令選擇
  6. sbit rw=P2^5;         //讀寫選擇
  7. sbit e=P2^7;          //使能

  8. sbit k1=P3^1; //模式
  9. sbit k2=P3^0; //加
  10. sbit k3=P3^2; //減

  11. //sbit DHT11_DQ_OUT=P3^2;
  12. sbit led1=P2^0;
  13. sbit led2=P2^1;
  14. sbit bz=P1^5;

  15. sbit dq=P3^7;

  16. uint8 mode=0,xian;
  17. char temph=35,templ=20;
  18. //char humih=80,humil=20;
  19. uint8 temp,humi;
  20. uint8 flag;          //設定報警標志
  21. uint8 a,c,tempvalue;
  22. uint8 code num[10]="0123456789";

  23. uint8 code str1[]="Temp:";  //溫度
  24. uint8 code str2[]="Humi:";  //濕度
  25. uint8 code str3[]="Error";  
  26. uint8 code str4[]="Success    ";
  27. uint8 code str5[]="%RH";
  28. uint8 code str6[]="TempH:";          //設定溫度上限顯示
  29. uint8 code str7[]="TempL:";          //設定溫度下限顯示
  30. uint8 code str8[]="HumiH:";           //設定濕度上限顯示
  31. uint8 code str9[]="HumiL:";           //設定濕度下限顯示


  32. void delay(uint16 i)
  33. {
  34.         while(i--);
  35. }

  36. void delay_ms(uint16 i)
  37. {
  38.         while(i--);
  39.         delay(90);
  40. }

  41. void sound()
  42. {
  43.         int n=100;
  44.         while(n--)
  45.         {
  46.                 bz=~bz;
  47.                 delay(100);       
  48.         }
  49. }
  50. void wrc(uint8 c)         //寫命令
  51. {
  52.         delay(1000);
  53.         rs=0;
  54.         rw=0;
  55.         e=0;
  56.         P0=c;
  57.         e=1;
  58.         delay(10);
  59.         e=0;
  60. }
  61. void wrd(uint8 dat)          //寫數據
  62. {
  63.         delay(1000);
  64.         rs=1;
  65.         rw=0;
  66.         e=0;
  67.         P0=dat;
  68.         e=1;
  69.         delay(10);
  70.         e=0;
  71.         rs=0;
  72. }
  73. void lcd_init()           // LCD1602初始化
  74. {
  75.         delay(1000);
  76.         wrc(0x38);
  77.         wrc(0x38);         //功能設置命令,選擇8位總線,雙行顯示  5*7點陣字符
  78.         wrc(0x38);
  79.         wrc(0x06);        //光標和顯示模式設置  光標右移  整屏不移動
  80.         wrc(0x0c);        //顯示開關控制  開顯示  無光標 光標不閃爍
  81.         wrc(0x01);        //清零指令  固定的
  82. }
  83. //復位DHT11
  84. //void DHT11_Rst()          
  85. //{                 
  86. //    DHT11_DQ_OUT=0;         //拉低DQ
  87. //    delay_ms(20);            //拉低至少18ms
  88. //    DHT11_DQ_OUT=1;         //DQ=1
  89. //        delay(3);             //主機拉高20~40us
  90. //}

  91. //等待DHT11的回應
  92. //返回1:未檢測到DHT11的存在
  93. //返回0:存在
  94. //uint8 DHT11_Check()           
  95. //{   
  96. //        uint8 retry=0;         
  97. //    while (DHT11_DQ_OUT&&retry<100)//DHT11會拉低40~50us
  98. //        {
  99. //                retry++;
  100. //                _nop_();
  101. //        };         
  102. //        if(retry>=100)return 1;
  103. //        else retry=0;
  104. //    while (!DHT11_DQ_OUT&&retry<100)//DHT11拉低后會再次拉高40~50us
  105. //        {
  106. //                retry++;
  107. //                _nop_();
  108. //        };
  109. //        if(retry>=100)return 1;            
  110. //        return 0;
  111. //}


  112. //DHT11初始化
  113. //返回0:初始化成功,1:失敗
  114. //uint8 DHT11_Init()
  115. //{
  116. //        DHT11_Rst();          
  117. //        return DHT11_Check();       
  118. //}


  119. //從DHT11讀取一個位
  120. //返回值:1/0
  121. //uint8 DHT11_Read_Bit(void)                          
  122. //{
  123. //         uint8 retry=0;
  124. //        while(DHT11_DQ_OUT&&retry<100)//等待變為低電平 12-14us 開始
  125. //        {
  126. //                retry++;
  127. //                _nop_();
  128. //        }
  129. //        retry=0;
  130. //        while((!DHT11_DQ_OUT)&&retry<100)//等待變高電平         26-28us表示0,116-118us表示1
  131. //        {
  132. //                retry++;
  133. //                _nop_();
  134. //        }
  135. //        delay(1);//等待40us
  136. //        if(DHT11_DQ_OUT)return 1;
  137. //        else return 0;                  
  138. //}

  139. //從DHT11讀取一個字節
  140. //返回值:讀到的數據
  141. //uint8 DHT11_Read_Byte(void)   
  142. //{        
  143. //    uint8 i,dat=0;
  144. //        for (i=0;i<8;i++)
  145. //        {
  146. //                   dat<<=1;
  147. //            dat|=DHT11_Read_Bit();
  148. //    }                                                    
  149. //    return dat;
  150. //}

  151. //從DHT11讀取一次數據
  152. //temp:溫度值(范圍:0~50°)
  153. //humi:濕度值(范圍:20%~90%)
  154. //返回值:0,正常;1,讀取失敗
  155. //uint8 DHT11_Read_Data(uint8 *temp,uint8 *humi)   
  156. //{        
  157. //         uint8 buf[5];
  158. //        uint8 i;
  159. //        DHT11_Rst();
  160. //        if(DHT11_Check()==0)
  161. //        {
  162. //                for(i=0;i<5;i++)//讀取40位數據
  163. //                {
  164. //                        buf[i]=DHT11_Read_Byte();
  165. //                }
  166. //                if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
  167. //                {
  168. //                        *humi=buf[0];
  169. //                        *temp=buf[2];
  170. //                }
  171. //               
  172. //        }else return 1;
  173. //        return 0;            
  174. //}




  175. void ds18b20init()                //18b20的初始化
  176. {
  177.         dq=1;
  178.         delay(1);
  179.         dq=0;
  180.         delay(80);
  181.         dq=1;
  182.         delay(5);
  183.         dq=0;
  184.         delay(20);
  185.         dq=1;
  186.         delay(35);
  187. }
  188. void ds18b20wr(uint8 dat)          //18b20寫數據
  189. {
  190.         uint8 i;
  191.         for(i=0;i<8;i++)
  192.         {
  193.                 dq=0;
  194.                 dq=dat&0x01;
  195.                 dat>>=1;
  196.                 delay(8);//在時序上只有這一塊對時序要求最準確,他的時間必須大于15us
  197.                 dq=1;
  198.                 delay(1);
  199.         }       
  200. }
  201. uint8 ds18b20rd()                  //18b20讀數據
  202. {
  203.         uint8 value,i;
  204.         for(i=0;i<8;i++)       
  205.         {
  206.                 dq=0;
  207.                 value>>=1;
  208.                 dq=1;
  209.                 if(dq==1)value|=0x80;
  210.                 delay(8);//在這一塊也對時間要求特別準確,整段程序必須大于60us               
  211.         }
  212.         return value;
  213. }
  214. uint8 readtemp()                          //讀取溫度內需要復位的
  215. {
  216.         uint8 b;
  217.         ds18b20init();                //初始化
  218.         ds18b20wr(0xcc);   //發送忽略ROM指令
  219.         ds18b20wr(0x44);   //發送溫度轉換指令
  220.         delay(100);
  221.         ds18b20init();           //初始化
  222.         ds18b20wr(0xcc);   //發送忽略ROM指令
  223.         ds18b20wr(0xbe);   //發讀暫存器指令
  224.         a=ds18b20rd();         //溫度的低八位
  225.         b=ds18b20rd();         //溫度的高八位
  226.         b<<=4;                         //ssss s***;s為標志位s=0表示溫度值為正數,s=1溫度值為負數
  227.         c=b&0x80;                //溫度正負標志位確認
  228.         b+=(a&0xf0)>>4;
  229.         a=a&0x0f;          //溫度的小數部分
  230.         return b;
  231. }


  232. void key_pros()  //按鍵處理函數
  233. {
  234.         if(k1==0)
  235.         {
  236.                 delay(1000);
  237.                 if(k1==0)
  238.                 {
  239.                         mode++;
  240.                         if(mode==3)mode=0;
  241.                         wrc(0x01);
  242.                 }
  243.                 while(!k1);
  244.         }
  245.         if(mode==1)                  //對溫度上限設定
  246.         {
  247.                 if(k2==0)                  //加
  248.                 {
  249.                         delay(1000);
  250.                         if(k2==0)
  251.                         {
  252.                                 temph++;
  253.                                 if(temph>=80)temph=80;
  254.                         }
  255.                         while(!k2);
  256.                 }
  257.                 if(k3==0)           //減
  258.                 {
  259.                         delay(1000);
  260.                         if(k3==0)
  261.                         {
  262.                                 temph--;
  263.                                 if(temph<=0)temph=0;
  264.                         }
  265.                         while(!k3);
  266.                 }
  267.         }
  268.         if(mode==2)                  //對溫度下限設定
  269.         {
  270.                 if(k2==0)                  //加
  271.                 {
  272.                         delay(1000);
  273.                         if(k2==0)
  274.                         {
  275.                                 templ++;
  276.                                 if(templ>=80)templ=80;
  277.                         }
  278.                         while(!k2);
  279.                 }
  280.                 if(k3==0)           //減
  281.                 {
  282.                         delay(1000);
  283.                         if(k3==0)
  284.                         {
  285.                                 templ--;
  286.                                 if(templ<=0)templ=0;
  287.                         }
  288.                         while(!k3);
  289.                 }
  290.         }
  291. //        if(mode==3)                  //對濕度上限設定
  292. //        {
  293. //                if(k2==0)                  //加
  294. //                {
  295. //                        delay(1000);
  296. //                        if(k2==0)
  297. //                        {
  298. //                                humih++;
  299. //                                if(humih>=80)humih=80;
  300. //                        }
  301. //                        while(!k2);
  302. //                }
  303. //                if(k3==0)           //減
  304. //                {
  305. //                        delay(1000);
  306. //                        if(k3==0)
  307. //                        {
  308. //                                humih--;
  309. //                                if(humih<=0)humih=0;
  310. //                        }
  311. //                        while(!k3);
  312. //                }
  313. //        }
  314. //        if(mode==4)                  //對濕度下限設定
  315. //        {
  316. //                if(k2==0)                  //加
  317. //                {
  318. //                        delay(1000);
  319. //                        if(k2==0)
  320. //                        {
  321. //                                humil++;
  322. //                                if(humil>=80)humil=80;
  323. //                        }
  324. //                        while(!k2);
  325. //                }
  326. //                if(k3==0)           //減
  327. //                {
  328. //                        delay(1000);
  329. //                        if(k3==0)
  330. //                        {
  331. //                                humil--;
  332. //                                if(humil<=0)humil=0;
  333. //                        }
  334. //                        while(!k3);
  335. //                }
  336. //        }
  337. }

  338. void lcd_init_display()           //LCD初始化顯示
  339. {
  340.         uint8 i;
  341.         for(i=0;i<5;i++)
  342.         {
  343.                 wrc(0x80+i);
  344.                 wrd(str1[i]);       
  345.         }

  346. //        for(i=0;i<5;i++)
  347. //        {
  348. //                wrc(0xc0+i);
  349. //                wrd(str2[i]);       
  350. //        }
  351. }

  352. void data_pros()        //數據處理函數
  353. {
  354.         uint8 i;              
  355.         uint8 temp_buf[2],humi_buf[2];
  356.         uint8 temphbuf[2],templbuf[2],humihbuf[2],humilbuf[2];
  357.         float dio;
  358.         uint16 k;

  359.         tempvalue=readtemp();
  360. //        DHT11_Read_Data(&temp,&humi);
  361. //        temp_buf[0]=temp/10+0x30;       
  362. //        temp_buf[1]=temp%10+0x30;
  363. //
  364. //        humi_buf[0]=humi/10+0x30;       
  365. //        humi_buf[1]=humi%10+0x30;
  366.        
  367.         dio=a*0.0625;
  368.         k=dio*10000;//取小數點后兩位有效數字

  369.         temphbuf[0]=temph/10+0x30;
  370.         temphbuf[1]=temph%10+0x30;
  371.         templbuf[0]=templ/10+0x30;
  372.         templbuf[1]=templ%10+0x30;

  373. //        humihbuf[0]=humih/10+0x30;
  374. //        humihbuf[1]=humih%10+0x30;
  375. //        humilbuf[0]=humil/10+0x30;
  376. //        humilbuf[1]=humil%10+0x30;

  377.         if(mode==0)
  378.         {
  379.                 lcd_init_display();
  380.                 wrc(0x85);
  381.                 wrd(num[tempvalue%100/10]);
  382.                 wrd(num[tempvalue%100%10]);
  383.                 wrd('.');
  384.                 wrd(num[k/1000]);
  385.                 wrd(0xdf);
  386.                 wrd('C');
  387.        
  388. //                for(i=0;i<2;i++)
  389. //                {
  390. //                        wrc(0Xc5+i);
  391. //                        wrd(humi_buf[i]);                  
  392. //                }       
  393. //                for(i=0;i<3;i++)
  394. //                {
  395. //                        wrc(0Xc7+i);
  396. //                        wrd(str5[i]);                  
  397. //                }       
  398.         }
  399.         if(mode==1)                          //溫度上限顯示
  400.         {
  401.                 wrc(0x80);
  402.                 for(i=0;i<6;i++)
  403.                 {
  404.                         wrd(str6[i]);                  
  405.                 }
  406.                 wrd(temphbuf[0]);
  407.                 wrd(temphbuf[1]);                       
  408.         }
  409.         if(mode==2)                          //溫度下限顯示
  410.         {
  411.                 wrc(0x80);
  412.                 for(i=0;i<6;i++)
  413.                 {
  414.                         wrd(str7[i]);                  
  415.                 }
  416.                 wrd(templbuf[0]);
  417.                 wrd(templbuf[1]);                       
  418.         }
  419. //        if(mode==3)                          //濕度上限顯示
  420. //        {
  421. //                wrc(0x80);
  422. //                for(i=0;i<6;i++)
  423. //                {
  424. //                        wrd(str8[i]);                  
  425. //                }
  426. //                wrd(humihbuf[0]);
  427. //                wrd(humihbuf[1]);                       
  428. //        }
  429. //        if(mode==4)                          //濕度下限顯示
  430. //        {
  431. //                wrc(0x80);
  432. //                for(i=0;i<6;i++)
  433. //                {
  434. //                        wrd(str9[i]);                  
  435. //                }
  436. //                wrd(humilbuf[0]);
  437. //                wrd(humilbuf[1]);                       
  438. //        }
  439. }

  440. void baojinpros()        //報警處理
  441. {
  442.         if(tempvalue>=temph)         //檢測溫度或者濕度高于設定上限值 降溫濕
  443.         {
  444.                 led1=0;                //降溫濕指示燈
  445.                 led2=1;
  446.                 sound();
  447.         }
  448.         if(tempvalue<=templ)        //檢測溫度或者濕度低于設定下限值  升溫濕
  449.         {
  450.                 led1=1;
  451.                 led2=0;           //升高溫濕指示燈
  452.                 sound();
  453.         }
  454.         if((tempvalue>templ&&tempvalue<temph))
  455.         {
  456.                 led1=1;
  457.                 led2=1;       
  458.         }
  459. }

  460. void main()
  461. {
  462.         uint8 i=0;
  463.         led1=0;
  464.         led2=0;
  465.         lcd_init();
  466. //        while(DHT11_Init())        //檢測DHT11是否純在
  467. //        {
  468. //                for(i=0;i<6;i++)
  469. //                {
  470. //                        wrc(0x80+i);
  471. //                        wrd(str4[i]);       
  472. //                }                       
  473. //        }
  474.         wrc(0x01);
  475.         lcd_init_display();           //LCD初始化顯示
  476.         i=0;
  477.         while(1)
  478.         {       
  479.                 i++;
  480.                 key_pros();
  481.                 baojinpros();        //報警處理
  482.                 if(i==15)
  483.                 {
  484.                         i=0;
  485.                         data_pros();           //讀取一次DHT11數據最少要大于100ms
  486.                 }
  487.                 delay(1000);
  488.                
  489.         }       
  490. }
復制代碼

所有程序51hei提供下載:
程序設計.zip (47.92 KB, 下載次數: 48)


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

使用道具 舉報

沙發
ID:442461 發表于 2020-6-28 10:19 | 只看該作者
沒有proteus 工程文件啊
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久久久久久久久久久 | 一区二区三区视频在线观看 | 亚洲国产精品99久久久久久久久 | 久久精品小短片 | 欧美精品一区在线发布 | 日韩一区二区三区视频 | 91亚洲国产成人久久精品网站 | 久久综合久色欧美综合狠狠 | 国产精品婷婷 | 亚洲一区 中文字幕 | 国产乱码精品一区二区三区忘忧草 | 黄色一级电影在线观看 | 亚洲人成人一区二区在线观看 | 久久手机视频 | 欧美日韩成人 | 国产免费一区二区三区 | 午夜精品一区二区三区在线视频 | 国产美女在线播放 | 天天干天天干 | 国产精品精品视频 | 麻豆久久久久久久久久 | 成人久久久 | 国产精品视频网站 | 久久精品一 | 黄色一级电影免费观看 | 在线观看www| 亚洲精品99999 | 成人精品一区二区三区四区 | 黄色大片免费播放 | 男女又爽又黄视频 | 四色成人av永久网址 | 亚洲在线看 | 成人免费一区二区三区视频网站 | 黄色一级大片在线观看 | 久久久久久av | 欧美久久久久久 | 欧美一区二区三区小说 | 日本三级视频 | 欧美一区二区在线观看视频 | 日韩精品一区二区三区免费观看 | 亚洲成av人片在线观看无码 |