久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7406|回復: 2
打印 上一主題 下一主題
收起左側

單片機紅外發射程序

[復制鏈接]
跳轉到指定樓層
樓主


本例程可以實現用stc的51單片機來控制進行紅外線的發射,
完整keil工程文件下載:
http://www.zg4o1577.cn/bbs/dpj-55490-1.html
下面是部分程序代碼的預覽:
主程序:
  1. #include "IR_SendCode.h"
  2. #include "IR_SendDisp.h"
  3. #include "IR_Receive.h"
  4. #include "ChannelShortcutDef.h"
  5. #include "Nokia5110.h"
  6. #include "delay.h"

  7. ChannelKey_TypeDef Channel_ShortKey;//定義通道&快捷鍵結構體
  8. uint8_t IRSendOrRemote_Flag = Function_IRsend;//定義需要實現的是紅外發射還是紅外接收

  9. void main(void)
  10. {
  11.         IRsend_Init();
  12.         IRreceiver_Init();
  13.         Nokia5110_Init();
  14.         ReadE2P_ChannelShortKey();//讀取設置的通道和快捷鍵
  15.         Nokia5110_DispChannelKey();//顯示設置的通道和快捷鍵
  16.        
  17.         while(1)
  18.         {
  19.                 Funtion_KeyScan();
  20.                 if(IRSendOrRemote_Flag == Function_IRsend)  //紅外發送功能實現
  21.                 {
  22.                         Set_ChannelShortKey();
  23.                   ShortKeyScan_IRSendCode();                       
  24.                  }
  25.                 if(IRSendOrRemote_Flag == Function_IRremote)//紅外接收功能實現
  26.                 {
  27.                         IRcode_Disp();
  28.                  }
  29.          }
  30. }
復制代碼

