|
#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
}
}
|
评分
-
查看全部评分
|