#include "stm32f10x.h"
#include "exti.h"
#include "SysTick.h"
#define IR_Hongwai_0 GPIOA->BRR = 0x00000100//红外低电
#define IR_Hongwai_1 GPIOA->BSRR = 0x00000100红外高电平
#define IR_Hongwai_x GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8)//读
unsigned int value_templook;
unsigned int value_IR_Hongwai[4];
unsigned int value_IR_BEEPOOK[8] = {0, 0, 0, 0, 0, 0, 0, 0};
/*
* 配置GPIO端口寄存器
*/
void GPIO_InitStructReadtempCmd(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8; //配置GPIO线路
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //配置速率50MHZ
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; //配置成浮空输入
GPIO_Init(GPIOA, &GPIO_InitStruct); //初始化GPIO指定端口
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; //配置推挽式输出
GPIO_Init(GPIOD, &GPIO_InitStruct);
}
/*
* 配置RCC外设时钟
*/
void RCC_APB2PeriphReadtempyCmd(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //打开GPIOA,外设时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); //打开GPIOD,外设时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE); //打开复用功能AFIO外设时钟
}
/*
* 计算低脉宽持续时间Count1 * 10us
*/
unsigned int IR_HongwaiBEOOK_LSB()
{
unsigned int Count1 = 0; //变量清零
while(IR_Hongwai_0 | IR_Hongwai_x == 0 ) //判断红外低电平进入循环负责跳出结束
{
Count1++; //变量每10us加一次
Delay_10us(1); //延时10us
}
return(Count1); //返回Count1值
}
/*
* 计算高脉宽持续时间Count2 * 10us
*/
unsigned int IR_HongwaiBEOOK_MSB()
{
unsigned int Count2 = 0; //变量清零
while(IR_Hongwai_1 & IR_Hongwai_x == 1 ) //判断红外高电平进入循环负责跳出结束
{
Count2++; //变量每10us加一次
Delay_10us(1); //延时10us
}
return(Count2); //返回Count2值
}
/*
* 函数主题
*/
int main(void)
{
SystemInit(); //系统时钟初始化进入72M主频
SYSTICK_InitStructReadTCmd(); //SysTick配置寄存器初始化
RCC_APB2PeriphReadtempyCmd(); //配置RCC外设时钟初始化
GPIO_InitStructReadtempCmd(); //配置GPIO端口寄存器初始化
EXTI_InitStructReadtempCmd(); //配置EXTI中断线路初始化
NVIC_InitStructReadtempCmd(); //配置NVIC中断初始化
while(1)
{
}
}
void EXTI9_5_IRQCHandler(void)
{
unsigned char i = 0;
unsigned char value_temp;
IR_Hongwai_1;
//红外低电平持续时间
value_templook = IR_HongwaiBEOOK_LSB(); //把读出来的时间赋值给value_templook//
if((value_templook < 850) | (value_templook > 950)) //判断引导码低电平是否符合 9MS //经检查发现程序直接跳出计算延时黄色注释哪里
{
return;
}
value_templook = IR_HongwaiBEOOK_MSB(); //把读出来的时间赋值给变量value_templook
if((value_templook < 400) | (value_templook > 500)) //判断引导码高电平是否符合 4.5MS
{
return;
}
value_temp = 0;
for(i = 1; i < 14; i++)
{
value_temp = value_temp >> 1;
value_templook = IR_HongwaiBEOOK_LSB();
if((value_templook < 20) | (value_templook > 80))
{
return;
}
value_templook = IR_HongwaiBEOOK_MSB();
if((value_templook < 20) | (value_templook > 200))
{
return;
}
if(value_templook > 112)
{
value_temp = value_temp | 0x80;
}
}
value_IR_Hongwai[0] = (value_IR_BEEPOOK[0] = value_temp / 16);
value_IR_Hongwai[0] = (value_IR_BEEPOOK[1] = value_temp % 16);
value_temp = 0;
for(i = 14; i < 27; i++)
{
value_temp = value_temp >> 1;
value_templook = IR_HongwaiBEOOK_LSB();
if((value_templook < 20) | (value_templook > 80))
{
return;
}
value_templook = IR_HongwaiBEOOK_MSB();
if((value_templook < 20) | (value_templook > 200))
{
return;
}
if(value_templook > 112)
{
value_temp = value_temp | 0x80;
}
}
value_IR_Hongwai[1] = (value_IR_BEEPOOK[2] = value_temp / 16);
value_IR_Hongwai[1] = (value_IR_BEEPOOK[3] = value_temp % 16);
value_temp = 0;
for(i = 27; i < 35; i++)
{
value_temp = value_temp >> 1;
value_templook = IR_HongwaiBEOOK_LSB();
if((value_templook < 20) | (value_templook > 80))
{
return;
}
value_templook = IR_HongwaiBEOOK_MSB();
if((value_templook < 20) | (value_templook > 200))
{
return;
}
if(value_templook > 112)
{
value_temp = value_temp | 0x80;
}
}
value_IR_Hongwai[2] = (value_IR_BEEPOOK[4] = value_temp / 16);
value_IR_Hongwai[2] = (value_IR_BEEPOOK[5] = value_temp % 16);
value_temp = 0;
for(i = 35; i < 42; i++)
{
value_temp = value_temp >> 1;
value_templook = IR_HongwaiBEOOK_LSB();
if((value_templook < 20) | (value_templook > 80))
{
return;
}
value_templook = IR_HongwaiBEOOK_MSB();
if((value_templook < 20) | (value_templook > 200))
{
return;
}
if(value_templook > 112)
{
value_temp = value_temp | 0x80;
}
}
value_IR_Hongwai[3] = (value_IR_BEEPOOK[6] = value_temp / 16);
value_IR_Hongwai[3] = (value_IR_BEEPOOK[7] = value_temp % 16);
switch (value_IR_Hongwai[2]) //判断按键正码
{
case 0x00:
GPIO_SetBits(GPIOD, GPIO_Pin_8); //点亮LED8
break;
case 0x01:
GPIO_ResetBits(GPIOD, GPIO_Pin_8); //熄灭LED8
break;
default : break;
}
EXTI_ClearITPendingBit(EXTI_Line8); //清除中断挂起位
}
程序
红外延时计算有问题,程序直接跳出没有执行 while(IR_Hongwai_0 | IR_Hongwai_x == 0 ) 语句,有什么好的延时计算方法吗,请大虾指点,本人初学者ffice ffice" />
|