在单片机中会遇到识别按键的问题,常用的独立按键电路如下图:
由于机械式触点开关具有弹性,会发生抖动,所以要进行消抖。有两种消抖方式:硬件消抖和软件消抖。
硬件消抖电路:
软件消抖常采用延时消抖:按键被按下时,当检测到低电平时,延时一段时间,一般是5到10ms,然后再检测端口,若还是低电平,则表示检测到按键按下,按键弹起时同理可得。
独立按键的检测一般采用两种方法:中断检测和查询检测。
按键连接P3^2引脚,检测按键按下和弹起的次数。
1.查询检测:可以直接在主程序中循环检测,也可以通过定时器,每隔20ms检测一次。下面是直接在循环中检测的。
主函数:
#include
#include
#define uint unsigned int
sbit in0 = P3^2 ; //输入信号引脚
uint Press_flag = 1 ; //按键按下标志
uint count = 0 ; //按键次数
void delay_ms(uint ms)
{
uint i , j ;
for(i = 0 ; i < ms ; i++)
{
for(j = 0 ; j < 333 ; j++)
{
_nop_() ;
}
}
}
void key()
{
if(in0 == 0) //检测到0
{
delay_ms(10) ; // 延时消抖
if(in0 == 0) //再次检测到0
{
Press_flag = 0 ; //代表按键被按下
}
}
if(Press_flag == 0) //如果按键被按下,再检测按键弹起
{
if(in0 == 1)
{
delay_ms(10) ;
if(in0 == 1)
{
count ++ ; //表示按键按下并弹起的次数
Press_flag = 1 ; //复位按键按下标志
}
}
}
}
void main(void)
{
while(1)
{
key() ;
}
}
信号函数:
signal void test(unsigned int cc)
{
unsigned int i , j ;
for(i = 0 ; i < cc ; i++)
{
for(j = 0 ; j < 2 ; j++)
{
port3 &= ~(1<<2) ;
swatch(0.002) ;
port3 |= 1<<2 ;
swatch(0.002);
}
port3 &= ~(1<<2) ;
swatch(0.002) ;
swatch(0.01) ;
for(j = 0 ; j < 2 ; j++)
{
port3 |= 1<<2 ;
swatch(0.002) ;
port3 &= ~(1<<2) ;
swatch(0.002) ;
}
port3 |= 1<<2 ;
swatch(0.02) ;
swatch(0.1) ;
}
_break_ = 1 ;
}
信号函数波形图:
可以看到count的值为4
2.中断检测
主程序:
#include
#include
#define uint unsigned int
sbit in0 = P3^2 ;
uint count = 0 ;
uint press_flag = 1 ;
void delay_ms(uint ms)
{
uint i , j ;
for(i = 0 ; i < ms ; i++)
{
for(j = 0 ; j < 333 ; j++)
{
_nop_() ;
}
}
}
void Init_INT(void)
{
EA = 1 ; //开总中断
EX0 = 1 ; //开外部中断0
IT0 = 1 ; //下降沿触发中断
}
void Int0 (void) interrupt 0
{
EX0 = 0 ; //关闭外部中断0,防止频繁触发中断
delay_ms(10) ;
if(in0 == 0)
{
press_flag = 0 ;//按键按下标志
}
if(press_flag == 0 && in0 == 1)//检测按键弹起
{
delay_ms(10) ;
if(in0 == 1)
{
count++ ;
press_flag = 1 ;
}
}
EX0 = 1 ; //开启外部中断
}
void main(void)
{
Init_INT() ; // 中断初始化
while(1)
{
}
}
关键字:51单片机 按键检测 信号函数 仿真
引用地址:
51单片机按键检测和信号函数仿真
推荐阅读最新更新时间:2024-03-16 16:24
基于单片机超声波倒车雷达仿真设计
#include REGX52.H #include stdio.h #include LCD.H #include 18B20.H #include delay.h sbit k1=P3^5; sbit k2=P3^6; sbit csb=P2^5; sbit csbint=P3^2; sbit bg=P2^6; sbit fmq=P3^3; unsigned char aa ={' ',' ','D','i','s','t','a','n','c','
[单片机]
基于51单片机串口通信的实时温度
测试环境:Keil Vision4 测试芯片:STC89C52RC 所需器件:DS18B20 // //Created by XD on 03/04/14 // #include AT89X52.h //调用51单片机的头文件 #include Intrins.h //这个头文件里有_nop()_;函数的定义 //--------------------------------------- //1602液晶相关I/O设置 sbit E = P1^2; //液晶E接口位定义,对位操作,要先进行位定义,因为AT89X52.h头文件里没有相关的位定义 sbit RW = P1^1;//液晶RW接口位定义,对位操作,要先进行位定义,因
[单片机]
CAN总线通信控制协议的仿真及性能分析
控制器局域网(CAN)属于现场总线的范畴,是一种有效支持分布式控制系统的串行通信网络。它是由德国博世公司在20世纪80年代专门为汽车行业开发的一种串行通信总线。由于其通信速率高、工作可靠、调试方便、使用灵活和性价比高等优点,己经在汽车业、航空业、工业控制、安全防护等领域中得到了广泛应用,被公认为几种最有前途的总线之一,其协议也发展为重要的国际标准。
随着CAN总线在各个行业和领域的广泛应用,其通信性能也越来越受到人们的关注。目前,已有很多学者对CAN总线通信性能进行分析研究。文中在分析CAN总线通信控制协议的基础上,在MATLAB/Sinulink软件Stateflow仿真环境下,利用有限状态机理论对CAN总线通信系统
[嵌入式]
MCS51单片机的定时器/计数器概念 非常好的寄存器关系图
一、MCS-51单片机的定时器/计数器概念 单片机中的定时器和计数器其实是同一个物理的电子元件,只不过计数器记录的是单片机外部发生的事情(接受的是外部脉冲),而定时器则是由单片机自身提供的一个非常稳定的计数器,这个稳定的计数器就是单片机上连接的晶振部件;MCS-51单片机的晶振经过12分频之后提供给单片机的只有1MHZ的稳定脉冲;晶振的频率是非常准确的,所以单片机的计数脉冲之间的时间间隔也是非常准确的,这个准确的时间间隔是1微秒; MCS-51单片机外接的是12MHZ的晶振(实际上是11.0592MHZ),所以,MCS-51单片机内部的工作频率(时钟脉冲频率)是12MHZ/12=1MHZ=1000000次/秒=1000000条指令
[单片机]
基于51单片机秒表设计,独立按键实现启动、复位、暂停功能
功能说明: #include reg52.h //此文件中定义了单片机的一些特殊功能寄存器 typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned char u8; sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4; sbit K1=P3^1; //开始 sbit K2=P3^0; //停止 sbit K3=P3^2; //使用中断 清零 //数码表 u8 code smgduan ={0x3f,0x06,0x5b, 0x4f,0x66,0x6d, 0x7d,
[单片机]
51单片机用定时器0实现流水灯
51单片机用定时器0实现流水灯的代码如下,用P1口接led灯,代码如下都有注释就不具体解释了,英语不怎么好,有的地方将就一下喽,本次主要讲一下P1口怎么赋值。原先写的都是用查表来移位的,个人感觉不怎么好,麻烦。直接用位运算的比较好。 n初始值为0,然后n每次循环都加1,P1口赋值语句为: P1=~(0x01 n) ; 此处注意和P1=~(0xfe n) ; 的区别。 /*********调用头文件*****************/ #include reg51.h #include intrins.h /***********宏定义*******************/ #define uint u
[单片机]
基于Proteus的公交车液晶显示报站系统的设计与仿真
1 引 言
公交车对提升城市形象、促进社会经济发展起到积极推动作用。但在我国偏远的西部和经济还不太发达的一些地方,公交车的发展还明显跟不上人们日益增长的物质需求,如2009 年3 月,康定县才成为四川藏区第一个开通公交服务的城市。对于我国二级以下的城市,目前公交车报站的情况大多还存在以下问题: ①没有自动报站,实行人工报站;②有自动报站,却停留在单一的语言报站上;③LED站台数字编号(比如002) 显示;④LED 汉字显示屏,但屏幕显示内容单一。这些在乘客对路线不熟悉或在乘车拥挤的情况下,势必会给乘客带来不便。本文设计了公交车报站系统液晶显示汉字的控制电路,并在Proteus 仿真平台上完成了模拟。
2 Proteus 介
[电源管理]
C8051单片机实现多目标超声波测距的设计
超声波测距传感器以其测量精度高、响应快和价格低廉而广泛应用在工业现场测距、移动机器人导航和定位等场合。超声波测距传感器常用的方式是1 个发射头对应1 个接收头,也有多个发射头对应1 个接收头。 它们共同之处是:每个接收头只测量一个位置,这个位置就是除盲区内因发射的超声波旁瓣引起的接收信号超声波包络峰值外,第1个接收信号超声波包络峰值对应的距离。 在机器人自主导航避障时,机器人只关心最近障碍物的距离,是能够完成自主避障的。 但是在机器人定位时,尤其在动态环境下,1 个接收头同时测量多个距离,能够更多地描述环境信息,这对机器人用超声波定位具有重要意义。 1 超声波 1. 1 超声波测距原理 超声波测距原理比较简单,一般是采用时差法
[单片机]