产品概述

抖动单片机 一种单片机裸机系统开入量消除抖动的软件实现方法

小编 2024-10-06 产品概述 23 0

一种单片机裸机系统开入量消除抖动的软件实现方法

下面介绍一种开关量消除信号抖动的方法,是我刚开始单片机编程时学到的,下面分享给大家,如有不足之处,请大家指正。

1、定义开关量结构体

typedef struct

{

uint32_t temp_value; //消除抖动前开关量过程值

uint8_t nonjitter_times; //无抖动计数值

uint8_t value; //消除抖动后开关量最终值

}virtualinput;

2、定义并初始化实际开关量变量

virtualinput input[9];//注意此处定于了9个开关量变量,实际工程中读取9个开关量

//数据初始化

void input_init(void)

{

int i;

for (i = 0; i < 9; i++)

{

input[i].nonjitter_times = 0;

input[i].temp_value = 0;

input[i].value = 0;

}

}

这里注意消除抖动前的开关量过程值

初始化开关量结构体变量

3、开关量的读取及移位保存图解

对应第五部分代码的第一部分数据的读取及保存

数据的移位保存过程

4、开关量消抖过程

对应第五部分代码的第二部分开关量的消除抖动

当读取开关量过程值的最后两位相同时,·证明输入的开关量信号没有改变(即没有抖动),因此需要取过程值input[i].temp_value的最后两位,分两种情况,结果为3(二进制11,即读取到开关量前后两次均为1)结果为0(二进制00,即读取到开关量前后两次均为0),则无抖动计数值加1,即input[i].nonjitter_times++;

当读取开关量过程值的最后两位不同时,无抖动计数值赋值为5,随后input[i].nonjitter_times--;注意无抖动值减小为0后自动赋值为5。

当无抖动计数20次时,此信号有效。

5、附录开关量信号读取函数

//开关量读入并消抖函数

void input_cortrol(void)

