-
2016-03-11 23:01:56
源程序:
#include<reg51.h>
#define LED P1
void delay(int x);
void light(int x);
void light1(int x);
void main()
{
IE=0x85;
IP=0x04;
TCON=0x05;
LED=0xff;
while(1)
{
delay(500);
LED=~LED;
}
}
void delay(int x)
{
int i,j;
for(i=0;i
for(j=0;j<120;j++);
}
void my_int0() interrupt 0
{
unsigned int saveLED;
saveLED=LED;
light(2);
LED=saveLED;
}
void my_int1() interrupt 2
{
unsigned int saveLED;
saveLED=LED;
light1(4);
LED=saveLED;
}
void light(int x)
{
int i,j;
for(i=0;i
{
LED=0xfe;
for(j=0;j<7;j++)
{
delay(500);
LED=(LED<<1)|0x01;
}
LED=0x7f;
for(j=0;j<7;j++)
{
delay(500);
LED=(LED>>1)|0x80;
}
delay(500);
}
}
void light1(int x)
{
int i,j;
for(i=0;i
{
LED=0xfe;
for(j=0;j<7;j++)
{
delay(500);
LED=(LED<<1)|0x01;
}
LED=0x7f;
for(j=0;j<7;j++)
{
delay(500);
LED=(LED>>1)|0x80;
}
delay(500);
}
}更多相关内容 -
51外部中断1电平触发
2018-03-17 12:25:4851单片机实现外部中断1电平触发 /*----------------------------------------------- 名称:外部中断0电平触发 论坛:www.doflye.net 编写:shifang 日期:2009.5 修改:无 内容:通过中断接口P3.2连接的独立... -
51 中断系统 外部中断0 外部中断1
2019-06-14 22:26:11EX0(IE.0),外部中断0允许位; ET0(IE.1),定时/计数器T0中断允许位; EX1(IE.2),外部中断0允许位; ET1(IE.3),定时/计数器T1中断允许位; ES(IE.4),串行口中断允许位; EA (IE.7), CPU中断允...51单片机的中断系统结构
中断允许控制
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中断允许(总允许)位。
中断请求标志
1、TCON的中断标志
IT0(TCON.0),外部中断0触发方式控制位。
当IT0=0时,为电平触发方式。
当IT0=1时,为边沿触发方式(下降沿有效)。
IE0(TCON.1),外部中断0中断请求标志位。
IT1(TCON.2),外部中断1触发方式控制位。
IE1(TCON.3),外部中断1中断请求标志位。
TF0(TCON.5),定时/计数器T0溢出中断请求标志位。
TF1(TCON.7),定时/计数器T1溢出中断请求标志位。
中断源
中断响应条件
中断源有中断请求;
n此中断源的中断允许位为1;
CPU开中断(即EA=1)。
以上三条同时满足时,CPU才有可能响应中断。
#include "reg51.h" #include "intrins.h" typedef unsigned char u8; typedef unsigned int u16; sbit k1=P3^3; sbit led=P2^0; void delay(u16 i) { while (i--); } //外部中断0条件 void Int0Init() { IT0 = 1; //设置外部中断的触发方式为下降沿触发。 EX0 = 1; //开启外部中断0 EA = 1; //中断总开关 } //外部中断1条件 void Int1Init() { IT1 = 1; //设置外部中断1的触发方式为下降沿触发。 EX1 = 1; //开启外部中断1 EA = 1; //中断总开关 } void main() { Int1Init(); while(1); } void Int0() interrupt 0 { delay(1000); if(k1 == 0) { led= ~led; } } void Int1() interrupt 2 { delay(1000); if(k1 == 0) { led= ~led; } }
proteus 8 电路原理图,k3接p32,k4接p33。p32默认高电平,按下k3后,电平拉低,产生下降沿,触发中断0。同样k4按下,触发为中断1。
#include "reg51.h" #include "intrins.h" typedef unsigned char u8; typedef unsigned int u16; sbit k3=P3^2; sbit k4=P3^3; sbit led=P2^0; void delay(u16 i) { while (i--); } //外部中断0条件 void Int0Init() { IT0 = 1; //设置外部中断的触发方式为下降沿触发。 EX0 = 1; //开启外部中断0 EA = 1; //中断总开关 } //外部中断1条件 void Int1Init() { IT1 = 1; //设置外部中断1的触发方式为下降沿触发。 EX1 = 1; //开启外部中断1 EA = 1; //中断总开关 } void main() { Int0Init(); while(1); } void Int0() interrupt 0 { delay(1000); if(k3 == 0) { led= ~led; } } void Int1() interrupt 2 { delay(1000); if(k4 == 0) { led= ~led; } }
-
51单片机学习——8.1外部中断0和1
2021-02-13 08:49:54外部中断0和1外部中断原理编程原理(外部中断0)代码实现 外部中断原理 外部中断0:(P3.2)可由IT0(TCON.0)选择其为低电平有效还是下降沿有效。当CPU检测到P3.2引脚上出现有效的中断信号时,中断标志IE0(TCON.1)置...外部中断0和1
外部中断原理
外部中断0:(P3.2)可由IT0(TCON.0)选择其为低电平有效还是下降沿有效。当CPU检测到P3.2引脚上出现有效的中断信号时,中断标志IE0(TCON.1)置1,向CPU申请中断。
外部中断1:(P3.3)可由IT1(TCON.2)选择其为低电平有效还是下降沿有效。当CPU检测到P3.3引脚上出现有效的中断信号时,中断标志IE1(TCON.3)置1,向CPU申请中断。编程原理(外部中断0)
- 首先我们对中断允许控制寄存器IE赋值,打开中断总开关,令EA=1.
- 然后我们还需要打开外部中断0的开关,令EX0=1
EX0(IE.0),外部中断0允许位;
ET0(IE.1),定时/计数器T0中断允许位;
EX1(IE.2),外部中断1允许位;
ET1(IE.3),定时/计数器T1中断允许位;
ES(IE.4),串行口中断允许位;
EA (IE.7), CPU中断允许(总允许)位。 - 最后再对中断请求标志TCON寄存器赋值,我们可以选择的外部中断0的触发方式有两种,一种是低电平触发方式,一种是下降沿的触发方式。如果选择低电平触发,则令IT0=0,如果选择下降沿触发,则令IT0=1。
IT0(TCON.0),外部中断0触发方式控制位。
当IT0=0时,为低电平触发方式。
当IT0=1时,为边沿触发方式(下降沿有效)。
IE0(TCON.1),外部中断0中断请求标志位。
IT1(TCON.2),外部中断1触发方式控制位。
IE1(TCON.3),外部中断1中断请求标志位。
TF0(TCON.5),定时/计数器T0溢出中断请求标志位。
TF1(TCON.7),定时/计数器T1溢出中断请求标志位。4.完成以上过程就完成了对中断系统的初始化 ,然后需要编程中断服务函数。格式如下:
void init0() interrupt 0 using m { 函数体 }
函数名(自定):init0
0:外部中断0的中断标号
m:寄存器组
在实际编程中using m 可省去
代码实现
通过独立按键来控制第一个led灯的亮灭
#include<reg52.h> typedef unsigned char u8; typedef unsigned int u16; sbit led1=P2^0; sbit K3=P3^2;//通过独立按键触发外部中断0 void intint0()//外部中断初始化 { EA=1; EX0=1; IT0=1; } void delay(u16 i)//延时函数 { while(i--); } void main() { intint0();//在主函数中调用初始化外部中断0 while(1); } void int0() interrupt 0 //中断服务函数 { delay(1000);//延时消抖 if(K3==0) { led1=~led1;//是第一个led灯状态反转 } }
-
外部中断和定时器中断
2018-11-20 13:53:278.外部中断实现代码 9.定时器/计数器中断工作原理 10.定时器/计数器定时值的计算 11.定时器/计数器实现代码 1.什么是中断 中断就是指CPU正在执行一项任务A,然后突然停止任务A去执行任务B,执行完任务B再回来...1.什么是中断
2.中断有什么用
3.双重功能的P3引脚
4.8051的 中断体系
5.中断特殊寄存器
6.中断的优先级
7.中断服务程序的编写
8.外部中断实现代码
9.定时器/计数器中断工作原理
10.定时器/计数器定时值的计算
11.定时器/计数器实现代码
1.什么是中断
中断就是指CPU正在执行一项任务A,然后突然停止任务A去执行任务B,执行完任务B再回来继续执行任务A的过程。
例如:你正在看电视,然后电话响了,你就停止看电视,跑去接电话,接完电话后由回来继续看电视。这个过程叫中断。
中断跟硬件有关。可以说是硬件来让单片机中断。2.中断有什么用
1.中断能让CPU同时执行多项任务,例如CPU在执行流水灯程序,就无法执行 按下按键时,蜂鸣器发声了。
2.当然上面的例子可以用软件轮询检擦案件是否按下来实现,但这样就消耗了CPU一部分资源来轮询检测 按键是否有按下了,所以中断的另一个优点就是
节省CPU资源
3.双重功能的P3引脚
由最小系统板的原理图可知,P3.0~P3.7的引脚对应着RXD,TXD,INTO,INT1,T0,T1等,说明P3引脚既是 I/O口,由有别的功能,这个功能就是中断功能。
4.8051中断体系
8051的单片机有5个中断源,2个优先级
由上图可知,INT0是通过引脚P3.2,INI1时通过引脚P3.3,定时器T0和T1是分别通过引脚P3.4和P3.5的
中断源:INT0(外部中断0),INT1(外部中断1),T0(定时器0),T1(定时器1),RXD和TXD(同属串口中断)中断相关的特殊寄存器:
(1)中断允许控制寄存器(IE)--------控制各中断的开放和屏蔽
(2)定时器/计数器控制寄存器(TCON)-------定时器和外部中断的控制
(3)串行口控制寄存器(SCON)-------串行中断的控制
(4)中断优先级控制寄存器(IP)-------设置各中断的优先级
各寄存器的控制范围如下图:从上图可看出从中断源产生请求到请求进入CPU的过程:
以INT0为例,INT0产生中断源,经过TCON寄存器中的IT0为选择是下边沿触发的还是低电平触发的中断请求(当然IT0是程序人工设置的),当中断请求到达IE0的时候,
IE0会被硬件置1(当CPU响应此中断请求时,IE0被硬件置0),然后就到 IE寄存器的地方了,EX0是外部中断INT0的开关,而 EA 是所有中断的总开关,这都由 IE寄存器
控制,最后经过 IP寄存器 设置优先级,这个一般比较少用,默认的优先级为,INT0 > T0 > INT1 > T1 >串口中断。最后把中断请求传给CPU。
5.中断特寄存器
TCON寄存器
IE寄存器
EA:中断的总开关,EA=1才能允许中断传给CPU
ES:串行口中断开关
ET1:定时器1中断开关
EX1:外部中断1开关
ET0:定时器0中断开关
EX0:外部中断0开关
IP优先级寄存器(对应为设置成1说明优先级设置成高,8051只有高低两种优先级)
6.中断的优先级
8051只有高低两种优先级,默认下优先级从高到低:INT0 > T0 > INT1 > T1 > 串行中断。
1.高优先级的中断可以打断低优先级的中断。
2.正在响应的中断,不能被同级或者低级的中断打断。
3.同时发生几个中断,先响应优先级高的中断
7.中断服务程序的编写
中断服务程序就是中断发生后,CPU去执行的函数。
1.中断服务函数没有返回值
2.中断服务函数不能传入参数
例如:void 函数名 (void) interrupt x using y
{
}
x 范围为0~4,分别代表5个中断源,例如外部中断INT0就是0,T0就是1,INT1就是2,T1就是3,串行中断就是4
y 的范围为0~3,分别表示4组工作寄存器,不写就用0. 不写也可以
8.外部中断实现代码
##includeinclude<reg52.h><reg52.h> sbit LED=P1^sbit LED=P 0; void main() { IT0=0; //中断触发方式为低电平触发,IT0=1则为下边沿触发 EX0=1; //打开外部中断0 EA=1; //打开中断总开关 while(1) { LED=1; //在没有中断发生时,LED关闭 } } void INTERR(void) interrupt 0 { LED=0;//有中断发生时,LED亮起 }
把开发板的P3.2用杜邦线接到GND上,就会触发中断,发现LED亮起来了。(为什么是P3.2?因为由最上面的原理图可知道INT0的引脚是P3.2)
9.定时器/计数器中断工作原理
1.由最上面的最小系统原理图可以看出,定时器T0和T1分别对应的引脚是P3.4和P3.5
2.定时器/计数器 的计数脉冲来源可以有两个,一个是芯片内部晶振振荡器输出脉冲12分频后的脉冲,一个是从外部接入的外部脉冲
3.TLx和THx寄存器,x=0,1。以TL0和TH0为例,TL0和TH0 都是8位寄存器(8051的寄存器都是8位),所以TL0和TH0形成高八位和低八位寄存器,用于计数,一共16位。
2^16=65536,所以 TL0和TH0加一起最大能计数的值是0~65536,一共65536.
4.定时器/计数器的两个寄存器:TCON和TMOD,其中TCON用于开启定时器/计数器中断,TMOD用于设置定时器/计数器的工作方式(TCON上面 已经说过了)TMOD寄存器:
(由图:低八位为定时器T0,高八位为定时器T1)
GATE:门控制。
当GATE=1:INTx引脚为高电平且TRx 要同时为1,定时器Tx才启动。
当GATE=0:只要TRx =1,定时器Tx就启动,不用理会INTx引脚的电平高低。
C/T:决定是使用 定时功能,还是 计数功能当C/T=0:定时功能。加1计数器对芯片晶振12分频的脉冲计数,一个脉冲过来,就加一,直到 TFx 加满了溢出。(TFx在TCON寄存器中)
当C/T=1:计数功能。加1计数器对来自输入引脚T0(P3.4)或T1(P3.5)的外部脉冲进行计数,一个脉冲加一,直到TFx加满溢出。M1和M0:工作方式选择位
M0 M1 工作方式 功能说明
0 0 方式0 13位定时器/计数器,最大计数为2^13 = 8192
0 1 方式1 16位定时器/计数器,最大计数为2^16 = 65536
1 0 方式2 自动重载8位定时器/计数器,最大计数为 2^8 = 256
1 1 方式3 T0分为2个独立的8位独立计数器,T1停止工作10.定时器/计数器定时数值的计算
例:我要定时10ms。晶振频率是12M,工作模式在方式1
f = 12M/12 =1M (因为要12分频),也就是说 1秒 1000000个机器周期,10ms有10000个机器周期。
65536 - 10000 = 55536 ,意思是 计数器从65536 一直减到 55536 所用的时间就是10ms。
55536的十六进制是0xD8F0
所以设置 TH0 = 0XD8,TL0=0XF0
下面给出代码
或者直接下载一个C51定时器计算器:
11.定时器/计数器代码
#include<reg52.h> sbit LED0=P1^0; unsigned char i; void main() { TMOD=0X01; //设置使用定时器0,16位的定时/计数寄存器 TL0=0xD8; //低八位赋初值 TH0=0XF0; //高八位赋初值 ET0=1; //开启定时器0中断 TR0=1; //运行定时器0 EA=1; //开启中断总开关 while(1); } void Delay(void) interrupt 1 using 0 { i++; TR0=0; //进入中断函数时,关闭定时器 TL0=0XD8; //重新赋初值 TH0=0XF0; if(i==20) //因为10ms一次处罚看不出明显结果,所以让20次触发才让灯变一次 { LED0=~LED0; } TR0=1; //重新开启定时器 }
-
用汇编语言要求用外部中断零制作一个流水灯
2021-05-23 10:27:08满意答案dky15832016.01.11采纳率:46%等级:7已帮助:260人ORG 0000HLJMP MAINORG 0003HLJMP LEDSTORG 0100HMAIN:CLR IT0SETB EASETB EX0MAINLOOP: MOV A,#0FFHCLR CMAINLOOP1:CALL DELAYRLC AMOV P1,ASJMP MAINLOO... -
51单片机:中断系统(外部中断,定时器中断,串口通信)
2022-05-27 18:15:12中断系统简介: 中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的,中断功能的存在,很大程度上提高了单片机处理外部...外部中断0:INT0 √ 外部中断1:INT1 √ 外部中断2:INT2 外部中断3:INT3... -
外部中断,定时器中断的理解
2021-04-25 23:20:53外部中断 外部中断一般是由计算机外设发出的中断请指求,如:键盘中断、打印机中断、定时器中断等。外部中断一般指io高低电平来触发并响应io中断函数 定时器中断 定时器中断是指计数器在晶振的...1:先说外部中断 ... -
快速复习51单片机的外部中断、计数/定时器中断和串行口中断,加代码实现
2021-09-13 15:12:32SBUF是像是李信,光信和暗信是一个英雄,但是有不同的技能和外观。 -
外部中断和内部中断详解
2017-09-06 17:59:40中断基本概念 什么是中断?先打个比方。...计算机科学家观察了类似实例,“外师物化,内得心源”,借用了这些思想、处理方式和名称,研制了一系列中断服务程序及其调度系统。 中断是CPU处理外部突发事件 -
定时器外部中断
2021-01-18 20:49:42外部时钟模式1:外部输入脚(TIx) 外部时钟模式2:外部触发输入(ETR)(仅适用TIM2,3,4) 内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频... -
外部中断和内部中断 硬中断 软中断 中断下半部
2018-01-09 15:51:24重要声明: 以下代码有粘贴 截取他人劳动成果的成分 如有...它能使CPU在运行过程中对外部事件发出的中断请求及时地进行处理,处理完成后又立即返回断点,继续进行CPU原来的工作。引起中断的原因或者说发出中断请求的 -
树莓派从零开始快速入门第7讲——外部中断
2021-08-06 15:42:07前面两节介绍了LED灯和按键输入,那么这一讲就基于按键学习一下外部中断,目标是通过按键控制LED开灯和关灯。 -
89C51单片机之外部中断0、1控制LED
2020-03-22 18:37:0689C51单片机之外部中断0、1控制LED 1.proteus仿真图 2.keli代码 #include <reg51.h> sbit led1=P0^0; sbit led2=P1^0; //外部中断0控制程序 void INT0test() interrupt 0 { led1=~led1; } //外部中断1... -
stm32——外部中断及中断概念小讲(一)(初学者参考)
2020-10-19 23:44:52下一篇内容会涉及外部中断的配置代码、中断处理函数的编写, 下下篇会围绕中断控制器展开,涉及“中断向量表”和“中断嵌套”的内容。 前言 写《stm32基础项目——智能小车(红外避障)》时发现,对零基础的学弟学妹... -
51单片机(二十八)—— 外部中断实验
2020-03-06 11:12:21一、外部中断介绍 ...INT1—外部中断1,由P33端口线引入,低电平或下降沿触发中断。 T0—定时器/计数器0中断,由T0计数器计满回零引起。 T1—定时器/计数器1中断,由T1计数器计满回零引起。 T2—... -
11.51单片机外部中断实验
2021-10-25 09:58:121.编程实现无中断时,发光二极管常亮,有外部中断时左移。 2.完成以下功能及验证: ①编程实现无中断时,发光二极管常亮,有外部中断时左移,有外部中断时右移。 ②验证中断查询的自然优先顺序(写出验证方法及... -
RT-Thread零基础快速入门第5讲——外部中断
2020-04-11 23:08:05RT-Thread零基础快速入门第6讲——外部中断 一、前言 这一讲,我要讲的是外部中断,也不知道是太简单了还是没有人用,我没找到比较完整的关于RT-thread外部中断的教程,只发现RT-thread文档中心的PIN设备里面有提及... -
AT89C51单片机外部中断
2020-11-27 22:12:30C51单片机外部中断调用P3...IT1:外部中断1触发方式设置位,IT1=1下降沿触发,IT1=0低电平触发; 外部中断0中断服务程序的编写: void 函数名()interrupt 0 { } 外部中断1中断服务程序的编写: void 函数名()inte -
外部中断和内部中断【转】
2019-01-20 14:02:44中断基本概念 什么是中断?先打个比方。...计算机科学家观察了类似实例,“外师物化,内得心源”,借用了这些思想、处理方式和名称,研制了一系列中断服务程序及其调度系统。 中断是CPU处理外部突发事件... -
c51单片机之外部中断实验(利用外部中断实现按键控制显示数字实现设置、加一、减一功能)
2021-06-10 19:41:42} } void int1_0() interrupt 2{ //外部中断1服务程序 if(TR1==1) z=0; else z=1; TR1=0; if(TL1>0){ TL1=TL1-1; //计数值减一 } else{ TL1=0; TR1=0; } if(z==0) TR1=1; else if(z==1) TR1=0; } void int1_3() ... -
【STM32】外部中断实验代码详解
2021-09-22 20:59:36文章目录exit.c exit.c #include "exti.h" ...//外部中断初始化函数 void EXTIX_Init(void) { EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(R -
51单片机复习:外部中断,定时器/计数器中断
2019-04-09 21:11:00中断: 什么是中断,就是打断,你一开始在做一件事,突然意外发生...件意外(中断服务),处理完意外后你继续做刚才那件事(中断返回),这就是中断,而单片机中的中断也是如此, 单片机中有五个中断源,两个优先级... -
51单片机外部中断0实例详解
2020-02-14 11:47:49外部中断1 定时器1中断 串口中断 每一个中断都对应一个中断向量,中断向量表如下所示: 2 什么是中断事件 当中断发生时单片机将正在执行的程序暂时放下而去处理中断事件,当中断事件处理完毕后再接着去处理之前的... -
ESP32的电容touch和外部中断
2022-04-26 17:21:33ESP32的电容touch和外部中断 代码编写 #include <Arduino.h> // 定义外部中断的Mode // 0: 无中断,读取Touch值 // 1:Touch中断,执行 TouchEvent() // 2: 外部IO的中断 #define EXT_ISR_MODE 0 void ... -
从零开始ZigBee学习(3)——外部中断
2021-09-19 10:11:10中断函数: PxIFG的位数与PxIEN的位数对应 二、代码 #include<iocc2530.h> // P0_5是一个按键 void delay() { int i,j; for(i=0;i<1000;i++) for(j=0;j<30;j++); } void main() { P0SEL &... -
51单片机中外部中断使用示例(Protues仿真)
2021-10-28 09:32:14中断的概念: CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生)... 2、INT1——外部中断1,由P3.3端口引入,低电平或下降沿引起。默认优先级第二 3、T0——定时器/计数器0中断,由T0计数器计 -
外部中断及其中断优先级管理
2018-06-26 20:10:41一、外部中断的一般配置 ①初始化IO口为输入 GPIO_Init(); ②开启IO口复用时钟 RCC_APB2PeriphClockCmg(RCC_APB2Periph_AFIO,ENABLE) ③设置IO口与中断线的映射关系 void GPIO_EXTILineConfig(); ... -
基于AT89C51的外部中断INT0(汇编语言)
2020-07-09 17:15:59外部中断 功能: 八个LED灯D1到D8依次循环点亮,按下按键跳转到中断服务程序,此时8个LED灯全部熄灭,D9闪烁三次,然后返回主程序。 仿真图: 汇编代码: ORG 0000H LJMP START ORG 0003H LJMP INSER ... -
10.80c51外部中断 按键翻转LED
2021-11-23 20:23:53在我理解,外部中断要用的话,首先得开启总中断开关即(EA=1),而后打开外部中断允许(即EX0=1),最后选择外部中断触发方式(IT0,为0则为低电平触发,为1则为下降沿触发),以下为外部中断0的实现按键按下LED灯...