找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机格力空调遥控器设计源码

  [复制链接]
跳转到指定楼层
楼主
ID:281190 发表于 2018-1-31 15:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. //51单片机格力空调遥控器

  2. #include <reg52.h>
  3. #include <intrins.h>
  4. #define uchar unsigned char
  5. #define uint  unsigned int
  6. #define enTransmitt   flag=1
  7. #define disTransmitt  flag=0
  8. sfr   T2MOD  = 0XC9;
  9. bit   flag=0;
  10. sbit IR38k =P2^3;     //红外发射管
  11. sbit key1=P1^1;
  12. sbit key2=P1^3;
  13. sbit key3=P1^5;
  14. sbit key4=P1^7;
  15. sbit key5=P1^0;
  16. sbit key6=P1^4;
  17. uchar KeyScan();
  18. uint  count=0,set_count=0;
  19. uchar fengliang_value=0;
  20. uchar key_value=0;
  21. uchar wendu_value=0;
  22. uchar mode_value=0;
  23. uchar switch_value=0;
  24. uchar zhuanye_value=0;
  25. uchar code zhuanye[][5]={{0x39,0x04,0x00,0x50,0x02},{0x79,0x04,0x00,0x50,0x02}};  // 手动,自动转页(20度,冷气)
  26. uchar code  fengliang[][5]={{0x28,0x08,0x00,0x50,0x02},{0x19,0x08,0x00,0x50,0x02},
  27.                              {0x09,0x08,0x00,0x50,0x02}
  28.          }; //自动模式风量 小,中,大  (20度)
  29. uchar code  mode[][5]={  
  30.                          {0x58,0x00,0x00,0x50,0x02},{0x59,0x04,0x00,0x50,0x02},
  31.        {0x5a,0x04,0x00,0x50,0x02},{0x5b,0x04,0x00,0x50,0x02}
  32.                       };    //自动,冷气,除湿,送风
  33. /*uchar code  on_or_off[][5]={ {0x40,0x00,0x00,0x50,0x02},{0x48,0x00,0x00,0x50,0x02} }; */
  34. uchar code  on_or_off[][5]={
  35.        {0x39,0x08,0x00,0x50,0x02},{0x31,0x08,0x00,0x50,0x02},
  36.                             {0x59,0x08,0x00,0x50,0x02},{0x51,0x08,0x00,0x50,0x02},
  37.        {0x79,0x08,0x00,0x50,0x02},{0x71,0x08,0x00,0x50,0x02},
  38.        }; //开机,关机
  39. uchar code  wendu[][5]={
  40.                      {0x59,0x00,0x00,0x50,0x02},{0x59,0x01,0x00,0x50,0x02},
  41.          {0x59,0x02,0x00,0x50,0x02},{0x59,0x03,0x00,0x50,0x02},
  42.          {0x59,0x04,0x00,0x50,0x02},{0x59,0x05,0x00,0x50,0x02},
  43.          {0x59,0x06,0x00,0x50,0x02},{0x59,0x07,0x00,0x50,0x02},
  44.          {0x59,0x08,0x00,0x50,0x02},{0x59,0x09,0x00,0x50,0x02},
  45.          {0x59,0x0a,0x00,0x50,0x02},{0x59,0x0b,0x00,0x50,0x02},
  46.          {0x59,0x0c,0x00,0x50,0x02},{0x59,0x0d,0x00,0x50,0x02},
  47.          {0x59,0x0e,0x00,0x50,0x02}  
  48.                        }; //温度值

  49. void send_precode(unsigned int s_cnt_1,unsigned int s_cnt_2);
  50. void send_8bit_code(uchar value);
  51. void send_4bit_code(uchar value);
  52. void send_final_code();
  53. void ir_out1() //启动和关闭
  54. {
  55. send_precode(180,90);
  56. send_8bit_code(on_or_off[switch_value][0]);
  57. send_8bit_code(on_or_off[switch_value][1]);
  58. send_8bit_code(on_or_off[switch_value][2]);
  59. send_8bit_code(on_or_off[switch_value][3]);
  60. send_4bit_code(on_or_off[switch_value][4]);
  61. //send_final_code();
  62. // key_value=0;
  63.     switch_value++;
  64. if(switch_value==6){ switch_value=0; }

  65. }
  66. void ir_out2() //wendu--
  67. {

  68. send_precode(180,90);
  69. send_8bit_code(wendu[wendu_value][0]);
  70. send_8bit_code(wendu[wendu_value][1]);
  71. send_8bit_code(wendu[wendu_value][2]);
  72. send_8bit_code(wendu[wendu_value][3]);
  73. send_4bit_code(wendu[wendu_value][4]);
  74. send_final_code();
  75. wendu_value--;
  76. if(wendu_value==0)  {wendu_value=15;}

  77. }
  78. void ir_out3() //wendu++
  79. {   
  80. send_precode(180,90);
  81. send_8bit_code(wendu[wendu_value][0]);
  82. send_8bit_code(wendu[wendu_value][1]);
  83. send_8bit_code(wendu[wendu_value][2]);
  84. send_8bit_code(wendu[wendu_value][3]);
  85. send_4bit_code(wendu[wendu_value][4]);
  86. send_final_code();
  87. wendu_value++;
  88. if(wendu_value==15) { wendu_value=0;}
  89. }
  90. void ir_out4()//mode choose
  91. {
  92. send_precode(180,90);
  93. send_8bit_code(mode[mode_value][0]);
  94. send_8bit_code(mode[mode_value][1]);
  95. send_8bit_code(mode[mode_value][2]);
  96. send_8bit_code(mode[mode_value][3]);
  97. send_4bit_code(mode[mode_value][4]);
  98. send_final_code();
  99. mode_value++;
  100. if(mode_value==4)
  101. { mode_value=0;}

  102. }
  103. void ir_out5() //转叶
  104. {
  105. send_precode(180,90);
  106. send_8bit_code(zhuanye[zhuanye_value][0]);
  107. send_8bit_code(zhuanye[zhuanye_value][1]);
  108. send_8bit_code(zhuanye[zhuanye_value][2]);
  109. send_8bit_code(zhuanye[zhuanye_value][3]);
  110. send_4bit_code(zhuanye[zhuanye_value][4]);
  111. send_final_code();
  112.     zhuanye_value++;
  113. if(zhuanye_value==2)  {zhuanye_value=0;}
  114. }
  115. void ir_out6() //风量
  116. {
  117. send_precode(180,90);
  118. send_8bit_code(fengliang[fengliang_value][0]);
  119. send_8bit_code(fengliang[fengliang_value][1]);
  120. send_8bit_code(fengliang[fengliang_value][2]);
  121. send_8bit_code(fengliang[fengliang_value][3]);
  122. send_4bit_code(fengliang[fengliang_value][4]);
  123. send_final_code();
  124.     fengliang_value++;
  125. if(fengliang_value==3)  {fengliang_value=0;}
  126. }
  127. //============================================

  128. void delayms(unsigned char ms)
  129. {
  130. unsigned char i;                 
  131. while(ms--)
  132. {
  133.   for(i=0;i<120;i++){};
  134. }
  135. }
  136. void TimerInit()
  137. {
  138. EA=1;
  139. ET0=1;
  140. TMOD=0X01;
  141. TH0=0XfF;
  142. TL0=221;  //50US

  143. T2CON=0x00;
  144.     T2MOD=0x02;  //enable T2's wave output through T2 pin(P10)
  145.     RCAP2H=(65536-11059/38/4)>>8; //output frequency is 38KHz
  146.     RCAP2L=(65536-11059/38/4)&0xff;   
  147. }
  148. void TransmittPulse()
  149. {
  150.   enTransmitt;
  151. // ir=0;
  152. TR0=1;
  153. TR2=1;
  154. }
  155. void TransmittLow()
  156. {
  157. //ir=1;
  158. TR0=1;
  159. disTransmitt;
  160. TR2=0;
  161. IR38k=1;
  162. }
  163. void endTransmitt()
  164. {
  165. //ir=0;
  166. TR0=0;
  167. TR2=0;
  168. IR38k=1;   //JIEZHI
  169. }
  170. void send_logic0(unsigned int s_cnt_1,unsigned int s_cnt_2)
  171. {
  172. set_count=s_cnt_1;//
  173. TransmittPulse();
  174. count =0;

  175. while(count<set_count)
  176. ;
  177. endTransmitt();
  178. //ir=1;
  179. set_count=s_cnt_2;//11;//
  180. //ir=1;
  181. count =0;
  182. TransmittLow();

  183. while(count<set_count)
  184. ;
  185. endTransmitt();
  186. }
  187. void send_logic1(unsigned int s_cnt_1,unsigned int s_cnt_2)
  188. {
  189. set_count=s_cnt_1;//
  190. TransmittPulse();

  191. count =0;

  192. while(count<set_count)
  193. ;
  194. endTransmitt();
  195. //ir=1;
  196. //=========================
  197. set_count=s_cnt_2;//32;//
  198. //ir=1;
  199. count =0;

  200. TransmittLow();

  201. while(count<set_count)
  202. ;
  203. endTransmitt();
  204. }
  205. void send_precode(unsigned int s_cnt_1,unsigned int s_cnt_2)
  206. {
  207. set_count =s_cnt_1;//180;// 9MS
  208. TransmittPulse();  //start send pulse
  209. count =0;

  210. while(count<set_count)
  211. {;}
  212. endTransmitt();
  213. set_count =s_cnt_2;//90;//4.5MS

  214. count =0;
  215. TransmittLow();
  216. while(count<set_count)
  217. {;}
  218. endTransmitt();

  219. }
  220. void send_final_code()
  221. {
  222. set_count=28;//

  223. count =0;
  224. TransmittPulse();
  225. while(count<set_count)
  226. ;
  227. endTransmitt();
  228. }
  229. void send_8bit_code(uchar value)
  230. {
  231. uchar i,temp;
  232. temp=value;
  233. for(i=0;i<8;i++)
  234. {
  235.   if(temp&0x01)  send_logic1(11,32); //1.68ms
  236.   else  send_logic0(11,11); //600US
  237.   temp=temp>>1;
  238. }
  239. }
  240. void send_4bit_code(uchar value)
  241. {
  242. uchar i,temp;
  243. temp=value;
  244. for(i=0;i<4;i++)
  245. {
  246. if(temp&0x01)  send_logic1(11,32); //1.68ms
  247.   else  send_logic0(11,11); //600US

  248.   temp=temp>>1;
  249. }
  250. }
  251. //============================主函数========================
  252. void main()
  253. {
  254.   TimerInit();      
  255.   while(1)
  256. {
  257.   key_value=KeyScan();
  258.   switch(key_value)
  259.   {
  260.   case 1:ir_out1();delayms(200);break;  //   开和关
  261.   case 2:ir_out2();delayms(200);break;  //   温度-
  262.   case 3:ir_out3();delayms(200);break;   //   温度+.
  263.   case 4:ir_out4();delayms(200);break;  // 模式选择
  264.   case 5:ir_out5();delayms(200);break;    //转叶设置
  265.   case 6:ir_out6();delayms(200);break;
  266.     //default:ir=1;break;
  267.   }
  268. }  
  269. }
  270. void timer0(void) interrupt 1
  271. {
  272. TH0=0XfF;
  273. TL0=221; //50us
  274. count++;
  275. if(flag)
  276.    TR2=1; //IR38k=0;
  277. else TR2=0;//IR38k=1;

  278. }
  279. unsigned char KeyScan()
  280. {

  281. /*-------------第一列扫描-----------------*/


  282.     if(key1==0)
  283. {
  284.    delayms(20);
  285.   if(key1==0)
  286.   {
  287.    return 1;
  288.   }
  289.   while(!key1);
  290. }
  291. if(key2==0)
  292. {
  293.    delayms(20);
  294.   if(key2==0)
  295.   {
  296.    return 2;
  297.   }
  298.   while(!key2);
  299. }

  300. if(key3==0)
  301. {
  302.    delayms(20);
  303.   if(key3==0)
  304.   {
  305.    return 3;
  306.   }
  307.   while(!key3);
  308. }
  309. if(key4==0)
  310. {
  311.    delayms(20);
  312.   if(key4==0)
  313.   {
  314.    return 4;
  315.   }
  316.   while(!key4);
  317. }
  318.   if(key5==0)
  319. {
  320.    delayms(20);
  321.   if(key5==0)
  322.   {
  323.    return 5;
  324.   }
  325.   while(!key5);
  326. }
  327.   if(key6==0)
  328. {
  329.    delayms(20);
  330.   if(key6==0)
  331.   {
  332.    return 6;
  333.   }
  334.   while(!key6);
  335. }
  336.    return 0 ;
  337. }


