找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机制作居家养老监护系统程序PCB与仿真 e4a安卓App源程序

  [复制链接]
ID:730449 发表于 2022-4-13 22:02 | 显示全部楼层 |阅读模式
居家养老监护系统仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.png

Altium Designer画的居家养老监护系统PCB图如下:(51hei附件中可下载工程文件)
51hei.png

安卓app 用e4a写的:
51hei.png

单片机源程序如下:
  1. #include "reg52.h"                 //调用单片机头文件
  2. #include "delay.h"
  3. #include "oled.h"
  4. #include "dht11.h"
  5. #include "esp8266.h"

  6. #define uchar unsigned char  //无符号字符型 宏定义        变量范围0~255
  7. #define uint  unsigned int         //无符号整型 宏定义        变量范围0~65535

  8. //继电器
  9. sbit relay1=P1^6;
  10. sbit relay2=P1^5;
  11. sbit relay3=P1^4;
  12. sbit relay4=P1^3;
  13. sbit relay5=P3^6;
  14. sbit relay6=P3^7;
  15. //按键接口
  16. sbit K0=P2^6;          //一键启动
  17. sbit K1=P2^7;          //一键关闭
  18. sbit K2=P2^5;          //R1开/关
  19. sbit K3=P2^4;          //R2开/关
  20. sbit K4=P2^3;          //R3开/关
  21. sbit K5=P2^2;          //R4开/关
  22. sbit K6=P2^1;          //R5开/关
  23. sbit K7=P2^0;          //R6开/关
  24. //蜂鸣器
  25. sbit beep=P1^0;

  26. uchar code table[]="0123456789.";
  27. uchar T=0,H=0,Receive;     

  28. uchar Recive_table[40];                  //用于接收wifi模块反馈到MCU上的数据
  29. uchar Send_table[10]="0000000000";//前面4位温湿度,后面6位继电器状态,1表示开,0表示关

  30. void ESP8266_Senddate()
  31. {         
  32.            delay_uint(100);
  33.        ESP8266_Set("AT+CIPSEND=0,10");//发送10个字节
  34.        delay_uint(100);
  35.        ESP8266_Set(Send_table);
  36. }
  37. void DHT11_receive()      //接收40位的数据
  38. {
  39.     uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
  40.         EA=0; //关闭中断,防止中断影响DHT11出现单片机死机
  41.     DHT11_start();
  42.     if(Data==0)
  43.     {
  44.         while(Data==0);  //等待拉高     
  45.         DHT11_delay_us(40);  //拉高后延时80us
  46.         R_H=DHT11_rec_byte();    //接收湿度高八位  
  47.         R_L=DHT11_rec_byte();    //接收湿度低八位  
  48.         T_H=DHT11_rec_byte();    //接收温度高八位  
  49.         T_L=DHT11_rec_byte();    //接收温度低八位
  50.         revise=DHT11_rec_byte(); //接收校正位

  51.         DHT11_delay_us(25);    //结束
  52.                 EA=1;
  53.         if((R_H+R_L+T_H+T_L)==revise)      //校正
  54.         {
  55.             RH=R_H;
  56.             RL=R_L;
  57.             TH=T_H;
  58.             TL=T_L;
  59.         }
  60.                 T=TH;
  61.                 H=RH;
  62.                 //获取当前温湿度值并显示
  63.                 OLED_ShowChar(72,0,T%100/10,16);
  64.             OLED_ShowChar(88,0,T%10,16);
  65.             OLED_ShowChar(72,2,H%100/10,16);
  66.         OLED_ShowChar(88,2,H%10,16);
  67.         //温度
  68.        Send_table[0]=table[T%100/10];
  69.        Send_table[1]=table[T%10];
  70.        //湿度
  71.        Send_table[2]=table[H%100/10];
  72.        Send_table[3]=table[H%10];
  73.      }
  74. }
  75. /*****
  76. 对接收的数据处理
  77. ******/
  78. void ESP8266_Recive_Estimate()
  79. {
  80.   if((Recive_table[0]=='+')&&(Recive_table[1]=='I')&&(Recive_table[2]=='P'))//MCU接收到的数据为+IPD时进入控制  
  81.                 {
  82.                   //一键启动
  83.                   if((Recive_table[9]=='a'))
  84.                   {
  85.                    //提示音
  86.                 beep=1;
  87.                     delay_uint(100);
  88.                     beep=0;
  89.                    relay1=1;
  90.            relay2=1;
  91.            relay3=1;
  92.            relay4=1;
  93.            relay5=1;
  94.            relay6=1;
  95.                    OLED_ShowChinese(24,4,11,16);//继电器1
  96.                    OLED_ShowChinese(68,4,11,16);//继电器2
  97.                    OLED_ShowChinese(112,4,11,16);//继电器3
  98.                    OLED_ShowChinese(24,6,11,16);//继电器4
  99.                    OLED_ShowChinese(68,6,11,16);//继电器5
  100.                    OLED_ShowChinese(112,6,11,16);//继电器6
  101.                    Send_table[4]=Send_table[5]=Send_table[6]=Send_table[7]=Send_table[8]=Send_table[9]=table[1];
  102.                    Recive_table[9]=' ';
  103.                    ESP8266_Senddate();
  104.                   }
  105.                   //一键关闭
  106.                   if((Recive_table[9]=='b'))
  107.                   {
  108.                    //提示音
  109.                 beep=1;
  110.                     delay_uint(100);
  111.                     beep=0;
  112.                    relay1=0;
  113.            relay2=0;
  114.            relay3=0;
  115.            relay4=0;
  116.            relay5=0;
  117.            relay6=0;
  118.                    OLED_ShowChinese(24,4,12,16);//继电器1
  119.                    OLED_ShowChinese(68,4,12,16);//继电器2
  120.                    OLED_ShowChinese(112,4,12,16);//继电器3
  121.                    OLED_ShowChinese(24,6,12,16);//继电器4
  122.                    OLED_ShowChinese(68,6,12,16);//继电器5
  123.                    OLED_ShowChinese(112,6,12,16);//继电器6
  124.                    Send_table[4]=Send_table[5]=Send_table[6]=Send_table[7]=Send_table[8]=Send_table[9]=table[0];
  125.                    Recive_table[9]=' ';
  126.                    ESP8266_Senddate();
  127.                   }
  128.                   //继电器1控制
  129.                   if((Recive_table[9]=='c'))
  130.                   {
  131.                    //提示音
  132.                 beep=1;
  133.                     delay_uint(100);
  134.                     beep=0;
  135.                    if((Send_table[4]-'0')==1){Send_table[4]=table[0];OLED_ShowChinese(24,4,12,16);relay1=0;}
  136.                    else{Send_table[4]=table[1];OLED_ShowChinese(24,4,11,16);relay1=1;}
  137.                    Recive_table[9]=' ';
  138.                    ESP8266_Senddate();
  139.                   }
  140.                   //继电器2控制
  141.                   if((Recive_table[9]=='d'))
  142.                   {
  143.                     //提示音
  144.                 beep=1;
  145.                     delay_uint(100);
  146.                     beep=0;
  147.                    if((Send_table[5]-'0')==1){Send_table[5]=table[0];OLED_ShowChinese(68,4,12,16);relay2=0;}
  148.                    else{Send_table[5]=table[1];OLED_ShowChinese(68,4,11,16);relay2=1;}
  149.                    Recive_table[9]=' ';
  150.                    ESP8266_Senddate();
  151.                   }
  152.                   //继电器3控制
  153.                   if((Recive_table[9]=='e'))
  154.                   {
  155.                    //提示音
  156.                 beep=1;
  157.                     delay_uint(100);
  158.                     beep=0;
  159.                    if((Send_table[6]-'0')==1){Send_table[6]=table[0];OLED_ShowChinese(112,4,12,16);relay3=0;}
  160.                    else{Send_table[6]=table[1];OLED_ShowChinese(112,4,11,16);relay3=1;}
  161.                    Recive_table[9]=' ';
  162.                    ESP8266_Senddate();
  163.                   }
  164.                   //继电器4控制
  165.                   if((Recive_table[9]=='f'))
  166.                   {
  167.                    //提示音
  168.                 beep=1;
  169.                     delay_uint(100);
  170.                     beep=0;
  171.                    if((Send_table[7]-'0')==1){Send_table[7]=table[0];OLED_ShowChinese(24,6,12,16);relay4=0;}
  172.                    else{Send_table[7]=table[1];OLED_ShowChinese(24,6,11,16);relay4=1;}
  173.                    Recive_table[9]=' ';
  174.                    ESP8266_Senddate();
  175.                   }
  176.                   //继电器5控制
  177.                   if((Recive_table[9]=='g'))
  178.                   {
  179.                    //提示音
  180.                 beep=1;
  181.                     delay_uint(100);
  182.                     beep=0;
  183.                    if((Send_table[8]-'0')==1){Send_table[8]=table[0];OLED_ShowChinese(68,6,12,16);relay5=0;}
  184.                    else{Send_table[8]=table[1];OLED_ShowChinese(68,6,11,16);relay5=1;}
  185.                    Recive_table[9]=' ';
  186.                    ESP8266_Senddate();
  187.                   }
  188.                   //继电器6控制
  189.                   if((Recive_table[9]=='h'))
  190.                   {
  191.                    //提示音
  192.                 beep=1;
  193.                     delay_uint(100);
  194.                     beep=0;
  195.                    if((Send_table[9]-'0')==1){Send_table[9]=table[0];OLED_ShowChinese(112,6,12,16);relay6=0;}
  196.                    else{Send_table[9]=table[1];OLED_ShowChinese(112,6,11,16);relay6=1;}
  197.                    Recive_table[9]=' ';
  198.                    ESP8266_Senddate();
  199.                   }
  200.                   //APP连接后一直发送
  201.                   if((Recive_table[9]=='I'))
  202.                   {
  203.                     ESP8266_Senddate();
  204.                   }
  205.                 }
  206. }
  207. /****
  208. 按键控制
  209. ****/
  210. void keyscan()
  211. {
  212. //一键启动
  213.    if(K0==0)                                          
  214.     {
  215.       delay_uint(10);//延时消抖
  216.      if(K0==0)
  217.           {
  218.            //按键提示音
  219.             beep=1;
  220.                 delay_uint(100);
  221.                 beep=0;
  222.            //启动所有继电器
  223.         relay1=1;
  224.         relay2=1;
  225.         relay3=1;
  226.         relay4=1;
  227.         relay5=1;
  228.         relay6=1;
  229.                 Send_table[4]=Send_table[5]=Send_table[6]=Send_table[7]=Send_table[8]=Send_table[9]='1';
  230.                 OLED_ShowChinese(24,4,11,16);//继电器1
  231.                 OLED_ShowChinese(68,4,11,16);//继电器2
  232.                 OLED_ShowChinese(112,4,11,16);//继电器3
  233.                 OLED_ShowChinese(24,6,11,16);//继电器4
  234.                 OLED_ShowChinese(68,6,11,16);//继电器5
  235.                 OLED_ShowChinese(112,6,11,16);//继电器6
  236.                 while(K0==0);//等待按键释放
  237.           }
  238.         }
  239. //一键关闭
  240.    if(K1==0)                                          
  241.     {
  242.       delay_uint(10);//延时消抖
  243.      if(K1==0)
  244.           {
  245.                    //按键提示音
  246.             beep=1;
  247.                 delay_uint(100);
  248.                 beep=0;
  249.            //启动所有继电器
  250.         relay1=0;
  251.         relay2=0;
  252.         relay3=0;
  253.         relay4=0;
  254.         relay5=0;
  255.         relay6=0;
  256.                 Send_table[4]=Send_table[5]=Send_table[6]=Send_table[7]=Send_table[8]=Send_table[9]='0';
  257.                 OLED_ShowChinese(24,4,12,16);//继电器1
  258.                 OLED_ShowChinese(68,4,12,16);//继电器2
  259.                 OLED_ShowChinese(112,4,12,16);//继电器3
  260.                 OLED_ShowChinese(24,6,12,16);//继电器4
  261.                 OLED_ShowChinese(68,6,12,16);//继电器5
  262.                 OLED_ShowChinese(112,6,12,16);//继电器6
  263.                 while(K1==0);//等待按键释放
  264.           }
  265.         }
  266. //继电器1
  267.    if(K2==0)                                          
  268.     {
  269.       delay_uint(10);//延时消抖
  270.      if(K2==0)
  271.           {
  272.             //按键提示音
  273.             beep=1;
  274.                 delay_uint(100);
  275.                 beep=0;
  276.            //继电器状态翻转
  277.                 if(relay1==0){OLED_ShowChinese(24,4,12,16);Send_table[4]='0';}
  278.                 else {OLED_ShowChinese(24,4,11,16);Send_table[4]='1';}
  279.                 while(K2==0);//等待按键释放
  280.           }
  281.         }
  282. //继电器2
  283.    if(K3==0)                                          
  284.     {
  285.       delay_uint(10);//延时消抖
  286.      if(K3==0)
  287.           {
  288.           //按键提示音
  289.             beep=1;
  290.                 delay_uint(100);
  291.                 beep=0;
  292.            //继电器状态翻转
  293.         relay2=~relay2;
  294.                 if(relay2==0){OLED_ShowChinese(68,4,12,16);Send_table[5]='0';}
  295.                 else {OLED_ShowChinese(68,4,11,16);Send_table[5]='1';}
  296.                 while(K3==0);//等待按键释放
  297.           }
  298.         }
  299. //继电器3
  300.    if(K4==0)                                          
  301.     {
  302.       delay_uint(10);//延时消抖
  303.      if(K4==0)
  304.           {
  305.           //按键提示音
  306.             beep=1;
  307.                 delay_uint(100);
  308.                 beep=0;
  309.            //继电器状态翻转
  310.         relay3=~relay3;
  311.                 if(relay3==0){OLED_ShowChinese(112,4,12,16);Send_table[6]='0';}
  312.                 else {OLED_ShowChinese(112,4,11,16);Send_table[6]='1';}
  313.                 while(K4==0);//等待按键释放
  314.           }
  315.         }
  316. //继电器4
  317.    if(K5==0)                                          
  318.     {
  319.       delay_uint(10); //延时消抖
  320.      if(K5==0)
  321.           {
  322.            //按键提示音
  323.             beep=1;
  324.                 delay_uint(100);
  325.                 beep=0;
  326.            //继电器状态翻转
  327.         relay4=~relay4;
  328.                 if(relay4==0){OLED_ShowChinese(24,6,12,16);Send_table[7]='0';}
  329.                 else {OLED_ShowChinese(24,6,11,16);Send_table[7]='1';}
  330.                 while(K5==0);//等待按键释放
  331.           }
  332.         }
  333. //继电器5
  334.    if(K6==0)                                          
  335.     {
  336.       delay_uint(10);//延时消抖
  337.      if(K6==0)
  338.           {
  339.            //按键提示音
  340.             beep=1;
  341.                 delay_uint(100);
  342.                 beep=0;
  343.            //继电器状态翻转
  344.         relay5=~relay5;
  345.                 if(relay5==0){OLED_ShowChinese(68,6,12,16);Send_table[8]='0';}
  346.                 else {OLED_ShowChinese(68,6,11,16);Send_table[8]='1';}
  347.                 while(K6==0);//等待按键释放
  348.           }
  349.         }
  350. //继电器6
  351.    if(K7==0)                                          
  352.     {
  353.       delay_uint(10);//延时消抖
  354.      if(K7==0)
  355.           {
  356.            //按键提示音
  357.             beep=1;
  358.                 delay_uint(100);
  359.                 beep=0;
  360.            //继电器状态翻转
  361.         relay6=~relay6;
  362.                 if(relay6==0){OLED_ShowChinese(112,6,12,16);Send_table[9]='0';}
  363.                 else {OLED_ShowChinese(112,6,11,16);Send_table[9]='1';}
  364.                 while(K7==0);//等待按键释放
  365.           }
  366.         }
  367.             
  368. }
  369. /*****
  370. 系统初始化函数
  371. ****/
  372. void System_Init()
  373. {       
  374.     beep=0;//关闭蜂鸣器
  375.     //关闭所有继电器
  376.     relay1=0;
  377.     relay2=0;
  378.     relay3=0;
  379.     relay4=0;
  380.     relay5=0;
  381.     relay6=0;
  382.         //OLED初始化
  383.         OLED_Init();       
  384.     //开机显示                                                                                                                          
  385.     OLED_ShowChinese(10,0,0,16);
  386.         OLED_ShowChinese(28,0,1,16);
  387.         OLED_ShowChinese(42,0,2,16);
  388.         OLED_ShowChinese(60,0,3,16);
  389.         OLED_ShowChinese(78,0,4,16);
  390.         OLED_ShowChar(96,0,11,16);//!

  391.         OLED_ShowChinese(10,3,5,16);
  392.         OLED_ShowChinese(28,3,6,16);
  393.         OLED_ShowChinese(42,3,7,16);
  394.         OLED_ShowChar(60,3,24,16);//.
  395.         OLED_ShowChar(78,3,24,16);//.
  396.         OLED_ShowChar(96,3,24,16);//.
  397.         //ESP8266模块初始化
  398.         ESP8266_Init();
  399.         OLED_Clear();//清屏
  400.                 //显示温度
  401.         OLED_ShowChinese(20,0,8,16);
  402.         OLED_ShowChinese(38,0,9,16);
  403.         OLED_ShowChar(56,0,26,16);
  404.         OLED_ShowChar(72,0,T%100/10,16);
  405.         OLED_ShowChar(88,0,T%10,16);
  406.         OLED_ShowChar(102,0,35,16);
  407.         OLED_ShowChar(110,0,95,16);
  408.         //显示湿度
  409.         OLED_ShowChinese(20,2,10,16);
  410.         OLED_ShowChinese(38,2,9,16);
  411.         OLED_ShowChar(56,2,26,16);
  412.         OLED_ShowChar(72,2,H%100/10,16);
  413.         OLED_ShowChar(88,2,H%10,16);
  414.         OLED_ShowChar(102,2,15,16);
  415.         //显示继电器状态、继电器1
  416.         OLED_ShowChar(0,4,50,16);
  417.         OLED_ShowChar(8,4,1,16);
  418.         OLED_ShowChar(16,4,26,16);
  419.         OLED_ShowChinese(24,4,12,16);
  420.          //继电器2
  421.         OLED_ShowChar(44,4,50,16);
  422.         OLED_ShowChar(52,4,2,16);
  423.         OLED_ShowChar(60,4,26,16);
  424.         OLED_ShowChinese(68,4,12,16);
  425.          //继电器3
  426.         OLED_ShowChar(88,4,50,16);
  427.         OLED_ShowChar(96,4,3,16);
  428.         OLED_ShowChar(104,4,26,16);
  429.         OLED_ShowChinese(112,4,12,16);
  430.         //继电器4
  431.         OLED_ShowChar(0,6,50,16);
  432.         OLED_ShowChar(8,6,4,16);
  433.         OLED_ShowChar(16,6,26,16);
  434.         OLED_ShowChinese(24,6,12,16);
  435.     //继电器5
  436.         OLED_ShowChar(44,6,50,16);
  437.         OLED_ShowChar(52,6,5,16);
  438. ……………………

  439. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
51hei.png

上图资料51hei附件下载 程序Keil5,仿真Proteus8.8,ad10 PCB:
居家养老监护系统.7z (2.93 MB, 下载次数: 76)

评分

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

查看全部评分

回复

使用道具 举报

ID:297903 发表于 2022-4-14 19:52 | 显示全部楼层
看标题应该很适用!!
回复

使用道具 举报

ID:262 发表于 2022-4-15 05:28 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:712493 发表于 2022-4-15 08:54 | 显示全部楼层
能说说E4A的调试过程,想学  谢谢!
回复

使用道具 举报

ID:368810 发表于 2022-4-19 14:29 | 显示全部楼层
目前看你这个是有一个温湿度的监测,算上加热,降温,加湿与除湿,应该控制4个继电器啊,你还有两个继电器是什么作用呢大佬?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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