红外遥控
时间: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****/
检查很多遍了,但是中断部分可能有问题,大家能帮我看看嘛
不知道为什么遥控器按键没有摁下去,程序就自己跑进中断里了。这就是没解决的问题
#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口读一下状态,确保硬件上确实没有信号进去
?
