(二)按键检测设计
按键是基本方便的输入手段,可通过按键开关控制发光二极管的亮灭来,说明AVR单片机的端口检测外部信号的功能和方法。
1、单按键的电路
典型的单按键的电路如图6-7所示,在按键没有按下时,PA5引脚信号为高电平,当按键按下时PA5引脚信号为低电平。通过检测引脚的电平会方便的知道按键的状态。
图14 按键电路
我们日常所说的按键,外观如图6-8所示,有四个脚。按键两侧的脚是连通的,之所以做成四个脚,是为了安装牢固。
图15 按键开关
2、按键的响应过程
理想的按键的闭合和断开时,接触点的电压应该立即变高或者变低,但是由于机械触点的弹性以及按键按动时电压突变等原因,在触点闭合或断开的瞬间会出现电压抖动现象,如图6-9所示。在发生抖动的时间一般在5-10ms。
一次按键处理过程如下:当按键按下之后,相应的按键接触点的电压以高低电平的方式输入到单片机的I/O口。按键的闭合与断开是有一定时间的,一般为
0.1-1S。而AVR单片机的机器周期一般为1us甚至更短,在0.1-1S的时间段内,程序会检测很多次按键的输入电平,这样单片机可能会认为按键被按下了多次,从而出现误判。
图17 按键闭合断开时的电压波动示意图 3、按键去抖动的方法和原理
为了去除按键的抖动,保证单片机对按键的一次输入只响应一次,可以采用硬件和软件两种方法:硬件电路去抖动是在外围电路中加入去抖动电路(如R-S触发器);软件去抖动是在程序中加入延时程序以跳过抖动时间,等待信号稳定后再次判断按键的输入电平,如果信号电平保持不变,则可以确认一次按键按下。
●硬件去抖动电路的原理
用R-S触发器形成去抖电路是单片机外围电路设计中常用的方法,这种方法可以减少单片机软件对按键动作的延时和计算。典型的硬件去抖动电路如图6-10,74LS02构成一个R-S触发器电路实现按键的消抖电路。
图6-10 74LS02实现的硬件消抖电路
●软件消抖的原理和实现
软件消抖的基本原理是在软件中对按键进行两次检测确认,记载第一次检测到按键按下后,间隔10ms左右再次检测按键是否按下,只有在两次都检测到按
键按下时才最终确认有键按下,这样就避开了按键的抖动时间,从而消除了抖动的影响。
在按键接口软件的设计中,除了要考虑按键消抖外,一般还要判别按键的释放,只有检测到按键释放后,才能确定为一次完整的按键动作。 通用的案件检测程序如下:
Keyscan() {
if((PINA&0X20)==0) //判断按键是否按下,等于0表示按键按下 {
delayms(20); //延时20ms。避开按键抖动时间 if((PINA&0X20)==0) //再次判断按键是否按下, {
… //按键按下的处理程序 } }
While((PINA&0X20)==0); //判断按键是否放开,不等于表示按键释放,退出处理函数 }
(三)1-wire 是一种通讯协议实现
对18b20的操作实质是1-wire 是一种通讯协议。1-wire 是一种通讯协议,它只有一个信号线,信号线即可以进行输入也可以进行输出操作。在此基础上进行移植,在实际应用过程中意义重大。
而以往使用AVR进行引脚操作时,一个引脚要么输入、要么输出。在1-wire下,一个引脚既要实现输入操作、也要实现输出操作,因而需要对DDR操作进行深入的了解,认识DDR操作对引脚电平的影响。
1-wire通讯协议基本基本操作包括复位、写数据位、读位数据。8个位操作形成字节数据的读写,所有操作都在复位后才可以开始。 1、复位时序
对DS18B20进行所有操作之前,首先要将它复位。复位时序图6-11如下:
图18 复位时序图
(1)主机将信号线置为低电平,时间为480~960μS。 (2)主机将信号线置为高电平,时间为15~60μS。
(3)从机(DS18B20)发出60~240μS 的低电平作为应答信号,后释放信号线,信号线恢复为高电平。主机收到此信号后,才能认定复位操作完成,可以对DS18820进行其它操作。
2、对DS18B20操作的宏复位的实现代码
为实现代码的可移植性,实现对DS18B20的操作代码前,定义如下宏。 #define OW_PIN PD0 #define OW_IN PIND #define OW_OUT PORTD #define OW_DDR DDRD
#define OW_GET_IN() ( OW_IN & (1< #define OW_OUT_LOW() ( OW_OUT &= (~(1 << OW_PIN)) ) #define OW_OUT_HIGH() ( OW_OUT |= (1 << OW_PIN) ) #define OW_DIR_IN() ( OW_DDR &= (~(1 << OW_PIN )) ) #define OW_DIR_OUT() ( OW_DDR |= (1 << OW_PIN) ) 3、复位的实现代码 unsigned char ow_reset(void) { unsigned char err;
相关推荐: