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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

pcf8591+oled+ DHT11溫濕度智能車內管理系統源程序與Proteus仿真

  [復制鏈接]
跳轉到指定樓層
樓主
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. #include <reg52.h>          //頭文件
  2. //#include  "LCD1602.h"
  3. //#include  "AT24C02.h"
  4. #include  "DHT11.h"
  5. #include  "oled.h"
  6. #include <intrins.h>
  7. //#include "adc0809.h"
  8. #include "IIC.h"
  9. #include "IICyy.h"
  10. #define uint unsigned int
  11. #define uchar unsigned char
  12. sbit led1 =P1^7;        
  13. sbit led2 =P1^6;        

  14. sbit jia_wen    = P2^2;  
  15. sbit zhilen     = P3^0;
  16. sbit jin_hua    = P3^1;
  17. sbit jia_shi    = P3^5;

  18. /*****************燈、蜂鳴器、按鍵引腳定義*******************/
  19. //sbit led     = P3^7;  //超限指示燈
  20. //sbit led1    = P3^2;  //正常指示燈
  21. sbit buzz    = P2^3;  //蜂鳴器
  22. //sbit key_set = P1^5;  //設置鍵
  23. //sbit key_jia = P1^6;  //加鍵
  24. //sbit key_jian= P1^7;  //減鍵

  25. /************************變量定義***********************/
  26. uchar temp_old,humi_old;//存儲上一次的溫度、濕度
  27. uchar temp_up,temp_down;//存儲溫度上、下限值
  28. uchar humi_up,humi_down;//存儲濕度上、下限值
  29. uchar set_f;                               //設置選擇標記,=0非設置,=1設置濕度上限,=2設置濕度下限
  30.                                                       //              =3設置溫度上限,=4設置溫度下限。
  31. unsigned char  AD_DATA[1]; //保存IN0通道轉換后的數據
  32. void jiexianw();
  33. void Delay_1ms(uint i);

  34. /********************************************************
  35. 函數名稱:void display(void)
  36. 函數作用:oled顯示固定作用
  37. 參數說明:
  38. ********************************************************/
  39. /*
  40. void fixed_display(void)
  41. {
  42.         OLED_ShowString(0,0,"Temp:"); //固定位置顯示“Temp:”
  43.         OLED_ShowString(56,0,".");    //固定位置顯示“.”
  44.         OLED_ShowString(80,0,"C");    //固定位置顯示“C”
  45.         OLED_ShowString(0,1,"Humi:"); //固定位置顯示“Humi:”
  46.         OLED_ShowString(56,1,".");    //固定位置顯示“.”
  47.         OLED_ShowString(80,1,"%");    //固定位置顯示“%”

  48.         if(set_f==0)                  //設置鍵沒按下,非設置模式
  49.         {
  50.         OLED_ShowString(80,4," ");    //不顯示
  51.         }        
  52.         if(set_f==1)                  //設置鍵按了1次
  53.         {
  54.         OLED_ShowString(80,4," HU");  //顯示“HU”
  55.         }
  56.         if(set_f==2)                  //設置鍵按了2次
  57.         {
  58.         OLED_ShowString(80,4," HD");  //顯示“HD”
  59.         }
  60.                 if(set_f==3)                //設置鍵按了3次
  61.         {
  62.         OLED_ShowString(80,4," TU");  //顯示“TU”
  63.         }
  64.                 if(set_f==4)                //設置鍵按了4次
  65.         {
  66.         OLED_ShowString(80,4," TD");  //顯示“TD”
  67.         }        
  68. }
  69. */
  70. /********************************************************
  71. 函數名稱:void display1(void)
  72. 函數作用:顯示當前實際溫濕度
  73. 參數說明:
  74. /********************************************************/
  75. /*
  76. void display1(void)
  77. {
  78.                
  79.         if(DHT11_Check()==1)                //判斷校驗和是否正確
  80.         {
  81.                 if(humi_old<Humi_H)                                        //判斷濕度是否上升
  82.                 {
  83.                         
  84.                         OLED_ShowString(88,1,"up");     //上升則顯示‘up’
  85.                         
  86.                         Delay_ms(50);                                            //延時
  87.                         humi_old=Humi_H;                                  //記錄當前濕度
  88.                 }
  89.                 else
  90.                         if(humi_old>Humi_H)                                //判斷濕度是否下降
  91.                         {
  92.                                 OLED_ShowString(88,1,"down"); //下降則顯示‘down’
  93.                                 Delay_ms(50);                                    //延時
  94.                                 humi_old=Humi_H;                          //記錄當前濕度
  95.                         }

  96.                 if(temp_old<Temp_H)                                        //判斷溫度是否上升
  97.                 {
  98.                                 OLED_ShowString(88,0,"up");   //上升則顯示‘up’
  99.                           Delay_ms(50);                                            //延時
  100.                           temp_old=Temp_H;                                  //記錄當前溫度
  101.                 }
  102.                 else
  103.                         if(temp_old>Temp_H)                                //判斷溫度是否下降
  104.                         {
  105.                                 OLED_ShowString(88,0,"down"); //下降顯示‘down’
  106.                                 Delay_ms(50);                                    //延時
  107.                                 temp_old=Temp_H;                          //記錄當前溫度
  108.                         }

  109.                   //顯示實測濕度值
  110.                         OLED_ShowChar(40,1,ASCII[Humi_H/10]);//顯示濕度十位的數值
  111.                         OLED_ShowChar(48,1,ASCII[Humi_H%10]);//顯示濕度個位的數值
  112.                         OLED_ShowChar(64,1,ASCII[Humi_L/10]);//顯示濕度十分位的數值
  113.                         OLED_ShowChar(70,1,ASCII[Humi_L%10]);//顯示濕度百分位的數值
  114.                         
  115.                                        
  116.                         OLED_ShowChar(40,0,ASCII[Temp_H/10]);//顯示溫度十位的數值
  117.                         OLED_ShowChar(48,0,ASCII[Temp_H%10]);//顯示溫度個位的數值
  118.                         OLED_ShowChar(64,0,ASCII[Temp_L/10]);//顯示溫度十分位的數值
  119.                         OLED_ShowChar(70,0,ASCII[Temp_L%10]);//顯示溫度百分位的數值
  120.                                                 
  121.                 if(temp_up<=Temp_H||temp_down>Temp_H||humi_up<=Humi_H||humi_down>Humi_H) //判斷是否超出設置的溫濕度上下限
  122.                 {
  123.                         buzz=0;                 //超出的話蜂鳴器響起
  124.                         led=0;                 //點亮報警燈
  125.                         led1=1;
  126.                 }
  127.                 else                     //否者溫濕度都處于限值范圍內
  128.                 {
  129.                         buzz=1;                 //關閉蜂鳴器
  130.                         led=1;               
  131.                         led1=0;                 //點亮正常燈
  132.                 }        
  133.      jiexianw();               
  134.         }        
  135. }
  136. */
  137. /***************溫度上下限限制*******************/
  138. /*
  139. void jiexianw()
  140. {        
  141.         fixed_display();                        //顯示固定內容
  142.         OLED_ShowString(0,4,"T&H limit");                          //設置區域顯示"T&H limit"
  143.         OLED_ShowString(0,5,"T:UP");            //設置區域顯示"T:UP"
  144.         OLED_ShowChar(32,5,ASCII[temp_up/10]);  //設置區域顯示溫度上限十位的數值
  145.         OLED_ShowChar(40,5,ASCII[temp_up%10]);  //設置區域顯示溫度上限個位的數值
  146.         OLED_ShowString(56,5,"DOWN");           //設置區域顯示"DOWN"
  147.         OLED_ShowChar(88,5,ASCII[temp_down/10]);//設置區域顯示溫度下限十位的數值
  148.         OLED_ShowChar(94,5,ASCII[temp_down%10]);//設置區域顯示溫度下限個位的數值
  149.         
  150.         OLED_ShowString(0,6,"H:UP");            //設置區域顯示"H:UP"
  151.         OLED_ShowChar(32,6,ASCII[humi_up/10]);  //設置區域顯示濕度上限十位的數值
  152.         OLED_ShowChar(40,6,ASCII[humi_up%10]);  //設置區域顯示濕度上限十位的數值
  153.         OLED_ShowString(56,6,"DOWN");           //設置區域顯示"DOWN"
  154.         OLED_ShowChar(88,6,ASCII[humi_down/10]);//設置區域顯示濕度下限十位的數值
  155.         OLED_ShowChar(94,6,ASCII[humi_down%10]);//設置區域顯示濕度下限個位的數值
  156.         
  157. }
  158. */
  159. /********************************************************
  160. 函數名稱:void delayms(uint ms)
  161. 函數作用:毫秒延時函數
  162. 參數說明:
  163. ********************************************************/
  164. void delayms(uint ms)
  165. {
  166.         unsigned char i=100,j;
  167.         for(;ms;ms--)
  168.         {
  169.                 while(--i)
  170.                 {
  171.                         j=10;
  172.                         while(--j);
  173.                 }
  174.         }
  175. }
  176. /********************************************************
  177. 函數名稱:void scan(void)
  178. 函數作用:按鍵檢測函數
  179. 參數說明:
  180. ********************************************************/
  181. /*
  182. void scan(void)
  183. {        
  184.         //設置鍵,不支持連按
  185.         if(key_set==0)                 //按鍵按下
  186.         {
  187.                 delayms(7);                   //延時消抖
  188.                 if(key_set==0)         //再次確認按鍵按下
  189.                 {
  190.                         led=1;               //關閉報警燈
  191.                         led1=1;        //關閉正常燈
  192.                         buzz=1;               //關閉蜂鳴器
  193.                         if(set_f==0)   //進入設置先清除屏幕,顯示設置部分
  194.                         {
  195.                                 OLED_Clear();      //清除屏幕顯示
  196.                                 delay_n40us(100);         //延時等待全部清除完畢
  197.                         }
  198.                         set_f++;                   //設置變量+1
  199.                         if(set_f==5)         //全部設置完成,退出設置
  200.                         {
  201.                                 set_f=0;           //重置設置變量

  202.                                 AT24C02_write_date(0,humi_up);  //寫入【濕度上限】數據保存
  203.                                 AT24C02_write_date(1,humi_down);//寫入【濕度下限】數據保存
  204.                                 AT24C02_write_date(2,temp_up);  //寫入【溫度上限】數據保存
  205.                                 AT24C02_write_date(3,temp_down);//寫入【溫度下限】數據保存
  206.                                 
  207.                                 OLED_Clear();      //清除屏幕顯示
  208.                                 delay_n40us(100);         //延時等待全部清除完畢
  209.                                 fixed_display();   //清除顯示后顯示固定部分
  210.                         }                        
  211.                 }
  212.                 while(!key_set);       //檢測按鍵松開
  213.         }

  214.           //加值鍵,支持連按        
  215.         if(key_jia==0&&set_f!=0||key_jian==0&&set_f!=0)//進入設置模式,按下加鍵或減鍵
  216.         {
  217.          delayms(7);       //延時消抖
  218.   if(set_f==1)       //設置濕度上限
  219.   {
  220.         if(key_jia==0)
  221.         {
  222.                         if(humi_up<99)  //濕度最大值不可大于99%RH
  223.                         humi_up++;      //濕度上限+1%RH
  224.         }
  225.         if(key_jian==0)
  226.         {
  227.         if(humi_up!=0&&humi_up>humi_down+1)//濕度上限最小不可為0%RH,并且上限得比下限大
  228.          humi_up--;                       //濕度上限值-1%RH
  229.         
  230.         }
  231. }
  232.   if(set_f==2)        //設置濕度下限
  233.   {
  234.         if(key_jia==0)
  235.         {
  236.                                 if(humi_down<99&&humi_down+1<humi_up)//濕度下限最大值小于99%RH,并且下限不可超過上限
  237.                                         humi_down++;                       //濕度下限+1%RH
  238.         }
  239.         if(key_jian==0)
  240.         {
  241.                                 if(humi_down!=0)                   //濕度下限最小值不可為0%RH
  242.                                         humi_down--;                    //濕度下限值-1%RH        
  243.         }
  244. }

  245.   if(set_f==3)          //設置溫度上限
  246.   {
  247.         if(key_jia==0)
  248.         {
  249.                                 if(temp_up<99) //溫度上限最大值不可大于99℃
  250.                                         temp_up++;   //濕度上限+1℃
  251.         }
  252.         if(key_jian==0)
  253.         {
  254.                                 if(temp_up!=0&&temp_up>temp_down+1)//溫度上限最小值不可為0℃,并且上限得比下限大
  255.                                         temp_up--;                       //溫度上限值-1℃
  256.         
  257.         }
  258. }

  259.         if(set_f==4)        //設置溫度下限
  260. {
  261.         if(key_jia==0)
  262.         {
  263.                                 if(temp_down<99&&temp_down+1<temp_up)//溫度下限最大值不可大于99℃,并且下限不可超過上限
  264.                                         temp_down++;                       //溫度下限+1℃
  265.         }
  266.         if(key_jian==0)
  267.         {               
  268.                                 if(temp_down!=0)                    //溫度下限最小值不可為0℃
  269.                                         temp_down--;                      //溫度下限值-1℃
  270.         
  271.         }
  272.                 }
  273.         }
  274. } */

  275. //-------字符串轉換為  數字

  276. char *reverse(char *s)
  277. {
  278.     char temp;
  279.     char *p = s;   
  280.     char *q = s;   
  281.     while(*q)
  282.         ++q;
  283.     q--;

  284.    
  285.     while(q > p)
  286.     {
  287.         temp = *p;
  288.         *p++ = *q;
  289.         *q-- = temp;
  290.     }
  291.     return s;
  292. }

  293. char *my_itoa(int n)
  294. {
  295.     int i = 0,isNegative = 0;
  296.     static char s[20];         
  297.     if((isNegative = n) < 0)
  298.     {
  299.         n = -n;
  300.     }
  301.     do        
  302.     {
  303.         s[i++] = n%10 + '0';
  304.         n = n/10;
  305.     }while(n > 0);

  306.     if(isNegative < 0)   
  307.     {
  308.         s[i++] = '-';
  309.     }
  310.     s[i] = '\0';   
  311.     return reverse(s);   
  312. }
  313. /********************************************************
  314. 函數名稱:void main()
  315. 函數作用:主函數
  316. 參數說明:
  317. ********************************************************/
  318. //----lcd能顯示8行-1  ~ 6  -1 0 1 2 3 4 5 6

  319. int main()
  320. {
  321.         char js =1;
  322.         char jh = 1;
  323.         char wd =1;
  324.         char swh =1;
  325.         unsigned char ovc=0;unsigned char pm2_5=0;
  326.         unsigned int  value = 0;
  327.         int humid = 0;int tempt = 0;
  328.         OLED_Init();                         //顯示屏初始化

  329.          /*  DHT11_read();            //讀取DHT11溫濕度
  330.                  humid = Humi_H;
  331.                  tempt = Temp_H;
  332.            OLED_ShowString(0,0,"   ");        
  333.            OLED_ShowString(0,1,"   ");
  334.         
  335.     OLED_ShowString(0,0,"T:");                 OLED_ShowString(15,0,my_itoa(Temp_H));         
  336.     OLED_ShowString(50,0,"H:");                 OLED_ShowString(65,0,my_itoa(Temp_H));                        
  337.                 OLED_ShowString(0,1,"OVC:");   OLED_ShowString(30,1,my_itoa(iic_readvoldata2()/10));
  338.                 OLED_ShowString(0,2,"PM2.5:"); OLED_ShowString(40,1,my_itoa(iic_readvoldata1()/10));*/
  339.         
  340.         while(1)
  341.         {
  342.                            DHT11_read();            //讀取DHT11溫濕度
  343.                                         ovc   =  iic_readvoldata1();
  344.                             pm2_5 = iic_readvoldata2();
  345.           OLED_ShowString(0,0,"T:");                  OLED_ShowString(15,0,"   ");                   OLED_ShowString(15,0,my_itoa(Temp_H));         
  346.     OLED_ShowString(50,0,"H:");                  OLED_ShowString(65,0,"   ");             OLED_ShowString(65,0,my_itoa(Humi_H));                        
  347.                
  348.                 OLED_ShowString(0,2,"PM2.5:");  OLED_ShowString(40,2,"      ");         OLED_ShowString(60,2,my_itoa(ovc));  //---3        
  349.                 OLED_ShowString(0,1,"OVC:");           OLED_ShowString(30,1,"      ");           OLED_ShowString(30,1,my_itoa(pm2_5));  //----2
  350.                 //-----智能模式
  351.           OLED_ShowString(0,3,"mode:");   OLED_ShowString(40,3,my_itoa(swh));
  352.                 if(led1 == 0)
  353.                 {
  354.                         swh++;
  355.                         while(!led1);
  356.                 }
  357.                 if(swh >4)swh =1;
  358.                
  359.                 if(swh ==1)
  360.                 {        jia_wen =1; zhilen  =1;jia_shi =1;jin_hua = 1;
  361.                         if(Temp_H>=10&&Temp_H<=30){jia_wen =1 ; zhilen  =1;}
  362.                         if(Temp_H <10) {jia_wen =0; zhilen  =1;}
  363.                         if(Temp_H >30) {zhilen =0; jia_wen  =1; }        
  364.                         if(Humi_H <10)  {jia_shi =0;}  
  365.                         if(Humi_H >50)  {jia_shi =1;}
  366.                         
  367.                         if(ovc>122||pm2_5>140){ jin_hua = 0;} else {jin_hua = 1;}
  368.                 }
  369.                 if(swh == 2) //jia_wen
  370.                 {
  371.                         if(led2 == 0) wd++;
  372.                                 while(!led2);
  373.                         if(wd>3) wd =1;        
  374.                 }
  375.                 if(swh == 3) //jin_hua
  376.                 {
  377.                         if(led2 == 0) jh++;
  378.                                 while(!led2);
  379.                         if(jh>2) jh =1;
  380.                 }        

  381.                 if(swh == 4) //jia_shi
  382. ……………………

  383. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
溫濕度.zip (174.47 KB, 下載次數: 448)

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:842307 發表于 2021-2-22 00:47 | 只看該作者
很有幫助,謝謝貼主
回復

使用道具 舉報

板凳
ID:995239 發表于 2021-12-21 16:43 | 只看該作者
好用,謝謝貼主
回復

使用道具 舉報

地板
ID:262073 發表于 2022-4-6 16:33 | 只看該作者
take a look
回復

使用道具 舉報

5#
ID:1064295 發表于 2023-2-25 22:12 | 只看該作者
謝謝樓主,很有幫助
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美视频在线播放 | 久久最新 | 日韩免费网站 | 久久久国产一区 | 韩国电影久久 | 日日夜夜精品免费视频 | 精品欧美一区二区三区 | 日韩成人在线看 | 在线一区二区三区 | 欧美一区二区免费视频 | 久久久久无码国产精品一区 | 亚洲精品久久久久久国产精华液 | 日本高清精品 | 国产精品日产欧美久久久久 | 国产乱码精品一区二区三区五月婷 | 91精品一区二区 | 夏同学福利网 | 精品久久久久久久久久久久久久 | 日本一区二区三区在线观看 | 日韩精品一区二区三区中文在线 | 国产精品久久久久久 | 黄色综合| 欧美成人一区二区 | 国产高清区 | 久久久精品高清 | 黄在线免费观看 | 高清av电影 | 国产成人影院 | 亚洲第一中文字幕 | 久久青青 | 一区二区精品 | 日韩一区二区在线免费观看 | 日韩在线日韩 | 欧美激情一区 | 国产一区二区三区色淫影院 | 亚洲性视频网站 | 免费观看毛片 | 在线观看成年视频 | 国产视频一视频二 | 日本天堂一区二区 | 亚洲成人一区 |