(完整版)C51中断函数的写法

合集下载

电气自动化技术《3.1.2中断程序设计及仿真(C51)》

电气自动化技术《3.1.2中断程序设计及仿真(C51)》

中断程序设计与仿真一、中断函数C51编译器支持在C源程序中直接开发中断程序。

中断效劳程序是一个按规定语法格式定义的函数。

中断效劳程序的函数定义格式如下:返回值函数名([参数]) interrupt m[using n]{}“interrupt m〞是C51函数中非常重要的一个修饰符,是中断函数与其它函数区别的标志。

在C51程序设计中,如果函数定义时使用“inter rupt m〞修饰符,那么在系统编译时,会把对应函数转化为中断函数,自动加上程序头段和尾段,并按MCS-51系统中断的处理方式自动把它安排在程序存储器中的相应位置。

在该修饰符中,m的取值为0~31,对应的中断情况如下:0——外部中断01——定时/计数器T02——外部中断13——定时/计数器T14——串行口中断5——定时/计数器T2其它值预留。

编写51中断函数注意如下:〔1〕中断函数不能进行参数传递,如果中断函数中包含任何参数声明都将导致编译出错。

〔2〕中断函数没有返回值,如果企图定义一个返回值将得不到正确的结果,建议在定义中断函数时将其定义为void类型,以明确说明没有返回值。

〔3〕在任何情况下都不能直接调用中断函数,否那么会产生编译错误。

因为中断函数的返回是由51单片机的RETI指令完成的,RETI 指令影响51单片机的硬件中断系统。

如果在没有实际中断情况下直接调用中断函数,RETI指令的操作结果会产生一个致命的错误。

〔4〕如果在中断函数中调用了其它函数,那么被调用函数所使用的存放器必须与中断函数相同,否那么会产生不正确的结果。

〔5〕C51编译器对中断函数编译时会自动在程序开始和结束处加上相应的内容,具体如下:在程序开始处对ACC、B、DPH、DPL和PSW入栈,结束时出栈。

中断函数未加using n修饰符的,开始时还要将R0~R1入栈,结束时出栈。

如中断函数加using n修饰符,那么在开始将PSW入栈后还要修改PSW中的工作存放器组选择位。

单片机C语言-第4章中断系统的C51编程 2

单片机C语言-第4章中断系统的C51编程 2
【注意】
1、中断服务函数既没有返回值,也没有调用参数; 2、中断服务函数只能由系统调用,不能被其他函数调用。
2、中断请求的撤除
(1)定时器/计数器溢出中断请求的撤除
TF0和TF1是定时器/计数器溢出中断标志位,定时器 /计数器溢出中断请求时自动置位,中断得到响应后自动 复位成0状态。定时器/计数器溢出中断自动撤除。
(2)串行口中断请求的撤除
TI和RI是串行口中断标志位,中断系统不能自动将它 们撤除,需要通过以下的指令进行撤除:
P1^0=1; P1^0=0; IE0=0;
4.2.2 中断函数的结构形式
C51中断函数upt n [using m]
interrupt n,表示是关于中断号为n的中断服务函数;外 部中断0中断、定时器/计数器0溢出中断、外部中断1中断、 定时器/计数器1溢出中断、串行口中断对应的中断类型号 分别为0、1、2、3、4。 using m,表示该中断函数将使用第m组工作寄存器。 缺省为当前工作寄存器组。
4.2 中断优先级与中断函数
4.2.1 中断优先级
1、中断优先级原则如下:
1)高级中断请求可以打断正在执行的低级中断;
2)同级或低级中断请求不能打断正在执行的中断; 3)同级中断源同时提出请求时按自然优先级响应:
INT0→ T0 → INT1→T1→TI/RI 4)单片机复位时,IP初值为0——默认所有中断源均 为低级中断。
TI=0 //撤除发送中断
RI=0 //撤除接收中断
(3)外部中断请求的撤除

当IT0(或IT1)=1,脉冲触发方式时,若第一个机器
周期采样到INTx引脚为高电平,第二个机器周期采样
到INTx引脚为低电平,则由硬件置位IE0(或IE1),并以

单片机中断系统的C51语言编程