STC89Cx_it.c
  1. #include "STC89Cx_it.h"
  2. #include "IR_Receive.h"

  3. //紅外解碼原理:把紅外中的載波解調成低電平,把紅外中的低電平解調成高電平輸出
  4. //識別原理:識別一個完整周期的高低電平總時間來識別頭碼和"0"或"1"的值

  5. #define Rev_Header      0x00          //數據接收狀態:接收頭碼0xAA或oxAB
  6. #define Rev_Length      0x01          //數據接收狀態:接收頭碼數據包長度
  7. #define Rev_DataPackage 0x02         //數據接收狀態:接收數據包

  8. extern uint8_t IRcode_Type;                          //聲明收到的紅外數據類型
  9. extern uint8_t IRdataReceive_Flag;//聲明接收紅外數據狀態,等待or接收中or接收完畢
  10. extern uint32_t IRcode_Buffer;                //紅外數據緩存
  11. uint8_t CycleTime = 0;                                 //存儲完整周期時間(高電平+低電平)
  12. /**********************************************
  13. 函數:void INT0_Handler(void);
  14. 功能:外部中斷0中斷處理函數;
  15. ***********************************************/
  16. void INT0_Handler(void) interrupt 0
  17. {
  18. }

  19. /**********************************************
  20. 函數:void TIME0_Handler(void);
  21. 功能:定時器0中斷處理函數;
  22. ***********************************************/
  23. void TIME0_Handler(void) interrupt 1
  24. {
  25.         CycleTime++;
  26.         if(CycleTime==255)CycleTime=0;         
  27. }

  28. /**********************************************
  29. 函數:void INT1_Handler(void);
  30. 功能:外部中斷1中斷處理函數;
  31. ***********************************************/
  32. void INT1_Handler(void) interrupt 2
  33. {
  34.         static uint8_t EnterINT0_CNT = 0;//存儲進入外部中斷次數
  35.         static uint8_t Rev_State = Rev_Header;//定義接收狀態
  36.         uint8_t CycleTime_Buffer=0;                         //周期時間緩沖變量
  37.        
  38.         EnterINT0_CNT++;                                                                 //每進入中斷一次加1
  39.         //第一次進入中斷周期清零,打開定時器0準備計時
  40.         if(EnterINT0_CNT==1)
  41.         {
  42.                 CycleTime=0;
  43.                 IRcode_Buffer=0;
  44.                 TR0=1;
  45.          }
  46.         else//之后先讀時間,再進行清零
  47.         {
  48.                 CycleTime_Buffer=CycleTime;
  49.                 CycleTime = 0;
  50.          }
  51.          
  52.          //開始識別頭碼
  53.         if((Rev_State==Rev_Header)&&(EnterINT0_CNT==2))         
  54.         {
  55.                 Rev_State = Rev_DataPackage;
  56.                 if((CycleTime_Buffer>60)&&(CycleTime_Buffer<100))                         //頭碼時間位于6.0ms~10ms則為RCA碼(標準8ms)
  57.                 {
  58.                         IRcode_Type = IRcode_TypeRCA;
  59.                  }
  60.                 else if((CycleTime_Buffer>110)&&(CycleTime_Buffer<160))//頭碼時間位于11ms~16ms(必須是大于11ms)則為NEC碼(標準13.5ms)
  61.                 {
  62.                         IRcode_Type = IRcode_TypeNEC8;
  63.                  }
  64.                 else//如果都不是,則認為沒有收到頭碼
  65.                 {
  66.                         TR0=0;
  67.                         IRcode_Buffer = 0;
  68.                         EnterINT0_CNT = 0;
  69.                         Rev_State = Rev_Header;
  70.                  }
  71.          }
  72.          
  73.         if((Rev_State==Rev_DataPackage)&&(EnterINT0_CNT>2))//開始解碼
  74.         {
  75.                 IRcode_Buffer <<= 1;
  76.                 switch(IRcode_Type)
  77.                 {
  78.                         case IRcode_TypeRCA:
  79.                         {
  80.                                 if((CycleTime_Buffer>10)&&(CycleTime_Buffer<20))//碼值時間位于1.0ms~2.0ms則為RCA'1'(標準1.5ms)
  81.                                 {
  82.                                         IRcode_Buffer |= (uint32_t)0x01;
  83.                                  }
  84.                                 else if((CycleTime_Buffer>20)&&(CycleTime_Buffer<30))//碼值時間位于1.0ms~2.0ms則為RCA'0'(標準2.5ms)
  85.                                 {
  86.                                         IRcode_Buffer |= (uint32_t)0x00;
  87.                                  }
  88.                                 else
  89.                                 {
  90.                                         TR0=0;
  91.                                         IRcode_Buffer = 0;
  92.                                         EnterINT0_CNT = 0;
  93.                                         Rev_State = Rev_Header;
  94.                                  }
  95.                                 break;
  96.                          }
  97.                         case IRcode_TypeNEC8:
  98.                         {
  99.                                 if((CycleTime_Buffer>6)&&(CycleTime_Buffer<16))//碼值時間位于0.6ms~1.6ms則為NEC'0'(標準1.124ms)
  100.                                 {
  101.                                         IRcode_Buffer |= (uint32_t)0x00;
  102.                                  }
  103.                                 else if((CycleTime_Buffer>16)&&(CycleTime_Buffer<28))//碼值時間位于1.6ms~2.8ms則為NEC'1'(標準2.25ms)
  104.                                 {
  105.                                         IRcode_Buffer |= (uint32_t)0x01;
  106.                                  }
  107.                                 else
  108.                                 {
  109.                                         TR0=0;
  110.                                         IRcode_Buffer = 0;
  111.                                         EnterINT0_CNT = 0;
  112.                                         Rev_State = Rev_Header;
  113.                            }
  114.                                 break;
  115.                          }
  116.                  }
  117.                  
  118.                 if(((EnterINT0_CNT==26)&&((IRcode_Type==IRcode_TypeRCA)))||((EnterINT0_CNT==34)&&((IRcode_Type==IRcode_TypeNEC8))))//RCA碼加頭碼25,NEC碼加頭碼33位,解碼進入中斷次數分別為26和34
  119.                 {
  120.                         TR0=0;//解碼完畢關閉定時器
  121.                         EnterINT0_CNT=0;
  122.                         IRdataReceive_Flag=IRdataReceive_Success;
  123.                         Rev_State = Rev_Header;//準備下一次接收
  124.                  }
  125.          }
  126. }

  127. /**********************************************
  128. 函數:void TIME1_Handler(void);
  129. 功能:定時器1中斷處理函數;
  130. ***********************************************/
  131. void TIME1_Handler(void) interrupt 3
  132. {
  133. }

  134. /**********************************************
  135. 函數:void USART_Handler(void);
  136. 功能:串口中斷處理函數;
  137. ***********************************************/
  138. void USART_Handler(void) interrupt 4
  139. {

  140. }
  141. /**********************************************
  142. 函數:void TIME2_Handler(void);
  143. 功能:定時器2中斷處理函數;
  144. ***********************************************/
  145. void TIME2_Handler(void) interrupt 5
  146. {
  147.          
  148. }
