找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5650|回复: 10
收起左侧

单片机蓝牙+红外学习转发模块源程序 实现用安卓手机控制所有家电

  [复制链接]
ID:12816 发表于 2019-5-12 22:40 | 显示全部楼层 |阅读模式
本帖最后由 lbq691477940 于 2019-6-1 16:06 编辑

单片机蓝牙遥控模块 红外遥控学习转发模块 附源程序
用安卓手机按制所有带红外遥控器的家电、设备
一个APP界面可以学习家里所有以38K红外载波编码的任意红外遥控器,再也不用看场电视要拿好几个红外遥控器了。
如:空调、电视、机顶盒、风扇、台灯..........等等,常用的按键学习在手机APP中,从而达到一机在手控制家里的所有家电的目的。

提取码:wcvd
22.png

11.png

33.png

Screenshot_2019-05-13-21-16-44-66.png

单片机源程序如下:
  1. /***************************************************************************************************
  2. 单片机:
  3.         STC11F02E或兼容芯片
  4. 晶振:
  5.         11.0592Mhz
  6. 波特率:57600

  7. 红外接收:
  8.         P3.3口即外部中断1(此引脚不可自由更改)
  9. 定时器0:
  10.         1.接收红外码时为12T/16位计数模式不使用定时器0中断功能
  11.         2.发射红外码时为1T/8位自重载模式且用定时器0产生38Khz=13uS中断功能
  12. 定时器1:
  13.         为1T/8位自重载模式作为串口波特率发生器(使能波特率加倍)
  14. 红外发射管:
  15.         为P1.0口驱动NPN三极管(此引脚可自由更改)
  16. 红外发射状态指标灯:
  17.         为P3.4口驱动LED低电平有效(此引脚可自由更改)
  18. /***************************************************************************************************/
  19. #include <STC12C5A60S2.H>
  20. #define uchar unsigned char
  21. #define uint unsigned int
  22. /***************************************************************************************************/
  23. #define IR_BYTE         200         //接收的最大位数为500位
  24. /***************************************************************************************************/
  25. sbit IR_IN = P3^3;                        //一体化红外接收头的输出脚连到此脚作为红外线输入
  26. sbit LED = P3^4;                        //状态指标灯
  27. sbit IR_out = P1^0;                        //红外发射管控制脚,驱动NPN三极管J3印字即S8050贴片
  28. /***************************************************************************************************/
  29. bit UART_RI;                                //串口接收完成标志位
  30. bit flag;                                        //发射高电平码还是低电平码标志位
  31. bit IR_OK;                                        //红外线接收完成标志位
  32. uchar idata IR_data[IR_BYTE];        //红外接收及串口接收缓冲区
  33. uint IR_re;                                        //红外接收的数据个数计数器        
  34. uint UART_re;                                //串口接收的数据个数计数器                                
  35. uint count;                //中断计数
  36. /***************************************************************************************************
  37. 名称:sys_initial
  38. 功能:系统初始化
  39. //如果外部中断是仅下降沿触发,要求必须在相应的引脚维持高电平至少1个系统时钟,而且低电平也要持续至少一个系统
  40.   时钟,才能确保该下降沿被CPU检测到
  41. //如果外部中断是低电平可触发,则要求必须在相应的引脚维持低电平至少2个系统时钟,这样才能确保CPU能够检测到该低电平信号
  42. /***************************************************************************************************/
  43. void sys_initial()
  44. {
  45.         PCON |= 0x80;                                //使能波特率倍速位SMOD
  46.         SCON = 0x50;                                //8位数据,可变波特率
  47.         AUXR |= 0x40;                                //定时器1时钟为Fosc,即1T
  48.         AUXR &= 0xFE;                                //串口1选择定时器1为波特率发生器
  49.         TMOD &= 0x0F;                                //清除定时器1模式位
  50.         TMOD |= 0x21;                                //设定定时器1为8位自动重装方式/设定定时器0为16位方式
  51.         TH1        = TL1 = 0xF4;                        //设定定时初值  11.0592Mhz / 57600
  52.         ET1 = 0;                                        //禁止定时器1中断
  53.         TR1 = 1;                                        //启动定时器1
  54.         
  55.         ES = REN = 1;                                //允许串口接收中断
  56.         IT1 = 1;                                //设置INT1的中断类型 (1:低电平触发 0:下降沿触发)
  57.     EX1 = 1;                                //使能INT1中断
  58.         EA = 1;                                                //使能总中断
  59.         IR_OK = 0;               
  60. }
  61. /***************************************************************************************************
  62. 名称:com
  63. 功能:串口发送字符数据;
  64. 形参:TS=数据指针;n=字符长度
  65. /***************************************************************************************************/
  66. void UART1_SEND(uchar *TS,uchar n)
  67. {
  68.         uchar m;
  69.         for(m = 0;m < n;m++)
  70.         {
  71.                 SBUF = *(TS + m);
  72.                 while(!TI);
  73.                 TI = 0;
  74.         }
  75. }
  76. /***************************************************************************************************/
  77. void main()
  78. {        
  79.         uint i;
  80.         sys_initial();
  81.         LED = 0;
  82.         while(1)
  83.         {
  84.                 if(UART_RI)        //接收成功
  85.                 {
  86.                         ES = 0;                                                //禁止串口中断
  87.                         UART_RI = 0;                                //清除串口接收完成标志位
  88. /***************************************************************************************************************/                        
  89.                         if((IR_data[0] == 0xFE) && (IR_data[1] == 0xFD) && (UART_re > 10))
  90.                         {//判断接收到的前二个指令码是否为 0xFE和0xFD且大于10个数据
  91.                                 EX1 = 0;                                //进行红外发码前先关闭外部中断0
  92.                                 PT0 = ET0 = 1;                        //设定时器0中断优先及允许定时器0中断
  93.                                 if(UART_re % 2)                        //如果收到的是单个字节则自行加一个缓冲区数据
  94.                                 {
  95.                                         UART_re += 1;
  96.                                         IR_data[UART_re] = 2;//随便给个值即可
  97.                                 }
  98. /***************************************************************************************/                        
  99.                                 for(i = 2;i < UART_re;i++)
  100.                                 {                                
  101.                                         flag = ~(bit)(i % 2);                                  //红外发送标志=1
  102.                                         TF0 = count = 0;                                          //中断计数=0
  103.                                         TR0 = 1;        //启动定时器0
  104.                                         // if(IR_data[ i] <= 5)
  105.                                         // {
  106.                                                 // IR_data[ i] = 5;
  107.                                         // }
  108.                                         while(count < (IR_data[ i] * 90 / 13));
  109.                                         TR0 = 0;                                                         //关闭定时器0
  110.                                 }                                
  111. /***************************************************************************************                        
  112.                                 for(i = 2;i < UART_re;)
  113.                                 {                                
  114.                                         //编码中的低电平
  115.                                         flag = 1;                                                          //红外发送标志=1
  116.                                         TF0 = count = 0;                                          //中断计数=0
  117.                                         TR0 = 1;                                                          //启动定时器0
  118.                                         while(count < (IR_data[ i] * 90 / 13));
  119.                                         TR0 = 0;        
  120.                                         i++;//关闭定时器0
  121.                                         //编码中的高电平
  122.                                         flag = 0;                                                          //红外发送标志
  123.                                         TF0 = count = 0;                                          //中断计数=0
  124.                                         TR0 = 1;                                                          //启动定时器0
  125.                                         while(count < (IR_data[ i] * 90 / 13));
  126.                                         TR0 = 0;                                                          //关闭定时器0
  127.                                 }
  128. /***************************************************************************************/                                
  129.                                 SBUF = 0xFC;                                        //发射完成返回一个0xFC给PC机表示发射完毕
  130.                                 while(!TI);
  131.                                 TI = 0;
  132. /***************************************************************************************/                                
  133.                                 EX1 = 1;                                                //红外发码发完后才再次允许外部中断0
  134.                         }
  135.                         for(UART_re = IR_BYTE;UART_re > 0;UART_re--)
  136.                                 IR_data[UART_re] = 0;                        //清除串口接收区,且将UART_re清0
  137.                         LED = IR_out = 0;                                        //红外管 = 0不发光
  138.                         ES = 1;                                                                //重新允许串口中断
  139. /***************************************************************************************************************/                        
  140.                 }               
  141.         }
  142. }
  143. /***************************************************************************************************************/
  144. void timer0(void) interrupt 1
  145. {
  146.         count += 1;
  147.         if(flag == 1)                        //如果红外发送标志=1
  148.         {
  149.                 //这里可以改为=1不取反另用ne555产生38K信号与IR_out口的信号相与后接IR
  150.                 LED = ~LED;                        //红外发射指示状态=取反
  151.         }                                                
  152.         else
  153.         {
  154.                 IR_out = 0;                        //红外管=0不发光
  155.         }
  156. }
  157. /***************************************************************************************************************/
