OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9086|回复: 5

红外延时计算求助

[复制链接]

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2012-8-8
在线时间
18 小时
发表于 2012-8-30 13:33:37 | 显示全部楼层 |阅读模式

#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 ) 语句,有什么好的延时计算方法吗,请大虾指点,本人初学者fficeffice" />

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-8-30 13:40:48 | 显示全部楼层
参考我们的红外例程.
另外,红外遥控解码,可以考虑用输入捕获.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2012-8-8
在线时间
18 小时
 楼主| 发表于 2012-8-30 13:47:37 | 显示全部楼层
澳,好的谢谢原子哥
回复 支持 反对

使用道具 举报

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2012-8-8
在线时间
18 小时
 楼主| 发表于 2012-8-31 10:30:37 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
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值

回复 支持 反对

使用道具 举报

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2012-8-8
在线时间
18 小时
 楼主| 发表于 2012-8-31 10:37:16 | 显示全部楼层
回复【4楼】爱好单片机:
---------------------------------
unsigned int IR_HongwaiBEOOK_LSB(){ unsigned int Count1 = 0;            //变量清零 while(IR_Hongwai_0 | IR_Hongwai_x == 0 )  //判断红外低电平进入循环负责跳出结束 
{  Count1++;        //变量每10us加一次
  LED1 = 1; 
 Delay_10us(1);       //延时10us
 LED2 = 1; 
} return(Count1);        //返回Count1值} 
原子哥,我昨天晚上调试一晚上我发现一个问题比较纠结,红外检测低电平,进入死循环跳不出来,我在里面加了两个LED发现LED1能亮LED2不亮,把延时去掉就好了,程序死在延时这里了是怎么回事,难道外部中断和系统滴答定时器有冲突吗,能帮忙解释一下吗。先谢谢原子哥
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-8-31 14:35:02 | 显示全部楼层
你的延时函数怎么实现的?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 13:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表