51单片机中断程序大全
51单片机中断实验连接图及程序

实验五、中断实验
1、实验目的:了解单片机的中断系统,学习汇编语言中断程序的编程方法与调试技巧。
2、实验内容:单片机的INT0和INT1分别接了两个外部中断,当INT0引脚有中断时,点亮发光二极管D1,当INT1引脚有中断时,点亮发光二极管D2。
3、实验程序框图
4、实验电路图
5、实验步骤:SW1从高电平变为低电平时,点亮发光二极管D1;SW2从高电平变为低电
平时,点亮发光二极管D2。
调试程序,并运行。
观察发光二极管点亮情况。
6、思考:程序中的外部中断的触发方式是哪一种?修改程序使外部中断的触发方式改变。
7、程序清单:
ORG 0000H
AJMP MAIN
ORG 0003H
AJMP SERVE
ORG 0013H
AJMP SERVE1
MAIN: ORL P1 , #0FFH ;;灯全灭,准备读入SETB IT0; ;选择边沿触发方式
SETB EX0; ;允许INT0中断
SETB IT1; ;选择边沿触发方式SETB EX1; ;允许INT0中断
SETB EA ;;CPU开中断
AJMP $ ;;等待中断
;中断服务子程序为:
SERVE: MOV A,#0F7H
MOV P1,A
RETI
SERVE1: MOV A,#0EFH
MOV P1,A
RETI。
51单片机中断实施的步骤

51单片机中断实施的步骤介绍中断是指在程序运行的过程中,当发生特定条件的时候,中断会打断程序的正常执行,转而执行中断服务程序。
51单片机中断实施的步骤可以帮助开发者合理地利用中断的功能,提高程序的灵活性和效率。
本文将详细介绍51单片机中断实施的步骤。
步骤一:设置中断向量表中断向量表是存放中断服务程序入口地址的一组地址。
首先,需要用特定的指令将中断服务程序的入口地址存入中断向量表的相应位置。
51单片机具有8个中断源,对应的中断向量表从0x0003~0x001B,每个中断源有两个地址,分别为中断入口地址和重定向入口地址。
步骤二:开放中断在51单片机中,中断允许位和中断优先级相互影响,因此在开放中断之前,需要设置好相关的中断优先级和中断允许位。
设置中断优先级的方法有两种,一种是通过设置中断允许位的方式,另一种是通过设置寄存器中的优先级位的方式。
步骤三:编写中断服务程序中断服务程序是在中断发生时执行的一段特定的代码。
在编写中断服务程序时,需要注意以下几点: - 中断服务程序必须使用org指令指定入口地址,保证程序正确执行; - 中断服务程序中不应该包含太长的延时和大量的计算; - 中断服务程序中可以操作的寄存器有限,需要仔细查看相关的资料。
步骤四:设置中断允许位为了使中断能够正常工作,需要在中断实施前设置相关的中断允许位。
在51单片机中,P33为总中断允许位,P34为定时器0中断允许位,P3^5为定时器1中断允许位,以此类推。
设置中断允许位的代码如下:EA=1; // 总中断允许位ET0=1; // 定时器0中断允许位ET1=1; // 定时器1中断允许位...步骤五:配置中断源在实施中断之前,需要配置好中断源。
在51单片机中,中断源可以是外部中断、定时器中断、串口中断等等。
配置中断源的代码如下:IT0=1; // 外部中断0下降沿触发IT1=0; // 外部中断1低电平触发...步骤六:启动中断通过设置中断允许位和配置中断源后,即可启动中断。
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,重复。
51单片机中断系统程序实例

51单片机中断系统程序实例(STC89C52RC)51单片机有了中断,在程序设计中就可以做到,在做某件事的过程中,停下来先去响应中断,做别的事情,做好别的事情再继续原来的事情。
中断优先级是可以给要做的事情排序。
单片机的学习不难,只要掌握学习方法,学起来并不难。
什么是好的学习方法呢,一定要掌握二个要点:1. 要知道寄存器的英文全拼,比如IE = interrupt中断不知道全拼,要去猜,去查。
这样就可以理解为什么是这个名称,理解了以后就不用记忆了。
2. 每个知识点要有形像的出处比如看到TF0,脑子里马上要形像地定位到TCON寄存器的某位看到ET0, 马上要形像地定位到IE寄存器的第2位/tuenhai/独家揭秘:形像是记忆的最大技巧。
当人眼看到某个图时,是把视觉信号转化成电信号,再转化成人能理解的形像。
当我们回忆形像时,就是在重新检索原先那个视觉信号,并放大。
在学习过程中,不断练习检索、放大信号,我们的学习能力就会越来越强。
写程序代码时,也要把尽量把每行代码形像化。
51单片机内中断源8051有五个中断源,有两个优先级。
与中断系统有关的特殊功能寄存器有IE(中断允许寄存器)、IP(中断优先级控制寄存器)、中断源控制寄存器(如TCON、SCON的有关位)。
51单片机的中断系统结构如下图(注意,IF0应为TF0):8052有6个中断源,它比8051多一个定时器/计数器T2中断源。
8051五个中断源分别是:(1)51单片机外部中断源8051有两个外部中断源,分别是INT0和INT1,分别从P3.2和P3.3两个引脚引入中断请求信号,两个中断源的中断触发允许由TCON的低4位控制,TCON的高4位控制运行和溢出标志。
INT0也就是Interrupt 0。
在这里应该看一下你的51单片机开发板的电路原理图。
离开形像的记忆是没有意义的。
读到上面这句,你应该回忆起原理图上的连接。
任何记忆都转化为形像,这是学习的根本原理,我们通过学习单片机要学会这种学习方法,会让你一辈子受益无穷。
51单片机中断说明及初始化程序

//与定时计数功能和终端功能相关的寄存器共四个,分别为TMOD,TCON,IE,IP,其中TMOD是定时计数功能专用的寄存器,高四位//控制定时器1,低四位控制定时器0;TCON高四位控制定时计数功能,为运行控制位和中断标志位;低四位控制外中断功能,为//中断触发方式控制位和中断标志控制位;IE是各个中断(两个外中断,两个定时器中断和一个串行口中断)允许和总中断允许控//制寄存器;IP为中断优先级控制寄存器,从IP.0--IP.4共五个,从高到低分别控制串行口、定时器1、外中断1、定时器0、外中//断0,谁为1,谁就为高优先级,若都为0或都为1,则按自然优先级来,自然优先级为:外0,定0,外1,定1,串行口;ORG 00HAJMP MAINORG 000BH //定时器0入口地址AJMP TIMER0ORG 001BH //定时器1入口地址AJMP TIMER1ORG 03H //外中断0入口地址AJMP WAI0ORG 13H //外中断1入口地址AJMP WAI1ORG 60HMAIN:MOV SP,#5FHMOV P0,#00HSETB EA //开总中断MOV IP,#06 //设置优先级CALL DINGSHI0CALL JISHU1CALL WAIQ0CALL WAIQ1AJMP $TIMER0:CPL P0.0MOV TH0,#3CHMOV TL0,#0B0HRETITIMER1:CPL P0.1MOV TH0,#3CHMOV TL0,#0B0HRETIWAI0:CPL P0.2RETIWAI1:CPL P0.3RETIDINGSHI0:MOV TMOD,#01H //工作于方式1,16位定时 MOV TH0,#3CHMOV TL0,#0B0HSETB ET0 //开定时器0中断SETB TR0 //定时器0运行控制位RET//计数器0驱动JISHU0:MOV TMOD,#04H //工作于计数方式MOV TH0,#255MOV TL0,#250 //计到10个脉冲产生一次中断 SETB ET0 //开定时器0中断SETB TR0RET//定时器1驱动DINGSHI1:MOV TMOD,#16 //工作于方式1,16位定时MOV TH1,#3CHMOV TL1,#0B0HSETB ET1SETB TR1RETJISHU1:MOV TMOD,#64 //工作于计数方式MOV TH0,#255MOV TL0,#250SETB ET0SETB TR0RET//外中断0驱动WAIQ0:SETB IT0 //下降沿触发,若为0则为低电平触发 SETB EX0 //开启中断RET//外中断1驱动WAIQ1:SETB IT1SETB EX1RETEND。
单片机中断程序大全

