找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6163|回复: 4
收起左侧

pcf8591+oled+ DHT11温湿度智能车内管理系统源程序与Proteus仿真

  [复制链接]
ID:623452 发表于 2020-10-7 16:19 | 显示全部楼层 |阅读模式
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.png

单片机源程序如下:
  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.png
所有资料51hei提供下载:
温湿度.zip (174.47 KB, 下载次数: 441)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:842307 发表于 2021-2-22 00:47 | 显示全部楼层
很有帮助,谢谢贴主
回复

使用道具 举报

ID:995239 发表于 2021-12-21 16:43 | 显示全部楼层
好用,谢谢贴主
回复

使用道具 举报

ID:262073 发表于 2022-4-6 16:33 | 显示全部楼层
take a look
回复

使用道具 举报

ID:1064295 发表于 2023-2-25 22:12 | 显示全部楼层
谢谢楼主,很有帮助
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表