{

uint8_t i;

//第1部分数据的移位及存储

//对9个开关量结构体变量的过程值进行移位保存

for (i = 0; i < 9; i++)

{

input[i].temp_value <<= 1;

}

//新读到的开关量值存在开关量结构体末位

input[0].temp_value += (((GPIOPinRead(GPIO_PORTE_BASE, GPIO_PIN_0) & 0x01) >> 0) & 0x01);

input[1].temp_value += (((GPIOPinRead(GPIO_PORTE_BASE, GPIO_PIN_1) & 0x02) >> 1) & 0x01);

input[2].temp_value += (((GPIOPinRead(GPIO_PORTE_BASE, GPIO_PIN_2) & 0x04) >> 2) & 0x01);

input[3].temp_value += (((GPIOPinRead(GPIO_PORTE_BASE, GPIO_PIN_3) & 0x08) >> 3) & 0x01);

input[4].temp_value += (((GPIOPinRead(GPIO_PORTC_AHB_BASE, GPIO_PIN_5) & 0x20) >> 5) & 0x01);

input[5].temp_value += (((GPIOPinRead(GPIO_PORTC_AHB_BASE, GPIO_PIN_6) & 0x40) >> 6) & 0x01);

input[6].temp_value += (((GPIOPinRead(GPIO_PORTC_AHB_BASE, GPIO_PIN_7) & 0x80) >> 7) & 0x01);

input[7].temp_value += (((GPIOPinRead(GPIO_PORTA_AHB_BASE, GPIO_PIN_1) & 0x02) >> 1) & 0x01);

input[8].temp_value += (((GPIOPinRead(GPIO_PORTG_AHB_BASE, GPIO_PIN_0) & 0x01) >>0) & 0x01);

//第2部分,数据的消抖

//消除信号抖动

for (i = 0; i < 9; i++)

{ //前后两次数据检测的相同,计数加1

if ((input[i].temp_value & 0x03) == 0x00 || (input[i].temp_value & 0x03) == 0x03)

{

if (input[i].nonjitter_times < 20)

{

input[i].nonjitter_times++;

}

}

else

{

//数据发生变化

if ((input[i].temp_value & 0x06) == 0x00 || (input[i].temp_value & 0x06) == 0x06)

{

input[i].nonjitter_times = 5;

if (input[i].nonjitter_times > 0)

{

input[i].nonjitter_times--;

}

}

}

//计算20次,认为信号有效

if (input[i].nonjitter_times == 20)

{

input[i].value = ~(input[i].temp_value) & 0x01;

}

if (input[i].nonjitter_times == 0)

{

input[i].nonjitter_times = 5;

}

}

详解单片机的按键检测与控制

按键在单片机控制系统中起到人机交互的作用,通过按键可以输入数据、命令和各种参数,按键侧键测处理是单片机系统设计和开发中一个重要的内容,关系到整个系统的交互性能和稳定性。按键处理形式在单片机系统中有两种形式:直接按键和矩阵编码键盘,下面分别对这两种按键检测电路的特点及编程思路和方法进行分析和介绍。

按键抖动问题产生的原因及解决方法

按键的抖动问题是指按键的触点在闭合和断开瞬间由于接触情况不稳定,从而导致电压信号的抖动现象(由按键的机械特性造成,不可避免)。图8-1所示为一次按键的抖动过程,在按键的前沿和后沿都会有5~10ms的抖动。

图8-1 按键抖动示意图

对于时钟是微秒级的单片机而言,键盘的抖动有可能造成单片机对一次按键的多次处理。为了提高系统的稳定性,我们必须采用有效的方式消除抖动。

去除抖动可以采用硬件方式和软件方式。硬件方式一般是在按键与单片机的输入通道上安装硬件去抖电路(如RS触发器)。软件方式的实现方法是:当查询到电路中有按键按下时,先不进行处理,而是先执行10~20ms的延时程序,延时程序结束后,再次查询按键状态,若此时按键仍为按下状态,则视为按键被按下。

按键检测电路及应用

1. 独立式按键

独立式键盘相互独立,每个按键占用一根I/O口线,每根I/O口线上的按键工作状态不会影响其他按键的工作状态,CPU可直接读取该I/O线的高/低电平状态。这种按键硬件、软件结构简单,判键速度快,使用方便,但占用I/O口线较多,适用于按键数量较少的系统中。

独立连接式键盘连接如图8-2所示。当没有键被按下时,所有的数据输入线均为高电平;当任意一个按键被按下时,与之相连的数据输入线将变为低电平;通过相应指令,可以判断是否有键被按下。

图8-2 独立式键盘接口设计

【例8-1】 利用单片机的P1.0~P1.34个I/O口检测4个按键的触发信息,以实现不同功能的控制。

硬件电路参见图8-2所示,C51参考程序如下:

2. 矩阵式按键

在单片机系统中,当按键数量较多时,为了减少IO口的使用,通常将按键排列成矩阵型式。例如下例中的16个按键,被排列成了如图8-3所示的4X4矩阵方式。该矩阵式键盘由4根行线和4根列线组成,每个行线和列线的交叉点是一个按键。

【例8-2】 将矩阵式键盘的按键值通过数码管显示出来。

电路连接如图8-3所示(电源和震荡电路未标出)。

图8-3 矩阵式键盘按键显示电路图

如何判断被按下的键值呢?

分析如下:

根据下面的电路图,如果已知P1.0端口被置为低电平“0”,那么当按键K0被按下时,可以肯定P1.4端口的电平也变为了低电平“0”。基于这个原理,总结矩阵键盘识别按键的步骤如下:

a)首先判断是否有按键被按下

本例中矩阵键盘中P1端口低4位连接的是列线,高4位连接的是行线。将全部行线置为低电平“0”,全部列线置为高电平“1”。然后检测列线的状态。只要有一根列线的电平为低,则表示有按键被按下。否则没有按键按下。

b)按键消抖

当判断到有按键被按下后,还要进行消抖处理,以确认真正有按键被按下。

c)按键识别

