找回密码
 立即注册

QQ登录

只需一步,快速开始

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

自制志高移动空调KY-7KC/A 6+3键红外遥控器,附单片机程序电路原理图

  [复制链接]
回帖奖励 40 黑币 回复本帖可获得 2 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
仅供参考,手工绘制的电路原理图和制作出来的实物图如下:


单片机源程序如下:
  1. /*单片机模拟红外遥控器发射的C语言程序   志高移动空调 KY-7KC/A  6+3键测试  数据总长度:80毫秒  
  2.   12 MH 晶振  12MHz=12,000,000Hz,也就是1秒振荡一千二百万次   红外发射高电平驱动
  3.   STC8G1K08A-36I-SOP8系列单片机是 STC 生产的单时钟/机器周期(1T)的单片机,
  4.   是宽电压/高速/高可靠/低功耗/强抗静电/较强抗干扰的新一代 8051 单片机,超级加密。指令代码完全兼容传统 8051。*/
  5.         
  6. #include "stc8.h"
  7. sbit ir=P3^3;/*红外发射管控制脚*/unsigned int count/*中断计数*/, set_count; /*设定中断次数*/
  8. sbit key1=P3^1;sbit key2=P3^2;sbit key3=P3^0;
  9. bit irflag;/*红外发送标志位*/unsigned char irdata,ircode;/*发送的红外数据*/
  10. void delayms(unsigned int xms){unsigned int i,j;for(i=xms;i>0;i--) for(j=110;j>0;j--);}
  11. void ir_sendbyte()        //红外发送一个字节数据
  12. {
  13. unsigned char i;
  14. for(i=0;i<8;i++)          //发送8位数据
  15. {
  16.    set_count=43;          //设定中断次数  //发送编码中的0.56ms高电平
  17.    count=0;               //中断计数先清0
  18.          irflag=1;              //启动红外发射二极管发射
  19.    TR0=1;                 //开启定时器0
  20.    while(count<set_count);//等待发送完
  21.    TR0=0;                 //关闭定时器0
  22.    if(ircode&0x01)        //判断红外编码最低位,
  23.          set_count=130;         //若为1则1.69ms的低电平
  24.    else                   //否则
  25.          set_count=43;          //为0则0.56ms的低电平
  26.    irflag=0;              //低电平则不发射
  27.    count=0;               //中断计数清0
  28.    TR0=1;                 //开启定时器0
  29.    while(count<set_count);//等待发送完
  30.    TR0=0;                 //关闭定时器0
  31.    ircode=ircode>>1;      //将数据右移,即从低位到高位发送
  32. }
  33. }
  34. void ir_send()         //发送红外数据
  35. {
  36. TR0=0;                 /*关闭定时器0*/
  37. set_count=685;         /*发送编码中的引导码(8.9ms高电平)*/
  38. irflag=1;              /*打开红外发射二极管发射*/
  39. count=0;               /*中断计数先清0*/
  40. TR0=1;                 /*开启定时器0*/
  41. while(count<set_count);/*等待发送完*/
  42. //TR0=0;               /*暂不关闭定时器0*/
  43. set_count=348;         /*发送编码中的引导码(4.5ms低电平)*/
  44. irflag=0;              /*关闭红外发射二极管发射*/
  45. count=0;               /*中断计数先清0*/
  46. TR0=1;                 /*开启定时器0*/
  47. while(count<set_count);/*等待发送完*/
  48. TR0=0;
  49. ircode=0x80;           //发送16位用户码的前1-8位 0x81
  50. ir_sendbyte();
  51. ircode=0x7f;           //发送16位用户码的前9-16位 0x7f
  52. ir_sendbyte();
  53. ircode=irdata;         //发送8位数据码
  54. ir_sendbyte();
  55. ircode=~irdata;        //发送8位数据反码
  56. ir_sendbyte();
  57. /*信号收尾*/
  58. TR0=0;                 /*关闭定时器0*/
  59. set_count=50;          /*发送编码中的引导码(0.63ms高电平)*/
  60. irflag=1;              /*开启红外发射二极管发射*/
  61. count=0;               /*中断计数先清0*/
  62. TR0=1;                 /*开启定时器0*/
  63. while(count<set_count);/*等待发送完*/
  64. TR0=0;                 /*关闭定时器0*/
  65. set_count=12;          /*发送编码中的引导码(0.15ms低电平)*/
  66. irflag=0;              /*关闭红外发射二极管发射*/
  67. count=0;               /*中断计数先清0*/
  68. TR0=1;                 /*开启定时器0*/
  69. while(count<set_count);/*等待发送完*/
  70. TR0=0;                 /*关闭定时器0*/
  71. set_count=100;          /*发送编码中的引导码(1.29ms高电平)*/
  72. irflag=1;              /*开启红外发射二极管发射*/
  73. count=0;               /*中断计数先清0*/
  74. TR0=1;                 /*开启定时器0*/
  75. while(count<set_count);/*等待发送完*/
  76. TR0=0;                 /*关闭定时器0*/
  77. set_count=682;          /*发送编码中的引导码(8.86ms低电平)*/
  78. irflag=0;              /*关闭红外发射二极管发射*/
  79. count=0;               /*中断计数先清0*/
  80. TR0=1;                 /*开启定时器0*/
  81. while(count<set_count);/*等待发送完*/
  82. TR0=0;                 /*关闭定时器0*/
  83. set_count=178;          /*发送编码中的引导码(2.31ms高电平)*/
  84. irflag=1;              /*开启红外发射二极管发射*/
  85. count=0;               /*中断计数先清0*/
  86. TR0=1;                 /*开启定时器0*/
  87. while(count<set_count);/*等待发送完*/
  88. TR0=0;                 /*关闭定时器0*/
  89. set_count=50;          /*发送编码中的引导码(0.65ms低电平)*/
  90. irflag=0;              /*关闭红外发射二极管发射*/
  91. count=0;               /*中断计数先清0*/
  92. TR0=1;                 /*开启定时器0*/
  93. while(count<set_count);/*等待发送完*/
  94. TR0=0;
  95. ir=0;    //发射完了关闭红外发射二极管
  96. }
  97. void timer0_init()    //定时器初始化
  98. {
  99.   TMOD=0x02;     //定时0 8位自动重装模式
  100.   TH0=0xf3;      //设置定时初始值 13微秒
  101.         TL0=0xf3;      //设置定时重载值 13微秒
  102.   EA=1;                 //全局中断允许位。EA=1,打开全局中断控制。
  103.   EX0=0;         //外部中断0允许位,1表示允许外部中断0的中断申请;
  104.   ET0=1;         //定时/计数器0中断允许位,1表示允许定时/计数器0的溢出中断;        
  105.         TR0=0;         //关闭定时器0
  106.   count=0;       //中断计数先清0
  107.   irflag=0;      //红外发射标志先置0               
  108. }
  109. void keyscan()  //常规按键检测低电平
  110. {
  111.         if(key1==0&&P54==1){delayms(500);if(key1==0){irdata=0x07;/*键值*/ir_send();/*发送红外编码*/while(!key1);}}//单减
  112.         if(key2==0&&P54==1){delayms(500);if(key2==0){irdata=0x01;/*键值*/ir_send();/*发送红外编码*/while(!key2);}}//单加        
  113.         if(key3==0&&P54==1){delayms(500);if(key3==0){irdata=0x1a;/*键值*/ir_send();/*发送红外编码*/while(!key3);}}//开/关机
  114. }
  115. //减键:0x07  加键:0x01  开关机:0x1a  模式:0x03  定时:0x09  风速:0x06  睡眠:0x0e  +键:0x01  -键:0x07
  116. /*先把所有的行置高电平(先行),所有的列置低电平(后列),等待高电平的引脚变低也就是键按下的时候(这时候就能判断是哪一行的键被按下了),
  117.   然后立即把所有的列置高电平(先列),所有的行置低电平(后行),这时候按键还未松开,看哪一列的引脚变低了,就能判断是哪一列的键被按下了,
  118.   然后两者结合就能判断是哪个键按下了。注意:语句的先行后列次序,否则检测不到低电平*/
  119. void ajsm()  //3*2行例键盘扫描
  120. {
  121.         bit h0,h1,h2;h0=h1=h2=0;
  122.         P30=1;P31=1;P32=1;/*行*/   P54=0;P55=0;/*列*/   
  123.   if(P30==0){h0=1;}  if(P31==0){h1=1;}  if(P32==0){h2=1;} /*记录行*/
  124.         P54=1;P55=1;/*列*/   P30=0;P31=0;P32=0;/*行*/     
  125.         if(h1==1&&P54==0){delayms(500);if(h1==1&&P54==0){irdata=0x03;/*模式*/ir_send();/*发送红外编码*/while(!P54);}}/*S1*/
  126.   if(h1==1&&P55==0){delayms(500);if(h1==1&&P55==0){irdata=0x09;/*定时*/ir_send();/*发送红外编码*/while(!P55);}}/*S2*/
  127.   if(h2==1&&P54==0){delayms(500);if(h2==1&&P54==0){irdata=0x06;/*风速*/ir_send();/*发送红外编码*/while(!P54);}}/*S3*/
  128.   if(h2==1&&P55==0){delayms(500);if(h2==1&&P55==0){irdata=0x0e;/*睡眠*/ir_send();/*发送红外编码*/while(!P55);}}/*S4*/
  129.   if(h0==1&&P54==0){delayms(500);irdata=0x01;/*+ 键*/ir_send();/*发送红外编码*/}/*S5 持续*/
  130.   if(h0==1&&P55==0){delayms(500);irdata=0x07;/*- 键*/ir_send();/*发送红外编码*/}/*S6 持续*/
  131.         P30=1;P31=1;P32=1;/*函数结尾行要恢复高电平,否则按键对GND检测失效*/
  132. }
  133. void main()
  134. {
  135. P5M0=0;P5M1=0;P3M0=0;P3M1=0;  //设置准双向口模式        
  136. timer0_init(); //定时0初始化
  137. while(1)
  138. {
  139.         keyscan();/*常规按键检测低电平*/ajsm();/*3*2行例键盘扫描*/
  140. }
  141. }
  142. void timer0() interrupt 1 //定时器0中断
  143. {
  144. count++;if(irflag==1) ir=~ir;/*有发射标志,则发射38khz的矩形波*/else ir=0;/*否则不发射,即相当于发射编码中的低电平*/
  145. }
复制代码


参考波形图.png (227.87 KB, 下载次数: 91)

参考波形图.png

程序界面.png (186.68 KB, 下载次数: 91)

程序界面.png

空调.jpg (178.52 KB, 下载次数: 87)

空调.jpg

自制红外遥控背面.jpg (240.83 KB, 下载次数: 91)

自制红外遥控背面.jpg

自制遥控正面.jpg (229.04 KB, 下载次数: 107)

自制遥控正面.jpg

评分

参与人数 2黑币 +105 收起 理由
admin + 90 共享资料的黑币奖励!
1109 + 15 厉害!好奇楼主怎么搞到志高的红外编码的?

查看全部评分

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

使用道具 举报

沙发
ID:796012 发表于 2023-3-15 11:18 | 只看该作者

粘贴固定


外形样式
回复

使用道具 举报

板凳
ID:796012 发表于 2023-8-5 16:34 | 只看该作者
锁键代码:F7183FC0
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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