微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 红外遥控

红外遥控

时间:10-02 整理:3721RD 点击:
我写了红外的程序不知道为什么不对
检查很多遍了,但是中断部分可能有问题,大家能帮我看看嘛
不知道为什么遥控器按键没有摁下去,程序就自己跑进中断里了。这就是没解决的问题

#include "stm32f10x_lib.h"
#include "LCD_driver.h"
/*********************************/
#define uchar unsigned char
#define uint  unsigned int
#define IRIN GPIO_Pin_8 //P3^2; A8
#define Beep GPIO_Pin_7 //P2^0; B7         
#define F1   GPIO_Pin_0 //P1^0; A0
#define F2   GPIO_Pin_1 //P1^1; A1
#define F3   GPIO_Pin_2 //P1^2; A2
#define F4   GPIO_Pin_3 //P1^3; A3
#define LCD_cs(x)   x ? GPIO_SetBits(GPIOB, LCD_CS) :   GPIO_ResetBits(GPIOB, LCD_CS)//自己定义的位函数
unsigned char IRCOM[7] = {0,0,0,0,0,0,0};
unsigned int  k,a;
unsigned char Val[2];
unsigned char FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; //反转
unsigned char FFZ[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1}; //正转
static vu32 TimingDelay;
/*********************************************************************/
unsigned int  b;
unsigned char biaozhi,bx;
/**********************************************************************/
     //中断变量定义
/**********************************************************************/
EXTI_InitTypeDef EXTI_InitStructure;
ErrorStatus   HSEStartUpStatus;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/******************定义函数*******************************************/
void motor_ffw(void);
void RCC_Configuration(void);
void NVIC_Configuration(void);
void delay_us(vu32 nTime);
void delay_100us(int count);
/**********************************************************************/
     //主函数
/**********************************************************************/
int main(void)
{  
// IR_initi() ;中断初始化
#ifdef DEBUG
   debug();  //在线调试使用
#endif
RCC_Configuration();      //系统时钟配置函数   
NVIC_Configuration();     //NVIC配置函数
//系统默认SysTick是8分频(HCLK/8)当前系统时钟72M的话 72/8 = 9MHZ
SysTick_SetReload(9); //如果设置9000时,计数到9000时,产生1MS中断
//开启SysTick中断
SysTick_ITConfig(ENABLE);
  
//启动GPIO模块时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
//把调试设置普通IO口
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);  
                     
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;  //所有GPIO为同一类型端口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //输出的最大频率为50HZ
GPIO_Init(GPIOA, &GPIO_InitStructure);   //初始化GPIOA端口
GPIO_Init(GPIOB, &GPIO_InitStructure);   //初始化GPIOB端口
/**************************中断配置***********************************************/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;       //推挽输入
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
/*******************************************************************************/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;;//IN_FLOATING;   //配置浮空输入
/*******************************************************************************/
GPIO_Init(GPIOA, &GPIO_InitStructure);
         
///*将EXTI线6连接到PB6*/
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource6);
/*******************************************************************************/
/* Configure Key Button EXTI Line to generate an interrupt on falling edge */  
//配置按钮中断线触发方式
EXTI_InitStructure.EXTI_Line = EXTI_Line6;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //中断线使能
EXTI_Init(&EXTI_InitStructure); //初始化中断
/* Generate software interrupt: simulate a falling edge applied on Key Button EXTI line */
EXTI_GenerateSWInterrupt(EXTI_Line6); //EXTI_Line6中断允许 到此中断配置完成,可以写中断处理函数。
/********************************************************************************************/
GPIO_Write(GPIOA,0xffff);  //将GPIOA 16个端口全部置为高电平
GPIO_Write(GPIOB,0xffff);  //将GPIOB 16个端口全部置为高电平
LCD_Init();    //初始化LCD
Pant(0x00 , 0x1f);
// while(1)
// {
// }
LCD_cs(0);
    ChineseChar(  4,1,1,colors[0],colors[2], 5);
delay_100us(200000);   
    ChineseChar( 29,1,1,colors[0],colors[2], 6);
// delay_us(2000000);  
    ChineseChar( 54,1,1,colors[0],colors[2], 7);   
    ChineseChar( 79,1,1,colors[0],colors[2], 8);
    ChineseChar(104,1,1,colors[0],colors[2], 9);  
    ChineseChar(129,1,1,colors[0],colors[2],10);   
    ChineseChar(154,1,1,colors[0],colors[2],11);
    ChineseChar(179,1,1,colors[0],colors[2],12);  
    ChineseChar(204,1,1,colors[0],colors[2],13);
LCD_ShowString(5,25,colors[0],colors[2],"______");   
    LCD_cs(1);