单片机中断系统的C51语言编程
单片机中断系统的C51语言编程
4.1 单片机的中断系统
4.1.1 51系列单片机的中断系统 4.1.2 51系列单片机中断系统的控制 4.1.3 51系列单片机的中断处理过程
单片机中断系统的C51语言编程
4.1 单片机的中断系统
所谓中断就是当单片机执 行主程序时,系统中出现某些 急需处理的异常情况或特殊请 求(中断请求),单片机暂时中 止现行的程序,而转去对随机 发生的更紧迫的事件进行处理 (中断响应),在处理完毕后, 单片机又自动返回(中断返回) 原来的主程序继续运行,如图 4.1所示。
单片机中断系统的C51语言编程
3. 中断处理
中断处理应根据具体要求编写中断服务程序。在编写 中断服务程序时要注意两个问题:现场保护和现场恢复; 关中断和开中断。
单片机中断系统的C51语言编程
4. 中断返回
在Keil C51 语言中,中断服务程序是由中断函数来实 现的,中断处理结束后会自动返回主程序。
图4.3 TCON中的中断请求标志位
单片机中断系统的C51语言编程
2) 特殊功能寄存器SCON中的中断请求标志位 SCON是串行口控制寄存器。它锁存串行口的发送中
断标志和接收中断标志。SCON 中的中断请求标志位如图4. 4所示。
图4.4 SCON中的中断请求标志位
单片机中断系统的C51语言编程
4.1.2 51系列单片机中断系统的控制
由于上述原因而未能响应的中断请求必须等待CPU的 下一次查询,即CPU 对查询的结果不作记忆。查询过程在 下一个机器周期重新进行。
单片机中断系统的C51语言编程
3) 中断响应
中断响应是对中断源提出的中断请求的接受。在中断 查询中,当查询到有效的中断请求时,紧接着进行中断响 应。 4) 中断响应时间

电子信息工程技术《C51中断子程序的设计》

电子信息工程技术《C51中断子程序的设计》
第六页,共九页。
使用中断函数的本卷须知
① 中断函数不能进行参数传递;
Su小 结m
② 中断函数没有返回值;
③ 在任何情况下,都不能直接调用中断函数;
④ 如果中断函数调用了其他函数,那么被调用函数所使用的存放器组
必须与中断函数相同。
第七页,共九页。
单片机原理与应用
再见
第八页,共九页。
内容总结
单片机原理与应用。单片机原理与应用。C51 语言扩展了函数的定义使它可以直接编写中断效劳函数,扩展 的关键字是interrupt和using,用于定义中断效劳程序。n的取值范围为0~31,但具体的中断号要取决于芯片的型 号,像87C51 实际上就使用0~4号中断。using这个选项是指定选用51芯片4 组工作存放器中的那个组,初学者可 以不必去做工作存放器设定,而由编译器自动选择,防止产生不必要的错误
EA=1; // 翻开CPU中断
while 1 // 主程序循环 { } }
第五页,共九页。
// 外中断0程序
void int0 interrupt 0 // 在中断里点亮LED 图1 {
P1=~001<<n; n=n1%8;
} 每按一下1〔P32〕之后,就会触发一次 中断,就会点亮一个LED灯。如果连续按键,就会依次循环点亮LED 灯。
单片机原理与应用
电子信息工程技术
单片机C51程序设计
第一页,共九页。
C51 语言扩展了函数的定义使它可以直接编写中断效劳函数,扩展的关键字是interrupt和 using,用于定义中断效劳程序。
第二页,共九页。
〔1〕中断函数的定义与使用举例 中断函数定义具体格式如下:
函数类型 函数名 形式参数 interrupt n

51单片机外部中断的C51编程

51单片机外部中断的C51编程

