通过载波学习红外,并可还原发送出去
单片机源程序如下:
- #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"
- /* 接口
- 发送指示灯 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
- 发送控制 Txd -- PC.2
- */
- u8 Flag_RemoteSet = 0;
- u8 Flag_LearnState = 0;
- extern u16 PulseTab[];
- int main(void)
- {
- u16 i;
- u8 temp = 0;
- /* 延时函数初始化 */
- DelayInit();
- NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
- /* 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(); // 红外接收函数
- SendPort_Init();
- /* TFT1.8初始化 */
- LCD_PortInit();
- LCD_Init();
- /***************************** 以下添加代码区 *****************************/
- /* 设置窗口 */
- 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);// 协
- 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); // 态
- LCD_ShowChar(55,100,BLACK,PUEPLE,':');
- /***************************** 以上添加代码区 *****************************/
- LEARN_ON = 0; // 关闭红外接收
- LED1 = 1; // 收到脉冲指示
- LED_SEND = 1; // 发送状态指示
- 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); // 按键扫描,非连按模式
- /* 红外协议检测 */
- if(PulseTab[1]>3500 && PulseTab[1]<5500) {
- LCD_ShowString(50,65,BLACK,YELLOW,"NEC ");
- }else{
- LCD_ShowString(50,65,BLACK,YELLOW,"Other");
- }
- /* 遥控器状态检测 */
- 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(); // 测试
- //=======================学习状态=======================//
- 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; // 调试用
- FLASH_WriteData(KEY1_ADDR,PulseTab,200); // 红外脉冲宽度值保存到相应按键下
- break;
- case VOL_DOWN:temp = 0; // 按键按下标志清零
- LED3 = ~LED3;
- FLASH_WriteData(KEY2_ADDR,PulseTab,200); // 红外脉冲宽度值保存到相应按键下
- break;
- case CH_UP :temp = 0; // 按键按下标志清零
- LED3 = ~LED3;
- FLASH_WriteData(KEY3_ADDR,PulseTab,200); // 红外脉冲宽度值保存到相应按键下
- break;
- case CH_DOWN :temp = 0; // 按键按下标志清零
- LED3 = ~LED3;
- FLASH_WriteData(KEY4_ADDR,PulseTab,200); // 红外脉冲宽度值保存到相应按键下
- break;
- case PWR_ON :temp = 0; // 按键按下标志清零
- LED3 = ~LED3;
- FLASH_WriteData(KEY5_ADDR,PulseTab,200); // 红外脉冲宽度值保存到相应按键下
- break;
- }
- }
- //=======================发送状态=======================//
- if(Flag_RemoteSet == 0){
- //LCD_ShowString(18,115,BLACK,PUEPLE,"SendingStat");
- switch(temp){
- case VOL_UP :temp = 0; // 按键按下标志清零
- SendLight(1); // 发送指示灯亮
- //LED3 = ~LED3; // 调试用
- IR_SendData(KEY1_ADDR); // 红外发送
- delay_ms(150);
- SendLight(0); // 发送完熄灭
- break;
- case VOL_DOWN:temp = 0; // 按键按下标志清零
- SendLight(1); //发送指示灯亮
- //LED3 = ~LED3;
- IR_SendData(KEY2_ADDR);
- delay_ms(150);
- SendLight(0);
- break;
- case CH_UP :temp = 0; // 按键按下标志清零
- SendLight(1); //发送指示灯亮
- //LED3 = ~LED3;
- IR_SendData(KEY3_ADDR);
- delay_ms(150);
- SendLight(0);
- break;
- case CH_DOWN :temp = 0; // 按键按下标志清零
- SendLight(1); //发送指示灯亮
- //LED3 = ~LED3;
- IR_SendData(KEY4_ADDR);
- delay_ms(150);
- SendLight(0);
- break;
- case PWR_ON :temp = 0; // 按键按下标志清零
- SendLight(1); //发送指示灯亮
- //LED3 = ~LED3;
- IR_SendData(KEY5_ADDR);
- delay_ms(150);
- SendLight(0);
- break;
- }
- }
- }
- }
复制代码
所有资料51hei提供下载:
IR_remote.zip
(382.88 KB, 下载次数: 579)
|