我采用按键输入的方法来读取红外反射传感器的高低电平,在通过led的翻转来呈现输入状态的改变,stm32读取的效果。
出现的问题是:有时能翻转([size=18.6667px]传感器的灯亮,输入的led亮;[size=18.6667px]传感器的灯灭,输入的led灭),有时[size=18.6667px]输入的led只是亮了些。程序中的消抖延迟改过许多数值甚至删除也没有效果。
红外反射传感器的资料如下:
TCRT5000传感器的红外发射二极管不断发射红外线, 当发射出的红外线没有被反射回来或被反射回来但强度不够大时,红外接收管一直处于关断状态,此时模块的输出端为低电平,指示二极管一直处于熄灭状态; 被检测物体出现在检测范围内时,红外线被反射回来且强度足够大,红外接收管饱和,此时模块的输出端为高电平,指示二极管被点亮。 我采用的按键输入方式是浮空输入,支持连续按的方式,按键连接的i/o口是c14 led连接的io口是pc13. 代码在附件有:如下 主函数: #include "key.h" #include "sys.h" #include "beep.h"
int main(void) { u8 key=0; delay_init(); //延时函数初始化 LED_Init(); //初始化与LED连接的硬件接口 KEY_Init(); //初始化与按键连接的硬件接口 LED0=0; //先点亮绿灯 while(1) { key=KEY_Scan(1); //得到键值 //mode:0,不支持连续按;1,支持连续按; if(key) { switch(key) { case KEY0_PRES: //控制led LED0=!LED0; break; } }else delay_ms(10); } }
灯的代码:
//头文件《led.h》 #ifndef __LED_H #define __LED_H #include "sys.h"
#define LED0 PCout(13)// PC13
void LED_Init(void);//初始化
#endif
《led.c》文件
#include "led.h"
//初始化PC13为输出口.并使能这个口的时钟 //LED IO初始化 void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能PC端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //LED0 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(GPIOC, &GPIO_InitStructure); //根据设定参数初始化GPIOB.5 GPIO_SetBits(GPIOC,GPIO_Pin_13); //PC13 输出高
}
按键输入代码
《key.h》
#ifndef __KEY_H #define __KEY_H #include "sys.h"
//#define KEY0 PEin(14) //PC14
#define KEY0 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_14)//读取按键0
#define KEY0_PRES 1 //KEY0按下
void KEY_Init(void);//IO初始化 u8 KEY_Scan(u8); //按键扫描函数 #endif
《key.c》文件
#include "stm32f10x.h"
#include "key.h"
#include "sys.h"
#include "delay.h"
//按键初始化函数
void KEY_Init(void) //IO初始化
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//使能PORTC时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;//KEY0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC14
}
//按键处理函数
//返回按键值
//mode:0,不支持连续按;1,支持连续按;
//0,没有任何按键按下
//1,KEY0按下
//注意此函数有响应优先级,KEY0!
u8 KEY_Scan(u8 mode)
{
if(KEY0==1)
{
delay_ms(15);//去抖动 //
if(KEY0==1)
return KEY0_PRES;
}
return 0;// 无按键按下
}
|