遙控 :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, 下載次數: 67)
2019-7-30 18:05 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|