单片机c语言程序按键和消抖
单片机的按键消抖与几种按键电路

用其他的各类触发器,锁存器亦可达到消抖效果。 二、 软件消抖 : 通过软件延时 10ms 达到消除抖动的效果,不加文字赘述。 三、 按键电路 : 独立按键
矩阵按键 译码按键 AD 模拟按键 锁定按键
单片机的按键消抖与几种按键电路
一、 硬件消抖 : 按键防抖电路控制电路 所示利用 RC 积分电路来达成杂波的滤除与波形修整的电路(如图 1 )。 在 S1 ON 的瞬间由于接触弹跳的关系,会使 A 点电压呈现高速的断 续现象,再 S1 OFF 时亦然,详(如图 2 所示),然而由于电容两端电压需由 电压经电阻慢慢充电才会上升,使得 B 点电位缓步上升情形:S1 OFF 时亦 然,电容电压经 R 放电,使 B 点电压缓缓下降。此一变化,经史密特反相 修整后,可得一标准负脉波输出,如波
按键消抖与时间按键

case 0xdf:return 6;break;
case 0xbf:return 7;break;
case 0x7f:return 0;break;
}
}
}
定时器函数
void timer0 ()interrupt1
TR0=1;
if(T>100)
{
TR0=0;
T=0;
}
if(TR0=1&&T<100)
continue;//在定时器里面设置初值让定时器中断一次1ms并且T自加1,100次就100ms
switch(key)
{//返回键值
case 0xfe:return 1;break;
case 0xfd:return 2;break;
消抖分硬件和软件消抖,
硬件消抖有《模拟电子技术》上提到用三态门实现,当然还有周立功那个7920(管理数码管和按键的芯片),当然还有很多硬件电路以及一些按键有自带消抖电路,但是如果要做产品硬件消抖肯定会增加成本,一般都会考虑软件消抖
软件消抖我们先来看看书上消抖方法如下图
例程
Unsignedchar keyscan()//这里是用的P2口作为按键的输入口
第4个问题了,从物理上我们可以知道,既然是阻尼振动,必定到振动到某个时候肯定是和稳定的状态一致的,所以肯定不是必须10ms的延时的,比如按下去假设10ms振动后机械才稳定,但是电平上当触点挨得很近振动的时候就算触点不是挨着,还是显示低电平
第5个问题实际上前面已经说了,有硬件消抖肯定对CPU占用最少,软件消抖当然就是尽量不要用些没用的语句,分配好时序
2.如何消抖
3.是不是按键都要消抖,不是的话,哪些需要消抖,哪些不需要消抖
查询按键加减实验报告(3篇)

第1篇一、实验目的1. 理解按键输入的基本原理。
2. 掌握C语言编程中按键扫描和响应的实现方法。
3. 实现基于按键输入的加减功能,并能够查询结果。
二、实验环境1. 开发工具:Keil uVision52. 实验平台:STM32F103系列单片机开发板3. 外设:按键模块三、实验原理1. 按键扫描原理:通过查询或中断方式检测按键是否被按下,并判断是哪个按键被按下。
2. 单片机编程:使用C语言编写程序,实现对按键的扫描和加减功能的实现。
四、实验步骤1. 准备实验环境,连接按键模块到单片机开发板上。
2. 编写按键扫描函数,实现按键的检测和识别。
3. 编写加减功能函数,实现加法和减法运算。
4. 编写主函数,实现按键输入和结果显示。
五、实验代码```cinclude "stm32f10x.h"// 按键定义define KEY_ADD GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) // PA0define KEY_SUB GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) // PA1// 全局变量volatile int result = 0;// 按键扫描函数void KeyScan(void) {if (KEY_ADD == 0) {while (KEY_ADD == 0); // 防抖动 result += 1;}if (KEY_SUB == 0) {while (KEY_SUB == 0); // 防抖动 result -= 1;}}// 加减功能函数void AddSub(void) {KeyScan();// 显示结果// ... (此处省略显示代码)}// 主函数int main(void) {// 初始化GPIO// ... (此处省略初始化代码)while (1) {AddSub();}}```六、实验结果与分析1. 实验结果:通过按键输入,可以实现对数字的加减操作,并实时显示结果。
单片机按键程序设计

单片机按键程序设计单片机按键的基本原理其实并不复杂。
通常,按键就是一个简单的开关,当按键按下时,电路接通,对应的引脚电平发生变化;当按键松开时,电路断开,引脚电平恢复到初始状态。
在程序设计中,我们需要不断检测引脚的电平变化,从而判断按键是否被按下。
在实际的按键程序设计中,有多种方式可以实现按键检测。
其中一种常见的方法是查询法。
这种方法是通过不断地读取按键对应的引脚状态来判断按键是否被按下。
以下是一个简单的查询法示例代码:```cinclude <reg51h> //包含 51 单片机的头文件sbit key = P1^0; //定义按键连接的引脚void main(){while(1) //无限循环{if(key == 0) //如果按键按下,引脚为低电平{//执行按键按下的操作//比如点亮一个 LED 灯P2 = 0xfe;while(key == 0);//等待按键松开}}}```上述代码中,我们首先定义了按键连接的引脚`key`,然后在主函数的无限循环中不断检测按键引脚的状态。
当检测到按键按下时,执行相应的操作,并通过`while(key == 0)`等待按键松开。
除了查询法,还有中断法可以用于按键检测。
中断法的优点是能够及时响应按键动作,不会因为程序的其他操作而导致按键响应延迟。
```cinclude <reg51h> //包含 51 单片机的头文件sbit key = P1^0; //定义按键连接的引脚void int0_init()//中断初始化函数{IT0 = 1; //下降沿触发中断EX0 = 1; //使能外部中断 0EA = 1; //开总中断}void int0() interrupt 0 //外部中断 0 服务函数{//执行按键按下的操作//比如点亮一个 LED 灯P2 = 0xfe;}void main(){int0_init();//初始化中断while(1);//无限循环,保持程序运行}```在上述代码中,我们首先在`int0_init` 函数中对中断进行了初始化设置,然后在`int0` 函数中编写了按键按下时的处理代码。
单片机按键电容消抖电路

单片机按键电容消抖电路1.引言1.1 概述概述部分的内容:在许多电子设备中,按键电路常常被使用来实现用户与设备之间的交互。
然而,由于按键的物理特性,如机械弹性和触点接触的不稳定性,会导致按键的震荡现象,即按键在按下或释放时会产生多次跳变。
这种跳变会导致单片机误读按键的信号,可能引发系统错误操作或不稳定的现象。
因此,为了保证按键信号的可靠性和稳定性,需要对按键进行消抖处理。
本篇文章将详细介绍单片机按键电容消抖电路的设计和实现原理。
通过在按键电路中引入电容元件,可以达到消抖的效果。
电容元件具有快速充放电的特性,可以有效地过滤掉按键震荡带来的干扰信号,确保单片机正确读取按键状态。
文章将首先介绍单片机按键的工作原理,包括按键的接口电路和输入电平变化的检测方式。
接着,将深入探讨按键消抖的必要性,分析不进行消抖处理所带来的潜在问题。
在这之后,将详细介绍按键电容消抖电路的设计原理,包括电容的连接方式和参数的选择。
最后,将给出经过实际测试的电路实现结果和相关性能指标的评估。
通过本文的阅读,读者将能够了解单片机按键的基本原理和消抖处理的必要性,掌握按键电容消抖电路的设计和实现方法,以及了解该电路的性能表现。
这对于开发单片机应用的工程师和爱好者来说,具有一定的指导意义和实践价值。
文章结构部分的内容是对整篇文章的组织和布局进行描述。
它向读者展示了文章的章节和主题,并指导读者理解和阅读文章的内容。
在本文中,文章结构如下:1. 引言1.1 概述1.2 文章结构1.3 目的2. 正文2.1 单片机按键原理2.2 按键消抖的必要性3. 结论3.1 按键电容消抖电路的设计原理3.2 电路实现与测试结果文章的结构分为引言、正文和结论三个主要部分。
在引言部分,概述简要介绍了单片机按键电容消抖电路的背景和重要性;文章结构部分指出了本文的章节组成和布局,为读者提供了阅读指南;目的阐明了文章的目标和意图。
正文部分主要包括单片机按键原理和按键消抖的必要性。
单片机按键电路工作原理

单片机按键电路工作原理一、引言单片机按键电路是嵌入式系统中常见的输入设备之一,用于接收用户的输入信号。
按键电路的工作原理对于理解嵌入式系统的输入部分至关重要。
本文将详细介绍单片机按键电路的工作原理。
二、按键电路的组成单片机按键电路主要由按键、电阻和电容等元件组成。
其中,按键是实现用户输入的主要部件,通过按下按键来产生电信号。
电阻和电容则起到限流和滤波的作用,保证按键电路的稳定性和可靠性。
三、按键电路的工作原理1. 按键原理按键是由弹簧片、触点和外壳等部件组成的机械开关。
当按键没有被按下时,弹簧片处于松弛状态,触点断开,电路中无通路。
当按键被按下时,弹簧片被压缩,触点闭合,电路中形成通路。
2. 按键电路连接按键电路一般采用多键并联的方式连接。
在按键闭合时,单片机的输入引脚与电源或地之间形成通路,产生一个逻辑电平。
在按键断开时,输入引脚与电源或地之间没有通路,逻辑电平为另一个状态。
通过不同的组合方式,可以实现多个按键的输入。
3. 按键消抖由于按键机械的特性,按键在按下和释放时会产生抖动现象,即在短时间内多次开关状态的切换。
为了避免抖动对系统产生误触发,按键电路一般会进行消抖处理。
常见的消抖方法有软件消抖和硬件消抖两种。
软件消抖是在单片机的程序中通过延时、计数等方法实现的,可以有效地去除按键抖动信号。
硬件消抖则是通过电容或者RC电路等方式实现的,将抖动信号滤除,只保留稳定的按键信号。
四、按键电路的工作流程1. 初始化在使用单片机按键电路之前,需要对其进行初始化。
通常需要设置引脚的输入/输出状态和上拉/下拉电阻等参数。
2. 读取按键状态单片机通过读取输入引脚的电平状态来判断按键的状态。
当检测到按键闭合时,将相应的引脚电平置为高电平或低电平,表示按键被按下。
当检测到按键断开时,引脚电平恢复为另一个状态。
3. 处理按键事件根据按键的状态,单片机可以执行相应的操作。
例如,在按下按键时,可以触发某个功能或者改变系统的状态。
51单片机电子时钟C语言程序

EX0=1;
ET0=1;
TR0=1;
yueqh(),riqh();//初始化日月切换
}
void ritiao()//日期的调节函数
{ if(P36==0)//日期加一调节键
{
p36xd();
if((numyue==1)||(numyue==3)||(numyue==5)||(numyue==7)||(numyue==8)||(numyue==10)||(numyue==12))
{numyue=1;}
yueqh();
}
if(P37==0)
{
p37xd();
numyue-=1;
if(numyue==0)
{numyue=12;}
yueqh();
}
}
void int0() interrupt 0
{
p32xd();
if(numsec==-1)
{
numsec=59;
}
secqh();
}
}
};
p32xd();
while(P32!=0)//第二次按下p32时,进行分调时
{
for(m=0;m<40;m++)
{
P2=0x00;
P0=table[hou1];
P2=0X20;
delayms(1);
P2=0x00;
P0=table[hou2]&0x7f;
P2=0X10;
delayms(1);
P2=0x00;
P0=table[sec1];
单片机按键程序

}
}//ov2 end
ISR(INT1_vect)//big button
{
if(mzt==4)
{ko=0xff;}
//if(mzt!=4&&mzt!=0)//反应时间控制
//{
//h
// }
if(mzt==0)
{
MCUCR=0x0A;
//4.0ms
TCCR0=0X03;//4m 0.25us*250*64(分频)*250==1.0s
TIMSK=0X01;
mzt=0;
//AJ
ajov=0;
ta=0;tb=0;zt=0;t1=0;t2=0;t=0;aj=0;//第一颗按键
tc=0;td=0;zt2=0;t3=0;t4=0;t_2=0;aj2=0;//第二颗按键
if(w==4) w=0;
time_0k=0;//显示标志软件清零
if(dark)
PORTB=0XFF;//取消显示
}
//timeov
if(timeov>0)
{
//位选时间time_0k 显示
time_0=time_0+1;
if(time_0>=0)//位选软件计时
if(++sw[2]>=6)//10秒
{
sw[2]=0;
if(++sw[3]>=10)//分
{sw[3]=0;}
}//2
}//1
}//0
}
}
if(++sw_0>=0)//位选软件计时
{
极其简单好用的按键扫描程序C语言

极其简单好用的按键扫描程序(C语言)不过我在网上游逛了很久,也看过不少源程序了,没有发现这种按键处理办法的踪迹,所以,我将他共享出来,和广大同僚们共勉。
我非常坚信这种按键处理办法的便捷和高效,你可以移植到任何一种嵌入式处理器上面,因为C语言强大的可移植性。
同时,这里面用到了一些分层的思想,在单片机当中也是相当有用的,也是本文的另外一个重点。
对于老鸟,我建议直接看那两个表达式,然后自己想想就会懂的了,也不需要听我后面的自吹自擂了,我可没有班门弄斧的意思,hoho~~但是对于新手,我建议将全文看完。
因为这是实际项目中总结出来的经验,学校里面学不到的东西。
以下假设你懂C语言,因为纯粹的C语言描述,所以和处理器平台无关,你可以在MCS-51,AVR,PIC,甚至是ARM平台上面测试这个程序性能。
当然,我自己也是在多个项目用过,效果非常好的。
好了,工程人员的习惯,废话就应该少说,开始吧。
以下我以AVR的MEGA8作为平台讲解,没有其它原因,因为我手头上只有AVR的板子而已没有51的。
用51也可以,只是芯片初始化部分不同,还有寄存器名字不同而已。
核心算法:unsigned char Trg;unsigned char Cont;void KeyRead( void ){unsigned char ReadData = PINB^0xff; // 1Trg = ReadData & (ReadData ^ Cont); // 2Cont = ReadData; // 3}完了。
有没有一种不可思议的感觉?当然,没有想懂之前会那样,想懂之后就会惊叹于这算法的精妙!!下面是程序解释:Trg(triger)代表的是触发,Cont(continue)代表的是连续按下。
1:读PORTB的端口数据,取反,然后送到ReadData 临时变量里面保存起来。
2:算法1,用来计算触发变量的。
一个位与操作,一个异或操作,我想学过C语言都应该懂吧?Trg为全局变量,其它程序可以直接引用。
单片机按键消抖方式详解

0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E };
void delay(); void main(){
程序如下: #include <reg52.h>
sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3; sbit ENLED = P1^4; sbit KEY1 = P2^4; sbit KEY2 = P2^5; sbit KEY3 = P2^6; sbit KEY4 = P2^7;
KeySta = 1; } else{
//其它情况则说明按键状态尚未稳定,则不对 KeySta 变量值进行更新 } } 这个算法是我们在实际工程中经常使用按键所总结的一个比较好的方法,介绍给大家,
今后都可以用这种方法消抖了。当然,按键消抖也还有其它的方法,程序实现更是多种多样,
大家也可以再多考虑下其它的算法,拓展下思路。
那么消抖操作所需要的延时该怎么处理呢?
举个例子:我们启用一个定时中断,每 2ms 进一次中断,扫描一次按键状态并且存储 起来,连续扫描 8 次后,看看这连续 8 次的按键状态是否是一致的。8 次按键的时间大 概是 16ms,这 16ms 内如果按键状态一直保持一致,那就可以确定现在按键处于稳定的 阶段,而非处于抖动的阶段,如图 8-12。
keybuf = (keybuf<<1) | KEY4; //连续 8 次扫描值都为 0,即 16ms 内都只检测到按下状态时,可认为按键已按下 if (keybuf == 0x00){
单片机综合实训教案

单片机综合实训教案一、实训目的与要求1. 目的(1)了解单片机的基本原理和结构。
(2)掌握单片机的编程方法和应用技巧。
(3)培养动手能力和团队协作精神。
2. 要求(1)熟悉单片机的基本硬件组成。
(2)掌握单片机编程语言(如C语言、汇编语言等)。
(3)能够独立完成简单单片机程序的设计与调试。
二、实训内容与课时安排1. 实训内容(1)单片机硬件认识与搭建。
(2)单片机编程基础。
(3)单片机常见外设接口编程。
(4)单片机应用系统设计。
(5)综合实训项目。
2. 课时安排(1)单片机硬件认识与搭建:2课时。
(2)单片机编程基础:4课时。
(3)单片机常见外设接口编程:6课时。
(4)单片机应用系统设计:4课时。
(5)综合实训项目:8课时。
三、实训步骤与方法1. 实训步骤(1)单片机硬件认识与搭建:了解单片机的硬件组成,搭建实验平台。
(2)单片机编程基础:学习单片机编程语言,掌握基本编程技巧。
(3)单片机常见外设接口编程:学习并掌握常见外设接口(如LED、按键、串口等)的编程方法。
(4)单片机应用系统设计:结合实际项目,设计并实现一个完整的单片机应用系统。
(5)综合实训项目:完成一个综合性的实训项目,提高实际应用能力。
2. 实训方法(1)讲解与演示:教师讲解单片机相关知识,并进行现场演示。
(2)实践操作:学生动手进行实验,巩固所学知识。
(3)讨论与提问:学生之间互相讨论,解答疑问。
(4)项目实践:以小组为单位,完成综合性实训项目。
四、实训评价与考核1. 评价方式(1)平时表现:30%。
(2)实验报告:40%。
(3)综合实训项目:30%。
2. 考核标准(1)平时表现:参与课堂讨论、提问、实验操作等。
(2)实验报告:内容完整、分析深入、表达清晰。
(3)综合实训项目:项目完成度高、创新性强、实用性好。
五、教学资源与工具1. 教学资源(1)教材:单片机原理与应用。
(2)课件:单片机相关知识。
(3)实验器材:单片机开发板、编程器、实验器件等。
单片机按键处理技巧及C语言编程方式

单片机按键处理技巧及编程方式在基于单片机为核心构成的应用系统中,用户输入是必不可少的一部分。
输入可以分很多种情况,譬如有的系统支持PS2键盘的接口,有的系统输入是基于编码器,有的系统输入是基于串口或者USB或者其它输入通道等等。
在各种输入途径中,更常见的是,基于单个按键或者由单个键盘按照一定排列构成的矩阵键盘(行列键盘)。
我们这一篇章主要讨论的对象就是基于单个按键的程序设计,以及矩阵键盘的程序编写。
按键检测的原理: 它们和我们的单片机系统的I/O口连接一般如下:对于单片机I/O内部有上拉电阻的微控制器而言,还可以省掉外部的那个上拉电阻。
简单分析一下按键检测的原理。
当按键没有按下的时候,单片机I/O通过上拉电阻R接到VCC,我们在程序中读取该I/O的电平的时候,其值为1(高电平); 当按键S按下的时候,该I/O被短接到GND,在程序中读取该I/O的电平的时候,其值为0(低电平) 。
这样,按键的按下与否,就和与该按键相连的I/O的电平的变化相对应起来。
结论:我们在程序中通过检测到该I/O 口电平的变化与否,即可以知道按键是否被按下,从而做出相应的响应。
一切看起来很美好,是这样的吗?在我们通过上面的按键检测原理得出上述的结论的时候,那就是现实中按键按下时候的电平变化状态。
我们的结论是基于理想的情况得出来的,而实际中,由于按键的弹片接触的时候,并不是一接触就紧紧的闭合,它还存在一定的抖动,尽管这个时间非常的短暂,但是对于我们执行时间以us为计算单位的微控制器来说,它太漫长了。
因而,实际的波形图应该如下面这幅示意图一样。
这样便存在这样一个问题。
假设我们的系统有这样功能需求:在检测到按键按下的时候,将某个I/O的状态取反。
由于这种抖动的存在,使得我们的微控制器误以为是多次按键的按下,从而将某个I/O的状态不断取反,这并不是我们想要的效果,假如该I/O控制着系统中某个重要的执行的部件,那结果更不是我们所期待的。
按键消抖

end
else
cnt <= 0; end
always @(posedge clk or negedge nrst) begin
if(nrst == 0)
key_out <= 0;
else if(cnt == TIME_20MS - 1)
key_out <= key_in; endendmodule
方案3
// key down, bounce 19ms
repeat(951) @(negedge clk) key_in = ~key_in;
// last 60ms
repeat(3000) @(negedge clk);
cnt <= 0;
//
end always @(posedge clk or negedge nrst) begin
if(nrst == 0)
key_cnt
<= 0;
else if(key_cnt == 0 && key_in != key_out)
key_cnt <= 1;
else
if(cnt == TIME_20MS - 1)
// clock .key_out(key_out) );
initial begin
clk = 1;
forever #(T/2) clk
= ~clk; end
// reset initial begin
nrst = 1;
@(negedge clk) nrst = 0;
@(negedge clk) nrst
按键消抖
按键去抖:由上图可以看出理想波形与实际波形之间是有区别的,实际波形在按下和释放的瞬间都有抖动的现象,抖动 时间的长短和按键的机械特性有关,一般为5~10ms。通常我们手动按键然后释放,这个动作中稳定闭合的时间超过了 20ms。因此单片机在检测键盘是否按下时都要加上去抖动操作,有专用的去抖动电路,也有专门的去抖动芯片,但通常 我们采用软件延时的方法就可以解决抖动问题。
按键功能实验报告总结(3篇)

第1篇一、实验背景按键作为电子设备中常见的输入装置,其功能丰富,应用广泛。
本实验旨在通过设计和实现一系列按键功能,加深对按键工作原理的理解,并提高电子设计实践能力。
二、实验目的1. 掌握按键的基本原理和电路设计方法。
2. 熟悉按键在不同应用场景下的功能实现。
3. 培养电子设计实践能力,提高问题解决能力。
三、实验内容1. 实验器材:51单片机最小核心电路、按键、LED灯、电阻、电容、面包板等。
2. 实验内容:(1)单按键控制LED灯闪烁(2)按键控制LED灯点亮与熄灭(3)按键控制LED灯亮度调节(4)按键实现数字时钟调整(5)按键实现多功能计数器(6)按键实现密码输入与验证四、实验步骤1. 根据实验要求,设计电路图,并选择合适的元器件。
2. 使用面包板搭建实验电路,包括单片机、按键、LED灯、电阻、电容等。
3. 编写程序,实现按键功能。
4. 对程序进行调试,确保按键功能正常。
5. 实验完成后,撰写实验报告。
五、实验结果与分析1. 单按键控制LED灯闪烁实验结果:按下按键,LED灯闪烁;松开按键,LED灯停止闪烁。
分析:本实验通过单片机定时器实现LED灯的闪烁。
当按键按下时,定时器开始计时;当定时器达到设定时间后,LED灯点亮;定时器继续计时,当达到设定时间后,LED灯熄灭。
如此循环,实现LED灯的闪烁。
2. 按键控制LED灯点亮与熄灭实验结果:按下按键,LED灯点亮;再次按下按键,LED灯熄灭。
分析:本实验通过单片机的I/O口控制LED灯的点亮与熄灭。
当按键按下时,单片机将I/O口置为高电平,LED灯点亮;当按键再次按下时,单片机将I/O口置为低电平,LED灯熄灭。
3. 按键控制LED灯亮度调节实验结果:按下按键,LED灯亮度逐渐增加;松开按键,LED灯亮度保持不变。
分析:本实验通过单片机的PWM(脉宽调制)功能实现LED灯亮度的调节。
当按键按下时,单片机调整PWM占空比,使LED灯亮度逐渐增加;松开按键后,PWM占空比保持不变,LED灯亮度保持不变。
【黑金原创教程】【FPGA那些事儿-驱动篇I】实验二:按键模块①-消抖

【⿊⾦原创教程】【FPGA那些事⼉-驱动篇I】实验⼆:按键模块①-消抖实验⼆:按键模块① - 消抖按键消抖实验可谓是经典中的经典,按键消抖实验虽曾在《建模篇》出现过,⽽且还惹来⼀堆⿇烦。
事实上,笔者这是在刁难各位同学,好让对⽅的惯性思维短路⼀下,但是惨遭⼝⽔攻击 ... ⾯对它,笔者宛如被甩的男⼈,对它⼜爱⼜恨。
不管怎么样,如今 I’ll be back,笔者再也不会重复⼀样的悲剧。
按键消抖说傻不傻说难不难。
所谓傻,它因为原理不仅简单(就是延迟⼏下下⽽已),⽽且顺序语⾔(C语⾔)也有⽆数不尽的例⼦。
所谓难,那是因为⼈们很难从单⽚机的思维跳出来 ... 此外,按键消抖也有许多细节未曾被⼈重视,真是让⼈伤⼼。
按键消抖⼀般有3段操作:l 检测电平变化;l 过滤抖动(延迟);l 产⽣有效按键。
假设C语⾔与单⽚机的组合想要检测电平变化,它们⼀般是利⽤if查询或者外部中断。
事后,如果这对组合想要过滤抖动,那么可以借⽤for 延迟的⼒量,⼜或者依赖定时中断产⽣精明的延迟效果。
反观有效案件的产⽣,这对组合视乎⽽外钟情“按下有效”似的 ... 不管怎么样,C语⾔与单⽚机这对组合在处理按键的时候,它们往往会错过⼀些黄⾦。
“黄⾦?”,读者震撼道。
所谓黄⾦时间就是电平发⽣变化那⼀瞬间,还有消抖(延迟)以后那⼀瞬间。
按键按下期间,按键的输⼊电平故会发⽣变化,如果使⽤if查询去检测,结果很容易浪费单⽚机的处理资源,因为单⽚机必须⼀直等待 ... 换之,如果反⽤外部中断,中断寻址也会耽误诺⼲时间。
假设C语⾔与单⽚机这对组合挨过电平检测这起难关,余下的困难却是消抖动作。
如果利⽤for循环实现去消抖,例如 Delay_ms(10) 之类的函数。
For循环不仅计数不紧密,⽽且还会⽩⽩浪费单⽚机的处理资源。
定时中断虽然计数紧密,但是中断触发依然也会产⽣诺⼲的寻址延迟。
补上,所谓寻址延迟是处理器处理中断触发的时候,它要事先保护现场之余,也要寻址中断处理⼊⼝,然后执⾏中断函数,完后回复现场,最后再返回当前的⼯作。
mcu 单片机c语言经典程序-实例

#define uchar unsigned char
#define uint unsigned int
/********************************************************************
*名称: Delay()
本例中是调用的intrins.h中的函数实现的循环移位。
*创建人:东流,2009年8月27日
*版本号:1.0
***********************************************************************/
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
/********************************************************************
*名称: Delay()
*功能:延时,延时时间为10ms * del
*输入: del
*输出:无
***********************************************************************/
*输入:无
*输出:无
***********************************************************************/
voidMain(void)
{
P0 = 0xff; //关闭所有LED
while(1)
{
Show_LED = 1;
单片机按键去抖原理

3楼
要不硬件上消下抖,加个电容?
为什么某个IO状态翻转呢?为什么不像电脑 一样,有kbhit这样 的判断存在,我们可以在有键按下 时锁住所按 键的扫描码吧,当然视 你要完成的功能而定 这样 的话,由于所按的 键已锁存,后面的中 断判断的就是有 无按键了,调节好其判 断条件如 时间 什么的,就像电 脑设置了按键响应速度一样,这样可以解决吧。
它们和我们的单片机系统的I/O口连接一般如下:
对于单片机I/O内部有上拉电阻的微控制器而言,还可以省掉外部的那个上拉电阻。简单分析一下按键检测的原理。当按键没有按下的时候,单片机 I/O通过上拉电阻R接到VCC,我们在程序中读取该I/O的电平的时候,其值为1(高电平); 当按键S按下的时候,该I/O被短接到GND,在程序中读取该I/O的电 平的时候,其值为0(低电平) 。这样,按键的按下与
否,就和与该按键相连的I/O的电平的变化相对应起来。结论:我们在程序中通过检测到该I/O口电平的变化与否,即可以知道按键是否被按下,从而 做出相应的响应。一切看起来很美好,是这样的吗?
◎现实并非理想 在我们通过上面的按键检测原理得出上述的结论的时候,其实忽略了一个重要的问题,那就是现实中按键按下时候的电平变化状态。我们的结论是基 于理想的情况得出来的,就如同下面这幅按键按下时候对应电平变化的波形图一样:
讨论下吧!
C语言也能 写图形的俄 罗斯方 块?!! TOP
发表于 2010-5-12 23:58 | 只看该作者
4楼
硬件上可以用电容消抖,并接一个104即可 ,如果还想要更好的效果,可以用74HC14对波形整形。我见过的按键除了上述的硬件处 理之外,软件上面同样要消抖,因为是用在工业环境里,什么情况都有可能出现。 “我们可以在有 键按下时锁住所按 键的扫描码吧,当然视你要完成的功能而定 这样的话,由于所按的 键已锁存,后面的中 断判断的就 是有 无按键了,调节好其判 断条件如 时间 什么的,就像电脑设 置了按 键响应 速度一 样,这样 可以解 决吧。” 呵呵,想法太简单。 按键处 理也要分情 况,对于很重要的,一般接中 断,剩下的应用级的,在主循 环中循环检测 即可。 比较好的做好是,开辟一个环形缓冲。确定按键按下,丢到缓冲区,任务根据当前状态取键值,作处理。