⑴ 51单片机中断笔记
51单片机中断笔记一、中断的概念
中断是指在CPU处理某一事件时,另一事件请求CPU迅速去处理,CPU中断当前的工作,转去处理该请求(中断响应和中断服务),待处理完毕后,再回到原来被中断的地方继续处理原事件(中断返回)。这一过程类似于在看电视时,突然蹦出一个广告,广告播放完毕后继续之前的节目。
二、基本中断源
51单片机中的5个重要中断源包括:
三、中断结构图
(此处插入中断结构图,markdown格式如下)
四、特殊功能寄存器
51单片机中与中断相关的特殊功能寄存器主要包括:
中断控制寄存器(IE)
EA:中断总开关。EA=1时,CPU开放中断;EA=0时,CPU屏蔽所有中断申请。
ELVD:低压检测中断允许位。ELVD=1时,允许低压检测中断;ELVD=0时,禁止低压检测中断。
EADC:ADC中断允许位。EADC=1时,允许ADC中断;EADC=0时,禁止ADC中断。
ES:串行口1中断允许位。ES=1时,允许串行口1中断;ES=0时,禁止串行口1中断。
ET1:定时/计数器T1的溢出中断允许位。ET1=1时,允许T1中断;ET1=0时,禁止T1中断。
EX1:外部中断1中断允许位。EX1=1时,允许外部中断1中断;EX1=0时,禁止外部中断1中断。
ET0:定时/计数器T0的溢出中断允许位。ET0=1时,允许T0中断;ET0=0时,禁止T0中断。
EX0:外部中断0中断允许位。EX0=1时,允许外部中断0中断;EX0=0时,禁止外部中断0中断。
中断优先级控制寄存器(IP)
PT1:定时器1中断优先级控制位。PT1=1时,定时器1中断为最高优先级;PT1=0时,定时器1中断为最低优先级。
PX1:外部中断1优先级控制位。PX1=1时,外部中断1为最高优先级;PX1=0时,外部中断1为最低优先级。
PT0:注意此处应为“定时器0中断优先级控制位”,而非原文中的“定时器1中断优先级控制位”。PT0=1时,定时器0中断为最高优先级;PT0=0时,定时器0中断为最低优先级。
PX0:外部中断0优先级控制位。PX0=1时,外部中断0为最高优先级;PX0=0时,外部中断0为最低优先级。
TCON:定时器/计数器控制寄存器
TF1:T1溢出中断标志。TF1=1时,表示T1计数器溢出;TF1=0时,表示T1计数器未溢出。
TR1:定时器1运行控制位。TR1=1时,启动定时器1;TR1=0时,关闭定时器1。
TF0:T0溢出中断标志。TF0=1时,表示T0计数器溢出;TF0=0时,表示T0计数器未溢出(原文中“TF10计数器未溢出”应为笔误,应为“TF0计数器未溢出”)。
TR0:定时器0运行控制位。TR0=1时,启动定时器0;TR0=0时,关闭定时器0。
IE1:外部中断1中断请求标志位。
IT1:外部中断1触发方式选择位。IT1=1时,下降沿触发;IT1=0时,低电平触发。
IE0:外部中断0中断请求标志位。
IT0:外部中断0触发方式选择位。IT0=1时,下降沿触发;IT0=0时,低电平触发。
SCON:串口控制寄存器
SM0、SM1:串口工作模式选择位。
SM2:多机通信控制位。
REN:串行接收允许位。
TB8:发送数据的第9位(奇偶校验位)。
RB8:接收数据的第9位(奇偶校验位)。
TI:发送完成中断标志位。发送完数据后由硬件置1,进入中断程序后需手动软件清0。
RI:接收完成中断标志位。接收完数据后由硬件置1,进入中断程序后需手动软件清0。
PCON:电源控制寄存器
SMOD:波特率选择位。SMOD=1时,方式1、2、3的波特率加倍。
AUXR:辅助寄存器
T(0/1/2)x12:定时器(0/1/2)速度控制位。为0时,定时器是传统8051速度,12T;为1时,定时器是传统8051速度的12倍,1T。
UART_M0x6:串口1模式0的通信速度设置位。为0时,串口1模式0是传统8051单片机串口速度,12T;为1时,串口1模式0是传统8051单片机串口速度的6倍,2T。
T2R:定时器2允许控制位。为1时,允许定时器2工作。
T2_C/~T:控制定时器2作为定时器还是计数器。为0时作为定时器,为1时用作计数器。
EXTRAM:内部/外部RAM存取控制位。0时,允许使用逻辑上在片外、物理上在片内的扩展RAM;1时,禁止使用逻辑上在片外、物理上在片内的扩展RAM。
SIST2:串口1(UART1)选择定时器2作波特率发生器的控制位。为0时,选择定时器1作为串口1(UART1)的波特率发生器;为1时,选择定时器2作为串口1(UART1)的波特率发生器,此时定时器1得到释放,可以作为独立定时器使用。
五、定时器/计数器
计数
计数是指对外部事件进行计数,外部事件的发生以输入脉冲的形式表示。计数功能的实质是对外部脉冲进行计数,在单片机中对应引脚T0和T1两个脉冲输入端。外部输入的脉冲在负跳变时有效(即外部脉冲由1变化到0),计数器加1。
定时
定时器是通过计数器的计数来实现的,不过定时器的计数脉冲来自单片机的内部,因此定时器的实质是对内部脉冲的计数。
根据单片机晶振、所选TMOD的工作方式、所要定的时间,来确定TH0和TL0所要赋予的初值。以12MHz晶振、工作方式1、16位计数器为例,设所定时间为Xus(16位计数器最大数65536,即65536us,若所定时间大于65535,则要用if语句控制,现假设X<65535):
时钟周期的时间:t=1/12MHz=1/12us
机器周期的时间:T=12*1/12=1us
因为每经过一个机器周期计数器+1,所以计数器+1经过的时间为1us。
若所定时间为X,则要求经过Xus中断响应,又因为16位计数器要全部置1(即达到65535+1)后,中断才会响应,所以初值=(65536-X),将初值转化为16进制码,分别赋给TH0和TL0。
例如:所定时间5ms,则:
初值=(65536-5000)=60536=EC78TH0=
⑵ 51单片机如何用一个按键控制一段程序的运行与停止
在51单片机编程中,通过一个按键实现程序的运行与停止功能,操作步骤如下:首先,你需要为你的项目创建一个新的文件,这是基础步骤,它将承载你的代码逻辑(
1、在51单片机项目中,新建一个文件用于存放程序代码。
)。接着,配置你的按键和LED。假设你选择的按键S1连接到P3的第2引脚,当按键按下时,可以通过编程使其对应P1的第5引脚点亮LED(
2、按键S1的输入设置为P3^2,LED的控制输出则连接到P1^5,以便通过按键操作来控制LED的亮灭。
)。然后,进入主函数的编写,这是程序的核心部分(
3、在C语言中,设计并实现主函数,用于程序的流程控制。
)。通常,我们会用一个无限循环(4、使用while(1){}结构创建循环,以实现程序的持续运行。
)来模拟程序的基本运行状态。在主循环中,你可以选择输出不同的效果。然而,关键在于如何处理按键事件。当按键S1被按下时,程序会检测到这一事件,并执行相应的操作(
5、在主循环中,设置按键S1的中断或事件处理,使其在按下时控制LED关闭,程序开始运行。
)。再次按下按键,会触发中断,使得LED重新点亮,程序暂停(
6、再次按下S1,中断执行,LED重新点亮,程序进入暂停状态,等待下一次按键指令。
)。通过这种方式,一个简单的按键就能控制51单片机程序的运行与停止,实现了用户与硬件的交互。
⑶ 51单片机ec11编码器中断法
配置一个1ms定时器,并设置为自动清零模式,配置好后记得打开定时器中断。首先要开启定时器TIM3,我们使用这个 HAL_TIM_IC_Start_IT(htim, Channel);启动定时器。
使用定时器回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
在里面编写上面的程序,因为我们将B相接在PA7引脚,所以我们使用switch case语句进行判断引脚电平,如果单片机检测到A相为高电平就会进入这个中断判断B相电平,低电平为反转,高电平极为正转(程序中的cnt为计数作用)。
⑷ 51单片机中的外部中断有什么作用
可以打个比方,每天上班你都随时需要知道你同事的工作进度情况,你是希望你不停地打个电话去问“你做完了吗”,还是希望他做完了主动打个电话给你讲“我做完了,我们谈谈吧”。这就是中断的意义,在不需要的时候不影响处理 器做其它的事情,提高效率,增强程序的实时性。
⑸ 51单片机如何用一个按键控制一段程序的运行与停止
1、创建项目文件。
6、当按下一个按键时,关闭灯,整个程序运行,再按一次,程序停止。
⑹ 关于51单片机的外部中断使用方法
使用方法:
单片机的P2.5,P2.6,P2.7口分别接三位动态数码管的位选端,P0口接动态数码管的段选端。然后,P1.0口接一个电阻串联一个LED灯然后接地,电阻取200~470欧之间就行,是一个限流电阻。
中断用的是外部中断0,要触发中断的时候,就用一根杜邦线一端接地,一端接到单片机的P3.2口就行,这样,就满足了你的要求了。
外部中断的触发方式有低电平触发和下降沿触发。到底是那种触发方式,要设置中断允许寄存器中IT0的值,如果IT0=0,像我写的程序,就是低电平触发,如果为1,就是下降沿触发。
灯不是一定要接到P3.2口上的。中断要执行的任务是在中断函数中写代码控制的,就像我写的代码中,你只需要控制LED灯接的那个IO口就行了。
代码如下:
#include
#define
uchar
unsigned
char
sbit
led=P1^0;
uchar
code
an[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar
code
wei[3]={0x06,0x05,0x03};
void
delay(uchar
c);
void
ini_()
//初始化函数,设置中断触发方式,开中断
{
EA=1;
IT0=0;
EX0=1;
}
void
main()
{
uchar
i;
ini_();
led=0;
//由于单片机上电之后,所有的IO口默认是高电平,而要求是开始不亮,所以要将P1.0口开始设置为低电平。
while(1)
{
for(i=0;i<3;i++)
动态数码管闪烁
{
P2=wei[i];
P0=an[i];
delay(35);
}
}
}
void
led_()
interrupt
0
//外部中断0函数,中断函数不需要申明
{
uchar
i;
led=1;
//在中断中让灯亮起来
while(1)
{
for(i=0;i<3;i++)
{
P2=wei[i];
P0=an[i];
delay(1);
}
}
}
void
delay(uchar
c)
{
uchar
a,b;
for(c;c>0;c--)
for(a=38;a>0;a--)
for(b=80;b>0;b--);
}