復制代碼
  1. #include "IR_SendCode.h"

  2. /***********************************************************************************************
  3. 函數void IRsend_Init(void)
  4. 功能:定時器1初始化
  5. **********************************************************************************************/
  6. void IRsend_Init(void)
  7. {
  8.   TMOD |= 0x10;                //工作于方式1,16位定時器                               
  9.         TH1   = 0x00;
  10.         TL1   = 0x00;
  11.         TF1   = 0;                        //清楚定時器標志位
  12.         TR1   = 0;                        //關閉定時器
  13. }
  14. /***********************************************************************************************
  15. 函數void Carrier_38KHz(void)
  16. 功能:產生38KHz載波,1/2占空比,12M晶振
  17. **********************************************************************************************/
  18. void Carrier_38KHz(void)
  19. {
  20.         IR = 1;
  21.         _nop_();_nop_();_nop_();_nop_();
  22.         _nop_();_nop_();_nop_();_nop_();
  23.         _nop_();_nop_();_nop_();_nop_();
  24.        
  25.         IR = 0;
  26.         _nop_();_nop_();_nop_();_nop_();
  27.         _nop_();_nop_();_nop_();_nop_();
  28.         _nop_();_nop_();_nop_();_nop_();
  29. }


  30. /******************************************RCA編碼**********************************************/

  31. /***********************************************************************************************
  32. 函數void RCA_LeadCode(void)
  33. 功能:產生RCA引導碼
  34. **********************************************************************************************/
  35. void RCA_LeadCode(void)
  36. {
  37.         TH1 = (65536-TCarrier_RCALeadCode)/256;//定時載波時間
  38.         TL1 = (65536-TCarrier_RCALeadCode)%256;
  39.         TR1 = 1;//打開定時器0
  40.         IR_ON();
  41.         while(!TF1)
  42.         {
  43.                 Carrier_38KHz();
  44.          }
  45.         TF1 = 0;TR1 = 0;
  46.        
  47.         IR_OFF();
  48.         TH1 = (65536-TLowLevel_RCALeadCode)/256;//定時低電平時間
  49.         TL1 = (65536-TLowLevel_RCALeadCode)%256;
  50.         TR1 = 1;//打開定時器0
  51.         while(!TF1)IR_OFF();
  52.         TF1 = 0;TR1 = 0;
  53. }
  54. /***********************************************************************************************
  55. 函數void RCA_1(void)
  56. 功能:產生RCA"1"碼
  57. **********************************************************************************************/
  58. void RCA_1(void)
  59. {
  60.         TH1 = (65536-TCarrier_RCA_1)/256;//定時載波時間
  61.         TL1 = (65536-TCarrier_RCA_1)%256;
  62.         TR1 = 1;//打開定時器0
  63.         IR_ON();
  64.         while(!TF1)
  65.         {
  66.                 Carrier_38KHz();
  67.          }
  68.         TF1 = 0;TR1 = 0;
  69.        
  70.         IR_OFF();
  71.         TH1 = (65536-TLowLevel_RCA_1)/256;//定時低電平時間
  72.         TL1 = (65536-TLowLevel_RCA_1)%256;
  73.         TR1 = 1;//打開定時器0
  74.         while(!TF1)IR_OFF();
  75.         TF1 = 0;TR1 = 0;       
  76. }
  77. /***********************************************************************************************
  78. 函數void RCA_0(void)
  79. 功能:產生RCA"0"碼
  80. **********************************************************************************************/
  81. void RCA_0(void)
  82. {
  83.         TH1 = (65536-TCarrier_RCA_0)/256;//定時載波時間
  84.         TL1 = (65536-TCarrier_RCA_0)%256;
  85.         TR1 = 1;//打開定時器0
  86.         IR_ON();
  87.         while(!TF1)
  88.         {
  89.                 Carrier_38KHz();
  90.          }
  91.         TF1 = 0;TR1 = 0;
  92.        
  93.         IR_OFF();
  94.         TH1 = (65536-TLowLevel_RCA_0)/256;//定時低電平時間
  95.         TL1 = (65536-TLowLevel_RCA_0)%256;
  96.         TR1 = 1;//打開定時器0
  97.         while(!TF1)IR_OFF();
  98.         TF1 = 0;TR1 = 0;       
  99. }
  100. /***********************************************************************************************
  101. 函數void RCA_EndCode(void)
  102. 功能:結束碼
  103. **********************************************************************************************/
  104. void RCA_EndCode(void)
  105. {
  106.         RCA_1();
  107. }

  108. /***********************************************************************************************
  109. 函數void IR_RCACode(uint8_t *pHex_RCA)
  110. 功能:RCA發碼(系統碼+用戶碼),高位在前發射,傳入的參數為RCA系統碼+用戶碼兩字節數組
  111. **********************************************************************************************/
  112. void IR_RCACode(uint8_t *pHex_RCA)
  113. {
  114.         uint16_t i;
  115.         uint8_t SystemCode = pHex_RCA[0];//RCA系統碼
  116.         uint8_t UserCode   = pHex_RCA[1];//RCA用戶碼
  117.        
  118.         RCA_LeadCode();//RCA引導碼
  119.         for(i=0x0008;i!=0x0000;i=i>>1)//發送RCA系統碼
  120.         {
  121.                 if(SystemCode&i)
  122.                 {
  123.                         RCA_1();
  124.                 }
  125.                 else
  126.                 {
  127.                         RCA_0();
  128.                 }
  129.         }
  130.         for(i=0x0080;i!=0x0000;i=i>>1)//發送RCA用戶碼
  131.         {
  132.                 if(UserCode&i)
  133.                 {
  134.                         RCA_1();
  135.                 }
  136.                 else
  137.                 {
  138.                         RCA_0();
  139.                 }
  140.         }       
  141.         SystemCode=~SystemCode;
  142.         for(i=0x0008;i!=0x0000;i=i>>1)//發送RCA系統反碼
  143.         {
  144.                 if(SystemCode&i)
  145.                 {
  146.                         RCA_1();
  147.                 }
  148.                 else
  149.                 {
  150.                         RCA_0();
  151.                 }
  152.         }
  153.         UserCode=~UserCode;
  154.         for(i=0x0080;i!=0x0000;i=i>>1)//發送RCA用戶反碼
  155.         {
  156.                 if(UserCode&i)
  157.                 {
  158.                         RCA_1();
  159.                 }
  160.                 else
  161.                 {
  162.                         RCA_0();
  163.                 }
  164.         }               
  165.         RCA_EndCode();//停止碼       
  166. }


  167. /******************************************NEC編碼**********************************************/

  168. /***********************************************************************************************
  169. 函數void NEC_LeadCode(void)
  170. 功能:產生NEC引導碼
  171. **********************************************************************************************/
  172. void NEC_LeadCode(void)
  173. {
  174.         TH1 = (65536-TCarrier_NECLeadCode)/256;//定時載波時間
  175.         TL1 = (65536-TCarrier_NECLeadCode)%256;
  176.         TR1 = 1;//打開定時器0
  177.         IR_ON();
  178.         while(!TF1)
  179.         {
  180.                 Carrier_38KHz();
  181.          }
  182.         TF1 = 0;TR1 = 0;
  183.        
  184.         IR_OFF();
  185.         TH1 = (65536-TLowLevel_NECLeadCode)/256;//定時低電平時間
  186.         TL1 = (65536-TLowLevel_NECLeadCode)%256;
  187.         TR1 = 1;//打開定時器0
  188.         while(!TF1)IR_OFF();
  189.         TF1 = 0;TR1 = 0;
  190. }
  191. /***********************************************************************************************
  192. 函數void NEC_1(void)
  193. 功能:產生NEC"1"碼
  194. **********************************************************************************************/
  195. void NEC_1(void)
  196. {
  197.         TH1 = (65536-TCarrier_NEC_1)/256;//定時載波時間
  198.         TL1 = (65536-TCarrier_NEC_1)%256;
  199.         TR1 = 1;//打開定時器0
  200.         IR_ON();
  201.         while(!TF1)
  202.         {
  203.                 Carrier_38KHz();
  204.          }
  205.         TF1 = 0;TR1 = 0;
  206.        
  207.         IR_OFF();
  208.         TH1 = (65536-TLowLevel_NEC_1)/256;//定時低電平時間
  209.         TL1 = (65536-TLowLevel_NEC_1)%256;
  210.         TR1 = 1;//打開定時器0
  211.         while(!TF1)IR_OFF();
  212.         TF1 = 0;TR1 = 0;       
  213. }
  214. /***********************************************************************************************
  215. 函數void NEC_0(void)
  216. 功能:產生NEC"0"碼
  217. **********************************************************************************************/
  218. void NEC_0(void)
  219. {
  220.         TH1 = (65536-TCarrier_NEC_0)/256;//定時載波時間
  221.         TL1 = (65536-TCarrier_NEC_0)%256;
  222.         TR1 = 1;//打開定時器0
  223.         IR_ON();
  224.         while(!TF1)
  225.         {
  226.                 Carrier_38KHz();
  227.          }
  228.         TF1 = 0;TR1 = 0;
  229.        
  230.         IR_OFF();
  231.         TH1 = (65536-TLowLevel_NEC_0)/256;//定時低電平時間
  232.         TL1 = (65536-TLowLevel_NEC_0)%256;
  233.         TR1 = 1;//打開定時器0
  234.         while(!TF1)IR_OFF();
  235.         TF1 = 0;TR1 = 0;       
  236. }
  237. /***********************************************************************************************
  238. 函數void NEC_EndCode(void)
  239. 功能:結束碼
  240. **********************************************************************************************/
  241. void NEC_EndCode(void)
  242. {
  243.         NEC_1();
  244. }

  245. /******************************************NEC8編碼*******************************************/

  246. /***********************************************************************************************
  247. 函數void IR_NEC8Code(uint8_t *pHex_NEC8)
  248. 功能:NEC8發碼(系統碼+用戶碼),低位在前發射,傳入參數為NEC8系統碼+用戶碼兩字節數組
  249. **********************************************************************************************/
  250. void IR_NEC8Code(uint8_t *pHex_NEC8)
  251. {
  252.         uint16_t i;
  253.         uint8_t SystemCode = pHex_NEC8[0];//NEC8系統碼
  254.         uint8_t UserCode   = pHex_NEC8[1];//NEC8用戶碼
  255.        
  256.         NEC_LeadCode();//NEC8引導碼
  257.         for(i=0x0001;i!=0x0100;i=i<<1)//發送NEC8系統碼
  258.         {
  259.                 if(SystemCode&i)
  260.                 {
  261.                         NEC_1();
  262.                 }
  263.                 else
  264.                 {
  265.                         NEC_0();
  266.                 }
  267.         }
  268.         SystemCode=~SystemCode;
  269.         for(i=0x0001;i!=0x0100;i=i<<1)//發送NEC8系統反碼
  270.         {
  271.                 if(SystemCode&i)
  272.                 {
  273.                         NEC_1();
  274.                 }
  275.                 else
  276.                 {
  277.                         NEC_0();
  278.                 }
  279.         }
  280.         for(i=0x0001;i!=0x0100;i=i<<1)//發送NEC8用戶碼
  281.         {
  282.                 if(UserCode&i)
  283.                 {
  284.                         NEC_1();
  285.                 }
  286.                 else
  287.                 {
  288.                         NEC_0();
  289.                 }
  290.         }       
  291.         UserCode=~UserCode;
  292.         for(i=0x0001;i!=0x0100;i=i<<1)//發送NEC8用戶反碼
  293.         {
  294.                 if(UserCode&i)
  295.                 {
  296.                         NEC_1();
  297.                 }
  298.                 else
  299.                 {
  300.                         NEC_0();
  301.                 }
  302.         }               
  303.         NEC_EndCode();//停止碼       
  304. }

  305. /******************************************NEC16編碼********************************************/

  306. /***********************************************************************************************
  307. 函數void IR_NEC16Code(uint16_t *pHex_NEC16)
  308. 功能:NEC16發碼(系統碼+用戶碼),低位在前發射
  309. **********************************************************************************************/
  310. void IR_NEC16Code(uint16_t *pHex_NEC16)
  311. {
  312.         uint16_t i;
  313.        
  314.         uint16_t SystemCode = pHex_NEC16[0];//NEC16系統碼;
  315.         uint16_t UserCode   = pHex_NEC16[1];//NEC16用戶碼;
  316.        
  317.         uint16_t SystemCode_High=SystemCode/256;
  318.         uint16_t SystemCode_Low =SystemCode%256;
  319.                
  320.         NEC_LeadCode();//NEC8引導碼
  321.         for(i=0x0001;i!=0x0100;i=i<<1)//發送NEC8系統碼高八位
  322.         {
  323.                 if(SystemCode_High&i)
  324.                 {
  325.                         NEC_1();
  326.                 }
  327.                 else
  328.                 {
  329.                         NEC_0();
  330.                 }
  331.         }
  332.         for(i=0x0001;i!=0x0100;i=i<<1)//發送NEC8系統碼低八位
  333.         {
  334.                 if(SystemCode_Low&i)
  335.                 {
  336.                         NEC_1();
  337.                 }
  338.                 else
  339.                 {
  340.                         NEC_0();
  341.                 }
  342.         }
  343.         for(i=0x0001;i!=0x0100;i=i<<1)//發送NEC8用戶碼
  344.         {
  345.                 if(UserCode&i)
  346.                 {
  347.                         NEC_1();
  348.                 }
  349.                 else
  350.                 {
  351.                         NEC_0();
  352.                 }
  353.         }       
  354.         UserCode=~UserCode;
  355.         for(i=0x0001;i!=0x0100;i=i<<1)//發送NEC8用戶反碼
  356.         {
  357.                 if(UserCode&i)
  358.                 {
  359.                         NEC_1();
  360.                 }
  361.                 else
  362.                 {
  363.                         NEC_0();
  364.                 }
  365.         }               
  366.         NEC_EndCode();//停止碼       
  367. }