while(1)
{
  switch(biaozhi)
  {
   case  0:                    
    break;
   case  1: switch(bx)  
      {
       case  0:
        LCD_cs(0);
           ChineseChar(104,25,1,colors[0],colors[2], 1);   
           ChineseChar(129,25,1,colors[0],colors[2], 2);  
           LCD_cs(1);
         break;
       case  1:
        LCD_cs(0);
           ChineseChar(104,25,1,colors[0],colors[2], 3);   
           ChineseChar(129,25,1,colors[0],colors[2], 4);  
           LCD_cs(1);
         break;
      }        
      switch(b)
      {
       case  0:
         break;
       case  1://Beep=~Beep;
         if(GPIO_ReadInputDataBit(GPIOB , Beep)!=0)
             GPIO_SetBits(GPIOB , Beep);
         else
             GPIO_ResetBits(GPIOB , Beep);         
         delay_100us(2000);      
         break;
      }              
       break;
   case  2: switch(bx)
      {
       case  0:k=2;motor_ffw();
         break;
       case  1:k=1;motor_ffw();      
         break;
      }
      switch(b)
      {
       case  0:
         break;
       case  1://Beep=~Beep;
         if(GPIO_ReadInputDataBit(GPIOB , Beep)!=0)
             GPIO_SetBits(GPIOB , Beep);
         else
             GPIO_ResetBits(GPIOB , Beep);  
         delay_100us(2000);      
         break;
      }      
    break;
   case  3:   
      a=840;     
      LCD_cs(0);
         ChineseChar(179,25,1,colors[0],colors[2], 14);   
         ChineseChar(204,25,1,colors[0],colors[2], 15);  
         LCD_cs(1);
      switch(b)
      {
       case  0:
         break;
       case  1://Beep=~Beep;
         if(GPIO_ReadInputDataBit(GPIOB , Beep)!=0)
             GPIO_SetBits(GPIOB , Beep);
         else
             GPIO_ResetBits(GPIOB , Beep);         
         delay_100us(2000);      
         break;
      }   
    break;
   case  4:
      a=630;        
      LCD_cs(0);
         ChineseChar(179,25,1,colors[0],colors[2], 16);   
         ChineseChar(204,25,1,colors[0],colors[2], 17);  
         LCD_cs(1);
      switch(b)
      {
       case  0:
         break;
       case  1://Beep=~Beep;
         if(GPIO_ReadInputDataBit(GPIOB , Beep)!=0)
             GPIO_SetBits(GPIOB , Beep);
         else
             GPIO_ResetBits(GPIOB , Beep);         
         delay_100us(2000);     
         break;
      }   
    break;
   case  5: switch(b)
      {
       case  0:
         break;
       case  1://Beep=~Beep;
         if(GPIO_ReadInputDataBit(GPIOB , Beep)!=0)
             GPIO_SetBits(GPIOB , Beep);
         else
             GPIO_ResetBits(GPIOB , Beep);        
         delay_100us(2000);      
         break;
      }
    break;      
  }
}  
}
/**********************************************************************
*                   *
*                       步进电机驱动              *
*                   *
**********************************************************************/
void  motor_ffw()
{
unsigned char i;
unsigned int  j;
for (j=0; j<20; j++)         //转1*n圈
{
  for (i=0; i<8; i++)       //一个周期转30度
  {
   if(k==1)  GPIO_Write(GPIOA,(FFW[i]&0x1f)*0X100); //P1 = FFW[i]&0x1f;  //取数据
     if(k==2)  GPIO_Write(GPIOA,(FFZ[i]&0x1f)*0X100);// P1 = FFZ[i]&0x1f;
     delay_100us(a);                   //调节转速
  }
}
}
/*******************************************************************************
*
*            RCC配置
*
*******************************************************************************/
void RCC_Configuration(void)
{
//复位RCC外部设备寄存器到默认值
RCC_DeInit();  
//打开外部高速晶振
RCC_HSEConfig(RCC_HSE_ON);
//等待外部高速时钟准备好
HSEStartUpStatus = RCC_WaitForHSEStartUp();
//外部高速时钟已经准别好
if(HSEStartUpStatus == SUCCESS)  
{
  FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
   
  FLASH_SetLatency(FLASH_Latency_2);
  
  //配置AHB(HCLK)时钟=SYSCLK
  RCC_HCLKConfig(RCC_SYSCLK_Div1);
  
  //配置APB2(PCLK2)钟=AHB时钟
  RCC_PCLK2Config(RCC_HCLK_Div1);
  
  //配置APB1(PCLK1)钟=AHB 1/2时钟
  RCC_PCLK1Config(RCC_HCLK_Div2);  
  
  //配置ADC时钟=PCLK2 1/4
  RCC_ADCCLKConfig(RCC_PCLK2_Div4);
  
  //配置PLL时钟 == 外部高速晶体时钟*9
  RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
  
  //配置ADC时钟= PCLK2/4
  RCC_ADCCLKConfig(RCC_PCLK2_Div4);
  
  //使能PLL时钟
  RCC_PLLCmd(ENABLE);  
  
  //等待PLL时钟就绪
  while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)  
  {
  }
  //配置系统时钟 = PLL时钟
  RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
  //检查PLL时钟是否作为系统时钟
  while(RCC_GetSYSCLKSource() != 0x08)  
  {
  }
}
/* Enable Key Button GPIO Port, GPIO_LED and AFIO clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB|
         RCC_APB2Periph_AFIO, ENABLE);
}
/*******************************************************************************
*
*           对系统滴答做延时处理
*
********************************************************************************/
void delay_us(u32 nTime)
{
//开启SysTick计数器
SysTick_CounterCmd(SysTick_Counter_Enable);
TimingDelay = nTime;
while(TimingDelay != 0);    //死等待
//关闭系统滴答
SysTick_CounterCmd(SysTick_Counter_Disable);
//清除SysTick 计数器
SysTick_CounterCmd(SysTick_Counter_Clear);
}
/*******************************************************************************
*
*          SysTick中断处理函数
*
*******************************************************************************/
void SysTick_Handler(void)
{
if (TimingDelay != 0x00)
{
  TimingDelay--;
}
}
/*******************************************************************************
* Function Name  : NVIC_Configuration
* Description    : Configure the nested vectored interrupt controller.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void NVIC_Configuration(void)
{
#ifdef  VECT_TAB_RAM  
   /* Set the Vector Table base location at 0x20000000 */
   NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);   //分配中断向量表