当确认有键被按下后,采用逐行扫描的方法来确定是哪一个按键被按下。先扫描第一行,即将第一行输出低电平“0”,然后读取列值,那一列出现低电平“0”,则说明该列与第一行交叉处的按键被按下。如果读入的列值全部为"1",说明与第一行连接的按键均没有被按下。那么接下来开始扫描第二行,以此类推。直到完成全部行线的扫描。

C51程序如下:

矩阵式键盘与I/O接口应用

【例8-3】 四位数字密码锁

四位数字密码锁功能:通过键盘输入密码,当输入密码与内置密码相同时,继电器动作,表示密码锁解开。为了简化功能,该密码锁只使用12个键(即4x3键盘),其中S1~S9为1~9数字键,S10为0数字键,S11为“*”键作为确认键使用,而S12为“#”键作为复位键,键盘接口电路如图8-4所示,键值布局如表8-1所示。

图8-4 行列式键盘电路连接图

表8-1 键盘布局表

单片机上电时,数码管显示“0000”,此时输入数字,数码管将显示按键值,数字逐个向左递增,四次输入完毕,四个数码管显示输入的数,此时按“*”号按键将启动比较,若输入数字与内设密码相同,继电器动作。如不同,则系统复位等待重新输入密码。当按“#”号键,系统复位,数码管显示“0000”。

在上面键扫描程序基础上增加的源程序如下:

相关问答

单片机 的按键开关 抖动 的产生原因,抖动的特点和如何消除抖动 ...

和硬件去抖软件判断:开关闭合——延时——是否还是闭合?——如果是就判定打开,软件解决可以降低成本,开关按钮,但信号的传导并不是单纯的由1断开/...

单片机 的按键开关 抖动 的产生原因,抖动的特点和如何消除抖动 ...

判定打开,软件解决可以降低成本,但是有时候硬件劣化超出延时的范围会造成故障。硬件解决:专用的去抖芯片或者自己组装一个双稳态消抖电路,...开关...

51 单片机 ,用按键实现外部中断,软件如何去抖?

定时中断里设置一个记录按下时间的static变量t按下按键则将t++(注意不要加到溢出)松开按键,检测tt定时中断里设置一个记录按下时间的static变量t按下...

单片机 控制强电设备时,如何防止干扰?

像PLC一样供电独立出来输入输出使用光耦继电器进行隔离单片机的防抖动像PLC一样供电独立出来输入输出使用光耦继电器进行隔离单片机的防抖动

单片机 试卷的几道题(求大神解答)选择:1.一个 单片机 应用系...

[最佳回答]1.一个单片机应用系统用LED数码管显示字符“8”的段码是80H,可以断定该显示系统用的是(B)。A、不加反相驱动的共阴极数码管B、加反相驱动的共阴极...

单片机 陀螺仪 作用?

感应...2.可以帮助手机摄像头防抖。在我们按下快门时,陀螺仪测量出手机翻转的角度,将手抖产生的偏差反馈给图像处理器,用计算出的结果控制补偿镜片组,对镜头...

51 单片机 怎么定义按键?

在51单片机中,可以通过以下步骤定义按键。首先,选择一个IO口作为按键输入口,将按键连接到该IO口上。然后,在程序中设置该IO口为输入模式。接着,通过读取该...

单片机 51,出现按一次按键,得到多次按键的情况,怎么处理-ZOL问答

delayxms(15);//消除抖动if(key==0)//再次判断{while(key==0);//等待按键释放//这里添加按键按下释放后的执行代码。}}有用(0)回复oracl...

电源开关里面的电容起的是什么作用?

稳压器前面并联两个电容是滤波作用,单片机电源脚上面再接电容主要是处理两种问题:1、滤除外界辐射的高频干扰;2、滤除单片机工作时自身产生的脉冲干扰;由于...

单片机 用一个IO口采集多个按键信号,如何实现?

每隔10ms(这个时间是按键抖动的滤波时间)读一次ADC按键值,根据值的范围,将对应的按键数值加到AD按键FIFO中(这里缓冲区8个字节长),如果AD按键FIFO满了,如...A...

猜你喜欢