在做ministm32开发板的红外实验的时候,打算用串口打印红外接收的按键值,可是老是不成功,代码如下:
[mw_shl_code=c,true]
#include "remoter.h"
#include "systick.h"
#include "stdio.h"
static struct IR_data //红外接收数据存储
{
unsigned char addr1; //REMOT_ID 地址1
unsigned char addr2; //REMOT_ID 反码
unsigned char data1; //数据1(数据码)
unsigned char data2; //数据2(数据码反码)
}IR_data;
#define REMOTE_ID 0
static u8 remote_cnt = 0;
FlagStatus remote_rdy = RESET;
u32 remote_data = 0;
void RemoterInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1);
EXTI_InitStructure.EXTI_Line = EXTI_Line1;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
static u8 PlusWithCheck(void)
{
u8 cnt = 0;
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1))
{
//printf("PlusWithCheck fun is run ***************************** \n");
DelayUs(20);
cnt++;
if(cnt == 250)return cnt;
}
return cnt;
}
/***************解码说明**********************
引导码+ 地址码+ 地址码+ 数据码+ 数据码反码+ 连发码
引导码: 9ms低电平+ 4.5ms高电平
连发码: 9ms低电平+ 2.25ms高电平
数据0 : 0.56ms低电平+ 0.56ms高电平
数据1 : 0.56ms低电平+ 1.69ms高电平
***************************************************/
void EXTI1_IRQHandler(void)
{
u8 PlusWith = 0;
FlagStatus start_flag = RESET;
u8 data_bit = 0;
while(1)
{
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1))
{
PlusWith = PlusWithCheck(); //检测高脉冲宽度
if(PlusWith == 250)break; //超出最大范围500ms
if(PlusWith >= 200 && PlusWith < 250)start_flag = SET; //引导码
else if(PlusWith >= 85 && PlusWith < 200) //连发码
{
remote_rdy = SET;
remote_cnt++;
break;
}
else if(PlusWith >= 50 && PlusWith < 85)data_bit = 1; //数据1
else if(PlusWith >= 10 && PlusWith < 50)data_bit = 0; //数据0
if(start_flag)
{
remote_data <<= 1;
remote_data += data_bit;
remote_cnt = 0;
}
}
}
EXTI_ClearITPendingBit(EXTI_Line1);
}
u8 key_process(void)
{
/*
if(remote_rdy)
{
IR_data.addr1 = remote_data >> 24;
IR_data.addr2 = (remote_data >> 16) & 0xFF;
IR_data.data1 = (remote_data >> 8) & 0xFF;
IR_data.data2 = remote_data & 0xFF;
remote_rdy = RESET;
if(IR_data.addr1 == REMOTE_ID && IR_data.addr1 == (u8)~(IR_data.addr2))
{
if(IR_data.data1 == (u8)~(IR_data.data2))
return IR_data.data1;
}
printf("IR_data.addr1 = %d IR_data.data1 = %d \n", IR_data.addr1, IR_data.data1);
}
return 0;
*/
u8 t1,t2;
t1=remote_data>>24; //得到地址码
t2=(remote_data>>16)&0xff;//得到地址反码
remote_rdy=RESET;//清除标记
if(t1==(u8)~t2&&t1==REMOTE_ID)//检验遥控识别码(ID)及地址
{
t1=remote_data>>8;
t2=remote_data;
printf("IR_data.data1 = %d \n", t1);
if(t1==(u8)~t2)return t1; //处理键值
}
return 0;
}
[/mw_shl_code]
主函数代码如下:
[mw_shl_code=c,true]int main(void)
{
// int flag = 0;
u8 key = 0;
int flag1 = 0;
int flag2 = 0;
SystemInit(); /*配置系统时钟为72M,设置向量表偏移量*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); /*本款芯片使用了4位优先级,采用2:2优先级分组*/
SysTick_Init(); //用于延迟函数的功能
UsartInit(115200);
LedInit();
TIM4_EncoderInit(0xFFFF, 0);
TIM1_PwmInit(0x0FFF, 0);
//SPI1_Init(SPI_BaudRatePrescaler_256);
RemoterInit();
while(1)
{
if(remote_rdy)
{
key = key_process();
printf("the key vale is %d\n", key);
if(key)
{
key = 0;
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
DelayMs(1000);
}
}
else
{
GPIO_SetBits(GPIOD,GPIO_Pin_2);
DelayMs(1000);
}
flag1 = 0;
while(flag1 < 2){
DelayMs(5); //延时5ms
if(flag2){
var-=10;
}else{
var+=10;
}
if(var>0x0FFF-20)
{
flag2 = 1;
flag1++;
}
else if(var < 10)
flag2 = 0;
TIM1_SetPwmCCR(1, var);
}
}
}[/mw_shl_code]
希望高手帮我解答一下,不胜感激啊 |