-
中断(外部中断0、外部中断1、定时器中断0、定时器中断1)
2020-07-17 08:36:37若IT0=0,则为低电平触发 若IT0=1,则为下降沿触发 外部中断0初始化: 初始化方法一: void Init_INT0() { IT0=1;//设置外部中断0;下降沿触发 EX0=1;//开启外部中断0; EA=1;//开启中断总开关 } 初始 化...中断
TMOD:定时器/计数器工作方式寄存器
TCON:定时器/计数器控制寄存器
IE:中断允许控制寄存器
IP:中断优先级控制寄存器
外部中断0
外部0中断触发:(P3.2口触发;P3.2触发;P3.2触发)
若IT0=0,则为低电平触发
若IT0=1,则为下降沿触发
外部中断0初始化:
初始化方法一:
void Init_INT0() { IT0=1;//设置外部中断0;下降沿触发 EX0=1;//开启外部中断0; EA=1;//开启中断总开关 } 初始
化方法二:
void Init_INT0() { TCON=TCON|0x01;//0000 0001->0x01相当IT0=1;设置下降沿触发中断 IE=0x81;//1000 0001->0X81; //第一个1是EA=1;即中断总开关 //第二个1是EX0=1;即中断分支开关 } 外部0
中断子函数:
void RSI_INT0() interrupt 0 { P0=~P0;//当触发中P0口的LED取反 }
主函数:
void main() { P0=0xff;//灯全熄灭 Init_INT0();//初始化外部中断0 while(1); }
外部中断1:
外部1中断触发:(
P3.3口触发;P3.3触发;P3.3触发
)若IT1=0,则为低电平触发
若IT1=1,则为下降沿触发
外部中断1初始化:
方法一:
void Init_INT1() { IT1=1;//设置外部中断1;下降沿触发 EX1=1;//开启外部中断1; EA=1;//开启中断总开关 }
方法二:
void Init_INT1() { // IT1=1;//设置下降沿触发 // EX1=1;//外部中断1的分支开关 // EA=1;//中断总开关 TCON=TCON|0x04;//0000 0100->0x04相当IT1=1;设置下降沿触发 IE=0x84;//IE=1000 0100->0x84 //第一个1相当EA=1;第二个1相当EX1=1 } 外部1
中断子函数:
void ISR_Int1() interrupt 2 { P0=~P0;//取反 }
主函数:(P3.3给了下降沿,软件触发)
void main() { P0=0xff;//熄灭所有的灯 Init_INT1();//外部中断1初始化 while(1){ Int1=1; Int1=0;//P3.3由1->0;下降沿触发 } }
该主函数可进行Dobug,查看函数的走向。
例题:(中断嵌套)
利用外部中断0,进行3次流水灯;
利用外部中断1,进行3次闪耀;
且外部中断1的优先级高于外部中断1。
不进行中断时LED灯处于熄灭状态。
#include <reg51.h> //延时程序 void delay() { int i,j; for(i=0;i<10;i++) for(j=0;j<3000;j++); } //外部中断0和1初始化 void Init_INT01() { TCON=TCON|0x05;//0000 0101->0x01相当IT0=1,IT1=1;设置下降沿触发中断 IE=0x85;//1000 0101->0X85; //第一个1是EA=1;即中断总开关 //第二个1是EX1=1;即中断1分支开关 //第二个1是EX0=1;即中断0分支开关 IP=IP|0x04;//设置外部中断1优先级高于外部中断0 } //LED右移程序 void lelf(unsigned int n) { unsigned int i,j; for(i=0;i<n;i++) { for(j=0;j<8;j++) { P0=~(0x80>>j); delay(); } } P0=0xff; } //闪耀程序 void flash(unsigned int n) { unsigned int i; for(i=0;i<n;i++) { P0=~P0; delay(); } } void main() { Init_INT01(); while(1); } //外部中断0子程序 void out_INT0() interrupt 0 { lelf(3); } //外部中断1子程序 void out_INT1() interrupt 2 { flash(4); }
定时器0中断:
中断触发:
定时/计数时间到触发中断
定时/计数原理:
脉冲下降沿,定时器/计数的值加 1
初始化程序:
//定时器/计数器0初始化void tminer0_Init() { TMOD&=0XFC;//选择定时模式C/T=0;计数模式C/T=1; TMOD|=0x01;//选择定时器0;工作模式1,16位定时/计数 TH0=0xFF; //装初值 TL0=0xFE; //定时1us ET0=1; //定时器0开关 EA=1; //中断总开关 TR0=1; //启动定时器0 }
中断子程序:
//定时器中断0子程序 void time0() interrupt 1 { TH0=0xFF;//重新装初值 TL0=0xFE;//定时1us P0=~P0; }
主程序:
void main() { tminer0_Init(); while(1); }
定时器1中断:
#include <reg51.h> //定时器/计数器1初始化 void tminer1_Init() { TMOD&=0XCF;//选择定时模式C/T=0;计数模式C/T=1; TMOD|=0x10;//选择定时器1;工作模式1,16位定时/计数 TH1=0xFF;//装初值 TL1=0xFE;//定时1us ET1=1;//定时器1开关 EA=1;//中断总开关 TR1=1;//启动定时器1 } void main() { tminer1_Init(); while(1); } //定时器中断1子程序 void time0() interrupt 3 { TH1=0xFF;//重新装初值 TL1=0xFE;//定时1us P0=~P0; }
-
AT89C51单片机外部中断
2020-11-27 22:12:30IT0:外部中断0触发方式设置位,IT0=1下降沿触发,IT0=0低电平触发; IE1:外部中断请求1标志位; IT1:外部中断1触发方式设置位,IT1=1下降沿触发,IT1=0低电平触发; 外部中断0中断服务程序的编写: void 函数名...C51单片机外部中断调用P3_2 ,P3_3口。
中断方式有两种,分别为电平方式和脉冲方式。
中断请求有0和1。中断总允许为EA=1,
IE0:外部中断请求0标志位;
IT0:外部中断0触发方式设置位,IT0=1下降沿触发,IT0=0低电平触发;
IE1:外部中断请求1标志位;
IT1:外部中断1触发方式设置位,IT1=1下降沿触发,IT1=0低电平触发;
外部中断0中断服务程序的编写:void 函数名()interrupt 0 { }
外部中断1中断服务程序的编写:
void 函数名()interrupt 2 { }
参考实验程序(主程序为P1口输出跑马灯程序),编写中断子程序使得发生外部中断0,且为低电平触发时,LED灯全亮。中断结束后LED继续接上次状态进行跑马灯闪烁。
#include<reg51.h> #include<intrins.h> sbit P3_2=P3^2; void delay(unsigned char i); void main() { unsigned char ii; P1=0xFE; P3_2=1; EA=1; EX0=1; IT0=0; while(1) { P1=0xFE; for(ii=0;ii<8;ii++) { P1=_crol_(P1,1); delay(200); } } } void delay(unsigned char i) //延时函数,无符号字符型变量i为形式参数 { unsigned char j,k; //定义无符号字符型变量j和k for(k=0;k<i;k++) //双重for循环语句实现软件延 for(j=0;j<255;j++); } void int_0() interrupt 0 { P1=0x00; }
参考实验程序(主程序为P1口输出跑马灯程序),发生外部中断1,且为低电平触发时,LED灯闪烁5次,中断结束后LED继续接上次状态进行跑马灯闪烁。
#include<reg51.h> #include<intrins.h> sbit P3_3=P3^3; void delay(unsigned char i); void main() { unsigned char ii; P1=0xFE; P3_2=1; EA=1; EX1=1; IT1=0; while(1) { P1=0xFE; for(ii=0;ii<8;ii++) { P1=_crol_(P1,1); delay(200); } } } void delay(unsigned char i) //延时函数,无符号字符型变量i为形式参数 { unsigned char j,k; //定义无符号字符型变量j和k for(k=0;k<i;k++) //双重for循环语句实现软件延 for(j=0;j<255;j++); } void int_1() interrupt 2 { unsigned char a; for(a=0;a<5;a++) { P1=0x00; delay(200); P1=0xff; delay(200); } }
参考实验程序(主程序为P1口输出跑马灯程序),编写中断子程序使得发生外部中断0,且为低电平触发时,LED灯全亮,中断结束后LED继续接上次状态进行跑马灯闪烁;发生外部中断1,且为低电平触发时,LED灯闪烁5次,中断结束后LED继续接上次状态进行跑马灯闪烁。
#include<reg51.h> #include<intrins.h> sbit P3_2=P3^2; sbit P3_3=P3^3; void delay(unsigned char i); void main() { unsigned char ii; P1=0xFE; P3_2=1; EA=1; EX0=1; IT0=0; EX1=1; IT1=0; while(1) { P1=0xFE; for(ii=0;ii<8;ii++) { P1=_crol_(P1,1); delay(200); } } } void delay(unsigned char i) //延时函数,无符号字符型变量i为形式参数 { unsigned char j,k; //定义无符号字符型变量j和k for(k=0;k<i;k++) //双重for循环语句实现软件延 for(j=0;j<255;j++); } void int_0() interrupt 0 //0触发 { P1=0x00; } void int_1() interrupt 2 //1触发 { unsigned char a; for(a=0;a<5;a++) { P1=0x00; delay(200); P1=0xff; delay(200); } }
-
80c51day06中断概念与为外部中断
2021-03-03 15:28:50中断 CPU正在在执行一个程序,突然接到中断请求,然后就放下手中的工作取执行中断程序,然后再...低电平触发 #include <reg52.h> #define uint unsigned int #define uchar unsigned char sbit key_s2 = P3^0;中断
CPU正在在执行一个程序,突然接到中断请求,然后就放下手中的工作取执行中断程序,然后再回来继续手头的工作。
框前面的数字是中断向量号
这个图并不完整,比如计时器/定时器的功能设置没画出来
看外部中断
串口中断的标志位必须通过软件置0,其他好像是自动的,不嫌麻烦就都用软件置0外部中断代码
低电平触发
#include <reg52.h> #define uint unsigned int #define uchar unsigned char sbit key_s2 = P3^0;//独立按键S2 sbit flag = P3^7; //外部中断信号产生脚 /*==================================== 函数 : delay(uint z) 参数 :z 延时毫秒设定,取值范围0-65535 返回值 :无 描述 :12T/Fosc11.0592M毫秒级延时 ====================================*/ void delay(uint z) { uint x,y; for(x = z; x > 0; x--) for(y = 114; y > 0 ; y--); } //外部中断0初始化 void int0Init() { EA = 1; //开总中断 EX0 = 1;//开外部中断0 IT0 = 0;//外部中断0低电平触发 } void main()//main函数自身会循环 { int0Init();//外部中断0初始化 while(1) { if(key_s2 == 0)//判断S2是否被按下 { delay(20);//按键消抖 if(key_s2 == 0) { flag = 0; flag = 0;//产生低电平,CPU会采样2次P3.2的状态,两次都为低才触发 flag = 1;//结束低电平 while(!key_s2);//松手检测 } } } } //外部中断1中断服务程序,加interrupt 和中断向量号 void int0() interrupt 0 { P1 = ~P1;//P1的状态按位取反 }
这个就是一直检测按键有无按下,有的话就改变引脚来触发中断,其实直接将对应引脚置搞,然后将引脚与开关连在一起会更好,但是开发板它已经固定死了,没办法连接。
再看一下下降沿触发的:#include <reg52.h> #define uint unsigned int #define uchar unsigned char sbit key_s2 = P3^0;//独立按键S2 sbit flag = P3^7; //外部中断信号产生脚 /*==================================== 函数 : delay(uint z) 参数 :z 延时毫秒设定,取值范围0-65535 返回值 :无 描述 :12T/Fosc11.0592M毫秒级延时 ====================================*/ void delay(uint z) { uint x,y; for(x = z; x > 0; x--) for(y = 114; y > 0 ; y--); } //外部中断1初始化 void int1Init() { EA = 1; //开总中断 EX1 = 1;//开外部中断1 IT1 = 1;//外部中断1下降沿触发 } void main()//main函数自身会循环 { int1Init();//外部中断1初始化 while(1) { if(key_s2 == 0)//判断S2是否被按下 { delay(20);//按键消抖 if(key_s2 == 0) { flag = 1; flag = 0;//产生下降沿 while(!key_s2);//松手检测 } } } } //外部中断1中断服务程序 void int1() interrupt 2 { P1 = ~P1; }
-
51单片机外部中断小练习
2011-10-30 20:17:20有3个寄存器需要注意 1.EA寄存器:中断的总开关,EA=0则所有中断都不起作用 ...IT0为0:低电平触发,IT0为1:下降沿触发。 另外,外部中断0的引脚是P3.2,入口点地址为:0003H;外部中断1的引脚为P3.3,入口点地址有3个寄存器需要注意
1.EA寄存器:中断的总开关,EA=0则所有中断都不起作用
2.EX0寄存器:EX为Enable External Interrupt 的缩写,所以EX0的意思是打开外部中断0
3.IT0寄存器:设置外部中断0的触发方式。IT0为0:低电平触发,IT0为1:下降沿触发。
另外,外部中断0的引脚是P3.2,入口点地址为:0003H;外部中断1的引脚为P3.3,入口点地址为0013H。
#include <reg52.h> void ExternalInterrupt() interrupt 0 { P0 = 0x00; } void main() { EA = 1; // 打开中断 EX0 = 1; // 打开外部中断0 IT0 = 0; // 低电平触发为0, 高电平到低电平边缘触发为1 while (1) P0 = 0xff; }
-
51单片机中断设置
2021-01-19 18:28:360——为低电平触发; 1——为下降沿触发 可由软件置位和清除 2)IE0 和 IE1——外部中断请求标志位 1——表示有中断请求,CPU要响应中断请求,跳向中断服务程序,按优先级处理... -
51单片机外部中断的C51编程
2011-04-17 11:08:0051单片机外部中断的C51编程 ...1、51单片机的5大中断源:串行口中断、定时中断1、外部中断1、定时中断0、外部中断0;...2、中断源的编号: 串行口中断...4、使用外部中断0和1,必须TCON寄存器设置其触发方式是低电平 -
STM32Hal库学习(三)CubeMx学习外部中断
2018-07-11 19:42:26外部中断主要是在CubeMx中设置好GPIO在引脚界面配置成中断然后configuration里对GPIO配置对于低电平触发中断,需要把GPIO设置为上拉,然后下降沿触发,反之高电平触发,反过来对NVIC配置在生成的程序里stm32f1xx_it.... -
sja1000 中断_SJA1000中断接收为什么接收中断不能被触发,不能进入中断接收子函数?看资料,里面说会自动...
2020-12-24 12:35:081.sja1000的int引脚你先不连接 sja1000通电后(纯粹通电不运行程序)你测试一下int...是否允许外部中断0了呢?中断寄存器为0x01时中断引脚才会输出低电平呢。你现在要做的事是想法让中断寄存器为0x013.还有你是自接收... -
stm32外部中断问题(每次stm32进行系统复位按键控制NRST=0,程序立马进入中断服务函数)
2018-06-11 12:34:47当rf接收到数据的时候,数据接收指示引脚由高电平变为低电平,所以中断配置里面配置的是IPU,下降沿触发。系统复位后,发送模块没有发送数据,也就是说这个接收模块没有接收到数据,这个中断口根本不会触发立马。... -
Proteus仿真:C51中断函数实例
2021-02-25 15:42:42要求外部中断INT0和INT1为低电平触发,相应引脚分别接一按钮,按钮按下接地输入低电平,产生中断信号;定时器/计数器T0和定时器/计数器T1设置为外部计数输入,相应引脚接1khz的方波信号,T0每满2000个脉冲产生1次... -
查询方式的UART和外部中断的初始化会有冲突吗??求大神指教!!!!
2017-06-14 03:09:44//中断子服务寄存器初始化,EINT7低电平触发 rEINT0MASK=(rEINT0MASK & ~(0xff<<0))|(0x00<<0);//禁止屏蔽 rEINT0PEND=(rEINT0PEND & ~(0xff<<0))|(0xff<<0);//清除原有中断,读0代表没有中断,读1代表有中断,写1... -
怎么设置ep4ce6e22b8n引脚_技术分享 | STM32G071 PD0 PD2引脚使用注意事项
2020-12-16 18:49:14背景STM32G071的PD0,PD2作为外部中断使用,外部接...但是实际上测量到的却是0.9V,这跟触发后的0V,同样会被单片机识别为低电平,故无法产生电平跳变而触发中断。分析解决查阅STM32G0数据手册可知:这个引脚的电平类... -
6410中断
2013-04-12 14:30:55cpu工作有7钟模式 sys usr svc und irq fiq abt 一上电cpu首先处于SVC模式. 首先查看原理图 .../**** key gpio KEYINT1-6 ->GPN0-5 */ ...高(低)电平触发:当你按下时,源源不断的发送中断信号 下降 -
对于cc2530GPIO中断的一点理解。
2015-02-22 23:32:13想要写个小程序,使用P0.0作为外部中断源,P0.0设置为输入口,当P0.0输入低电平,触发中断,进入中断服务程序。中断触发方式为上升沿触发。 阅读cc2530的datasheet知道和P0口中断相关的寄存器(部分具体到相关位)有... -
51单片机学习笔记(二):中断系统
2019-02-19 12:14:081.中断系统结构 2. 51单片机的5个中断源 ...语句就可以把外部中断请求的触发方式设置为低电平有效,而不需给TCON一个十六进制的数。 TCON的低四位控制外部中断,高四位的作用如下: TR0/TR1:控制定时/计... -
单片机与DSP中的DSP嵌入式系统主程序代码
2020-11-13 10:51:26DMA通道0配置为每次传输1帧,每帧1024个半字(HW,HalfWord),同步事件设置为外部中断4,触发极J性为高电平,初始化定时器0,定时间隔为22 ms。 当外部同步信号到来时,启动定时器0,手动启动DMA通道0,同时设置... -
在单片机中 设置pwm时会用到定时器,定时器的作用是什么了 详细一些
2019-03-20 17:20:37//将C2INI位置0,设置PWM2输出端口的初始电平为低电平 PWMIF &= 0xFE; //将C2IF位置0,PWM2中断标志位,需软件清零 PWM2CR |= 0x04; //将EPWM2I位置1,使能PWM2中断 PWM2CR &= 0xFD; //将EC2T2SI位置0... -
再次请求支援,关于字符设备驱动的程序问题,求帮找错(不好意思没点数了)
2015-03-12 01:46:28外部中断8接了一个按钮开关,如果按钮开关被按下,则输出为低电平,外部中断8管脚应该低电平, 反之,高电平 (变量pre) 只有当设备感应到有人体活动同时检测到按钮开关被按下。即 red == 1,pre == 0,的时候,才... -
笙泉单片机MA82G5B32例程
2014-07-26 10:43:17所有的外部中断支持高/低电平或上升/下降沿触发 三个 16-位 定时/计数, 定时器 0,定时器 1 和定时器 2 ━ T0CKO 在 P34, T1CKO 在 P35 和 T2CKO 在 P10 ━ T0/T1/T2 可以选择 X12 模式 ━ S1BRG 通过定时器 1 级联... -
单片机应用技术考试试题
2009-12-12 14:01:49D、复位时会将 设置为高电平, 为低电平。 6、下列指令不是变址寻址方式的是( )。 A、JMP @A+DPTR B、MOVC A,@A+PC C、MOVX A,@DPTR D、MOVC A,@A+DPTR 7、DA指令是BCD码运算调整指令,它可用在如下( )指令... -
初学单片机,C语言与汇编语言混编希望大神能帮我详细的分析一下这个程序,尤其是XTYPE[DAC+1]=i?
2018-12-21 14:13:58//允许外部中断0 IT0=1; //设置INT0程控为跳沿触发方式 EA=1; //允许总中断0 while(1) { if(XBYTE[0xCFE9]&0x07) { ReadKey(); //读取行列值 a=a-192; display(a); ... -
基于AT89S52 单片的频率计
2010-01-04 08:47:37首先定时/计数器T0 的计数寄存器设置一定的值,运行控制位TR0 置1,启动定 时/ 计数器0;利用定时器0 来控制1S 的定时,同时定时/计数器T1 对外部的待 第2 页共27 页 测信号进行计数,定时结束时TR1 清0 ,停止计数;... -
求大神帮小女子指导一下程序,遥控按键按下 1602 无法显示按键值
2014-05-31 20:50:28结 果:设置PWM模式占空比,为0时全部高电平,为1时全部低电平 备 注:如果需要PWM1的设置函数,只要把CCAP0L和CCAP0H中的0改为1即可 /************************************************************************... -
led1632电路图
2011-04-24 15:46:35以下为进入P3.2脚外部中断子程序,也就是解码程序 INT: CLR EA ;暂时关闭CPU的所有中断请求 MOV R6,#10 SB: ACALL YS1 ;调用882微秒延时子程序 JB P3.2,EXIT ;延时882微秒后判断P3.2脚是否出现高 ; 电平如果有就退出... -
都是想要的考试题 速度下载
2010-05-24 10:11:058259A的ICW2给定为80H,工作于电平触发方式,全嵌套中断优先级,数据总线无缓冲,采用中断自动结束方式。请填充下面程序中的空白项(注意:控制字中可0可1位选0,8255未用端口设成输入方式),(微处理器8086的A1、A2... -
MSP430G2转换结果数据类型
2014-08-03 11:23:27低电平有效, } } 问题是:Error[Pe147]: declaration is incompatible with "unsigned char ADC10_Result[100]" (declared at line 6 of "D:\workspace_v5_1\lianxi\caiji_fangda\dandao_duocai.h") D... -
c语言编写单片机技巧
2009-04-19 12:15:17并以量大低单价为产品主流,目前16位MCU与8位产品,还有相当幅度的价差,新的应用领域也仍在开发,业界预计,至少在2005年前8位的MCU仍是MCU产品的主流。 13. 学习ARM及嵌入式系统是否比学习其它一般单片机更有...