使用定时器TO的模式1
TH0=(65536-46083)/256;//定时器TO的高8位赋初值
TL0=(65536-46083)%256;//定时器TO的高8位赋初值
TR0=1;//启动定时器T0
TF0=0;
P2=0xff;
while(1)//无限循环等待查询{
while(TF0==0)
TF0=0;
P2=~P2;
TH0=(65536-46083)/256;//定时器T0的高8位赋初值
TL0=(65536-46083)%256;//定时器T0的高8位赋初值
}
}
#include<>//包含51单片机寄存器定义的头文件
sbit sou nd=P3^7;//将sou nd位定义为引脚
/**************************************************************函数功能:主函数
{
EA=1;//
ETO=1;//
TMOD=OxO1;//
THO=(65536-46O83)/256;//
TLO=(65536-46O83)%256;//
TRO=1;//
while(1)//无限循环等待中断
}
/**************************************************************函数功能:定时器TO的中断服务程序
{
D1=~D1;//按位取反操作,将引脚输出电平取反
TH0=(65536-46083)/256;//定时器TO的高8位重新赋初值
TL0=(65536-46083)%256;//定时器TO的高8位重新赋初值
51单片机中断总结-马强

51单片机中断总结-马强51单片机中断总结-马强Yybmec51单片机中断系统5个中断源:2个外部中断请求INT0和INT1、2个片内定时器/计数器T0和T1的溢出中断请求串行口中断请求TI 或RI(合为一个中断源)51单片机中断级别中断源INIT0---外部中断0T0---定时器/计数器0中断INIT1---外部中断1T1----定时器/计数器1中断TI/RI---串行口中断T2---定时器/计数器2中断默认中断级别最高第2第3第4第5最低序号(C语言用)012345中断允许寄存器IE位序号符号位DB7EADB6-------DB5ET2DB4ESDB3ET1DB2EX1DB1ET0DB0EX0EA---全局中允许位。
EA=1,打开全局中断控制,在此条件下,由各个中断控制位确定相应中断的打开或关闭。
EA=0,关闭全部中断。
-------,无效位。
ET2---定时器/计数器2中断允许位。
ET2=1,打开T2中断。
ET2=0,关闭T2中断。
ES---串行口中断允许位。
ES=1,打开串行口中断。
ES=0,关闭串行口中断。
ET1---定时器/计数器1中断允许位。
ET1=1,打开T1中断。
ET1=0,关闭T1中断。
EX1---外部中断1中断允许位。
EX1=1,打开外部中断1中断。
EX1=0,关闭外部中断1中断。
ET0---定时器/计数器0中断允许位。
ET0=1,打开T0中断。
ET0=0,关闭T0中断。
EX0---外部中断0中断允许位。
EX0=1,打开外部中断0中断。
EX0=0,关闭外部中断0中断。
中断优先级寄存器IP位序号DB7DB6DB5DB41DB3DB2DB1DBYybmec位地址---------PSPT1PX1PT0PX0-------,无效位。
PS---串行口中断优先级控制位。
PS=1,串行口中断定义为高优先级中断。
PS=0,串行口中断定义为低优先级中断。
PT1---定时器/计数器1中断优先级控制位。
单片机中断51单片机中断应用(全)

单片机中断:51单片机中断应用(全)
疯狂代码 / ĵ:http://NetworkProgramming/Article25409.html
/*****一直想把51的中断做一个总结,总是没有什么时间或被什么事给中断,现在终于弄好了^_^*****/ /*******最近一直做32位的,8位的都快忘记得差不多了,写在这里也好想用的时候有个地方查*******/ /************************************************************ *51单片机各中断初始化及子程序模板,几乎包括了传统51单片机的全部中断 *1、外部中断0 *2、定时器中断0 *3、外部中断1 *4、定时器中断1 *5、串行中断 *6、定时器中断2---本中断在52时才有 *在使用定时中断的时候需要根据实际需要重设定时器的初值和工作方式 *在串行通讯中,使用11.0592M晶振,通讯波特率为9600bps *为了保证文件的单一和方便保存,本项目只用了一个文件, *************************************************************/ #include<reg52.h>/*如果是使用51单片机,则应该是reg51.h,且不能使用定时器2*/ #include<intrins.h>/*以下两个包含文件在本代码中实际不需要,但经常用到,所以列出*/ #include<absacc.h>
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
. . //实例42:用定时器T0查询方式P2口8位控制LED闪烁 #include // 包含51单片机寄存器定义的头文件 /************************************************************** 函数功能:主函数 **************************************************************/ void main(void) { // EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x01; //使用定时器T0的模式1 TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%256; //定时器T0的高8位赋初值 TR0=1; //启动定时器T0 TF0=0; P2=0xff; while(1)//无限循环等待查询 { while(TF0==0) ; TF0=0; P2=~P2; TH0=(65536-46083)/256; //定时器T0的高8位赋初值 . . TL0=(65536-46083)%256; //定时器T0的高8位赋初值 } }
//实例43:用定时器T1查询方式控制单片机发出1KHz音频 #include // 包含51单片机寄存器定义的头文件 sbit sound=P3^7; //将sound位定义为P3.7引脚 /************************************************************** 函数功能:主函数 **************************************************************/ void main(void) { // EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x10; //使用定时器T1的模式1 TH1=(65536-921)/256; //定时器T1的高8位赋初值 TL1=(65536-921)%256; //定时器T1的高8位赋初值 TR1=1; //启动定时器T1 TF1=0; while(1)//无限循环等待查询 { . . while(TF1==0) ; TF1=0; sound=~sound; //将P3.7引脚输出电平取反 TH1=(65536-921)/256; //定时器T0的高8位赋初值 TL1=(65536-921)%256; //定时器T0的高8位赋初值 } }
//实例44:将计数器T0计数的结果送P1口8位LED显示 #include // 包含51单片机寄存器定义的头文件 sbit S=P3^4; //将S位定义为P3.4引脚 /************************************************************** 函数功能:主函数 **************************************************************/ void main(void) { // EA=1; //开总中断 // ET0=1; //定时器T0中断允许 TMOD=0x02; //使用定时器T0的模式2 TH0=256-156; //定时器T0的高8位赋初值 . . TL0=256-156; //定时器T0的高8位赋初值 TR0=1; //启动定时器T0 while(1)//无限循环等待查询 { while(TF0==0) //如果未计满就等待 { if(S==0) //按键S按下接地,电平为0 P1=TL0; //计数器TL0加1后送P1口显示 } TF0=0; //计数器溢出后,将TF0清0
} }
//实例45:用定时器T0的中断控制1位LED闪烁 #include // 包含51单片机寄存器定义的头文件 sbit D1=P2^0; //将D1位定义为P2.0引脚 /************************************************************** 函数功能:主函数 **************************************************************/ void main(void) { . . EA=1; //开总中断 ET0=1; //定时器T0中断允许 TMOD=0x01; //使用定时器T0的模式2 TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%256; //定时器T0的高8位赋初值 TR0=1; //启动定时器T0 while(1)//无限循环等待中断 ; } /************************************************************** 函数功能:定时器T0的中断服务程序 **************************************************************/ void Time0(void) interrupt 1 using 0 //“interrupt”声明函数为中断服务函数 //其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器 { D1=~D1; //按位取反操作,将P2.0引脚输出电平取反 TH0=(65536-46083)/256; //定时器T0的高8位重新赋初值 TL0=(65536-46083)%256; //定时器T0的高8位重新赋初值 } . . //实例46:用定时器T0的中断实现长时间定时 #include // 包含51单片机寄存器定义的头文件 sbit D1=P2^0; //将D1位定义为P2.0引脚 unsigned char Countor; //设置全局变量,储存定时器T0中断次数 /************************************************************** 函数功能:主函数 **************************************************************/ void main(void) { EA=1; //开总中断 ET0=1; //定时器T0中断允许 TMOD=0x01; //使用定时器T0的模式2 TH0=(65536-46083)/256; //定时器T0的高8位赋初值 TL0=(65536-46083)%256; //定时器T0的高8位赋初值 TR0=1; //启动定时器T0 Countor=0; //从0开始累计中断次数 while(1)//无限循环等待中断 ; } /************************************************************** 函数功能:定时器T0的中断服务程序 . . **************************************************************/ void Time0(void) interrupt 1 using 0 //“interrupt”声明函数为中断服务函数 //其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器 { Countor++; //中断次数自加1 if(Countor==20) //若累计满20次,即计时满1s { D1=~D1; //按位取反操作,将P2.0引脚输出电平取反 Countor=0; //将Countor清0,重新从0开始计数 } TH0=(65536-46083)/256; //定时器T0的高8位重新赋初值 TL0=(65536-46083)%256; //定时器T0的高8位重新赋初值 }
//实例47:用定时器T1中断控制两个LED以不同周期闪烁 #include // 包含51单片机寄存器定义的头文件 sbit D1=P2^0; //将D1位定义为P2.0引脚 sbit D2=P2^1; //将D2位定义为P2.1引脚 unsigned char Countor1; //设置全局变量,储存定时器T1中断次数 . . unsigned char Countor2; //设置全局变量,储存定时器T1中断次数 /************************************************************** 函数功能:主函数 **************************************************************/ void main(void) { EA=1; //开总中断 ET1=1; //定时器T1中断允许 TMOD=0x10; //使用定时器T1的模式1 TH1=(65536-46083)/256; //定时器T1的高8位赋初值 TL1=(65536-46083)%256; //定时器T1的高8位赋初值 TR1=1; //启动定时器T1 Countor1=0; //从0开始累计中断次数 Countor2=0; //从0开始累计中断次数 while(1)//无限循环等待中断 ; } /************************************************************** 函数功能:定时器T1的中断服务程序 **************************************************************/ void Time1(void) interrupt 3 using 0 //“interrupt”声明函数为中断服务函数