標(biāo)題: 51單片機(jī)格力空調(diào)遙控器設(shè)計(jì)源碼 [打印本頁(yè)]

作者: tanshi706    時(shí)間: 2018-1-31 15:53
標(biāo)題: 51單片機(jī)格力空調(diào)遙控器設(shè)計(jì)源碼
  1. //51單片機(jī)格力空調(diào)遙控器

  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;     //紅外發(fā)射管
  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}};  // 手動(dòng),自動(dòng)轉(zhuǎn)頁(yè)(20度,冷氣)
  26. uchar code  fengliang[][5]={{0x28,0x08,0x00,0x50,0x02},{0x19,0x08,0x00,0x50,0x02},
  27.                              {0x09,0x08,0x00,0x50,0x02}
  28.          }; //自動(dòng)模式風(fēng)量 小,中,大  (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.                       };    //自動(dòng),冷氣,除濕,送風(fēng)
  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.        }; //開(kāi)機(jī),關(guān)機(jī)
  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() //啟動(dòng)和關(guān)閉
  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() //轉(zhuǎn)葉
  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() //風(fēng)量
  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. //============================主函數(shù)========================
  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;  //   開(kāi)和關(guān)
  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;    //轉(zhuǎn)葉設(shè)置
  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. }


復(fù)制代碼

作者: 都市郎    時(shí)間: 2018-2-5 21:27
本來(lái)想驗(yàn)證下樓主程序的!可現(xiàn)在是寒冷的冬天,天氣非常冷,再開(kāi)空調(diào)怕小命不保呀!
作者: niuge    時(shí)間: 2018-2-6 01:29
都市郎 發(fā)表于 2018-2-5 21:27
本來(lái)想驗(yàn)證下樓主程序的!可現(xiàn)在是寒冷的冬天,天氣非常冷,再開(kāi)空調(diào)怕小命不保呀!

開(kāi)熱空調(diào)
作者: syf466    時(shí)間: 2018-2-6 11:16
感謝分享~~~很好的資料
作者: zz.stt    時(shí)間: 2018-5-10 11:23
解碼在哪里
作者: DANFISH    時(shí)間: 2018-7-20 10:36
謝謝,我學(xué)習(xí)遙控器怎么關(guān)機(jī)。
作者: 花生的護(hù)法    時(shí)間: 2018-11-14 11:27
niuge 發(fā)表于 2018-2-6 01:29
開(kāi)熱空調(diào)

所有的格力空調(diào)都可以開(kāi)嗎?
作者: 花生的護(hù)法    時(shí)間: 2018-11-14 11:29
這個(gè)程序一般的格力空調(diào)都可以開(kāi)嗎?
作者: cyu    時(shí)間: 2018-12-3 15:59
很優(yōu)秀
作者: 莊周的小燕    時(shí)間: 2019-3-2 12:30
怎么好像用不了呢?
作者: asd824313036    時(shí)間: 2019-3-30 16:00
感謝樓主分享
作者: 13828617332    時(shí)間: 2019-4-27 14:23
最近就是想做一個(gè)遙控器
作者: yyhlsf    時(shí)間: 2019-4-27 19:34
謝謝分享
作者: 陳曉龍    時(shí)間: 2019-11-4 19:07
第160行是不是少了東西...
作者: 陳曉龍    時(shí)間: 2019-11-4 19:10
第156行那個(gè)函數(shù)是不是應(yīng)該加一句IR^38=0,不然沒(méi)有紅外信號(hào)發(fā)射啊...
作者: 陳曉龍    時(shí)間: 2019-11-5 19:48
為什么不用可編程時(shí)鐘輸出呀?感覺(jué)用波特率發(fā)生器好復(fù)雜...看不懂,還有那兩個(gè)捕獲寄存器是做什么用的?




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1