‘壹’ 单片机程序PT0=1 PT1=1同时设置,谁优先级最高
在优先级设置一样的情况下,中断按高到低的顺序如下,
外部中断0;
定时中断0
外部中断1
定时中断1
串口中断。
‘贰’ 在51单片机的优先级设置中,若将定时器0中断位(PT0)置1,但只是触发了其它中断会出现抢占现象吗
你将PT1设为1的意思是当定时器1与其他中断同时触发时,单片机先处理定时器1的程序
‘叁’ xs128单片机接口PT0,PP0都是IOC0,单片机是如何识别的
在IO口的初始化里,要配置成指定的模式的。
‘肆’ 单片机中两个单独运行的程序如何分优先级
中断优先级有两种,一种是抢占优先级,一种是固有优先级,先介绍抢占优先级。
抢占优先级IP这个寄存器的每一位,表示对应中断的抢占优先级,每一位的复位值都是 0,当我们把某一位设置为 1 的时候,这一位的优先级就比其它位的优先级高了。比如我们设置了 PT0位为 1 后,当单片机在主循环或者任何其它中断程序中执行时,一旦定时器 T0 发生中断,作为更高的优先级,程序马上就会跑到 T0 的中断程序中来执行。 反过来,当单片机正在 T0中断程序中执行时, 如果有其它中断发生了,还是会继续执行 T0 中断程序,直到把 T0 中的中断程序执行完毕以后, 才会去执行其它中断程序。 当进入低优先级中断中执行时, 如又发生了高优先级的中断, 则立刻进入高优先级中断执行,处理完高优先级级中断后, 再返回处理低优先级中断, 这个过程就叫做中断嵌套,也称为抢占。 所以抢占优先级的概念就是, 优先级高的中断可以打断优先级低的中断的执行,从而形成嵌套。 当然反过来,优先级低的中断是不能打断优先级高的中断的。
既然有抢占优先级,自然就也有非抢占优先级了,也称为固有优先级。请注意,在中断优先级的编号中,一般都是数字越小优先级越高。 从表中可以看到一共有 1~6 共 6 级的优先级,这里的优先级与抢占优先级的一个不同点就是,它不具有抢占的特性,也就是说即使在低优先级中断执行过程中又发生了高优先级的中断,那么这个高优先级的中断也只能等到低优先级中断执行完后才能得到响应。
‘伍’ 简述单片机89c51中断的自然优先级顺序,如何提高某一中断源的优先级别
1、INT0——外部中断0,由P3.2端口引入,低电平或下降沿引起。默认优先级最高
2、INT1——外部中断1,由P3.3端口引入,低电平或下降沿引起。默认优先级第二
3、T0——定时器/计数器0中断,由T0计数器计满回零引起。默认优先级第三
4、T1——定时器/计数器1中断,由T1计数器计满回零引起。默认优先级第四
5、T2——定时器/计数器2中断,由T2计数器计满回零引起。默认优先级第五
优先级设定:
PX0(IP.0),外部中断0优先级设定位;
PT0(IP.1),定时/计数器T0优先级设定位;
PX1(IP.2),外部中断0优先级设定位;
PT1(IP.3),定时/计数器T1优先级设定位;
PS(IP.4),串行口优先级设定位;
‘陆’ 单片机中有PT0吗什么意思
有的,51单片机中PT0是设置定时器T0为高优先级的控制位,1时为高优先级,0时为低优先级。
‘柒’ 将单片机的外部中断1、定时器中断0打开,要求定时器0的中断优先级高于外部中断1,外部中断1采用边沿
关于中断的优先级有一下原则:
1、CPU同时接收到几个中断时,首先响应优先级最高的中断请求,低优先的进入队列等待;
2、正在进行的中断过程不能被新的同级或低优先级的中断请求所中断;
3、正在进行的低优先级中断服务,能被高优先级中断请求中断;
那么,IP寄存器的某一中断配置为1就成为高优先级。每一个中断在IP里面只占一位配置位(IP.x=0或OP.x=1),也就是说系统里只存在两种优先级,要么是高优先级,要么是低优先级。
如果,任何中断都不配置IP寄存器的优先级,也等同于系统上电时,默认的优先级顺序如下:
外部中断0 > 定时/计数器0 > 外部中断1 > 定时/计数器1 > 串行中断
关于外部中断的寄存器已经了解清楚了,接下来看代码设计:
外部中断0(下降沿触发)
/*-----------------------------------------------
功能:外部中断0边沿触发
现象:首先将P3.2口通过上拉电阻接到电源,保证在空闲时P3.2处于高电平;
当外部中断信号输出口P3.2接到GND时,产生了一个下降沿信号,接到P0.0
口的LED灯反转;若此后P3.2持续接到GND,LED只反转一次,这与电平触发
有区别。
------------------------------------------------*/
#include
sbit LED=P0^0; //定义LED端口
void DelayMs(unsigned char t) //大致延时1mS
{
unsigned short T=500;
while(t--)
{
while(--T);
}
}
void INT0_init(void) //外部中断0初始化
{
LED=1; //LED口初始值
EA=1; //全局中断开
EX0=1; //外部中断0开
IT0=1; //边沿触发
}
main()
{
INT0_init();
while(1){
//主循环
}
}
//中断服务程序 interrupt 0 指明是外部中断0的中断函数
/*
interrupt 0 指明是外部中断0;
interrupt 1 指明是定时器中断0;
interrupt 2 指明是外部中断1;
interrupt 3 指明是定时器中断1;
interrupt 4 指明是串行口中断;
*/
void ISR_Key(void) interrupt 0 using 1
{
if(!INT0){
DelayMs(10); //防抖动
if(!INT0){
LED=!LED; //按下触发一次,LED取反一次
}
}
}
外部中断0(电平触发)
/*-----------------------------------------------
功能:外部中断0电平触发
现象:首先将P3.2口通过上拉电阻接到电源,保证在空闲时P3.2处于高电平;
当外部中断信号输出口P3.2接到GND时,产生了一个低电平信号,接到P0.0
口的LED灯反转;若此后P3.2持续接到GND,LED会反复反转,这与边沿触
发有区别。
------------------------------------------------*/
#include
sbit LED=P0^0; //定义LED端口
void DelayMs(unsigned char t) //大致延时1mS
{
unsigned short T=500;
while(t--)
{
while(--T);
}
}
void INT0_init(void) //外部中断0初始化
{
LED=1; //LED口初始值
EA=1; //全局中断开
EX0=1; //外部中断0开
IT0=0; //电平触发
}
main()
{
INT0_init();
while(1){
//主循环
}
}
//中断服务程序 interrupt 0 指明是外部中断0的中断函数
/*
interrupt 0 指明是外部中断0;
interrupt 1 指明是定时器中断0;
interrupt 2 指明是外部中断1;
interrupt 3 指明是定时器中断1;
interrupt 4 指明是串行口中断;
*/
void ISR_Key(void) interrupt 0 us
‘捌’ 51单片机超声波测距的问题
关键这个电路是硬件设计好就可以。做一个40khz的发射电路。。。用2051的一个io控制电源。。。动态扫描led显示
另外再做一个40khz的接收电路。。。二者频率对准。。。接收电路接收到发射信号的时候输出一个电压触发中断,先接通40khz发射电路的工作电压。。。单片机开始计时。。。等侍接收电路触发中断。当有中断。停止计时。。。
这个时间除以2再乘以超声波在空气中传播速度。应该就是等于你要测试的距离。。。
这是参考源代码,可能不全,仅作参考!
#include
#define
unit
unsigned
int
#define
uchar
unsigned
char
sbit
fs="p3"^0;
//发送端;
sbit
h="p3"^7;
sbit
l="p3"^5;
//数码管位选端;
sbit
m="p3"^4;
uchar
tab[16]=\{0x28,0xeb,0x32,0xa2,0xe1,0xa4,0x24,0xea,0x20,0xa0,0x60,0x25,0x3c,0x23,0x34,0x74};//段码;
uchar
u[3];
//显示数组;
unit
count,b;
void
delay(unit
a)
//延时;
\{
unit
m;
for(m=0;m
=300)
\{
b=(17*count)/1000;
u[0]=b%10;
u[1]=(b/10)%10;
u[2]=(b/100)%10;
display();
}
}
void
over()interrupt
1
//t0溢出为无效测量fff;
\{
u[0]=15;
u[1]=15;
u[2]=15;
display();
}
void
main()
\{
fs=0;
delay(8600);
th0=0;
tl0=0;
tmod=0x01;
tr0=1;
ea=1;
et0=1;
pt0=1;
tx();
it0=1;
ie=0x83;
}
‘玖’ 51单片机加速传感器抬手中断
外部中断请求源:即外中断0和1,经由外部管脚引入的,在单片机上有两个管脚,名称为INT0、INT1,也就是P3.2、P3.3这两个管脚。在内部的TCON中有四位是与外中断有关的。IT0:INT0触发方式控制位,可由软件进和置位和复位,IT0=0,INT0为低电平触发方式,IT0=1,INT0为负跳变触发方式。这两种方式的差异将在以后再谈。IE0:INT0中断请求标志位。当有外部的中断请求时,这位就会置1(这由硬件来完成),在CPU响应中断后,由硬件将IE0清0。IT1、IE1的用途和IT0、IE0相同。(2)内部中断请求源TF0:定时器T0的溢出中断标记,当T0计数产生溢出时,由硬件置位TF0。当CPU响应中断后,再由硬件将TF0清0。TF1:与TF0类似。TI、RI:串行口发送、接收中断,在串行口中再讲解。2、中断允许寄存器IE在MCS-51中断系统中,中断的允许或禁止是由片内可进行位寻址的8位中断允许寄存器IE来控制的。
其中EA是总开关,如果它等于0,则所有中断都不允许。ES-串行口中断允许ET1-定时器1中断允许EX1-外中断1中断允许。ET0-定时器0中断允许EX0-外中断0中断允许。如果我们要设置允许外中断1,定时器1中断允许,其它不允许,则IE能是EAX
即8CH,当然,我们也能用位操作指令
SETB EA
SETB ET1SETB EX1
来实现它。
3、五个中断源的自然优先级与中断服务入口地址外中断0:0003H定时器0:000BH外中断1:0013H定时器1:001BH串行口:0023H它们的自然优先级由高到低排列。写到这里,大家应当明白,为什么前面有一些程序一始我们这样写:
ORG 0000HLJMP START
ORG 0030H
START:。
这样写的目的,就是为了让出中断源所占用的向量地址。当然,在程序中没用中断时,直接从0000H开始写程序,在原理上并没有错,但在实际工作中最好不这样做。优先级:单片机采用了自然优先级和人工设置高、低优先级的策略,即能由程序员设定那些中断是高优先级、哪些中断是低优先级,由于只有两级,必有一些中断处于同一级别,处于同一级别的,就由自然优先级确定。
开机时,每个中断都处于低优先级,我们能用指令对优先级进行设置。看表2中断优先级中由中断优先级寄存器IP来高置的,IP中某位设为1,对应的中断就是高优先级,不然就是低优先级。
XX
X
PS
PT1
PX1
PT0
PX0
例:设有如下要求,将T0、外中断1设为高优先级,其它为低优先级,求IP的值。IP的首3位没用,可任意取值,设为000,后面根据要求写就能了XX
因此,最终,IP的值就是06H。例:在上例中,如果5个中断请求同时发生,求中断响应的次序。响应次序为:定时器0->外中断1->外中断0->实时器1->串行中断。
MCS-51的中断响应过程:
1、中断响应的条件:讲到这儿,我们依然对于计算机响应中断感到神奇,我们人能响应外界的事件,是因为我们有多种“传感器“――眼、耳能接受不一样的信息,计算机是如何做到这点的呢?其实说穿了,一点都不希奇,MCS51工作时,在每个机器周期中都会去查询一下各个中断标记,看他们是否是“1“,如果是1,就说明有中断请求了,所以所谓中断,其实也是查询,不过是每个周期都查一下而已。这要换成人来说,就相当于你在看书的时候,每一秒钟都会抬起头来看一看,查问一下,是不是有人按门铃,是否有电话。。。。很蠢,不是吗?可计算机本来就是这样,它根本没人聪明。了解了上述中断的过程,就不难解中断响应的条件了。在下列三种情况之一时,CPU将封锁对中断的响应:
CPU正在处理一个同级或更高级别的中断请求。
现行的机器周期不是当前正执行指令的最后一个周期。我们知道,单片机有单周期、双周期、三周期指令,当前执行指令是单字节没有关系,如果是双字节或四字节的,就要等整条指令都执行完了,才能响应中断(因为中断查询是在每个机器周期都可能查到的)。
当前正执行的指令是返回批令(RETI)或访问IP、IE寄存器的指令,则CPU至少再执行一条指令才应中断。这些都是与中断有关的,如果正访问IP、IE则可能会开、关中断或改变中断的优先级,而中断返回指令则说明本次中断还没有处理完,所以都要等本指令处理结束,再执行一条指令才能响应中断。
2、中断响应过程CPU响应中断时,首先把当前指令的下一条指令(就是中断返回后将要执行的指令)的地址送入堆栈,然后根据中断标记,将对应的中断入口地址送入PC,PC是程序指针,CPU取指令就根据PC中的值,PC中是什么值,就会到什么地方去取指令,所以程序就会转到中断入口处继续执行。这些工作都是由硬件来完成的,不必我们去考虑。这里还有个问题,大家是否注意到,每个中断向量地址只间隔了8个单元,如0003-000B,在如此少的空间中如何完成中断程序呢?很简单,你在中断处安排一个LJMP指令,不就能把中断程序跳转到任何地方了吗?一个完整的主程序看起来应该是这样的:
ORG 0000HLJMP START
ORG 0003H
LJMP INT0 ;转外中断0ORG 000BH
RETI ;没有用定时器0中断,在此放一条RETI,万一 “不小心“产生了中断,也不会有太大的后果。。
中断程序完成后,一定要执行一条RETI指令,执行这条指令后,CPU将会把堆栈中保存着的地址取出,送回PC,那么程序就会从主程序的中断处继续往下执行了。注意:CPU所做的保护工作是很有限的,只保护了一个地址,而其它的所有东西都不保护,所以如果你在主程序中用到了如A、PSW等,在中断程序中又要用它们,还要保证回到主程序后这里面的数据还是没执行中断以前的数据,就得自己保护起来。
中断系统的控制寄存器:
中断系统有两个控制寄存器IE和IP,它们分别用来设定各个中断源的打开/关闭和中断优先级。此外,在TCON中另有4位用于选择引起外部中断的条件并作为标志位。
1.中断允许寄存器--IE
IE在特殊功能寄存器中,字节地址为A8H,位地址(由低位到高位)分别是A8H-AFH。
IE用来打开或关断各中断源的中断请求,基本格式如下图二所示:
EA:全局中断允许位。EA=0,关闭全部中断;EA=1,打开全局中断控制,在此条件下,由各个中断控制位确定相应中断的打开或关闭。
×:无效位。
ES:串行I/O中断允许位。ES=1,打开串行I/O中断;ES=0,关闭串行I/O中断。
ETl;定时器/计数器1中断允许位。ETl=1,打开T1中断;ETl=O,关闭T1中断。
EXl:外部中断l中断允许位。EXl=1,打开INT1;EXl=0,关闭INT1。
ET0:定时器/计数器0中断允许位。ET0=1,打开T0中断;ET0=0,关闭TO中断。
EXO:外部中断0中断允许位。Ex0=1,打开INT0;EX0=0,关闭INT0.
中断优先寄存器--IP:
IP在特殊功能寄存器中,字节地址为B8H,位地址(由低位到高位)分别是B8H一BFH,IP用来设定各个中断源属于两级中断中的哪一级,IP的基本格式如下图三所示:
×:无效位。
PS:串行I/O中断优先级控制位。PS=1,高优先级;PS=0,低优先级。
PTl:定时器/计数器1中断优先级控制位。PTl=1,高优先级;PTl=0,低优先级。
Pxl:外部中断1中断优先级控制位。Pxl=1,高优先级;PXl=O,低优先级。
PT0:定时器/计数器o中断优先级控制位。PT0=1,高优先级;PTO=0,低优先级。
Px0:外部中断0中断优先级控制位。Px0=1,高优先级;Px0=0,伤优先级。
在MCS-51单片机系列中,高级中断能够打断低级中断以形成中断嵌套;同级中断之间,或低级对高级中断则不能形成中断嵌套。若几个同级中断同时向CPU请求中断响应,则CPU按如下顺序确定响应的先后顺序:
INT0一T0---INT1一T1一RI/T1.
中断的响应过程
若某个中断源通过编程设置,处于被打开的状态,并满足中断响应的条件,而且①当前正在执行的那条指令已被执行完
1、当前末响应同级或高级中断
2、不是在操作IE,IP中断控制寄存器或执行REH指令则单片机响应此中断。
在正常的情况下,从中断请求信号有效开始,到中断得到响应,通常需要3个机器周期到8个机器周期。中断得到响应后,自动清除中断请求标志(对串行I/O端口的中断标志,要用软件清除),将断点即程序计数器之值(PC)压入堆栈(以备恢复用);然后把相应的中断入口地址装入PC,使程序转入到相应的中断服务程序中去执行。
各个中断源在程序存储器中的中断入口地址如下:
中断源 入口地址
INT0(外部中断0) 0003H
TF0(TO中断) 000BH
INT1(外部中断1) 0013H
TFl(T1中断) 001BH
RI/TI(串行口中断) 0023H
由于各个中断入口地址相隔甚近,不便于存放各个较长的中断服务程序,故通常在中断入口地址开始的二三个单元中,安排一条转移类指令,以转入到安排在那儿的中断服务程序。以T1中断为例,其过程下如图四所示。
由于5个中断源各有其中断请求标志0,TF0,IEl,TFl以及RI/TI,在中断源满足中断请求的条件下,各标志自动置1,以向CPU请求中断。如果某一中断源提出中断请求后,CPU不能立即响应,只要该中断请求标志不被软件人为清除,中断请求的状态就将一直保持,直到CPU响应了中断为止,对串行口中断而言,这一过程与其它4个中断的不同之处在于;即使CPU响应了中断,其中断标志RI/TI也不会自动清零,必须在中断服务程序中设置清除RI/TI的指令后,才会再一次地提出中断请求。
CPU的现场保护和恢复必须由被响应的相应中断服务程序去完成,当执行RETI中断返回指令后,断点值自动从栈顶2字节弹出,并装入PC寄存器,使CPU继续执行被打断了的程序。
下面给出一个应用定时器中断的实例。
现要求编制一段程序,使P1.0端口线上输出周期为2ms的方波脉冲。设单片机晶振频率
Fosc=6MHZ.
1、方法:利用定时器T0作1ms定时,达到定时值后引起中断,在中断服务程序中,使P1.0的状态取一次反,并再次定时1ms。
2、定时初值:机器周期MC=12/fosc=2us。所以定时lms所需的机器周期个数为500D,亦即0lF4H。设T0为工作方式1(16位方式),则定时初值是(01F4H)求补=FEOCH
串行端口的控制寄存器:
串行端口共有2个控制寄存器SCON和PCON,用以设置串行端口的工作方式、接收/发送的运行状态、接收/发送数据的特征、波特率的大小,以及作为运行的中断标志等。
①串行口控制寄存器SCON
SCON的字节地址是98H,位地址(由低位到高位)分别是98H一9FH。SCON的格式如图五所示。
SMo,SMl:
串行口工作方式控制位。
00--方式0;01--方式1;
10--方式2;11--方式3。
SM2:
仅用于方式2和方式3的多机通讯控制位
发送机SM2=1(要求程控设置)。
当为方式2或方式3时:
接收机 SM2=1时,若RB8=1,可引起串行接收中断;若RB8=0,不
引起串行接收中断。SM2=0时,若RB8=1,可引起串行接收中断;若
RB8=0,亦可引起串行接收中断。
REN:
串行接收允许位。
0--禁止接收;1--允许接收。
TB8:
在方式2,3中,TB8是发送机要发送的第9位数据。
RB8:
在方式2,3中,RB8是接收机接收到的第9位数据,该数据正好来自发
送机的TB8。
TI:
发送中断标志位。发送前必须用软件清零,发送过程中TI保持零电平,
发送完一帧数据后,由硬件自动置1。如要再发送,必须用软件再清零。
RI:
接收中断标志位。接收前,必须用软件清零,接收过程中RI保持零电平,接收完一帧数据后,由片内硬件自动置1。如要再接收,必须用软件再清零。
电源控制寄存器PCON
PCON的字节地址为87H,无位地址,PCON的格式如图六所示。需指出的是,对80C31单片机而言,PCON还有几位有效控制位。
SMOD:波特率加倍位。在计算串行方式1,2,3的波特率时;0---不加倍;1---加倍。
串行中断的应用特点:
8031单片机的串行I/O端口是一个中断源,有两个中断标志RI和TI,RI用于接收,TI用于发送。
串行端口无论在何种工作方式下,发送/接收前都必须对TI/RI清零。当一帧数据发送/接收完后,TI/RI自动置1,如要再发送/接收,必须先用软件将其清除。
在串行中断被打开的条件下,对方式0和方式1来说,一帧数据发送/接收完后,除置位TI/RI外,还会引起串行中断请求,并执行串行中侧目务程序。但对方式2和方式3的接收机而言,还要视SM2和RB8的状态,才可确定RI是否被置位以及串行中断的开放:
SM2 RB8 接收机中断标志与中断状态
0 1 激活RI,引起中断
1 0 不激活RI,不引起中断
1 1 激活RI,引起中断
单片机正是利用方式2,3的这一特点,实现多机间的通信。串行端口的常用应用方法见相关章节。
波特率的确定:
对方式0来说,波特率已固定成fosc/12,随着外部晶振的频率不同,波特率亦不相同。常用的fosc有12MHz和6MHz,所以波特率相应为1000×103和500×103位/s。在此方式下,数据将自动地按固定的波特率发送/接收,完全不用设置。
对方式2而言,波特率的计算式为2SMOD·fosc/64。当SMOD=0时,波特率为fm/64;当SMOD=1时,波特率为fosc/32。在此方式下,程控设置SMOD位的状态后,波特率就确定了,不需要再作其它设置。
对方式1和方式3来说,波特率的计算式为2SMOD/32×T1溢出率,根据SMOD状态位的不同,波特率有Tl/32溢出率和T1/16溢出率两种。由于T1溢出率的设置是方便的,因而波特率的选择将十分灵活。
前已叙及,定时器Tl有4种工作方式,为了得到其溢出率,而又不必进入中断服务程序,往往使T1设置在工作方式2的运行状态,也就是8位自动加入时间常数的方式。由于在这种方式下,T1的溢出率(次/秒)计算式可表达成:
下面一段主程序和中断服务程序,是利用串行方式l从数据00H开始连续不断增大地串行发送一片数据的程序例。设单片机晶振的频率为6MHZ,波特率为1200位/秒。
‘拾’ 单片机中有PT0吗什么意思
单片机中有PT0,是一个特殊位,表示定时器0的中断优先级,当PT0=1时,定时器0中断为高级优先级。为0时为低级优先权。