C51单片机的中断
80c51单片机外部中断初始化步骤
80C51 单片机外部中断初始化的步骤如下:
1. 设置中断优先级:通过设置特殊功能寄存器IP 来确定中断的优先级。
可以设置不同的优先级以确定中断的响应顺序。
2. 允许中断:通过设置特殊功能寄存器IE 来允许相应的中断源。
将对应中断源的使能位设置为1。
3. 设置触发方式:通过设置特殊功能寄存器TCON 来选择外部中断的触发方式。
可以选择低电平触发、下降沿触发或上升沿触发。
4. 配置中断向量:中断向量是指中断服务程序的入口地址。
可以通过设置特殊功能寄存器Interrupt Vector Table(中断向量表)来指定中断服务程序的入口地址。
这些步骤是80C51 单片机外部中断初始化的一般流程。
具体的实现方式可能会因不同的单片机型号和编译器而有所差异。
在实际编程中,还需要根据具体的需求和硬件连接来进行相应的配置。
51单片机应用技术(C语言版)习题答案(1)
解:计数初值X=216- T/T机=65536-1000/1=64536=FC18H
则TH0 = 0xfc
TL0 = 0x18
定时器0方式1时,TMOD=0x01
查询法参考程序:
#include<reg51.h>
同级或低级中断请求不能打断正在执行的中断;
同级中断源同时提出请求时按自然优先级响应:
单片机复位时,IP各位都被置0,所有中断源为低级中断。
自然优先级顺序是:/INT0→ T0 → /INT1→T1→TI/RI
5.答:有一按键接到单片机外部中断0引脚上,要求编程对按键动作进行计数和显示,达到99后重新由0开始计数(采用中断方式)。
答:MCS-51单片机的存储器采用的是哈佛结构,即把程序存储器和数据存储器分开,有各自的寻址系统、控制信号和功能。
MCS-51单片机存储器的最大寻址空间64KB。
4.MCS-51单片机的时钟周期,状态周期,机器周期,指令周期的含义是什么?当晶振频率为6MHZ时,它们分别为多少?
答:时钟周期:由振荡电路产生的时钟脉冲的周期;
MCS-51单片机提供了4个8位的I/O端口,分别命名为P0、P1、P2、P3,这些端口既可以按字节一次输入或输出8位数据,同时它们的每一位都可以独立进行输出或输出操作。
MCS-51单片机内部有两个16位的定时器/计数器,既可以做定时功能,又可以做计数功能。
2.MCS-51单片机的P0-P3口在功能上各有什么用途和区别?当它们做I/O口使用时,具有哪些特点?
sbit p1_0=P1^0;
void main()
{
TMOD=0x01;
单片机原理及应用教程(C语言版)-第5章 MCS-51单片机的中断系统
5.2.5 中断允许控制
例5-1 假设允许INT0、INT1、T0、T1中断,试 设置IE的值。 (2)汇编语言程序 按字节操作: MOV IE,#8FH 按位操作: SETB EX0 ;允许外部中断0中断 SETB ET0 ;允许定时器/计数器0中断 SETB EX1 ;允许外部中断1中断 SETB ET1 ;开定时器/计数器1中断 SETB EA ;开总中断控制位
IP (B8H)
D7 —
D6 D5 D4 D3 D2 D1 D0 — PT2 PS PT1 PX1 PT0 PX0
PT2:定时器/计数器T2的中断优先级控制位 PT2设置1则T2为高优先级,PT2设置0则T2为 低优先级。 后面各位均是如此,设置1为高优先级,设置0 为低优先级,不再一一赘述。 PS:串行口的中断优先级控制位。 PT1:定时器/计数器1的中断优先级控制位。 PX1:外部中断1的中断优先级控制位。 PT0:定时器/计数器0的中断优先级控制位。 PX0:外部中断0的中断优先级控制位。
5.2.4 中断请求标志
4.定时器/计数器T2中断请求标志
T2CON D7 D6 D5 (C8H) TF2 EXF2 D4 D3 D2 D1 D0
EXF2:定时器/计数器2的外部触发中断请求标志 位。T2以自动重装或外部捕获方式定时、计数,当 T2EX(P1.1)引脚出现负跳变时,TF2由硬件置1, 向CPU请求中断,CPU响应中断后,EXF2不会被硬 件清0,需要在程序中以软件方式清0。
5.2.3 外中断触发方式
TCON格式如下:
D7 D6 D5 D4 D3 D2 D1 D0
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
IT0=1,外中断0为下降沿触发 CPU在每一个机器周期的S5P2期间对P3.2引 脚采样,若上一个机器周期检测为高电平,紧挨着 的下一个机器周期为低电平,则使IE0置1。 IT1:外中断1触发方式控制位。功能同IT0
51单片机中断号
51单片机中断号若51单片机使用C语言编程,51单片机中断号的排列顺序是按中断向量地址由低到高来排列中断号,不是按中断查询的优先级或者中断服务顺序的优先级来排列中断号的。
本内容简单介绍了C51单片机的中断号以及中断向量,方便大家了解和学习关键词:中断向量C51单片机一、中断号二、interrupt 和 using 在C51中断中的使用8051 系列 MCU 的基本结构包括:32 个 I/O 口(4 组8 bit 端口);两个16 位定时计数器;全双工串行通信;6 个中断源(2 个外部中断、2 个定时/计数器中断、1 个串口输入/输出中断),两级中断优先级;128 字节内置RAM;独立的 64K 字节可寻址数据和代码区。
中断发生后,MCU 转到 5 个中断入口处之一,然后执行相应的中断服务处理程序。
中断程序的入口地址被编译器放在中断向量中,中断向量位于程序代码段的最低地址处,注意这里的串口输入/输出中断共用一个中断向量。
8051的中断向量表如下:C51单片机的中断号以及中断向量C51单片机的中断号以及中断向量一、中断号外部中断0 0定时器T0 1外部中断1 2定时器T1 3串口中断 4二、interrupt 和 using 在C51中断中的使用8051 系列 MCU 的基本结构包括:32 个 I/O 口(4 组8 bit 端口);两个16 位定时计数器;全双工串行通信;6 个中断源(2 个外部中断、2 个定时/计数器中断、1 个串口输入/输出中断),两级中断优先级;128 字节内置RAM ;独立的 64K 字节可寻址数据和代码区。
中断发生后,MCU 转到 5 个中断入口处之一,然后执行相应的中断服务处理程序。
中断程序的入口地址被编译器放在中断向量中,中断向量位于程序代码段的最低地址处,注意这里的串口输入/输出中断共用一个中断向量。
8051的中断向量表如下:中断源 中断向量 上电复位 0000H 外部中断0 0003H 定时器0 溢出 000BH 外部中断1 0013H 定时器1 溢出 001BH 串行口中断 0023H 定时器2 溢出 002BH51单片机定时器中断号 [复制链接]admin849 主题 987 帖子 3106 积分 管理员 积分 3106 • 发消息 电梯直达楼主发表于 2013-11-10 23:37:34 | 只看该作者| | 有用的中断号知识void 表示函数类型interrupt 0 ←这里的0表示中断源编号using 1 ←这里的1表示选用的寄存器组别在MCS-51单片机中,单片机类型不同,中断源个数也有差别.例如8051有5个中断源,8052有6个中断源.现以8051为例中断源 中断服务入口地址 中断标志外部中断INT0 0003H IE0定时器T0 000BH TF0外部中断INT1 0013H IE1串行口TI/RI 00023H TI/RI中断优先级别从上到下依次降低interrupt 表示中断优先级,using表示所用工作寄存器组。
c单片机中断详解
例
例62 设置IP寄存器的初始值;使2个外中断请求 为高优先级;其它中断请求为低优先级
1用位操作指令 SETB PX0 ;2个外中断为高优先级 SETB PX1 CLR PS ;串口为低优先级中断 CLR PT0 ;T0低优先级中断 CLR PT1 ;T1低优先级中断
响应中断请求的条件
四 中断返回
▪中断返回由专门的中断返回指令 RETI来实现
五 中断请求的撤消 2 外部中断请求的撤消 1跳沿方式外部中断请求的撤消是自 动撤消的 2电平方式外部中断请求的撤消
六 外部中断的响应时间 外部中断的最短的响应时间为3
个机器周期:
外部中断响应的最长的响应时间为8个机 器周期
注意:如果已在处理同级或更高级中断; 响应时间无法计算
在一个单一中断的系统里;MCS51单片机对 外部中断请求的响应的时间总是在3~8 个机器周期之间
补充:中断服务程序的设计
一 中断服务程序设计的任务 基本任务:
1设置中断允许控制寄存器IE 2设置中断优先级寄存器IP 3对外中断源;是采用电平触发还是跳沿触发 4编写中断服务程序;处理中断请求 前3条一般放在主程序的初始化程序段中
● TF0—T0溢出中断请求标志位 T0 计 数 溢 出 时 ; 由 硬 件 置 1TF0; 向 CPU 申 请 中
断;CPU响应TF0中断时;硬件自动清0TF0;TF0也可由 软件清0 ● TF1—T1的溢出中断请求标志位;功能和TF0类似 TR1 TR0 2个位与中断无关 当MCS51复位后;TCON 被清0;则CPU关中断;所有中断请求被禁止
3 关于C51中断函数的几点说明续
• C51编译器对中断函数编译时会自动在程序的 开始和结束处加上如下内容:开始处对ACC B DPH DPL和PSW入栈;结束时出栈 中断函 数未加using n修饰符时;开始处还要将R0R1 入栈;结束时出栈 如果中断函数加using n修 饰符;则在开始将PSW入栈后还要修改中PSW 的工作寄存器选择位RS0和RS1
单片机定时器中断原理和c语言代码详解
单片机定时器中断原理和C语言代码详解我之前都是用ARM7,单片机基本不会。
但一个项目要用到51,所以克了一下51还是有点模糊,今天调了这个代码之后,对51定时器中断有些心得,拿来和大家共享。
废话不说了,上代码。
#define _1231_C_#include "reg51.h"#include "1231.h"//sbit OE=P2^3;unsigned int SystemTime;void timer0(void) interrupt 1 using 3 //中断部分代码,见下文的释疑{TH0 = 0xdb;TL0 = 0xff;// TF0 = 0;SystemTime++;}void main(){TMOD &= 0xF0;TMOD |= 0x01; //TMOD的值表示定时器工作方式选择TH0 = 0xdb; //写入初始值,初始值可以决定定时多久TL0 = 0xff;//根据下文的木桶比喻的话,如果TH0 = 0x00;TL0 = 0x00;则表示从桶底开始装水。
//TH0 = 0xdb;TL0 = 0xff;可以这样子理解相当于木桶里已经有部分液铅在里面,//TH0和TL0这个两个值表示木桶里液铅的高度,即此时桶里只能从液铅的高度以上开始装水,//TH0 = 0xff;TL0 = 0xff;即表示桶的最高位置.TF0 = 0; //计数到时TF0为1,即当TH0 = 0xff;TL0 = 0xff;再运行一步TF0 = 1;TR0 = 1; //开始计数,从这时起,每运行一步TH0和TL0都会增加,直到TH0 = 0xff;TL0 = 0xff;//相当于开水龙头,如TR0=0则TH0和TL0不变ET0 = 1; //允许定时器0中断EA=1; //开总中断//下面是个死循环,程序里每运行一步TH0和TL0都会增加,当增加到TH0 = 0xff;TL0 = 0xff;//单片机会从死循环里退出,去执行中断部分的代码,即开始运行void timer0(void) interrupt 1 using 3{}//运行完中断部分的代码后,接着继续执行死循环里的代码。
如何设置51单片机的中断优先级
在 MCS-51 单片机中断优先级中由中断优先级寄存器 IP 来高置的,IP 中某位设为 1,相应的中断就是高优先级,否则就是低优先级。 PS PT1 PX1 PT0 PX0 IP 优先级别寄存器各位介绍如下:
PS PT1 PX1 PT0 PX0
0 0 0 0 0 1 1 0
因此,最终,IP 的值就是 06H。 例:在上例中,如果 5 个中断请求同时发生,求中断响应的次序。 响应次序为:定时器 0->外中断 1->外中断 0->实时器 1->串行中 断。
Байду номын сангаас
PS:串行口中断优先级控制位。PS=1 设定串行口为高优先级中断;PS=0 为低优先级中断。 PT1:T1 中断优先级控制位。PT1=1 设定定时器 T1 为高优先级中断; PT1=0 为低优先级中断。 PX1:外部中断 1 优先级控制位。PX1=1 设定定时器外部中断 1 为高优先 级中断;PX1=0 为低优先级中断。 PT0:T0 中断优先级控制位。PT0=1 设定定时器 T0 为高优先级中断; PT0=0 为低优先级中断。 PX0:外部中断 0 优先级控制位。PX0=1 设定定时器外部中断 0 为高优先 级中断;PX0=0 为低优先级中断。 例:设有如下要求,将 T0、外中断 1 设为高优先级,其它为低优先级, 求 IP 的值。 IP 的首 3 位没用,可任意取值,设为 000,后面根据要求写就可以了
51单片机中断程序
#include<reg52.h>#define uint unsigned int#define uchar unsigned charvoid delay(uint a);bit c,b;//==主程序区============================================= ======================================================void main(){EA=1;//打开总中断EX0=1;//打开外部中断0IT0=0;//将中断0设置为电平触发IT1=0;//将中断0设置为电平触发EX1=1;//打开外部中断1while(1){P1=0xfe;//关掉INT0里面的LEDP0=0xff;//关掉INT1里面的数码管P0=0x00;P2=0xf8;P1=0xfe;while(1);}}//=子程序区============================================== ====================================================== =void delay(uint a){uint b,c;for(b=a;b>0;b--)for(c=110;c>0;c--);}void Int0() interrupt 0//外部中断0的服务子程序不用在声明区声明的{uint a;a=10;while(a--)//这里不能用while(1)如果不是的话当外部中断已经成了高电平,但无法跳出中断服务子程序{P0=0x00;P2=0xf8;P1=0xff;delay(1000);P1=0x00;delay(1000);}}void Int1() interrupt 2//外部中断1 的服务子程序也是不用在声明区声明的。
{delay(1);c=P3^3;if(c==0){delay(1);if(c==0){uint a;a=10;while((a--))//这里不能用while(1)如果不是的话当外部中断已经成了高电平,但无法跳出中断服务子程序{P1=0xff;P2=0xf8;P0=0x3f;delay(1000);P2=0xf9;P0=0x00;delay(1000);P2=0xf8;P0=0x06;delay(1000);P2=0xf8;P0=0x5b;delay(1000);P2=0xf8;P0=0x4f;delay(1000);P2=0xf8;P0=0x66;delay(1000);P2=0xf8;P0=0x6d;delay(1000);}}}}/*程序功能是第一个LED亮的,P3^2口是低电平是进入中断程序,中断实现功能是八个L ED一起闪烁。
单片机C语言函数中断函数(中断服务程序)
单片机_C语言函数_中断函数(中断服务程序)在开始写中断函数之前,我们来一起回顾一下,单片机的中断系统。
中断的意思(学习过微机原理与接口技术的同学,没学过单片机,也应该知道),我们在这里就不讲了,首先来回忆下中断系统涉及到哪些问题。
(1)中断源:中断请求信号的来源。
(8051有3个内部中断源T0,T1,串行口,2个外部中断源INT0,INT1(这两个低电平有效,上面的那个横杠不知道怎么加上去))(2)中断响应与返回:CPU采集到中断请求信号,怎样转向特定的中断服务子程序,并在执行完之后返回被中断程序继续执行。
期间涉及到C PU响应中断的条件,现场保护,现场恢复。
(3)优先级控制:中断优先级的控制就形成了中断嵌套(8051允许有两级的中断嵌套,优先权顺序为INT0,T0,INT1,T1,串行口),同一个优先级的中断,还存在优先权的高低。
优先级是可以编程的,而优先权是固定的。
80C51的原则是①同优先级,先响应高优先权②低优先级能被高优先级中断③正在进行的中断不能被同一级的中断请求或低优先级的中断请求中断。
80C51的中断系统涉及到的中断控制有中断请求,中断允许,中断优先级控制(1)3个内部中断源T0,T1,串行口,2个外部中断源INT0,INT1(2)中断控制寄存器:定时和外中断控制寄存器TCON(包括T0、T1,INT0、INT1),串行控制寄存器SCON,中断允许寄存器IE,中断优先级寄存器IP具体的是什么,包括哪些标志位,在这里不讲了,所有书上面都会讲。
在这里我们讲下注意的事项(1)CPU响应中断后,TF0(T0中断标志位)和TF1由硬件自动清0。
(2)CPU响应中断后,在边沿触发方式下,IE0(外部中断IN T0请求标志位)和IE1由硬件自动清零;在电平触发方式下,不能自动清楚IE0和I E1。
单片机中断问题30例
前八例1、单片机外中断INT0为下降沿触发,当中断被触发后cpu执行中断程序,若本次中断的程序还未执行完INT0又来了一个相同的下降沿中断信号怎么办?cpu会怎么处理?若是定时器中断呢?串口中断呢?求解释答:再来一个INT0信号不会执行。
相同的优先级不会打断正在执行的中断。
一. 如果是高优先级的中断来了,会打断低优先级的正在执行的中断而执行高优先级的中断。
51单片机的默认(此时的IP寄存器不做设置)中断优先级为:外部中断0 > 定时/计数器0 > 外部中断1 > 定时/计数器1 > 串行中断;当同时有几种中断到达时,高优先级中断会先得到服务。
例如:当计数器0中断和外部中断1(优先级计数器0中断>外部中断1)同时到达时,会进入计时器0的中断服务函数;但是在外部中断1的中断服务函数正在服务的情况下,这时候任何中断都是打断不了它的,包括逻辑优先级比它高的外部中断0计数器0中断。
51单片机的中断优先级控制寄存器IP可以把默认的中断优先级设置为高或低级,例如默认是外部中断0 > 定时/计数器0 > 外部中断1 > 定时/计数器1 > 串行中断;现在设为定时1 和串行中断为高优先级其它为低,那么中断0执行时会被定时器1 或串行中断打断,如果设定的两个高优先级定时/计数器1 和串行中断同时响应,会再自然排队,先执行定时1中断再执行串行中断。
2、单片机中断问题,中断3为什么不执行,整个程序有什么不对的地方呢?#include <reg52.h>#define uint unsigned int#define uchar unsigned charsbit p1_0=P1^0;sbit p1_1=P1^1;sbit p1_2=P1^2;sbit p1_3=P1^3;sbit p1_4=P1^4;sbit p1_5=P1^5;uchar PWM_T1 = 0;uchar PWM_T2 = 0;uint i,m;void delay(uint z){for(i=z;i>0;i--)for(m=0;m<110;m++);}void PWM_value_left(int pwm_set){PWM_T1=pwm_set;}void PWM_value_right(int pwm_set){PWM_T2=pwm_set;}void main(void){bit flag = 1;uint n;TMOD=0x22;TH0=241;TH1=241;TL0=241;TL1=241;TR0=1;TR1=1;ET0=1;ET1=1;EA=1;P1=0xf0;delay(20);PWM_value_left(7); PWM_value_right(10); delay(100);PWM_value_left(8); PWM_value_right(9); delay(100);PWM_value_left(9); PWM_value_right(8); delay(100);PWM_value_left(10); PWM_value_right(7);}timer0() interrupt 1 using 2 {static uint t ;t++;if(t==10){t=0;p1_0=1;p1_1=0;}if(PWM_T1==t)P1=P1&0xfc;}timer1() interrupt 3{static uint t1 ;t1++;if(t1==10){t1=0;p1_2=1;p1_3=0;}if(PWM_T2==t1)P1=P1&0xf3;}答:没有主循环,没有等到中断3程序运行一次就跑飞了!!!在void main(void){//...你的程序//在这里加死循环,等待中断while(1){;}}而且,中断响应函数里必须要清中断标志位(你的没有)!3、各位大侠帮我看一下我写的51单片机C程序中断有没有问题,执行中断后不能继续执行主程序,注:P3.2口一直接注:P3.2口一直接地,程序如下:#include <reg52.h>sbit dula=P2^6;sbit wela=P2^7;sbit d0=P1^0;sbit d1=P1^1;sbit d2=P1^2;sbit d3=P1^3;sbit d4=P1^4;sbit d5=P1^5;sbit d6=P1^6;sbit d7=P1^7;#define uchar unsigned char#define uint unsigned int uchar num;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; void delay(uint z);void main(){EA=1;EX0=1;IT0=0;wela=1;P0=0xc0;wela=0;while(1){for(num=0;num<16;num++) {dula=1;P0=table[num];dula=0;delay(1000);}}}void delay(uint z){uint a,b;for(a=z;a>0;a--)for(b=110;b>0;b--);}void exter0() interrupt 0 {uint c;for(c=0;c<25000;c++);d0=0;for(c=0;c<25000;c++);d0=1;for(c=0;c<25000;c++);d1=0;for(c=0;c<25000;c++);d1=1;for(c=0;c<25000;c++);d2=0;for(c=0;c<25000;c++);d2=1;for(c=0;c<25000;c++);d3=0;for(c=0;c<25000;c++);d3=1;for(c=0;c<25000;c++);d4=0;for(c=0;c<25000;c++);d4=1;for(c=0;c<25000;c++);d5=0;for(c=0;c<25000;c++);d5=1;for(c=0;c<25000;c++);d6=0;for(c=0;c<25000;c++);d6=1;for(c=0;c<25000;c++);d7=0;for(c=0;c<25000;c++);d7=1;}答:IT0=0;//低电平触发,只要单片机监测到是低电平,就触发中断你P3.2一直接地,一直是低电平,那中断就不断的执行,当然回不到主程序中了。
