找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5626|回复: 14
打印 上一主题 下一主题
收起左侧

基于局域网的智能家居(手机控制C51单片机输出多路继电电器)

  [复制链接]
跳转到指定楼层
楼主
初学者,玩着玩着就玩大了,刚开始有PC的串口控制单片机输入输出电平信号,来控制继电器,闹着玩。最后想着用手机控制,慢慢加上了ESP8266模块,实现了手机端控制,最后又在某宝上买了一个多路继电器模块,通过修改程序,实现了手机控制多路程序,现在能手机控制八路继电器,模块上也有2路按键能控制,并且实现了信号反馈,下一步想继续拓展成远程控制,并且带反馈信号功能,请大咖多多指点……


制作出来的实物图如下:


电路原理图如下:


单片机源程序如下:

  1. #include <DB1.h>        //头文件
  2. #define HEAD 0x00//数据头码
  3. sbit BEEP=P3^7;
  4. sbit J1 = P1 ^ 0;//控制器接口定义
  5. sbit J2 = P1 ^ 1;//
  6. sbit J3 = P1 ^ 2;//
  7. sbit J4 = P1 ^ 3;//
  8. sbit J5 = P1 ^ 4;//6-11路没有使用(第12路用作了全局开关)
  9. sbit J6 = P1 ^ 5;//
  10. sbit J7 = P1 ^ 6;//
  11. sbit J8 = P1 ^ 7;//
  12. sbit DY_KEY1 = P3 ^ 4;
  13. sbit DY_KEY2 = P3 ^ 5;
  14. /********************************************************************/
  15. void DELAY_MS (unsigned int a){//毫秒级延时1*a毫秒
  16.         unsigned int i;
  17.         while( a-- != 0){
  18.                 for(i = 0; i < 600; i++);
  19.         }
  20. }
  21. /********************************************************************/
  22. void Play(unsigned int t)
  23. {
  24.         unsigned char i;
  25.         for(i=0;i<100;i++){
  26.       BEEP=0;   
  27.       DELAY_MS(t);
  28.         }
  29.         BEEP=1;
  30. }
  31. /****************************************************************************/
  32. void UART_init (void){//UART串口初始化函数
  33.         TMOD = 0x20;        //定时器T/C1工作方式2
  34.         SCON = 0x50;        //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)
  35.         TH1 = 0xFd;           //定时器初值高8位设置
  36.         TL1 = 0xFd;           //定时器初值低8位设置
  37. //        PCON = 0x80;        //波特率倍频(屏蔽本句波特率9600)
  38.         TR1 = 1;              //定时器启动   
  39. }

  40. /***************************************************************************/
  41. void main (void){
  42.         unsigned char UART_data1,UART_data2; //定义串口接收数据变量
  43.         unsigned int s;   //计数,方便程序判断
  44.         UART_init();      //串口初始化(查寻)
  45. //        INT_init ();  //外部中断INT初始化
  46.         DELAY_MS(1000);   //延时防止下载时死机
  47.         
  48.         while(1){
  49.                 DY_KEY1 = 1;
  50.                 DY_KEY2 = 1;        
  51.                 if(DY_KEY1==0||DY_KEY2==0){ //如果按键按下则继续
  52.                         DELAY_MS(40); //延时20mS
  53.                         if(DY_KEY1 == 0){ //如果按键按下则继续
  54.                                 J8= ~J8;      //第1路开
  55.                                 Play(1);   //蜂鸣
  56.                                 if (RI == 0){
  57.                                         SBUF=0xf8;   //将按键信息发送回PC(0xf8自定义为按键信息)
  58.                                         TI = 0;
  59.                                 }
  60.                                 DELAY_MS(10);
  61.                                 while(DY_KEY1 == 0); //等待按键松开
  62.                         }

  63.                         if(DY_KEY2 == 0){ //如果按键按下则继续
  64.                                 J1= ~J1;      //第1路开
  65.                                 Play(1);   //蜂鸣
  66.                                 if (RI == 0){
  67.                                         SBUF=0xf1;   //将按键信息发送回PC(0xf1自定义为按键信息)
  68.                                         TI = 0;
  69.                                 }
  70.                                 DELAY_MS(10);
  71.                                 while(DY_KEY2 == 0); //等待按键松开
  72.                         }
  73.                 }
  74.                 if (RI == 1){                //接收中断标志位为1时//接受数据头码
  75.                         UART_data1 = SBUF;        //接收数据 SBUF 为单片机的接收发送缓冲寄存器
  76.                         RI = 0;                        //令接收中断标志位为0(软件清零)
  77.                         s=0;                                
  78.                         while (s<2000&&UART_data1==HEAD){//判断头码是否正确,等待时间过长时跳出。
  79.                                 s++;
  80.                                 if (RI == 1){//开始接受控制数据
  81.                                         UART_data2 = SBUF; //接收尾码数据
  82.                                SBUF=UART_data2;   //将接收的尾码数据发送回去
  83.                                         RI = 0;
  84.                                         switch (UART_data2){
  85.                                                 case 0x01:J1=0;Play(1);break;//第P1.0引脚开
  86.                                                 case 0x81:J1=1;Play(2);break;//第P1.0引脚关
  87.                                                 case 0x02:J2=0;Play(1);break;//未开发
  88.                                                 case 0x82:J2=1;Play(2);break;
  89.                                                 case 0x03:J3=0;Play(1);break;//未开发
  90.                                                 case 0x83:J3=1;Play(2);break;
  91.                                                 case 0x04:J4=0;Play(1);break;//未开发
  92.                                                 case 0x84:J4=1;Play(2);break;
  93.                                                 case 0x05:J5=0;Play(1);break;//未开发
  94.                                                 case 0x85:J5=1;Play(2);break;
  95.                                                 case 0x06:J6=0;Play(1);break;//未开发
  96.                                                 case 0x86:J6=1;Play(2);break;
  97.                                                 case 0x07:J7=0;Play(1);break;//未开发
  98.                                                 case 0x87:J7=1;Play(2);break;
  99.                                                 case 0x08:J8=0;Play(1);break;//第P1.7引脚开
  100.                                                 case 0x88:J8=1;Play(2);break;//第P1.7引脚关
  101.                                                 case 0x09:J1=0;J2=0;J3=0;J4=0;J5=0;J6=0;J7=0;J8=0;Play(3);break;//全局开关
  102.                                                 case 0x89:J1=1;J2=1;J3=1;J4=1;J5=1;J6=1;J7=1;J8=1;Play(3);break;
  103.                                                 default:break;//冗余语句
  104.                                                         
  105.                                         }
  106.                                 }
  107.                         }
  108.                 }
  109.         }
  110. }