復制代碼




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:85743 發表于 2018-4-18 21:00 | 只看該作者
不錯,下載學習,謝謝樓主!
回復

使用道具 舉報

板凳
ID:262504 發表于 2018-8-10 16:27 | 只看該作者
剛好需要,謝謝分享
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品视频综合 | 欧美激情精品久久久久久 | 一区二区三区四区av | 国产精品久久久久久二区 | 亚洲三区在线观看 | 激情久久av一区av二区av三区 | 国产 日韩 欧美 中文 在线播放 | 一区在线视频 | 久草中文在线观看 | 国产真实精品久久二三区 | 91精品国产91久久久久久吃药 | 亚洲精品久久久一区二区三区 | 先锋资源吧 | 99re在线视频 | 午夜一区二区三区视频 | 91一区二区| 综合精品久久久 | 午夜电影福利 | 在线观看精品 | 久久久成人精品 | 精品国产伦一区二区三区观看体验 | 国产精品视频二区三区 | 色婷婷国产精品综合在线观看 | www.玖玖玖| 国产精品永久在线观看 | 黄瓜av| 极品国产视频 | 亚洲电影专区 | 国产亚洲精品精品国产亚洲综合 | 婷婷毛片 | 日韩一区二区三区视频 | 日韩欧美一区二区三区免费观看 | 亚洲欧美视频在线观看 | 免费的色网站 | 亚洲a在线视频 | 欧美中文字幕一区二区三区亚洲 | 91精品麻豆日日躁夜夜躁 | 中文字幕第90页 | 一区二区三区免费在线观看 | 国产精品色 | 中文字幕视频在线 |