|
#include "stm32f10x.h"
#include "bit_band.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "timer.h"
#include "infrared.h"
#include "SysTick.h"
u16 TIM2_IT_Update_Cnt = 0 ; // TIM2的溢出次數,用于LED1的閃爍計時
int main(void)
{
u16 user_code_16bit = 0x1234; // 初始化16位用戶碼
u8 data_code_8bit = 0x66 ; // 初始化8位數據碼
u8 F_key_down = 0 ; // 按鍵按下標志位
// 注:程序中使用中斷時,NVIC分組設置應盡量位于程序起始處,并且在設置后盡量不要再更改NVIC分組
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //NVIC分組2:2位搶占優先級,2位響應優先級
delay_Init(); // 延時初始化(注:調用延時函數之前,必須先調用delay_Init()將SysTick初始化)
LED_Init_JX() ; // 初始化LED硬件接口
KEY_Init_JX() ; // 初始化按鍵的硬件配置
TIM2_Time_Init(); // 初始化定時器2:1ms中斷一次
Infrared_IE_Init_JX(); // 初始化紅外發射管腳:Infrared_IE = PB9
Infrared_IR_Init_JX(); // 初始化紅外接收管腳:Infrared_REMOTE_IN = PB8
NEC_IE_code_message(user_code_16bit,data_code_8bit); // 上電發送:用戶碼0x1234 + 數據碼0x66
while(1)
{
// 判斷是否接收到有效的NEC紅外信息
if(Current_bit_CNT>=34)
{
// 解碼NEC格式紅外信息
if( ! NEC_IR_decode_message() )
{
// 判斷數據碼和數據碼反碼是否相反
if( Receive_data_code_8bit == (u8)(~Receive_data_code_opposite) )
{
// 避免重復保存
if( user_code_16bit!=Receive_user_code_16bit || data_code_8bit!=Receive_data_code_8bit )
{
user_code_16bit = Receive_user_code_16bit; // 保存用戶碼
data_code_8bit = Receive_data_code_8bit ; // 保存數據碼
PB_out(5) = 0; // LED0亮一下,表示將紅外碼接收
delay_ms(200);
PB_out(5) = 1;
}
}
}
}
// 按鍵發碼
KEY_Scan_delay_JX(); // 掃描按鍵是否按下
if( S_KEY_down == 0x04 )
{
if( F_key_down == 0 )
{
F_key_down = 1; // 長按只有效一次
NEC_IE_code_message(user_code_16bit,data_code_8bit); // 紅外發送:用戶碼 + 數據碼
}
}
else F_key_down = 0;
}
}
// TIM2中斷:20ms更新中斷一次
void TIM2_IRQHandler(void) //TIM2中斷
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //判斷是否為TIM2的更新中斷
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update ); //清除TIM2更新中斷標志
// 當接收到一個下降沿后,下一個下降沿須在20ms內被接收到,否則此次紅外接收認為是出錯的
Current_bit_CNT = 0; // 將當前紅外接收的位數清0
TIM2_IT_Update_Cnt ++ ;
if( TIM2_IT_Update_Cnt >= 25 ) // LED1閃爍速率:1s
{
TIM2_IT_Update_Cnt = 0 ;
PA_out(5) = !PA_out(5); // LED1閃爍
}
}
}
//紅外接收管腳PB8的下降沿中斷函數
void EXTI0_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line0) != RESET) // 判斷是否為中斷線0的中斷
{
EXTI_ClearITPendingBit(EXTI_Line0); // 清除中斷標志位
Each_bit_duration[Current_bit_CNT] = TIM2->CNT; // 將此下降沿的TIM2計數存入Each_bit_duration[x]中
Current_bit_CNT ++ ; // 將當前紅外接收的位數+1
// 1、方便下一個下降沿的計時
// 2、等待下一個下降沿20ms
TIM2->CNT=0; // 紅外接收管腳接收到一個下降沿后,將TIM2計數器清0
}
}
|
評分
-
查看全部評分
|