#else  /* VECT_TAB_FLASH  */
   /* Set the Vector Table base location at 0x08000000 */
   NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
#endif
// NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, 1, 0);//
/* Configure one bit for preemption priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);  //设置中断优先级
/* Enable the EXTI9_5 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel; //中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =  1;  //强占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//次优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  //通道中断使能
NVIC_Init(&NVIC_InitStructure);//初始化中断
}
void EXTI9_5_IRQHandler(void)
{
   unsigned char j,k,N=0;
    if(EXTI_GetITStatus(EXTI_Line6) != RESET) //检测制定的EXTI线路触发请求是否发生。
{
// EX0 = 0;   //关闭中断
// EXTI_InitStructure.EXTI_LineCmd = DISABLE;               //中断线使能
  if (GPIO_ReadInputDataBit(GPIOA , IRIN)==1)
  {
//  EXTI_InitStructure.EXTI_LineCmd = ENABLE;               //中断线使能
   EXTI_ClearITPendingBit(EXTI_Line6);//打开中断
   return;
  } //确认IR信号出现
    while (!GPIO_ReadInputDataBit(GPIOA , IRIN))         //等IR变为高电平,跳过9ms的前导低电平信号。
      {
    delay_100us(1);
   }
  for (j=0;j<4;j++)         //收集四组数据
   {
     for (k=0;k<8;k++)        //每组数据有8位
     {
       while (GPIO_ReadInputDataBit(GPIOA , IRIN))   //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
        {
     delay_100us(1);
    }
       while (!GPIO_ReadInputDataBit(GPIOA , IRIN))  //等 IR 变为高电平
       {
     delay_100us(1);
    }
       while (GPIO_ReadInputDataBit(GPIOA , IRIN))   //计算IR高电平时长
       {
        delay_us(140);
        N++;           
        if (N>=30)
     {
  //    EXTI_InitStructure.EXTI_LineCmd = ENABLE;               //中断线使能
      EXTI_ClearITPendingBit(EXTI_Line6);//打开中断
       return;
     }                  //0.14ms计数过长自动离开。
    }                        //高电平计数完毕               
    IRCOM[j]=IRCOM[j] >> 1;  //数据最高位补“0”
    if (N>=8)
    {
     IRCOM[j] = IRCOM[j] | 0x80;
    }
    N=0;
     }//end for k
   }//end for j
     if (IRCOM[2]!=~IRCOM[3])
     {
//  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
   EXTI_ClearITPendingBit(EXTI_Line6);//打开中断
       return;
  }
  switch(IRCOM[2])
  {                                                      
   case 0x45: biaozhi=0;                  break;        
   case 0x46: biaozhi=1;  bx++;
         if(bx==2)
         bx=0;     break;
   case 0x44: biaozhi=2;              break;
   case 0x43: biaozhi=3;              break;
   case 0x40: biaozhi=4;              break;
   case 0x47: biaozhi=5;   b++;
         if(b==2)
          b=0;        break;                          
  }
// EXTI_InitStructure.EXTI_LineCmd = ENABLE;               //中断线使能        
  EXTI_ClearITPendingBit(EXTI_Line6); //打开中断
}
// if(EXTI_GetITStatus(EXTI_Line6) != RESET) //检测制定的EXTI线路触发请求是否发生。
//    EXTI_ClearITPendingBit(EXTI_Line6); //清除EXTI线路挂起位
}
void delay_100us(int count)  // /* X10us */
{
        int i,j;
        for(i=0;i<count;i++)
                for(j=0;j<74;j++);
}
#ifdef  DEBUG
/*******************************************************************************
* Function Name  : assert_failed
* Description    : Reports the name of the source file and the source line number
*                  where the assert_param error has occurred.
* Input          : - file: pointer to the source file name
*                  - line: assert_param error line source number
* Output         : None
* Return         : None
********************************************************************************/
void assert_failed(u8* file, u32 line)
{
/* User can add his own implementation to report the file name and line number,
  ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* Infinite loop */
while (1)
{
}
}
#endif  
/******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/

直接用示波器或单片机IO口读一下状态,确保硬件上确实没有信号进去

?

                                                                                 

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top