复制代码

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:272625 发表于 2018-2-5 21:27 来自手机 | 只看该作者
本来想验证下楼主程序的!可现在是寒冷的冬天,天气非常冷,再开空调怕小命不保呀!
回复

使用道具 举报

板凳
ID:275438 发表于 2018-2-6 01:29 | 只看该作者
都市郎 发表于 2018-2-5 21:27
本来想验证下楼主程序的!可现在是寒冷的冬天,天气非常冷,再开空调怕小命不保呀!

开热空调
回复

使用道具 举报

地板
ID:110846 发表于 2018-2-6 11:16 | 只看该作者
感谢分享~~~很好的资料
回复

使用道具 举报

5#
ID:302797 发表于 2018-5-10 11:23 | 只看该作者
解码在哪里
回复

使用道具 举报

6#
ID:374869 发表于 2018-7-20 10:36 | 只看该作者
谢谢,我学习遥控器怎么关机。
回复

使用道具 举报

7#
ID:424544 发表于 2018-11-14 11:27 来自手机 | 只看该作者
niuge 发表于 2018-2-6 01:29
开热空调

所有的格力空调都可以开吗?
回复

使用道具 举报

8#
ID:424544 发表于 2018-11-14 11:29 来自手机 | 只看该作者
这个程序一般的格力空调都可以开吗?
回复

使用道具 举报

9#
ID:438442 发表于 2018-12-3 15:59 | 只看该作者
很优秀
回复

使用道具 举报

10#
ID:479945 发表于 2019-3-2 12:30 | 只看该作者
怎么好像用不了呢?
回复

使用道具 举报

11#
ID:501238 发表于 2019-3-30 16:00 | 只看该作者
感谢楼主分享
回复

使用道具 举报

12#
ID:305245 发表于 2019-4-27 14:23 | 只看该作者
最近就是想做一个遥控器
回复

使用道具 举报

13#
ID:375715 发表于 2019-4-27 19:34 来自手机 | 只看该作者
谢谢分享
回复

使用道具 举报

14#
ID:628988 发表于 2019-11-4 19:07 | 只看该作者
第160行是不是少了东西...
回复

使用道具 举报

15#
ID:628988 发表于 2019-11-4 19:10 | 只看该作者
第156行那个函数是不是应该加一句IR^38=0,不然没有红外信号发射啊...
回复

使用道具 举报

16#
ID:628988 发表于 2019-11-5 19:48 | 只看该作者
为什么不用可编程时钟输出呀?感觉用波特率发生器好复杂...看不懂,还有那两个捕获寄存器是做什么用的?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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