通過載波學習紅外,并可還原發(fā)送出去
單片機源程序如下:
- #include "stdio.h"
- #include "delay.h"
- #include "sys.h"
- #include "led.h"
- #include "myuart.h"
- #include "ir.h"
- #include "irsend.h"
- #include "learn.h"
- #include "key.h"
- #include "pwm.h"
- #include "remoteflash.h"
- #include "lcd.h"
- /* 接口
- 發(fā)送指示燈 LED_SEND -- PC.0
- 學習指示燈 LED_COPY -- PC.1
- 按鍵 K1 -- PA.3
- K2 -- PA.4
- K3 -- PA.5
- K4 -- PA.6
- K5 -- PA.7
- 學習按鍵 KEY -- PA.2
- 接收使能 DQ -- PC.3
- 紅外接收引腳 OUT -- PA.1
- 載波38K 38K -- PA.0
- 發(fā)送控制 Txd -- PC.2
- */
- u8 Flag_RemoteSet = 0;
- u8 Flag_LearnState = 0;
- extern u16 PulseTab[];
- int main(void)
- {
- u16 i;
- u8 temp = 0;
- /* 延時函數(shù)初始化 */
- DelayInit();
- NVIC_Configuration(); //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應(yīng)優(yōu)先級
- /* MYUART 初始化 */
- MY_UartInit(9600);
- /* KEY 初始化 */
- KEY_Init();
- LearnKEY_Init();
- /* PWM 初始化 */
- TIM2_PWM_Init(1895,0); //72000/(1895+1) = 37.99K
- /* LED 初始化 */
- LED_Init();
- /* IR 初始化 */
- IR_Init(); // 紅外接收函數(shù)
- SendPort_Init();
- /* TFT1.8初始化 */
- LCD_PortInit();
- LCD_Init();
- /***************************** 以下添加代碼區(qū) *****************************/
- /* 設(shè)置窗口 */
- LCD_SetRamAddr(0,127, 0,29);
- for(i=0; i<3839; i++) LCD_Wirte_Data16(CYAN);
- ChineseChar(32,10,0,BLACK,CYAN,1); // 遙
- ChineseChar(48,10,0,BLACK,CYAN,2); // 控
- ChineseChar(64,10,0,BLACK,CYAN,3); // 器
- ChineseChar(80,10,0,BLACK,CYAN,4); // 碼
- LCD_SetRamAddr(0,127,30,89);
- for(i=0; i<11520; i++) LCD_Wirte_Data16(YELLOW);
- ChineseChar(0,40,0,BLACK,YELLOW,5); // 紅
- ChineseChar(15,40,0,BLACK,YELLOW,6);// 外
- ChineseChar(30,40,0,BLACK,YELLOW,7);// 協(xié)
- ChineseChar(45,40,0,BLACK,YELLOW,8);// 議
- LCD_ShowChar(55,40,BLACK,YELLOW,':');
- LCD_SetRamAddr(0,127,90,159);
- for(i=0; i<11520; i++) LCD_Wirte_Data16(PUEPLE);
- ChineseChar( 0,100,0,BLACK,PUEPLE,1); // 紅
- ChineseChar(15,100,0,BLACK,PUEPLE,2); // 外
- ChineseChar(30,100,0,BLACK,PUEPLE,9); // 狀
- ChineseChar(45,100,0,BLACK,PUEPLE,10); // 態(tài)
- LCD_ShowChar(55,100,BLACK,PUEPLE,':');
- /***************************** 以上添加代碼區(qū) *****************************/
- LEARN_ON = 0; // 關(guān)閉紅外接收
- LED1 = 1; // 收到脈沖指示
- LED_SEND = 1; // 發(fā)送狀態(tài)指示
- LED2 = 0;
- LED2 = 1;
- LED3 = 1;
- LED4 = 1;
- LED5 = 1;
- // TFTDisplay(); // 測試
- while(1)
- {
- /* 頁面定義 */
- //#define KEY1_ADDR 0x0807E000 VOL+
- //#define KEY2_ADDR 0x0807E800 VOL-
- //#define KEY3_ADDR 0x0807F000 CH+
- //#define KEY4_ADDR 0x0807F800 CH-
- //#define KEY5_ADDR 0x0807D800 POWER
- //#define VOL_UP 1
- //#define VOL_DOWN 2
- //#define CH_UP 3
- //#define CH_DOWN 4
- //#define PWR_ON 5
- LED2 = 0;
- temp = KEY_Scan(0); // 按鍵掃描,非連按模式
- /* 紅外協(xié)議檢測 */
- if(PulseTab[1]>3500 && PulseTab[1]<5500) {
- LCD_ShowString(50,65,BLACK,YELLOW,"NEC ");
- }else{
- LCD_ShowString(50,65,BLACK,YELLOW,"Other");
- }
- /* 遙控器狀態(tài)檢測 */
- if((Flag_RemoteSet==0) && (temp!=0)) {
- LCD_ShowString(18,120,BLACK,PUEPLE,"Sending....");
- }
- if((Flag_RemoteSet==0) && (temp==0)) {
- LCD_ShowString(18,120,BLACK,PUEPLE,"Idle State ");
- }
- // TFTDisplay(); // 測試
- //=======================學習狀態(tài)=======================//
- if(Flag_RemoteSet == 1){
- // ChineseChar(20,110,2,BLACK,PUEPLE,1);// 學
- // ChineseChar(45,110,2,BLACK,PUEPLE,2);// 習
- // ChineseChar(70,1` 10,2,BLACK,PUEPLE,3);// 中
- // LCD_ShowString(95,115,BLACK,YELLOW,"...");
- //LCD_ShowString(18,115,BLACK,PUEPLE,"Learning...");
- switch(temp){
- case VOL_UP :temp = 0; // 按鍵按下標志清零
- LED3 = ~LED3; // 調(diào)試用
- FLASH_WriteData(KEY1_ADDR,PulseTab,200); // 紅外脈沖寬度值保存到相應(yīng)按鍵下
- break;
- case VOL_DOWN:temp = 0; // 按鍵按下標志清零
- LED3 = ~LED3;
- FLASH_WriteData(KEY2_ADDR,PulseTab,200); // 紅外脈沖寬度值保存到相應(yīng)按鍵下
- break;
- case CH_UP :temp = 0; // 按鍵按下標志清零
- LED3 = ~LED3;
- FLASH_WriteData(KEY3_ADDR,PulseTab,200); // 紅外脈沖寬度值保存到相應(yīng)按鍵下
- break;
- case CH_DOWN :temp = 0; // 按鍵按下標志清零
- LED3 = ~LED3;
- FLASH_WriteData(KEY4_ADDR,PulseTab,200); // 紅外脈沖寬度值保存到相應(yīng)按鍵下
- break;
- case PWR_ON :temp = 0; // 按鍵按下標志清零
- LED3 = ~LED3;
- FLASH_WriteData(KEY5_ADDR,PulseTab,200); // 紅外脈沖寬度值保存到相應(yīng)按鍵下
- break;
- }
- }
- //=======================發(fā)送狀態(tài)=======================//
- if(Flag_RemoteSet == 0){
- //LCD_ShowString(18,115,BLACK,PUEPLE,"SendingStat");
- switch(temp){
- case VOL_UP :temp = 0; // 按鍵按下標志清零
- SendLight(1); // 發(fā)送指示燈亮
- //LED3 = ~LED3; // 調(diào)試用
- IR_SendData(KEY1_ADDR); // 紅外發(fā)送
- delay_ms(150);
- SendLight(0); // 發(fā)送完熄滅
- break;
- case VOL_DOWN:temp = 0; // 按鍵按下標志清零
- SendLight(1); //發(fā)送指示燈亮
- //LED3 = ~LED3;
- IR_SendData(KEY2_ADDR);
- delay_ms(150);
- SendLight(0);
- break;
- case CH_UP :temp = 0; // 按鍵按下標志清零
- SendLight(1); //發(fā)送指示燈亮
- //LED3 = ~LED3;
- IR_SendData(KEY3_ADDR);
- delay_ms(150);
- SendLight(0);
- break;
- case CH_DOWN :temp = 0; // 按鍵按下標志清零
- SendLight(1); //發(fā)送指示燈亮
- //LED3 = ~LED3;
- IR_SendData(KEY4_ADDR);
- delay_ms(150);
- SendLight(0);
- break;
- case PWR_ON :temp = 0; // 按鍵按下標志清零
- SendLight(1); //發(fā)送指示燈亮
- //LED3 = ~LED3;
- IR_SendData(KEY5_ADDR);
- delay_ms(150);
- SendLight(0);
- break;
- }
- }
- }
- }
復制代碼
所有資料51hei提供下載:
IR_remote.zip
(382.88 KB, 下載次數(shù): 579)
2018-7-12 15:23 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|