复制代码






评分

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

查看全部评分

回复

使用道具 举报

ID:536970 发表于 2019-5-13 15:11 | 显示全部楼层
高手,学习下!
回复

使用道具 举报

ID:164850 发表于 2019-5-15 05:42 来自手机 | 显示全部楼层
蓝牙app麻烦上传一下
回复

使用道具 举报

ID:12816 发表于 2019-5-17 18:24 | 显示全部楼层
luxianjun 发表于 2019-5-15 05:42
蓝牙app麻烦上传一下

这是安卓手机端软件,写的不太完美但是能用
红外线遥控学习转发.rar (4.2 MB, 下载次数: 44)
回复

使用道具 举报

ID:164850 发表于 2019-5-19 12:00 来自手机 | 显示全部楼层
下非常感谢,下载试试。
回复

使用道具 举报

ID:556770 发表于 2019-8-26 20:53 | 显示全部楼层
学习了
回复

使用道具 举报

ID:12816 发表于 2020-5-26 22:09 | 显示全部楼层
Universal Remote_V1指令表(混合字节版).PNG
1.PNG

2.PNG

3.PNG

4.PNG

5.PNG

6.PNG

回复

使用道具 举报

ID:377382 发表于 2020-5-27 23:06 | 显示全部楼层
高手,学习下
回复

使用道具 举报

ID:756506 发表于 2020-6-1 15:50 | 显示全部楼层
很厉害,学习下。。谢谢!
回复

使用道具 举报

ID:12816 发表于 2020-7-20 23:04 | 显示全部楼层
增加安卓手机操作软件 onenet mqtt协议
MQTT-IR遥控.rar (782.48 KB, 下载次数: 10)
回复

使用道具 举报

ID:462436 发表于 2020-12-28 13:14 | 显示全部楼层
谢谢,下载学习资料。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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