遥控 :NEC 编码 960nm的波长 晶振为455KHZ,对应的发射频率(载波频率)为38KHZ,
遥控ID为0(即系统识别码),反码为255,不同的遥控ID有可能不一样。
接收头:1838 脉冲型
遥控码由三部分组成
1、leader code 9ms的高电平 + 4.5ms 的低电平
2、系统识别码 区别不同的红外遥控设备
3、操作码 8bit操作码和8bit的操作反码组成
发送方的电平跟接收方解调出来的电平是反向的。
红外接收头接收到遥控器的信号后,解码出后的数据格式如下:
写程序即根据这个信号的格式来写。
__________________ _______ _ _ _ _ _ _ _ _ ____ ____ ____ ____ ____ ____ ____ ____ ___________________________________ _______ ___________________________________________________________
|_____________| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |x x x x x x x x|x x x x x x x x| |_____________| |_|
|<- 9ms ->|<4.5ms>|
|----leader code------|-----custom code 8bit----------|-----------------custom code' 8bit---------------------| key data 8bit |key data'8bit |<---------------40ms---------------><----9ms-----><2.1ms>--|--------------- 此时的高电平超过40ms,然后出现9ms的低电平,2.1ms的高电平 连发码----------------
0和1均以0.56ms的低电平开始(实际测量是500us的样子),不同的是后面出现的高电平,
如果高电平是0.56ms(实际测量是500us的样子),则表示0,如果高电平是1.68ms(0.56*3=1.68)则表示1
0.56ms:|_|
_ _ _
0: |_| |_| |
_ ____ ____
1: |_| |_| |_
写代码的时候只需要检测高电平的时间即可。
以下时间都是通过示波器实际测量所得。
引导码的高电平:4.5ms
0的高电平 :0.56ms(实测0.5ms的样子)
1的高电平 :1.68ms
连发码的高电平:2.1ms
-------------------------------------------------------------------------------------------------------
不同的遥控按键值是不一样的,需要实际测量,测量的时候可通过串口打印出键值来测量
下面的键值是野火ISO STM32开发板配套的遥控器对应的键值
电源 :162
MENU : 226
TEST : 34
+ : 2
RETURN: 194
|<< : 224
> : 168
>>| : 144
0 : 104
- : 152
C : 176
1 :48
2 :24
3 :122
4 :16
5 :56
6 :90
7 :66
8 :74
9 :82
main函数:
- int main(void)
- {
- uint8_t key_val;
- /* config the led */
- LED_GPIO_Config();
- LED1_ON;
- /* 配置SysTick 为10us中断一次 */
- SysTick_Init();
- /* 重新配置SysTick的中断优先级为最高,要不然SysTick延时中断抢占不了IO EXTI中断
- * 因为SysTick初始化时默认配置的优先级是最低的
- * 或者当你用其他定时器做延时的时候,要配置定时器的优先级高于IO EXTI中断的优先级
- */
- NVIC_SetPriority (SysTick_IRQn, 0);
- /* USART config 115200 8-N-1 */
- Debug_USART_Config();
- printf("\r\n 这是一个红外遥控发射与接收实验 \r\n");
- /* 初始化红外接收头CP1838用到的IO */
- IrDa_Init();
- for(;;)
- {
- if( frame_flag == 1 ) /* 一帧红外数据接收完成 */
- {
- key_val = IrDa_Process();
- printf("\r\n key_val=%d \r\n",key_val);
- printf("\r\n 按键次数frame_cnt=%d \r\n",frame_cnt);
- printf("\r\n 中断次数isr_cnt=%d \r\n",isr_cnt);
- /* 不同的遥控器面板对应不同的键值,需要实际测量 */
- switch( key_val )
- {
- case 0:
- LED1_TOGGLE;
- printf("\r\n key_val=%d \r\n",key_val);
- printf("\r\n Error \r\n");
- break;
- case 162:
- LED1_TOGGLE;
- printf("\r\n key_val=%d \r\n",key_val);
- printf("\r\n POWER \r\n");
- break;
- case 226:
- LED1_TOGGLE;
- printf("\r\n key_val=%d \r\n",key_val);
- printf("\r\n MENU \r\n");
- break;
- case 34:
- LED1_TOGGLE;
- printf("\r\n key_val=%d \r\n",key_val);
- printf("\r\n TEST \r\n");
- break;
- case 2:
- LED1_TOGGLE;
- printf("\r\n key_val=%d \r\n",key_val);
- printf("\r\n + \r\n");
- break;
- case 194:
- LED1_TOGGLE;
- printf("\r\n key_val=%d \r\n",key_val);
- printf("\r\n RETURN \r\n");
- break;
- case 224:
- LED1_TOGGLE;
- printf("\r\n key_val=%d \r\n",key_val);
- printf("\r\n |<< \r\n");
- break;
- case 168:
- LED1_TOGGLE;
- printf("\r\n key_val=%d \r\n",key_val);
- printf("\r\n > \r\n");
- break;
- case 144:
- LED1_TOGGLE;
- printf("\r\n key_val=%d \r\n",key_val);
- printf("\r\n >>| \r\n");
- break;
- case 104:
- LED1_TOGGLE;
- printf("\r\n key_val=%d \r\n",key_val);
- printf("\r\n 0 \r\n");
- break;
- case 152:
- LED1_TOGGLE;
- printf("\r\n key_val=%d \r\n",key_val);
- printf("\r\n - \r\n");
- break;
- case 176:
- LED1_TOGGLE;
- printf("\r\n key_val=%d \r\n",key_val);
- printf("\r\n C \r\n");
- break;
- case 48:
- LED1_TOGGLE;
- printf("\r\n key_val=%d \r\n",key_val);
- printf("\r\n 1 \r\n");
- break;
- case 24:
- LED1_TOGGLE;
- printf("\r\n key_val=%d \r\n",key_val);
- printf("\r\n 2 \r\n");
- break;
- case 122:
- LED1_TOGGLE;
- printf("\r\n key_val=%d \r\n",key_val);
- printf("\r\n 3 \r\n");
- break;
- case 16:
- LED1_TOGGLE;
- printf("\r\n key_val=%d \r\n",key_val);
- printf("\r\n 4 \r\n");
- break;
- case 56:
- LED1_TOGGLE;
- printf("\r\n key_val=%d \r\n",key_val);
- printf("\r\n 5 \r\n");
- break;
- case 90:
- LED1_TOGGLE;
- printf("\r\n key_val=%d \r\n",key_val);
- printf("\r\n 6 \r\n");
- break;
- case 66:
- LED1_TOGGLE;
- printf("\r\n key_val=%d \r\n",key_val);
- printf("\r\n 7 \r\n");
- break;
- case 74:
- LED1_TOGGLE;
- printf("\r\n key_val=%d \r\n",key_val);
- printf("\r\n 8 \r\n");
- break;
- case 82:
- LED1_TOGGLE;
- printf("\r\n key_val=%d \r\n",key_val);
- printf("\r\n 9 \r\n");
- break;
- default:
- break;
- }
- }
- }
- }
复制代码 全部资料51hei下载地址:
程序.7z
(363.33 KB, 下载次数: 66)
|