第一篇:51单片机中断学习
51单片机中断学习
一、中断的概念
CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生);CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务);
待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断
二、中断源
在51单片机中有5个中断源
中断号优先级中断源中断入口地址
01(最高)外部中断00003H12定时器0000BH
23外部中断10013H
34定时器10018H
45串口总段0023H
三、中断寄存器
单片机有10个寄存器主要与中断程序的书写控制有关
1.中断允许控制寄存器IE
2.定时器控制寄存器TCON
3.串口控制寄存器SCON
4.中断优先控制寄存器IP
5.定时器工作方式控制寄存器TMOD
6.定时器初值赋予寄存器(TH0/TH1,TL0/TL1)T
第二篇:单片机外部中断实验报告
实验三 外部中断
实验报告
班级:
学号:
姓名:
教师:
一、实验目的 1、掌握单片机外部中断的原理及过程。
2、掌握单片机外部中断程序的设计方法。
3、掌握单片机外部中断时中断方式的选择方法。
二、实验内容 如下图所示,P3.2 设为输入,P2 设为输出位,连有 8 个发光二极管 D1~D8。每当发生外部中断时,发光二极管以向下流水灯的方式点亮。分别选择边沿触发外部中断放是和电平触发外部中断方式两种。
三、编程提示 1、P3 口是 8 位准双向口,具有双重功能:
第一功能和 P1 口一样,作为输入输出口,也有字节操作和位操作两种方式,每一位可分别定义为输入或输出;第二功能定义如下 :
P3.0
RXD 串行输入口 P3.1
TXD 串行输出口
P3.2
INT0 外部中断 0 请求输入线 P3.3
INT1 外部中断 1 请求输入线 P3.4
T0 定时器/计数器 T0 外部计数器脉冲输入线 P3.5
T1 定时器/计数器 T1 外部计数器脉冲输入线 P3.6
WR 外部数据存贮器写脉冲输出线 P3.7
RD 外部数据存贮器读脉冲输出线
2、各中断服务程序入口地址:
外部中断 0
03H 定时器/计数器 T1 溢出中断
0BH 外部中断 1
13H
定时器/计数器
1BH 串行口中断
23H 3、外部中断的产生条件 中断允许寄存器 IE:
EA
ES ET1 EX1 ET0 EX0
(1)外部中断源允许中断(中断 0:EX0=1;中断 1:EX1=1)。
(2)CPU 开中断(EA=1)。
(3)外部中断方式 CPU 发出中断申请。
4、外部中断方式的选择 控制 TCON:
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 IT0 是选择文字则外部中断 0 请求(INT0)边沿触发方式或电平触发方式的控制位。前一方式 IT0=1,后一方式 IT0=0。
IT1 是选择外部中断 1 请求(INT1)为边沿触发方式或电平触发方式的控制位。前一方式IT1=1,后一方式 IT1=0。
当 8031 复位后,TCON 被清 0。
5、外部中断电路 负脉冲作为中断请求信号时,为了保证中断的唯一性,必须加上消除开关抖动的电路或
者去抖动延时程序,保证每次只产生单脉冲,构成边沿触发方式外部中断电路。边沿触发的最大优点在于不会丢失中断。只要中断请求负跳变的宽度大于 1 个机器周期,单片机就能够采样到中断请求信号,单片机将采样到的信号琐存到中断请求标志寄存器中,硬件自动置IE0 为 1,即使单片机暂时不响应,这个标志也不会丢失,只有在外部中断响应之后,硬件才将 IE0 清除。
低电平触发的外部中断与边沿触发的外部中断,其中断过程基本相似。唯一不同在于中断请求信号的保持与撤消。在边沿触发中,单片机 TCON 寄存器专门有一位作它的请求标志,当负跳变后,单片机将中断请求标志 IE1(INT1 中断为 IE1,INT0 中断为 IE0)自动置1,由 IE1 请求中断,在响应中断时,又由单片机自动清除 IE1。但是对于电平触发方式,单片机中没有专门的请求标志,响应中断时也不能自动清除请求信号。在实际应用中,常常是在单片机外增加一个触发器作为中断请求标志,当中断请求发生时置触发器为 0,使 INT1为低电平,在单片机响应这个中断后,利用软件(占用另一根 I/O 线,例如 P3.1)发出复位脉冲,使该触发器置 1,撤消中断请求。这种电路使请求中断的低电平能够保持足够的时间,一直到中断发生为止,因而不会丢失中断请求。低电平的时间又不致太长,只要进入中断服务程序,在返回之前,就撤消请求信号,因而也不会产生多余的中断动作。
四、实验器材 仿真器、目标系统实验板、直流电源
五、实验步骤 1、边沿触发式外部中断 0 实验(1)
P3.2 设为边沿触发方式,连接外部复位开关,编程使每次中断流水灯向下移位一次,中断程序中不延时去抖动,观察结果。
(2)P3.2 设为边沿触发方式,连接外部复位开关,编程使每次中断流水灯向下移位一次,中断程序中采用延时去抖动,观察结果。
(3)P3.3 设为边沿触发方式,连接外部 RS 触发器硬件去抖动的开关,编程使每次中断流水灯向下移位一次,中断程序中不延时去抖动,观察结果。
2、电平触发式外部中断实验 P3.3 设为电平触发方式,连接外部 RS 触发器硬件去抖动的开关,编程使每次中断流水灯向下移位一次,中断程序中不延时去抖动,观察结果。
六、C C 源程序清单
#include
#define uchar unsigned char
uchar i=0;uchar
numi[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};void delay(uchar k);
void main(){
EA=1;
EX0=1;
IT0=1;
while(1)
{
if(EX0==0)
{
//delay(100);
IE0=0;
EX0=1;
}
} } void int0()interrupt 0
{
EX0=0;
P2=~numi[i];
i++;
if(i>8)
{
i=0;
} } void delay(uchar k){
uchar x,y,z;
for(x=k;x>0;x--)
for(y=20;y>0;y--)
for(z=250;z>0;z--);}
七、总结
1、边沿触发和电平触发两种方式中断响应的原理与区别 边沿触发:当从高至低电平或从低至高电平转变时,触发产生;电平保持多久都只产生一次。所以,边沿触发适合与以负脉冲形式输入的外部中断请求。
电平触发:那么在电平时间内中断一直有效;因此如果在电平没有恢复之前中断程序就已经执行完成从而退出,那么会在退出后又再次进入中断;但只要中断没有退出是不会重复触发的。所以,电平触发方式适合于外部中断以电平输入而且中断服务能清除外部中断源的情况。
2、实验现象 1、(1)实验现象是,按键一次就会跳过几个灯,也就是说按键一次并不是向后移一位而是好几位,这是因为按键没有去抖动,所以会进入多次中断导致。
1、(2)按键一次,灯就向下移一位,这是通过软件去抖动之后,按键按下后延时一段时间,再来判断中断有没有打开,所以按键一次只进入一次中断。
1、(3)按键一次,灯就向下移一位,虽然没有用按键去抖动,但是这个键在硬件上已经去抖,所以按键一次也是只进入一次中断程序,所以会有这种现象。
2、(1)由于是电平触发,所以在按下按键的时候,会有好多灯一起亮,比如低电平,在低电平这段时间里,会不断地请求中断,所以就会进入很多次中断,在加上请求中断的速度快和 LED 灯有一定的的余晖,所以肉眼看起来就好像灯全是亮的。
第三篇:关于51系列单片机中断嵌套
说最基本的,老的51单片机(80C51系列)有5个中断源,2个优先级,可以实现二级中断服务嵌套。现在很多扩展的51单片机已经有4个优先级(或更多)和更多的中断源了。
在说到中断之前,我先来定义一下优先级,明白了什么是优先级,后面的阐述就容易明白了。实际上很多人都是混淆了优先级的含义,所以才觉得糊里糊涂。
中断的优先级有两个:查询优先级和执行优先级。
什么是查询优级呢?我们从datasheet或书上看到的默认(IP寄存器不做设置,上电复位后为00H)的优先级:
外部中断0 > 定时/计数器0 > 外部中断1 > 定时/计数器1 > 串行中断 或 int0,timer0,int1,timer1,serial port 或 INT0、T0、INT1、T1、UART 或 PX0>PT0>PX1>PT1>PS>......其实都是查询优级。首先查询优先级是不可以更改和设置的。这是一个中断优先权排队的问题。是指多个中断源同时产生中断信号时,中断仲裁器选择对哪个中断源优先处理的顺序。而这与是否发生中断服务程序的嵌套毫不相干。当CPU查询各个中断标志位的时候,会依照上述5个查询优先级顺序依次查询,当数个中断同时请求的时候,会优先查询到高优查询先级的中断标志位,但并不代表高查询优先级的中断可以打断已经并且正在执行的低查询优先级的中断服务。
例如:当计数器0中断和外部中断1(按查询优先级,计数器0中断>外部中断1)同时到达时,会进入计时器0的中断服务函数;但是在外部中断1的中断服务函数正在服务的情况下,这时候任何中断都是打断不了它的,包括逻辑优先级比它高的外部中断0计数器0中断。
而中断的执行优先级就是你对IP寄存器的设置了。在2个优先级的情况下,某位为1,则相应的中断源为高优先级;为0,则为低优先级。
关于中断的优先级有三条原则:
1、CPU同时接收到几个中断时,首先响应优先级最高的中断请求;
2、正在进行的中断过程不能被新的同级或低行优优先级的中断请求所中断;
3、正在进行的低行优优先级中断服务,能被高行优优先级中断请求中断;
若:同一执行优先级中的中断申请不止一个时,则有一个中断优先权排队问题。同一执行优先级的中断优先权排队,由中断系统硬件确定的自然优先级形成,优先权自高到低的顺序即: 外部中断0>定时/计数0>外部中断1>定时/计数1>串行接口
例如:设置IP = 0x10,即设置串口中断为最高优先级,则串口中断可以打断任何其他的中断服务函数实现嵌套,且只有串口中断能打断其他中断的服务函数。若串口中断没有触发,则其他几个中断之间还是保持逻辑优先级,相互之间无法嵌套。
关于中断嵌套。可以这样说,当一个中断正在执行的时候,如果事先设置了中断优先级寄存器IP,那么当一个更高优先级的中断到来的时候会发生中断嵌套,如果没有设置则不会发
生任何嵌套;如果有同一个优先级的中断触发,它并不是在“不断的申请”,而是将它相应的中断标志位置即IE寄存器的某位置位,当CPU执行完当前中断之后,按照查询优先级重新去查询各个中断标志位,进入相应中断。
要记住,没有设置IP时,单片机会按照查询优先级(或都说逻辑优先级)来排队进入服务。如果要想让某个中断优先响应,则要设置IP,更改执行优先级(或者说物理优先级)。要注意的是,当设置了IP后,当低执行优先级中断在运行时,如果有高执行优先级的中断产生,则会嵌套调用进入高执行优先级的中断。如果你是用C语言写的程序,并在中断服务时 using 了寄存组,要注意,两个不同执行优先级的中断服务程序不要 using 同一组寄存器。
看两个问题,如下: 在各个中断都是低优先级的时候,如果定时器0的溢出进入中断。在这个中断处理的过程中,外部中断0也被触发了,那么是不是要发生中断嵌套? 如果定时器0发生中断的时候,进入中断处理程序,这个时候外部中断1条件触发条件满足了。因为定时器0自然优先级比外部中断1高,那么定时器0的中断处理程序继续执行。假设定时器中断处理程序执行的过程中,外部中断1的触发。条件消失了,那么等定时器0的中断处理完后,程序还是会进入外部中断1处理程序吗?
答案1:在IP事先设置了外部中断0的优先级的情况下,CUP会中止定时器0的中断服务,进入外部中断0服务程序,执行完以后再回到定时器0中断服务程序。否则不会。
答案2:肯定会进入中断的;外部中断1的触发条件满足后会置位外部1的中断标志,即使后来外部中断1的触发条件消失了,也不会清除已置位的中断标志,所以等定时器0的中断处理完后,程序判断外部中断的中断标志为1后依然会进入外部中断1处理程序的,只有在外部中断1处理程序中执行reti指令才会硬件清除外部中断1的中断标志(这也正是为什么中断返回使用reti指令而不可以用ret替换的原因)...
第四篇:单片机学习
培训总结
为期二十五天的单片机培训今天就要告一个段落了,回想起来,还有点舍不得。从第一天进来,看见单片机时的好奇及茫然,到之后的点滴学习的辛酸和喜悦:点亮第一个放光二极管,接通第一个七段数码管,用蜂鸣器发出近乎噪声的音乐……当时的无数次尝试,无数次失败,在现在看来都是那么的美好。
第一次进实验室时,看见满桌的实验仪器,心中竟漫上一丝丝的喜悦。对于从小就喜欢乱拆小电器的我,如果能掌握这些神秘仪器的用法,真是再好不过的事情了,真希望老师立马就教会我们这些东西。然后老师给我们讲我们暑假培训的目地就是学会单片机——一块拥有神秘芯片和器件的绿色板子。然后就是正式的培训上课了。
每天早上六七点起床,匆匆吃过早饭就得搭公交车往南区赶。一个小时的公交车奔波对于有点晕车的我可是个不小的挑战。下了车有点头晕,还没有回过神来,就和同学一起走进实验室了。晚上九点下课之后又得挤公交回去,十一二点才能睡觉。这样一两天之后觉得很累很累。想着得这样奔波一个月,真有点害怕,不知道自己能不能坚持下来。但我一直坚信这样做是值得的,因为在这边有我喜欢的东西。每天我都能学到新的东西,每天我都能更进一步掌握单片机的用法,每天我都能更加熟练地使用前段时间学到的东西。看视频,认真学里面老师的方法,理解他讲解的每一个器件的原理,跟着他编程驱动自己的单片机;问老师,把自己的想法告诉老师,让老师给我讲解在学习单片机时的困惑;和同学交流,一起交流学习的心得和自己的收获,相互关心相互帮助。随着时间的过去,大家都在进步,人数好像也越来越少。从进来的第一天老师就告诉我们要学会坚持,因为每天重复的生活,总会让人产生厌倦,而很多同学就是受不了这样的生活而选择了中途放弃。虽然我也想回家想摆脱这样的繁累,但还是选择了留下来,因为我知道,这里有我喜欢的东西。就这样日子一天天地过去直到今天,看着自己编的那么多程序,自己关于单片机的认识和掌握,真的很庆幸自己选择了留下来而没有中途退出。
这个培训让我真正有了一个不一样的暑假,不仅仅学会了单片机,更学会了坚持。我发现我原来对电子方面有这么大的兴趣,真的很庆幸这个培训给了我这个机会,我想我会沿着这个继续坚持下去。
第五篇:有关51单片机中断的形式和C语言编程格式
有关51单片机中断的形式和C语言编程格式
void INT0()interrupt 0 using 1 {.........} interrupt 0 指明是外部中断0; interrupt 1 指明是定时器中断0; interrupt 2 指明是外部中断1; interrupt 3 指明是定时器中断1; interrupt 4 指明是串行口中断;
using 0 是第0组寄存器; using 1 是第1组寄存器; using 2 是第2组寄存器; using 3 是第3组寄存器;
例如:
/*-----------------
外部中断程序-----------------*/ void ISR_Key(void)interrupt 0 using 1 { P1=~P1;
//s3按下触发一次,P1取反一次 }
/*-----------------
串口中断程序-----------------*/ void UART_SER(void)interrupt 4 //串行中断服务程序 {
unsigned char Temp;
//定义临时变量
if(RI)
//判断是接收中断产生
{
RI=0;
//标志位清零
Temp=SBUF;
//读入缓冲区的值
P1=Temp;
//把值输出到P1口,用于观察
SBUF=Temp;
//把接收到的值再发回电脑端
}
if(TI)
//如果是发送标志位,清零
TI=0;}