设置中断是为了使微控制器能够实时处理随机的内部或外部事件。
2. 中断效果
中断技术不仅解决了主机与I/O设备之间快速传输数据的问题,还具有以下优点:
1、分时操作:CPU可以分时地为多个I/O设备服务,从而提高了计算机的利用率。
2、实时操作:CPU能够及时处理应用系统的随机事件,系统的实时性大大增强。
3、可靠性高:CPU具有处理设备故障、断电等突发事件的能力,使系统更加可靠。
3.中断源及相关寄存器
中断优先级
定时器/计数器控制寄存器 TCON
TF0、TF1:定时器中断标志(定时器0溢出标志、定时器1溢出标志)
TR0,TR1:开启相应定时器(定时器0运行控制位,=1时启动定时器0,定时器1运行控制位,=1时启动定时器1)
软件清零关闭定时器 0/1。当 GATE=1 且 INIT 为高时,TR1 置 1 启动定时器 1;当 GATE=0 时,TR1 置 1 启动定时器 0/1。
IT0,IT1:外部中断的触发方式,=0时为低电平触发,=1时为负跳变触发。
IE0、IE1:外部中断标志
中断使能寄存器IE
EA:通用中断使能。EA=0;CPU屏蔽所有中断请求 EA=1;使能所有中断。
ES:串口中断使能位。ES=0;禁止串口中断。ES=1;使能串口中断。
ET0,ET1:定时器/计数器 0 和定时器/计数器 1 中断使能位。=0 禁用相应的定时器中断。=1 启用相应的定时器中断。
EX0,EX1:外部中断0和外部中断1中断使能位。=0表示禁止相应的外部中断。=1表示使能相应的外部中断。
——: 无效位
中断优先级寄存器IP
PS:串口中断优先级PS = 1;(高)。PS = 0;(低)。
PT0:定时器 0 中断优先级 PT0 = 1;(高) PT0 = 0;(低)。
PT1:定时器 1 中断优先级 PT1 = 1;(高) PT1 = 0;(低)。
PX0:外部中断0中断优先级PX0=1;(高)PX0=0;(低)。
PX1:外部中断1中断优先级PX1=1;(高)PX1=0;(低)。
——: 无效位
IP寄存器未设置,上电复位后为00H,默认为低优先级。
默认优先级为(从高到低):
外部中断0 → 定时器0 → 外部中断1 → 定时器1 → 串口
如果我们将 IP 寄存器设置为:(IP = 0X10)
聚苯乙烯=1;
PT1=0;
PX1=0;
PT0=0;
PX0=0;
如下表所示:
优先级从高到低依次为:
串行工作模式寄存器TMOD端口→外部中断0→定时器0→外部中断1→定时器1
工作模式寄存器TMOD
GATE:门控制
=0: 仅使用操作控制位TRx来控制定时器/计数器的启动。
=1: 由TRx和外部中断脉冲计数。(用于统计外部中断负跳变的次数)
C/T:计数器模式和定时器模式选择
=0: 选择定时器模式
=1: 选择计数器模式
M1、M0:选择定时器/计数器的工作模式
方法 0
方式0为13位计数,由TL0的低5位(高3位未使用)和TH0的8位组成,当TL0的低5位溢出时,会进位到TH0,当TH0溢出时,TCON中的TF0标志会被置位,并向CPU发出中断请求。
方法 1
方式1的计数位数为16位,以TL0为低8位,TH0为高8位,组成16位加1的计数器。
方法 2
模式2是8位计数模式,自动重新加载初始值。
方法 3
方式3只适用于定时器/计数器T0,定时器T1处于方式3时,相当于TR1=0,计数停止。
定时器初始值寄存器THx和TLx
首先我们来了解一下CPU时序:
振荡周期:为单片机提供时序信号的振荡源的周期(晶振周期或者外部振荡周期)
状态周期:2个振荡周期为1个状态周期,用S表示。振荡周期也叫S周期或时钟周期。
机器周期:1个机器周期包含6个状态周期和12个振荡周期。
指令周期:完成一条指令所需的总时间,以机器周期为单位。
例如:当外部晶振为12MHz时,51单片机相关周期具体值为:
振荡周期=1/12us;
状态周期=1/6us;
机器周期=1us;
指令周期=1~4us;
计数器初值的计算:
机器周期是 CPU 完成基本操作所需的时间。
机器周期 = 1/MCU时钟频率
51单片机的内部时钟频率是外部时钟频率的12倍,也就是当把外部晶振的频率输入到单片机时
当频率除以12时。
例如,如果你使用的是12MHZ的晶振,当你使用12MHZ的外部晶振时,
机器周期=1/1M=1us。(选择定时器工作模式1 16位)
我们的2的16次方等于65536,也就是说最大值是65536(溢出)
如果时间是1ms
初值为:1ms/1us=1000。也就是说如果要计数1000个数,初值=65535-1000+1=64536,65536就会溢出。所以初值为FC18H(十进制为64536)
如果时间是50ms
50毫秒/1微秒=50000;
初始值=65535-50000+1=15536;
计时50ms,初值为15536,即3CB0(十六进制)
定时器/计数器中断
你需要知道什么
51单片机有两组定时器/计数器,因为既能计时,又能计数,所以叫定时器/计数器。
定时器/计数器与微控制器的CPU相互独立,定时器/计数器自动工作,不需要CPU参与。
51单片机中的定时器/计数器根据机器内部时钟或者外部脉冲信号,将寄存器中的数据加1。
使用定时器/计数器可以提高单片机的效率,一些简单的重复加法运算可以由定时器/计数器来处理,CPU可以处理更复杂的任务,同时可以实现精确的定时。
工作准则
它本质上是一个加 1 计数器。当输入脉冲时,计数器自动加 1。
当计数器溢出时,它返回到0。计数器的溢出将相应的中断标志设置为1。
向CPU发出中断请求,若定时器/计数器工作在计时模式,则表示计时时间到;若工作在计数模式,则表示计数值已满。
可以看出,加1计数器的计数值是由计数器溢出时的值减去计数初始值得到的。
定时器结构
定时器/计数器的本质是一个16位的加法计数器,由THx、TLx两个寄存器组成,分别为高8位和低8位。TMOD为定时器/计数器的工作模式寄存器,决定工作模式和功能;TCON为控制寄存器,控制T0、T1的启动与停止以及设置溢出标志。
操作步骤(T0 T1)
1.选择工作模式。设置M1,M0(TMOD寄存器)
2.选择控制方式。设置GATE(TMOD寄存器)
3. 选择定时器或计数器模式。设置C/T(TMOD寄存器)
4. 为定时器/计数器分配初值。设置THx和TLx(定时器初值寄存器)
5. 使能通用中断。设置EA(IE寄存器)
6. 开启对应的定时器中断,设置ET0或者ET1(IE寄存器)
7. 启动定时器。设置TR1或TR0(TCON寄存器)
如何配置计时器
这里我们选择定时器0并选择模式1(16位)作为定时示例。
1、选择工作模式1(16位)M1=0;M0=1;
2、控制方式:仅使用操作控制位TRx来控制定时器/计数器的启动。GATE=0;
3、选择定时器模式C/T=0;
TMOD=0x01;
4.赋初值这里选择定时为50ms,我板子的晶振是11.0592,不知道怎么算,建议大家用mcuelf这个软件算一下,得到如下结果。
5.打开主中断(主开关)
6.打开T0中断开关
7.启动定时器0
程序示例
这是使用计时器在 LCD1602 上进行的简单时钟显示。
LCD1602 昨天发了一个关于LCD1602的使用以及显示hello word的视频,这里就来详细的介绍一下LCD1602的具体操作。
引脚定义
lcd1602.h
lcd1602.c
主程序
最终项目展示
4、定时器0工作模式1:16位定时器
在编写单片机的定时程序时,需要初始化定时器和中断寄存器。通常定时器初始化过程如下:
1、给TMOD赋值,确定T0、T1的工作模式。
2、计算初值写入TH0、TL0(定时器0)或TH1、TL1(定时器1)。
您正在使用 12MHZ 晶体振荡器。当您使用 12MHZ 外部晶体振荡器时,
机器周期Tcy=12*(1/12M)=1us。
计数数N=t/Tcy
(选择定时器工作模式1 16位)
2的16次方是65536,也就是说最大值是65536(溢出),溢出需要65536us。
如果计时50ms=50000,也就是需要统计50000个数,那么初始值=65536-50000=15536,超过65536就会溢出。
将15536除以256的模数:64536/256=60装入TH0,将15536除以256的余数:15536%256=176装入TL0。
如何编写中断服务程序:
中断函数格式如下:
void 函数名() 中断 中断号 使用工作组 /*中断函数不能返回任何值,所以开头使用void,后面跟着函数名,名字可以是任意的,中断函数不带任何参数,所以函数名后面的括号为空;中断号是单片机中几个中断源的序号*/
中断服务程序内容
例如:
void T1_time() 中断1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
3、中断模式下,中断使能寄存器IE被赋值,使能中断。
中断使能寄存器IE
EA:通用中断使能。EA=0;CPU屏蔽所有中断请求 EA=1;使能所有中断。
ES:串口中断使能位。ES=0;禁止串口中断。ES=1;使能串口中断。
ET0,ET1:定时器/计数器 0 和定时器/计数器 1 中断使能位。=0 禁用相应的定时器中断。=1 启用相应的定时器中断。
EX0,EX1:外部中断0和外部中断1中断使能位。=0表示禁止相应的外部中断。=1表示使能相应的外部中断。
——: 无效位
(EA=1;启用所有中断。
ET0=1则使能相应的定时器中断。)
4.设置TR0,启动定时器/计数器计时或计数。
定时器/计数器控制寄存器 TCON
TF0、TF1:定时器中断标志(定时器0溢出标志、定时器1溢出标志)
TR0,TR1:开启相应定时器(定时器0运行控制位,=1时启动定时器0,定时器1运行控制位,=1时启动定时器1)
软件清零关闭定时器 0/1。当 GATE=1 且 INIT 为高时,TR1 置 1 启动定时器 1;当 GATE=0 时,TR1 置 1 启动定时器 0/1。
IT0,IT1:外部中断的触发方式,=0时为低电平触发,=1时为负跳变触发。
IE0、IE1:外部中断标志
(TRO=1启动定时器0)