原创 C8051F学习笔记:中断

2010-4-11 00:20 8782 11 11 分类: MCU/ 嵌入式

                                  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" />


 


点击看大图


 


        J171脚和2脚相连,P0.4配置为INT0,上拉(Push-Pull),所以在没输入的时候,P0.4的状态为高电平。在没有按键按下的时候,ABCD点都为高电平,二极管D8D7D6D5截止。SW1按键按下,A点变为高电平,因为E点原为高电平,二极管D8导通,E点变为低电平。但此时B点、C点、D点还是高电平,由于二极管的正向导通性,D7D6D5截止,B点、C点、D点的高电平不会被拉低,INT0低电平触发中断,在中断程序中查询ABCD点的状态,因此能唯一确认SW1的状态。


这里要注意的是二极管D8D7D6D5的选用,因为有按键按下后,E点的电压不是0,而是二极管的正向压降VF,如果这个值大于单片机输入低电平最大值(0.8V)的话,而然这个值肯定小于单片机输入高电平的最小值(2V),就可能会引起I/O状态值的误判。C8051F320端口I/O直流特性和极限如下:


 



点击看大图


 


点击看大图


 


 在极限参数表中可以看到,C8051F的极限输入灌电流最大值为100mA


 


         实验中选用二极管IN4001,从IN4001DataSheet中可以知道它的正向压降VF1VIF=1A),要注意,这个正向压降1V的值是有条件的,就是正向电流为1A的情况下才为1V。显然C8051F的输入漏电流只能为50uA。这就需要查IN4001手册中正向电流与正向压降的关系图:IF=100mA时,VF<0.8V。实际测得为780mV,小于C8051F的低电平输入最小值,能判定为低电平(逻辑0)。



 


e199f164-a03a-4368-93f2-a6c99977bc83.JPG


IN4001二极管IF VS VF


     


因为单片机的输入电流不可能太大,因此几乎所有二极管都符合要求。不过还是选用VF小的二极管(如肖特基二极管VF<0.3V


 


(1) 选择中断源


      C8051F除了有传统51单片机所有的中断源(外部中断1、定时器/计数器0、外部中断1、定时器/计数器1、串行口中断)外,还包含一个扩展的中断源,一共16个中断源。



 


3ba71514-5189-491f-919d-03412ad3d02d.JPG 


 


b433ca94-1e8d-454f-b306-fce1e8ccad47.JPG


 

       16个中断有一个总开关(EA)和每一个中断都有各自的开关,可以在中断初始化程序中打开(允许),也可以在主程序中要用到相关中断的时候才打开。


 


(2) 设置优先级


每个中断都只有两个优先级:低优先级或高优先级。低优先级的中断服务程序可以被高优先级中断所中断,但高优先级的中断不能被中断。如果两个中断的优先级相同,则由固定的优先级顺序(上图)决定哪一个中断先得到服务。



 

12b62f7f-0bf5-4edb-98e9-3607985c902b.JPG


 


(3) 配置中断管脚


/INT0/INT1所使用的管脚可以从P0.0~P0.7中选一个,要注意的是,/INT0/INT1端口分配与交叉开关的设置无关,就是说既可以在交叉开关设置中设置相应管脚为某一功能,也能设置该管脚为外部中断,可以分时使用,使用某一功能时,关闭中断;作为外中断时,禁止某一功能,而打开中断。我觉得这样的话很容易导致中断误触发,所以最好的办法是在交叉开关跳过这个选择为外中断的管脚。




 

d07b5f67-f96b-41de-855c-e60cd0a3bf7d.JPG


 

点击看大图


 


传统单片机都是低电平或负跳变有效,而C8051F单片机两个外部中断/INT0/INT1可被设置为低电平有效或高电平有效,边沿触发或电平触发。



 

点击看大图


 


要注意的是,在C8051F的配置软件Configuration Wizard 2里外中断是不能选择电平触发还是边沿触发的,所以需要自己在程序中写TCONIT0IT1,默认为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)电源输入电流有何要求或限制?


http://zhidao.baidu.com/question/34893400.html

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
11
关闭 站长推荐上一条 /3 下一条