- 1、本文档共72页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
中断与定时器; 中断概念;引起CPU中断的根源,称为中断源。中断源向CPU提出的中断请求。CPU暂时中断原来的事务A,转去处理事件B。对事件B处理完毕后,再回到原来被中断的地方(即断点),称为中断返回。实现上述中断功能的部件称为中断系统(中断机构)。; 随着计算机技术的应用,人们发现中断技术不仅解决了快速主机与慢速I/O设备的数据传送问题,而且还具有如下优点:;1、8051中断系统的结构
8051的中断系统有5个中断源(8052有 6个,还有第三个定时/计数器中断) ,2个优先级,可实现二级中断嵌套 。; 外部中断0
(P3.2)可由IT0(TCON.0)选择其为低电平有效还是下降沿有效。当CPU检测到P3.2引脚上出现有效的中断信号时,中断标志IE0(TCON.1)置1,向CPU申请中断。
;2、8051请求标志
TCON的中断标志;SCON的中断标志;中断允许控制
CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制的。;中断优先级控制
8051单片机有两个中断优先级,即可实现二级中断服务嵌套。每个中断源的中断优先级都是由中断优先级寄存器IP中的相应位的状态来规定的 。;PX0(IPH.0),外部中断0优先级设定位;
PT0(IPH.1),定时/计数器T0优先级设定位;
PX1(IPH.2),外部中断1优先级设定位;
PT1(IPH.3),定时/计数器T1优先级设定位;
PS (IPH.4),串行口优先级设定位;
PT2 (IPH.5) ,定时/计数器T2优先级设定位。; 同一优先级中的中断申请不止一个时,则有中断优先权排队问题。同一优先级的中断优先权排队,由中断系统硬件确定的自然优先级形成,其排列如所示:;例:设置52单片机的4个中断源,使它们的优顺序为T1,INT1,INT0,T0.;8051单片机的中断优先级有三条原则:;4、8051单片机中断应用;中断子程序
格式为:
void 中断子程序名称(void) interrupt 中断编号 using 寄存器组
;#include reg51.h
#define LED P1
void delay1ms(int);
void left(int);
main()
{ IE=0x81;
LED=0x00;
while(1)
{ delay1ms(250);
LED=~LED;
}
}
void my_int0(void) interrupt 0
{ unsigned saveLED=LED;
left(3);
LED=saveLED;
};b.外部中断INT1
如图,P0直接驱动共阳极七段数码管,INT1接上拉电阻和对地按钮。
主程序执行时,数码管从0到9循环,每0.5S增加1。进入中断后,数码管从9到0,一圈后结束。;#include reg51.h
#defineSEG P0
void delay1ms(int);
Unsigned char code TAB[]={0xc0,…,0x98};
main()
{ int I;
IE=0x84;
while(1)
{ for(i=0;i10;i++)
{ SEG=TAB[i];
delay1ms(500);
}
}
};c.两个外部中断
如图,P1接8个LED,INT0和INT1接上拉电阻和对地按钮。
主程序执行时,P1所接的LED闪烁。按下INT0按钮,进入外部中断0服务,8个LED单灯左移,左移三圈后回主程序;按下INT1按钮,进入外部中断1服务,8个LED单灯右移,三圈后回主程序。此外,要求INT0的优先级高于INT1。;#include reg51.h
#define LED P1
void delay1ms(int);
void left(int);
void right(int);
main()
{ IE=0x85;
LED=0x00;
while(1)
{ delay1ms(250);
LED=~LED;
}
}
void my_int0(void) interrupt 0
{ unsigned saveLED=LED;
left(3);
LED=saveLED;
};void left(int x)
{ int i,j;
for(i=0;i3;i++)
{ LED=0xf
文档评论(0)