51单片机外部中断的C51编程相关知识:1、51单片机的5大中断源:串行口中断、定时中断1、外部中断1、定时中断0、外部中断0;2、中断源的编号:串行口中断为4、定时中断1为3、外部中断1为2、定时中断0为1、外部中断0为0;3、中断源的优先级:按以上顺序排列,串行口中断最低、外部中断0最高;4、使用外部中断0和1,必须TCON寄存器设置其触发方式是低电平触发(0)还是下降沿触发(1);5、使用前必须通过IE寄存器打开总中断和自己的中断;//外部中断基本例程-1(未使用中断,键盘扫描为一般端口扫描)//这是特意安排的一个例程,以便和使用外部中断的例程2进行对比//用一个按键控制一个灯的亮灭,开始不亮,按一下则点亮,再按一下灭掉,再按又亮........#include <reg52.h>sbit k1=P3^2;sbit led=P2^7;void delay_ms(unsigned int xms); //ms级延时子程序void key_scan(); //声明键盘扫描子函数//=================================================void main(){led=1; //上电初始化,led灯不亮while(1){key_scan();delay_ms(3000);}}//=================================================void delay_ms(unsigned int xms) //ms级延时子程序{ unsigned int x,y;for(x=xms;x>0;x--)for(y=130;y>0;y--);}//-------------------------------------------------void key_scan() //键盘扫描子函数{ if(k1==0) //有键按下吗?(k1=0 ?){ delay_ms(10); //延时消抖if(k1==0) //确实是有键按下,则:{led=!led; //翻转灯的状态while(!k1);} //等待按键放开}}//-------------------------------------------------//外部中断基本例程-2 (单个键盘的外部中断0扫描处理)//用一个按键控制一个灯的亮灭//开始不亮,按一下则点亮,再按一下灭掉,再按又亮........#include <reg52.h>sbit k1=P3^2;sbit led=P2^7;void delay_ms(unsigned int xms); //ms级延时子程序void key_scan() interrupt 0 //使用了外部中断0的键盘扫描子函数。

51单片机C语言程序 定时 计数器 中断

51单片机C语言程序 定时 计数器 中断

51单片机C语言程序定时计数器中断51单片机C语言程序定时计数器中断程序一利用定时/计数器T0从P1.0输出周期为1s的方波,让发光二极管以1HZ闪烁,#include reg52.h//52单片机头文件#include intrins.h//包含有左右循环移位子函数的库 #define uint unsigned int//宏定义#define uchar unsigned char//宏定义sbit P1_0=P1^0;uchar tt;void main()//主函数{TMOD=0x01;//设置定时器0为工作方式1 TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;//开总中断ET0=1;//开定时器0中断TR0=1;//启动定时器0 while(1);//等待中断产生 }void timer0()interrupt 1 {TH0=(65536-50000)/256;TL0=(65536-50000)%256;tt++;if(tt==20){tt=0;P1_0=~P1_0;}}程序二利用定时/计数器T1产生定时时钟,由P1口控制8个发光二极管,使8个指示灯依次一个一个闪动,闪动频率为10次/秒(8个灯依次亮一遍为一个周期),循环。

#include reg52.h//52单片机头文件 #include intrins.h//包含有左右循环移位子函数的库 #define uint unsigned int//宏定义#define uchar unsigned char//宏定义 sbit P1_0=P1^0;uchar tt,a;void main()//主函数{TMOD=0x01;//设置定时器0为工作方式1 TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;//开总中断ET0=1;//开定时器0中断TR0=1;//启动定时器0 a=0xfe; while(1);//等待中断产生}void timer0()interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;tt++;if(tt==2){tt=0;P1=a;a=_crol_(a,1);}}程序三同时用两个定时器控制蜂鸣器发声,定时器0控制频率,定时器1控制同个频率持续的时间,间隔2s依次输出 1,10,50,100,200,400,800, 1k(hz)的方波#include reg52.h//52单片机头文件 #include intrins.h//包含有左右循环移位子函数的库#define uint unsigned int//宏定义 #define uchar unsigned char//宏定义 sbit beep=P2^3;uchar tt;uint fre,flag;void main()//主函数{fre=50000;beep=0;//设置定时器0,定时器1为工作方式1 TH0=(65536-fre)/256; TMOD=0x11;TL0=(65536-fre)%256; TH1=(65536-50000)/256; TL1=(65536-50000)%256; EA=1;//开总中断ET0=1;//开定时器0中断 ET1=1;TR1=1;TR0=1;//启动定时器0 while(1);//等待中断产生}void timer0()interrupt 1//定时器0中断{TR0=0;//进中断后先把定时器0中断关闭,防止内部程序过多而造成中断丢失TH0=(65536-fre)/256; TL0=(65536-fre)%256; tt++;if(flag 40)//以下几个if分别用来选取不同的频率if(tt==10){; tt=0fre=50000;beep=~beep;}if(flag=40&&flag 80){tt=0;fre=50000;beep=~beep;}if(flag=80&&flag 120) {tt=0;fre=10000;beep=~beep;}if(flag=120&&flag 160) { tt=0;fre=5000;beep=~beep;}if(flag=160&&flag 200) { tt=0;fre=2500;beep=~beep;}if(flag=200&&flag 240) { tt=0;fre=1250;beep=~beep;}if(flag=240&&flag 280) {tt=0;fre=625;beep=~beep;}if(flag=280&&flag 320){tt=0;fre=312;beep=~beep; }if(flag=320&&flag 360){tt=0;fre=156;beep=~beep; }TR0=1;}void timer1()interrupt 3//定时器1中断用来产生2秒时间定时{TH1=(65536-50000)/256;TL1=(65536-50000)%256;flag++;if(flag==360){flag=0;fre=50000;}}程序四用定时器以间隔500MS在6位数码管上依次显示 0、1、2、3.C、D、E、F,重复。

