C<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />8051F学习笔记:中断<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
人与机器的人机接口离不开按键,而在单片机中使用按键,程序设计可以采用查询或中断两种方式。在查询方式中,需要程序中不停地查询单片机端口的状态,这样会大量占用单片机的运行时间,使其他程序的运行受到限制。在大部分的实际应用中,键盘不是每时每刻都在用的,所以没必要一直查询按键所在端口状态。
在单片机系统中,较多使用中断键盘,即单片机平时不用查询按键状态,而在按键按下后产生中断,在中断程序中中判断哪个按键被按下。
具体电路图如下:
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />
J17的1脚和2脚相连,P0.4配置为INT0,上拉(Push-Pull),所以在没输入的时候,P0.4的状态为高电平。在没有按键按下的时候,A、B、C、D点都为高电平,二极管D8、D7、D6、D5截止。SW1按键按下,A点变为高电平,因为E点原为高电平,二极管D8导通,E点变为低电平。但此时B点、C点、D点还是高电平,由于二极管的正向导通性,D7、D6、D5截止,B点、C点、D点的高电平不会被拉低,INT0低电平触发中断,在中断程序中查询A、B、C、D点的状态,因此能唯一确认SW1的状态。
这里要注意的是二极管D8、D7、D6、D5的选用,因为有按键按下后,E点的电压不是0,而是二极管的正向压降VF,如果这个值大于单片机输入低电平最大值(0.8V)的话,而然这个值肯定小于单片机输入高电平的最小值(2V),就可能会引起I/O状态值的误判。C8051F320端口I/O直流特性和极限如下:
在极限参数表中可以看到,C8051F的极限输入灌电流最大值为100mA。
实验中选用二极管IN4001,从IN4001的DataSheet中可以知道它的正向压降VF为1V(IF=1A),要注意,这个正向压降1V的值是有条件的,就是正向电流为1A的情况下才为1V。显然C8051F的输入漏电流只能为50uA。这就需要查IN4001手册中正向电流与正向压降的关系图:IF=100mA时,VF<0.8V。实际测得为780mV,小于C8051F的低电平输入最小值,能判定为低电平(逻辑0)。
IN4001二极管IF VS VF
因为单片机的输入电流不可能太大,因此几乎所有二极管都符合要求。不过还是选用VF小的二极管(如肖特基二极管VF<0.3V)。
(1) 选择中断源
C8051F除了有传统51单片机所有的中断源(外部中断1、定时器/计数器0、外部中断1、定时器/计数器1、串行口中断)外,还包含一个扩展的中断源,一共16个中断源。
16个中断有一个总开关(EA)和每一个中断都有各自的开关,可以在中断初始化程序中打开(允许),也可以在主程序中要用到相关中断的时候才打开。
(2) 设置优先级
每个中断都只有两个优先级:低优先级或高优先级。低优先级的中断服务程序可以被高优先级中断所中断,但高优先级的中断不能被中断。如果两个中断的优先级相同,则由固定的优先级顺序(上图)决定哪一个中断先得到服务。
(3) 配置中断管脚
/INT0和/INT1所使用的管脚可以从P0.0~P0.7中选一个,要注意的是,/INT0和/INT1端口分配与交叉开关的设置无关,就是说既可以在交叉开关设置中设置相应管脚为某一功能,也能设置该管脚为外部中断,可以分时使用,使用某一功能时,关闭中断;作为外中断时,禁止某一功能,而打开中断。我觉得这样的话很容易导致中断误触发,所以最好的办法是在交叉开关跳过这个选择为外中断的管脚。
传统单片机都是低电平或负跳变有效,而C8051F单片机两个外部中断/INT0和/INT1可被设置为低电平有效或高电平有效,边沿触发或电平触发。
要注意的是,在C8051F的配置软件Configuration Wizard 2里外中断是不能选择电平触发还是边沿触发的,所以需要自己在程序中写TCON的IT0和IT1,默认为0(电平触发。)
//如果是下降沿触发,那么中断程序只执行一次
//如果是低电平触发,那么中断程序先执行一次,接着判断INT0是否还为低电平,是,再执行,直到变为高电平
(4) 写中断程序
格式:
返回值 函数名([参数]) interrupt n [using m]
如:void INT0_Interrupt (void) interrupt 0 using 0
n对应中断源的编号,为0~15的常整数,不允许使用表达式
m对应寄存器组号,为0~3的常整数,除非可以确认未使用R0~R7(用汇编程序),最好给每种优先级程序分配不同的寄存器组。[using m]可以省略,由编译器自动分配寄存器组供中断程序用。(也就是说最多使用三个寄存器组,程序中用一组,高优先级中断用一组,低优先级中断用一组)。
C8051F320按键查询程序:https://static.assets-stash.eet-china.com/album/old-resources/2010/4/11/54b2d3f0-69be-493b-9be2-7d54390d24a2.rar
C8051F320按键中断程序:https://static.assets-stash.eet-china.com/album/old-resources/2010/4/11/f7b1bd87-8061-4384-89aa-360d61e34ed1.rar
参考资料:
1) 键盘中断实验
http://www.doc88.com/p-5520242231.html
2) 单片机系统键盘的设计小结-----程序匠人
http://cxjr.21ic.org/user1/349/archives/2007/34901.html
3) 请问51单片机(8052)电源输入电流有何要求或限制?
文章评论(0条评论)
登录后参与讨论