复制代码


以上代码51hei提供下载:


手机控制C51单片机输出多路继电电器.zip

4.14 MB, 下载次数: 101, 下载积分: 黑币 -5

评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏14 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:748312 发表于 2020-5-10 17:00 | 只看该作者
楼主强大,向你学习
回复

使用道具 举报

板凳
ID:577696 发表于 2020-5-14 13:42 | 只看该作者
想知道楼主手机端用的是什么APP?
回复

使用道具 举报

地板
ID:705430 发表于 2020-5-19 10:32 | 只看该作者
小飞龙 发表于 2020-5-14 13:42
想知道楼主手机端用的是什么APP?

用的是“TCP连接”,这个可以做手机的客户端或者服务器端
回复

使用道具 举报

5#
ID:93929 发表于 2020-5-22 20:37 | 只看该作者
什么型号的单片机?
回复

使用道具 举报

6#
ID:259035 发表于 2020-5-24 18:55 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

7#
ID:65956 发表于 2020-8-6 11:15 | 只看该作者
附件里有带APP软件吗?是跟之前有人发的那个蓝牙APP同款吗?
回复

使用道具 举报

8#
ID:517951 发表于 2020-11-15 17:42 | 只看该作者
不错,值得学习。51hei有你更精彩!!
回复

使用道具 举报

9#
ID:438106 发表于 2020-11-23 19:17 | 只看该作者
不错,不错,51黑有你更精彩
回复

使用道具 举报

10#
ID:693523 发表于 2020-11-23 20:16 | 只看该作者
我用硬件STC89C52+ESP8266+8路继电器模块
贝壳物联(服务器)
易安卓(手机客户端)
已经搞定,可以手机端控制和接收到反馈,另外有物理按键(门禁开关)作为灯具开关
效果挺好
回复

使用道具 举报

11#
ID:846386 发表于 2020-11-25 12:06 | 只看该作者
这技术真牛,学习
回复

使用道具 举报

12#
ID:849826 发表于 2020-11-30 14:14 来自手机 | 只看该作者
这个程序改到52单片机上了,按键可以控制输出开关,没有8266模块,用HC-25wifi模块,无法连接
回复

使用道具 举报

13#
ID:849826 发表于 2020-11-30 14:25 来自手机 | 只看该作者
HC-25怎么连接单片机做串口通信
回复

使用道具 举报

14#
ID:851971 发表于 2020-11-30 20:10 | 只看该作者
有技术的,学的还不错,下次弄个大的单片机。
回复

使用道具 举报

15#
ID:801730 发表于 2020-12-3 08:25 | 只看该作者
牛,,,,,仰望
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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