c51单片机中断详解 ppt课件


PPT课件
13
包含: (1)T0和T1的溢出中断请求标志位TF1和TF0。 (2)外部中断请求标志位IE1与IE0。 各标志位的功能:
IE1——外部中断请求1的中断请求标志位。 IE1=0,无中断请求。 IE1=1,外部中断1有中断请求。当CPU响应该中 断,转向中断服务程序,由硬件清“0”IE0。
中断系统结构示意图如下图所示:
PPT课件
8
P140
PPT课件
9
●中断请求源
五个中断请求源 :
(1)INT0*—外部中断请求0,由 引 脚 INT0* 输 入 , 中 断 请 求 标 志 为IE0。
(2)INT1*—外部中断请求1,由 引 脚 INT1* 输 入 , 中 断 请 求 标 志 为IE1。
PPT课件
14
● IT1外部中断1的中断触发方式控制位
IT1——选择外部中断请求1为负跳变触发方式 还是电平触发方式:
IT1 =0,为电平触发方式,IE1状态完全 由IT1决定。
IT1=1,为负跳变触发方式。 IT1可由软件置“1”或清“0”。
PPT课件
15
● IT0—外部中断请求0为负跳变触 发方式还是电平触发方式,意义与 IT1类似。 ● IE0—外部中断请求0的中断请求 标志位,意义与IE1类似。
SETB EA ;CPU开中断 SETB ET0 ;允许外中断0产生中断 SETB PX0 ;外中断0为高级中断 SETB IT0 ;外中断0为跳沿触发方式
PPT课件
45
二、采用中断时的主程序结构
PPT课件
46
三、 中 断 服 务 程 序 的 流 程
PPT课件
4例7
补充 C51中的中断函数

单片机C语言-第4章中断系统的C51编程 3

