导通的。
所以采用上面的电路设计,就能有效提高系统的抗干扰性。
此外,采用光电隔离设
计后,当外部有强信号冲击时,只能把隔离器件损坏,有效地保护了弱电系统本身。
连续信号往往在数据交换和通信通道中使用,其特点是对时间定位、捕捉、时序的要求
较高,通常要对信号的边沿(上升沿或下降沿)进行检测,或由信号的边缘触发。
此时外围
器件的选择应符合频率的要求,同时还要求程序员熟悉信号的时序以及相关的通信接口协议
等。
AVR单片机提供了丰富的接口,如外部中断、定时计数器、USART、I2C、SPI,可以方
便的对连续脉冲信号进行检测、计数,以及支持多种协议的数据交换和通信等。
9.1.2I/O输入接口软件设计要点
根据不同的硬件接口电路和嵌入式系统功能需求的不同,输入接口软件的设计也是千百
万化、丰富多彩的。
设计开发一个好的嵌入式系统产品,不仅要求软件设计人员要具备很强
的硬件能力,还要有相当高的软件设计编程能力和经验。
这是开发嵌入式系统的特点:
硬件
软件不可分割,同等重要。
在以后的学习中,我们会逐渐体会和深入学习各种接口的软件设
计技巧。
在本章以下的几节中,将主要讲解通用数字I/O口的一个基本和重要应用:
按键和键盘
接口的软硬件设计与实现。
按键和键盘是单片机嵌入式系统中一个重要的组成部分,虽然在
华东师范大学电子系马潮9-2
基于AVR的单片嵌入式系统原理与实践应用
硬件电路上的连接实现非常简单,但由于按键其本身的特殊性(如需要考虑消除抖动,确认
释放等)和功能的多样性(如连续按键,多功能等),它的软件接口程序的设计和实现要相
对复杂些。
所以读者在学习本章的内容时,更重要的是掌握系统软件设计编写的方法和技术,
采用模块化的思想实现功能模块的单一性、独立性,以及学习基于状态机思想的程序设计方
法。
AVR通用I/O口的结构以及相关的寄存器已经在本书的第六章中做了介绍,同时给出了
通用I/O口的输出应用实例。
但要将AVR单片机的I/O接口用做数字输入口使用时,请千万
注意AVR单片机同其它类型单片机的I/O口的不同,即AVR的通用I/O口是有方向的。
在程
序设计中,如果要将I/O口作为输入接口时,不要忘记应先对I/O进行正确的初始化和设置。
1)正确使用AVR的I/O口要注意:
先正确设置DDRx方向寄存器,再进行I/O口的读
写操作。
2)AVR的I/O口复位后的初始状态全部为输入工作方式,内部上拉电阻无效。
所以,
外部引脚呈现三态高阻输入状态。
3)因此,用户程序需要首先对要使用的I/O口进行初始化设置,根据实际需要设定使
用I/O口的工作方式(输出还是输入),当设定为输入方式时,还要考虑是否使用
内部的上拉电阻。
4)在硬件电路设计时,如能利用AVR内部I/O口的上拉电阻,可以节省外部的上拉电
阻。
5)I/O口用于输出时,应设置DDRx=1或DDRx.n=1,输出值写入PORTx或PORTx.n
中。
6)I/O口用于输入时,应设置DDRx=0或DDRx.n=0。
读取外部引脚电平时,应读
取PINx.n的值,而不是PORTx.n的值。
此时PORTx.n=1表示该I/O内部的上拉
电阻有效,PORTx.n=0表示不使用内部上拉,外部引脚呈现三态高阻输入状态。
7)一旦将I/O口的工作方式由输出设置成输入方式后,必须等待一个时钟周期后才能
正确的读到外部引脚PINx.n的值。
最后一点是由于在PINx.n和AVR内部数据总线之间有一个同步锁存器(图6-4中的
SYNCHRONIZER)电路,使用该电路避免了当系统时钟变化的短时间内外部引脚电平也同时变
化而造成的信号不稳定的现象,但它将产生大约一个时钟周期(0.5~1.5)的时延。
9.2按键输入接口设计
在单片机嵌入式系统中,按键和键盘是一个基本和常用的接口,它是构成人机对话通道
的一种常用的方式。
按键和键盘能实现向嵌入式系统输入数据、传输命令等功能,是人工干
预、设置和控制系统运行的主要手段。
9.2.1简单的按键输入硬件接口与分析
键盘是由一组按键组合构成的,所以我们先讨论简单的单个按键的输入。
图9-2是简单按键输入接口硬件连接电路图,图中单片机的三个I/O口PC7、PC6、PC5
作为输入口(输入方式),分别与K3、K2、K1三个按键连接。
其中K2是标准的连接方式,
当没有按下K2时,PC6的输入为高电平,按下K2输入为低电平。
PC6引脚上的电平值反映
了按键的状态。
华东师范大学电子系马潮9-3
第9章键盘输入接口与状态机编程
按键K1是一种经济的接法,它充分利用了AVR单片机I/O口的内部上拉特点。
在K1
的连接中,除了把PC5定义为输入方式时(DDRC.5=0),同时设置PC5口的上拉电阻有效
(PORTC.5=1),这样当K1处在断开状态时,PC5引脚在内部上拉电阻的作用下为稳定的高电
平(如果上拉电阻无效,则PC5处在高阻输入态,PC5的输入易受到干扰,不稳定),按下
K1输入为低电平。
与K2连接方式比较,K1连接电路中省掉了一个外部上拉电阻,而在K2
的连接方法中,由于外部使用了上拉电阻,所以只要设置PC6口为输入方式即可,该口内部
的上拉电阻有效与否则不必考虑了。
电阻R1不仅起到上拉的作用,还有限流的作用,通常
在5K-50K之间。
而对于K3的连接方式,我们不提倡使用,因当K3按下闭合时,PC7口直接与Vcc接通
了,有可能会造成大的短路电流流过PC7引脚,从而把端口烧毁。
图9-2简单按键输入电路图
根据按键连接电路可知,按键状态的确认就是判别按键是否闭合,反映在输入口的电平
就是和按键相连的I/O引脚呈现出高电平或低电平。
如果输入高电平表示断开的话,那么低
电平则表示按键闭合,所以简单的讲,在程序中通过检测引脚电平的高低,便可确认按键是
否按下。
但对于实际的按键确认并不是象上面描述的那么简单。
首先要考虑的是按键消抖的问
题。
通常,按键的开关为机械弹性触点开关,它是利用机械触点接触和分离实现电路的通、
断。
由于机械触点的弹性作用,加上人们按键时的力度、方向的不同,按键开关从按下到接
触稳定要经过数毫秒的弹跳抖动,既在按下的几十毫秒时间里会连续产生多个脉冲。
释放按
键时,电路也不会一下断开,同样会产
生抖动(图9-3)。
这两次抖动的时间分
别为10-20ms左右,而按键的稳定闭合
期通常大于0.3-0.5秒。
因此,为了确
保MCU对一次按键动作只确认一次,在
确认按键是否闭合时,必须要进行消抖
处理。
否则,由于MCU软件执行的速度
很快,非常可能将抖动产生的多个脉冲
误认为多次的按键。
在第七章的例7.1
键按下
图9-3按键操作波形
中,采用了简单的中断输入按键接口,没有消抖动的功能,所以出现了按键输入控制不稳定
华东师范大学电子系马潮9-4
的现象。
基于AVR的单片嵌入式系统原理与实践应用
消除按键的抖动既可采用硬件方法,也可采用软件的方法。
使用硬件消抖的方式,需要
在按键连接的硬件设计上增加硬件消抖电路,如采用R-S触发器或RC积分电路等。
采用硬
件消抖方式增加了系统的成本,而利用软件方式消抖则是比较经济的做法,但增加了软件设
计的复杂性。
软件方式消抖的基本原理是在软件中对按键进行两次测试确认,既在第一次检测到按键
按下后,间隔10ms左右再次检测该按键是否按下,只有在两次都测到按键按下时才最终确
认有键按下,从而消除了抖动的影响。
在按键接口软件中,除了要考虑按键消抖外,一般还要判别按键的释放,只有检测到按
键释放以后,才能确定为一次完整的按键动作完成。
9.2.2基于状态机的按键输入软件接口设计
一般的教课书中给出的按键输入软件接口程序通常非常简单,在程序中一旦检测到按键
输入口为低电平时(图9-2),便采用(调用)软件延时程序延时10ms。
然后再次检测按键
输入口,如果还是低电平则表示按键按下,转入执行按键处理程序。
如果第二次检测按键输
入口为高电平,则放弃本次按键的检测,从新开始一次按键检测过程。
这种方式实现的按键
输入接口,作为基础学习和一些简单的系统中可以采用,但在多数的实际产品设计中,这种
按键输入软件的实现方法有很大的缺陷和不足。
上面所提到简单的按键检测处理方法,不仅是由于采用了软件延时而使的MCU的效率降
低,而且也不容易同系统中其它功能模块协调工作,系统的实时性也差。
另外,由于在不同
的产品系统中对按键功能的定义和使用方式也会不同,而且是多变的,加上在测试和处理按
键的同时,MCU还要同时处理其它的任务(如显示、计算、计时等),因此编写键盘和按键
接口的处理程序需要掌握有效的分析方法,具备较高的软件设计能力和程序编写的技巧。
读者可以先仔细观察一下实际产品中各种按键的功能和使用。
如一般的电子手表上只有
2-3个的按键,却要实现时间、日期、闹钟时间的设置和查看显示等多种功能,因此这些按
键是多功能(或复用)的,在不同的状态下,按键的功能也不同。
更典型的是手机的键盘,
就拿手机键盘上的数字键“2”来将,当手机用于打电话需要拨出电话号码时,按“2”键代
表数值“2”。
而使用手机发短信用于输入短信文字信息时(英文输入),第一次按下“2”键
为字母“A”,紧接着再次按下为字母“B”,连续短时间按下该键,它的输入代表的符号不同,
但在同一个位置,而稍微等待一段时间后,光标的位置就会右移,表示对最后输入字符的确
认。
因此,按键输入接口设计和实现的核心,更多的体现在软件接口处理程序的设计中。
下
面将以此为例,介绍有限状态机的分析设计原理,以及基于状态机思想进行程序设计的基本
方法与技巧。
一、有限状态机分析设计的基本原理
对于电子技术和电子工程类的读者,最先接触和使用到状态机应该是在数字逻辑电路课
程里,状态机的思想和分析方法被应用于时序逻辑电路设计。
其实,有限状态机(FSM)是
实时系统设计中的一种数学模型,是一种重要的、易于建立的、应用比较广泛的、以描述控
制特性为主的建模方法,它可以应用于从系统分析到设计(包括硬件、软件)的所有阶段。
很多实时系统,特别是实时控制系统,其整个系统的分析机制和功能与系统的状态有相
当大的关系。
有限状态机由有限的状态和相互之间的转移构成,在任何时候只能处于给定数
目的状态中的一个。
当接收到一个输入事件时,状态机产生一个输出,同时也可能伴随着状
态的转移。
一个简单的有限状态机在数学上可以描述为:
华东师范大学电子系马潮9-5
第9章键盘输入接口与状态机编程
(1)一个有限的系统状态的集合Si()k=
{S1
()()ktk,L,Sq()k}
其中(i=1,2,…,q)。
该式表示系统可能存(处)在的状态有q个,而在时刻Tk,
系统的状态为其中之一Si(唯一性)。
(2)一个有限的系统输入信号的集合Ij()k=
{I1
()()ktk,L,Im()k}
其中(j=1,2,…,m),表示系统共有m个输入信号。
该式表示在时刻Tk,系统的输
入信号为输入集合的全集或子集(集合性)。
(3)一个状态转移函数F:
S'()
+1=Si()×Ij()
i
状态转移函数也是一个状态函数,它表示对于时刻Tk,系统在某一状态Si下,相对给
定输入Ij后,FSM转入该函数产生的新状态,这个新状态就是系统在下一时刻(K+1)的状
态。
这个新的状态也是唯一确定的(唯一性)。
O
(S()=
(()
{OS
(()
OS
,O
(Si()k}
(4)一个有限的输出信号集合
lik
1
ik
2
ik
L
n
其中(l=1,2,…,n),表示系统共有n个输出信号。
该式表示对于在时刻Tk,系统
的状态为Si时,其输出信号为输出集合的全集或子集(集合性)。
这里需要注意的是,系统
的输出只与系统所处的状态有关。
(5)时间序列T={t0,t1,L,tk,tk+1,L}
在状态机中,时间序列也是非常重要的一个因素,从硬件的角度看,时间序列如同一个
触发脉冲序列或同步信号,而从软件的角度看,时间序列就是一个定时器。
状态机由时间序
列同步触发,定时检测输入,以及根据当前的状态输出相应的信号,并确定下一次系统状态
的转移。
在时间序列进入下一次触发时,系统的状态将根据前一次的状态和输入情况发生状
态的转移。
其次,作为时间序列本身也可能是一个系统的输入信号,影响到状态的改变,进
而也影响到系统的输出。
所以对于时间序列,正确分析和考虑选择合适的时间段的间隔也是
非常重要的。
间隔太短的话,对系统的速度、频率响应要求高,并且可能减低系统的效率;
间隔太长时,系统的实时性差,响应慢,还有可能造成外部输入信号的丢失。
一般情况下,
时间序列的时间间隔的选取,应稍微小于外部输入信号中变化最快的周期值。
通常主要有两种方法来建立有限状态机,一种是“状态转移图”,另一种是“状态转移
表”,分别用图形方式和表格方式建立有限状态机。
实时系统经常会应用在比较大型的系统
中,这时采用图形或表格方式对理解复杂的系统具有很大的帮助。
总的来说,有限状态机的优点在于简单易用,状态间的关系能够直观看到。
应用在实时
系统中时,便于对复杂系统进行分析。
下面将给出两个按键与显示相结合的应用设计实例,结合设计的例子,讨论如何使用有
限状态机进行系统的分析和设计,以及如何在软件中进行描述和实现。
二、基于状态机分析的简单按键设计
(一)
我们把单个按键作为一个简单的系统,根据状态机的原理对其动作和确认的过程进行分
析,并用状态图表示出来,然后根据状态图编写出按键接口程序。
把单个按键看成是一个状态机话,首先需要对一次按键操作和确认的实际过程进行分
析,根据实际的情况和系统的需要确定按键在整个过程的状态,每个状态的输入信号和输出
信号,以及状态之间的转换关系。
最后还要考虑时间序列的间隔。
采用状态机对一个系统进行分析是一项非常细致的工作,它实际上是建立在对真实系统
有了全面深入的了解和认识的基础之上,进行综合和抽象化的模型建立的过程。
这个模型必
华东师范大学电子系马潮9-6
基于AVR的单片嵌入式系统原理与实践应用
须与真实的系统相吻合,既能正确和全面的对系统进行描述,也能够适合使用软件或硬件方
式来实现。
在一个嵌入式系统中,按键的操作是随机的,因此系统软件对按键需要一直循环查询。
由于按键的检测过程需要进行消抖处理,因此取状态机的时间序列的周期为10ms左右,这
样不仅可以跳过按键抖动的影响,同时也远小于按键0.3-0.5秒的稳定闭合期(图9-3),
不会将按键操作过程丢失。
很明显,系统的输入信号是与按键连接的I/O口电平,“1”表示
按键处于开放状态,“0”表示按键处于闭合状态(图9-2)。
而系统的输出信号则表示检测
和确认到一次按键的闭合操作,用“1”表示。
无按键
0
1/0
1/0
0/0(消抖)
1/0(干扰)
有按键
1
0/0
等释放
2
0/1(确认)
图9-4简单按键状态机的状态转换图
图9-4给出了一个简单按键状态机的状态转换图。
在图中,将一次按键完整的操作过程
分解为3个状态,采用时间序列周期为10ms。
下面对该图做进一步的分析和说明,并根据
状态图给出软件的实现方法。
首先,读者要充分体会时间序列的作用。
在这个系统中,采用的时间序列周期为10ms,
它意味着,每隔10ms检测一次按键的输入信号,并输出一次按键的确认信号,同时按键的
状态也发生一次转换。
图中“状态0”为按键的初始状态,当按键输入为“1”时,表示按键处于开放,输出
“0”(1/0),下一状态仍旧为“状态0”。
当按键输入为“0”,表示按键闭合,但输出还是
“0”(0/0)(没有经过消抖,不能确认按键真正按下),下一状态进入“状态1”。
“状态1”为按键闭合确认状态,它表示了在10ms前按键为闭合的,因此当再次检测
到按键输入为“0”时,可以确认按键被按下了(经过10ms的消抖),输出“1”表示确认按
键闭合(0/1),下一状态进入“状态2”。
而当再次检测到按键的输入为“1”时,表示按键
可能处在抖动干扰,输出为“0”(1/0),下一状态返回到“状态0”。
这样,利用状态1,实
现了按键的消抖处理。
“状态2”为等待按键释放状态,因为只有等按键释放后,一次完整的按键操作过程才
算完成。
从对图9-4的分析中可以知道,在一次按键操作的整个过程,按键的状态是从“状态0”
->“状态1”->“状态2”,最后返回到“状态0”的。
并且在整个过程中,按键的输出信号
仅在“状态1”时给出了唯一的一次确认按键闭合的信号“1”(其它状态均输出“0”)。
所
以上面状态机所表示的按键系统,不仅克服了按键抖动的问题,同时也确保在一次按键整个
的过程中,系统只输出一次按键闭合信号(“1”)。
换句话讲,不管按键被按下的时间保持多
华东师范大学电子系马潮9-7
第9章键盘输入接口与状态机编程
长,在这个按键的整个过程中都只给出了一次确认的输出,因此在这个设计中,按键没有“连
发”功能,它是一个最简单和基本的按键。
一旦有了正确的状态转换图,就可以根据状态转换图编写软件了。
在软件中实现状态机
的方法和程序结构通常使用多分支结构(IF-ELSEIF-ELSE、CA