4.3 外部中断源的C51编程
• 51单片机提供了2个外部中断源 : • 外部中断0请求,占用P3.2引脚,其中断
请求号为0。 • 外部中断1请求,占用P3.3引脚,其中断
请求号为2。 • 外部中断源的初始化时通过设置相应的特
殊功能寄存器的相应位来实现的。
4.3.1 外部中断源的初始化
(1)TCON寄存器中的IT0、IT1位 • 外部中断0和外部中断1的中断触发方式控制位。如: • IT0=0;//外部中断0为电平触发方式 • IT1=1;//外部中断1为脉冲触发方式 • (2)IP寄存器中的PX0、PX1位 • 外部中断0和外部中断1的中断优先级的设定。如: • PX0=0; //设定外部中断0为低级中断 • PX1=1; //设定外部中断1为高级中断
{
delay1ms(250); //延迟250*1m=0.25s

LED=~LED;
//LED反相

}
•}
• /* INT 0的中断子程序 - 单灯左移3圈 */
• void my_int0(void) interrupt 0
• { unsigned saveLED=LED; //储存中断前LED状态
//计数x次,延迟x 1ms //计数120次,延迟1ms
•}
• /* 单灯左移函数,执行x圈 */
• void left(int x)
• { int i, j;

for(i=0;i<x;i++)
//单灯左移函数开始 //声明变数i,j //i循环,执行x圈

{ LED=0xfe;

for(j=0;j<7;j++)
修改: (1)S0控制P1.0—P1.3的灯,S1控制P1.4—P1.7的灯。 (2)按下S0后,点亮8只LED;按下S1后,变为闪烁状态。

51单片机C语言程序(二)定时计数器中断

51单片机C语言程序(二)定时/计数器中断程序一利用定时/计数器T0从P1.0输出周期为1s 的方波,让发光二极管以1HZ闪烁,#include<reg52.h> //52单片机头文件#include <intrins.h> //包含有左右循环移位子函数的库#define uint unsigned int //宏定义#define uchar unsigned char //宏定义sbit P1_0=P1^0;uchar tt;void main() //主函数{TMOD=0x01;//设置定时器0为工作方式1TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;//开总中断ET0=1;//开定时器0中断TR0=1;//启动定时器0while(1);//等待中断产生}void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;tt++;if(tt==20){tt=0;P1_0=~P1_0;}}程序二利用定时/计数器T1产生定时时钟,由P1口控制8个发光二极管,使8个指示灯依次一个一个闪动,闪动频率为10次/秒(8个灯依次亮一遍为一个周期),循环。

#include<reg52.h> //52单片机头文件#include <intrins.h> //包含有左右循环移位子函数的库#define uint unsigned int //宏定义#define uchar unsigned char //宏定义sbit P1_0=P1^0;uchar tt,a;void main() //主函数{TMOD=0x01;//设置定时器0为工作方式1 TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;//开总中断ET0=1;//开定时器0中断TR0=1;//启动定时器0a=0xfe;while(1);//等待中断产生}void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;tt++;if(tt==2){tt=0;a=_crol_(a,1);}}程序三同时用两个定时器控制蜂鸣器发声,定时器0控制频率,定时器1控制同个频率持续的时间,间隔2s依次输出1,10,50,100,200,400,800,1k(hz)的方波#include<reg52.h> //52单片机头文件#include <intrins.h> //包含有左右循环移位子函数的库#define uint unsigned int //宏定义#define uchar unsigned char //宏定义sbit beep=P2^3;uchar tt;uint fre,flag;void main() //主函数{fre=50000;TMOD=0x11;//设置定时器0,定时器1为工作方式1TH0=(65536-fre)/256;TL0=(65536-fre)%256;TH1=(65536-50000)/256;TL1=(65536-50000)%256;EA=1;//开总中断ET0=1;//开定时器0中断ET1=1;TR1=1;TR0=1;//启动定时器0while(1);//等待中断产生}void timer0() interrupt 1 //定时器0中断{TR0=0; //进中断后先把定时器0中断关闭,防止内部程序过多而造成中断丢失TH0=(65536-fre)/256;TL0=(65536-fre)%256;tt++;if(flag<40) //以下几个if分别用来选取不同的频率{tt=0;fre=50000;beep=~beep;}if(flag>=40&&flag<80) {tt=0;fre=50000;beep=~beep;}if(flag>=80&&flag<120) {tt=0;fre=10000;beep=~beep;}if(flag>=120&&flag<160) {tt=0;fre=5000;beep=~beep;}if(flag>=160&&flag<200) {tt=0;fre=2500;beep=~beep;}if(flag>=200&&flag<240) {tt=0;fre=1250;beep=~beep;}if(flag>=240&&flag<280) {tt=0;fre=625;beep=~beep;}if(flag>=280&&flag<320) {tt=0;fre=312;beep=~beep;}if(flag>=320&&flag<360){tt=0;fre=156;beep=~beep;}TR0=1;}void timer1() interrupt 3 //定时器1中断用来产生2秒时间定时{TH1=(65536-50000)/256;TL1=(65536-50000)%256;flag++;if(flag==360){flag=0;fre=50000;}程序四用定时器以间隔500MS在6位数码管上依次显示0、1、2、3....C、D、E、F,重复。

KeilC51学习4按键外部中断

KeilC51学习4按键外部中断主板介绍:P3^2~P^5为四个按键;P1^0~P1^7为8个LED灯#include "reg52.h"//此⽂件中定义了单⽚机的⼀些特殊功能寄存器typedef unsigned int uint; //对数据类型进⾏声明定义typedef unsigned char u8;sbit k1=P3^5; //定义P31⼝是k1sbit led=P1^0; //定义P10⼝是led/******************************************************************************** 函数名 : delay* 函数功能 : 晶振11.0592M延时函数*******************************************************************************/void delay(uint z){uint i,j;for(j=z;j>0;j--)for(i=112;i>0;i--);}/******************************************************************************** 函数名 : keypros* 函数功能 : 按键处理函数,判断按键K1是否按下*******************************************************************************/void keypros(){if(k1==0){delay(50);if(k1==0) //再次判断按键是否按下led=~led; //led状态取反}while(!k1); //检测按键是否松开}/******************************************************************************** 函数名 : main* 函数功能 : 主函数* 输⼊ : ⽆* 输出 : ⽆*******************************************************************************/void main(){while(1){keypros(); //按键处理函数}}按键取反灯亮或灭计数器(计数器0⽤P3^4按钮,计数器1⽤P3^5按钮,不懂)/*-----------------------------------------------名称:计数器0论坛:编写:shifang⽇期:2009.5修改:⽆内容:通过外部按键计数进⼊中断执⾏LED取反------------------------------------------------*/#include<reg52.h> //包含头⽂件,⼀般情况不需要改动,头⽂件包含特殊功能寄存器的定义sbit LED=P1^0; //定义LED端⼝/*------------------------------------------------定时器初始化⼦程序(按钮P3^4控制,不知为什么)------------------------------------------------*/void Init_Timer0(void){TMOD |= 0x01 | 0x04; //使⽤模式1,16位计数器,使⽤"|"符号可以在使⽤多个定时器时不受影响TH0=0xFF; //给定初值TL0=245; //从245计数到255EA=1; //总中断打开ET0=1; //定时器中断打开}/*------------------------------------------------主程序------------------------------------------------*/main(){Init_Timer0();while(1);}/*------------------------------------------------定时器中断⼦程序------------------------------------------------*/void Timer0_isr(void) interrupt 1using1{TH0=0xFF; //重新给定初值TL0=245;LED=~LED; //指⽰灯反相,可以看到闪烁}计数器0/*-----------------------------------------------名称:计数器1论坛:编写:shifang⽇期:2009.5修改:⽆内容:通过外部按键计数进⼊中断执⾏LED取反------------------------------------------------*/#include<reg52.h> //包含头⽂件,⼀般情况不需要改动,头⽂件包含特殊功能寄存器的定义sbit LED=P1^0; //定义LED端⼝/*------------------------------------------------定时器初始化⼦程序------------------------------------------------*/void Init_Timer1(void){TMOD |= 0x10 | 0x40; //使⽤模式1,16位计数器,使⽤"|"符号可以在使⽤多个定时器时不受影响TH1=0xFF; //给定初值TL1=245; //从245计数到255EA=1; //总中断打开ET1=1; //定时器中断打开TR1=1; //定时器开关打开}/*------------------------------------------------主程序------------------------------------------------*/main(){Init_Timer1();while(1);}/*------------------------------------------------定时器中断⼦程序------------------------------------------------*/void Timer1_isr(void) interrupt 3{TH1=0xFF; //重新给定初值TL1=245;LED=~LED; //指⽰灯反相,可以看到闪烁}计数器1中断定义:当机器正在执⾏程序的过程中,⼀旦遇到⼀些异常或者特殊请求时,停⽌正在执⾏的程序转⼊必要的处理,处理完毕后,⽴即返回断点继续执⾏。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、中断允许控制
CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器
IE控制的。

▪ EX0(IE.0),外部中断0允许位;
▪ ET0(IE.1),定时/计数器T0中断允许位;
▪ EX1(IE.2),外部中断0允许位;
▪ ET1(IE.3),定时/计数器T1中断允许位;
▪ ES(IE.4),串行口中断允许位;
▪ EA (IE.7), CPU中断允许(总允许)位。

80C51单片机定时/计数器的工作由两个特殊功能寄存器控制。TMOD用于设置其工作
方式;TCON用于控制其启动和中断申请。
一、工作方式寄存器TMOD
工作方式寄存器TMOD用于设置定时/计数器的工作方式,低四位用于T0,高
四位用于T1。其格式如下:

GATE:门控位。GATE=0时,只要用软件使TCON中的TR0或TR1为1,就可以启
动定时/计数器工作;GATA=1时,要用软件使TR0或TR1为1,同时外部中断引脚INT0/1
也为高电平时,才能启动定时/计数器工作。即此时定时器的启动条件,加上了INT0/1引脚
为高电平这一条件。:定时/计数模式选择位。C/T =0为定时模式;C/T=1为计数模式。
M1M0:工作方式设置位。定时/计数器有四种工作方式,由M1M0进行设置。

TCON的低4位用于控制外部中断,已在前面介绍。TCON的高4位用于控制定时/计
数器的启动和中断申请。其格式如下:
▪ TF1(TCON.7):T1溢出中断请求标志位。T1计数溢出时由硬件自动置
TF1为1。CPU响应中断后TF1由硬件自动清0。T1工作时,CPU可随时查询TF1
的状态。所以,TF1可用作查询测试的标志。TF1也可以用软件置1或清0,同硬
件置1或清0的效果一样。
▪ TR1(TCON.6):T1运行控制位。TR1置1时,T1开始工作;TR1置0
时,T1停止工作。TR1由软件置1或清0。所以,用软件可控制定时/计数器的启
动与停止。
▪ TF0(TCON.5):T0溢出中断请求标志位,其功能与TF1类同。
▪ TR0(TCON.4):T0运行控制位,其功能与TR1类同。

3.3.5 定时/计数器应用举例
初始化程序应完成如下工作:
▪ 对TMOD赋值,以确定T0和T1的工作方式。
▪ 计算初值,并将其写入TH0、TL0或TH1、TL1。
▪ 中断方式时,则对IE赋值,开放中断。
▪ 使TR0或TR1置位,启动定时/计数器定时或计数。

定时器T0中断的初始化
TMOD=0x01; \\设定工作方式为16位定时器
TH0=(65536-50000)/256; \\赋定时器T0高四的值为50MS(对256求模)
TL0=(65536-50000)%256; \\赋定时器T0低四的值为50MS(对256求余)
EA=1; \\开总中断
ET0=1; \\开定时器T0中断
TR0=1; \\启动定时器T0

当定时器时间到产生中断就自动跳到以下中断函数,中断函数不需要做任何声明;
void timer0( ) interrupt 1 \\ 5个中断源的排序:0代表外部中断0中断 ,1代表
定时器/计数器0中断 ,2代表外部中断1中断, 3
代表定时器/计数器1, 4代表串行中断的中断

{
TH0=(65536-50000)/256; \\重装初值
TL0=(65536-50000)%256; \\重装初值
\\往下写CPU要处理的事情就OK了
}

中断响应条件
▪ 中断源有中断请求;
▪ 此中断源的中断允许位为1;
▪ CPU开中断(即EA=1)。
以上三条同时满足时,CPU才有可能响应中断。

P3.2口的外部中断
EA=1; //开总中断
EX0=1; //开外部中断0
//IT0=1; //当IT=0时为电平的外部中断触发方式,
当IT=1时位跳变沿外部中断触发方式
TCON=0x01; (这是对寄存器将IT置1,和IT0=1的效果是一样的)因
为TCON的地址是 可以被8整除,所以可以对其进行位
操作。

当符合外部中断的条件时执行下面的中断函数
void exter0() interrupt 0 \\ 5个中断源的排序:0代表外部中断0中断 ,1代表
定时器/计数器0中断 ,2代表外部中断1中断, 3
代表定时器/计数器1, 4代表串行中断的中断

{
\\这里下写CPU要处理的事情就OK了

}

相关文档
最新文档