单片机交流
直播中

刀马旦

11年用户 702经验值
私信 关注
[问答]

单片机编程中的中断知识,错过绝对后悔

单片机编程中的中断知识,错过绝对后悔

回帖(1)

李慧芳

2021-11-3 10:06:55
这篇文章主要针对的是单片机编程中的中断知识。单片机编程其实很简单(就是C语言编程),难的是各种外围器件的学习,以及看懂芯片手册和对芯片进行初试化的操作。因为单片机编程中常常涉及到中断,要对各种寄存器进行操作。所以我统一罗列出来,方便后面编程时查阅。本篇不介绍单片机编程中的基本知识(包括c语言知识、单片机基础知识)。
注意:
Stc89c51/52单片机的P0口为开漏输出,若作为普通I/O口试,需要加上拉电阻,不然输出不了高电平。(注:P1、P2、P3都是准双向输出)





其中上拉电阻的作用:1、加大普通IO口的驱动能力。2、起到限流的作用。3、抵抗电磁干扰。 1、单片机时钟时序单位(晶振周期/拍节、状态、机器周期、指令周期):




2、单片机最小系统组成5部分:单片机、晶振电路、复位电路、电源电路、下载电路






3、单片机引脚解释:单片机的40个引脚大致可分为4类:电源、时钟、控制和I/O引脚。

⒈ 电源: ⑴ VCC - 芯片电源,接+5V;⑵ VSS - 接地端;⒉ 时钟:XTAL1、XTAL2 - 晶体振荡电路反相输入端和输出端。⒊ 控制线:控制线共有4根,⑴ ALE/PROG:地址锁存允许/片内EPROM编程脉冲① ALE功能:用来锁存P0口送出的低8位地址② PROG功能:片内有EPROM的芯片,在EPROM编程期间,此引脚输入编程脉冲。⑵ PSEN:外ROM读选通信号。⑶ RST/VPD:复位/备用电源。① RST(Reset)功能:复位信号输入端。② VPD功能:在Vcc掉电情况下,接备用电源。⑷ EA/Vpp:内外ROM选择/片内EPROM编程电源。① EA功能:内外ROM选择端。② Vpp功能:片内有EPROM的芯片,在EPROM编程期间,施加编程电源Vpp。⒋ I/O线80C51共有4个8位并行I/O端口:P0、P1、P2、P3口,共32个引脚。P3口还具有第二功能,用于特殊信号输入输出和控制信号(属控制总线)。 一、中断简介:






1、89C51的中断系统有5个中断源 ,2个优先级,可实现二级中断嵌套。






!!注意:程序中涉及到中断时,这幅图非常有用,对中断的初始化基本就要安照这个图中从左到右进行寄存器的设置。这样中断才会工作。




2、中断寄存器

(1)定时器控制寄存器TCON:高位才与定时器有关,低位是外部中断相关的






IT0:外部中断0触发方式控制位。当IT0=0时,为电平触发方式(低电平有效)。当IT0=1时,为边沿触发方式(下降沿有效)。IE0:外部中断0中断请求标志位。Cpu检测到外部中断引脚存在中断请求信号时,硬件自动将IE0置1。注意:当IT0选择为边沿触发时,当CPU响应此中断时由硬件将IE0位清零。若IT0选择位电平触发时,则需要在中断服务程序中由软件将IE0清零。IT1:外部中断1触发方式控制位。同上IE1:外部中断1中断请求标志位。同上TR0、TR1是对定时器0/1进行启动控制的TF0:定时/计数器T0溢出中断请求标志位。当启动T0计数以后,T0从初值开始加1计数,计数器计数到最高位产生溢出时,由硬件自动将TF0置1,并向CPU发中断请求。当CPU响应此中断时,由硬件将TF0位清零。TF1:定时/计数器T1溢出中断请求标志位。同上  (2)串行口控制寄存器SCON






SM0、SM1:串行口工作方式选择位:




SM2:多级通信控制位。只有当串口工作与方式2/3时,该位才有意义。注意:若SM2=1,则串行口工作与方式2/3,此时只有当接收的第9位数据等于1,即RB8=1时,才将8位数据送入SUBF中去,并由硬件置RI=1产生中断请求,否则将接收的8位数据丢弃。然而当SM2=0时,不管接受的第9数据位为0/1,都将前8位数据送入SBUF,并使RI=1产生中断请求。REN:允许串行接收位。由软件置REN=1,则启动串行口接收数据;若软件置REN=0,则禁止接收。TB8:在方式2或方式3中,是发送数据的第9位,可以用用户软件设定。可以用作数据的奇偶校验位,或在多机通信中,作为地址帧/数据帧的标志位。在方式0和方式1中,该位未用到。RB8:在方式2或方式3中,是接收到数据的第9位,作为奇偶校验位或地址帧/数据帧的标志位。在方式1时,若SM2=0,则RB8是接收到的停止位。TI:发送中断标志位。在方式0时,当串行发送第8位数据进入缓冲区SBUF时,由内部硬件使TI置1,向CPU发中断申请。在中断服务程序中,必须用软件将其清0,取消此中断申请。RI:接收中断标志位。在方式0时,当串行接收完第8位数据时,由内部硬件使RI置1,向CPU发中断申请。也必须在中断服务程序中,用软件将其清0,取消此中断申请。 (3)中断允许寄存器IE:






EX0:外部中断0允许位;//值为0,禁止中断,值为1,允许中断。下面几个都是一样的。ET0:定时/计数器T0中断允许位; EX1:外部中断0允许位;ET1:定时/计数器T1中断允许位;ES: 串行口中断允许位;EA :CPU中断允许(总允许)位。  (4)中断优先级控制寄存器IP:






PS:串行口优先级控制位;1:高优先级,0:低优先级PT0/PT1:定时器/计数器0/1中断优先级控制位;1:高优先级,0:低优先级 PX0/PX1:外部中断管0/1中断优先级控制位;1:高优先级,0:低优先级 注: 默认中断优先级





(5)电源控制寄存器PCON:






SMOD:串行口波特率倍增位。在串口方式1、方式2、方式3时,波特率与SMOD有关,当SMOD=1时,波特率提高一倍。系统复位时,SMOD=0。!!注意:如果以相同的波特率,用波特率加倍的方式比不加倍的方式计算的误差小。 二、定时器/计数器篇

1、定时器/计数器中断:用到的寄存器

(1)两个特殊功能寄存器TH0/TH1(高8位)和TL1/TL0(低8位)
(2)控制寄存器TCON(主要是高四位)





TF1:T1溢出中断请求标志位。TR1:T1运行控制位。TR1置1时,T1开始工作;TR1置0时,T1停止工作。TF0:T0溢出中断请求标志位。TR0:T0运行控制位。 (3)工作方式寄存器TMOD:高四位是定时器T1工作字段,低四位为T0的工作字段










(1)寄存器每位详解:

——寄存器中第三位 C/T 是定时或者计数模式选择位。值等于0时,计数脉冲来自CPU内部,计数脉冲频率为时钟信号频率的12分频(即一个机器周期),为定时模式;值等于1时,计数脉冲来自与p3.4或p3.5相接的外部频率,此时为计数模式。
——GATE是启动方式控制位,值为1,则定时器启动由TCON寄存器中的TR0/TR1位和芯片的引脚INT0或INT1共同控制(双保险)。而值为0,则只受TCON寄存器中的TR0/TR1位控制。
*
注:定时器初值计算方法:TC=M-(T/TCY),其中M:定时器/计数器的最大次数(与工作方式有关),T:我们需要定时器定时的时间。TCY:计数器计数脉冲的周期(晶振周期的12倍或者一个机器周期,若单片机晶振为12Mhz,则机器周期=((1/12Mhz)12=1us)。TC:定时器需要预置的初值,当然从公式中知当TC=0时,即从预置初值0开始计数,定时时间T最大,最大TMAX为TCTCY。
**从而可以得出各种工作方式定时器的最大定时时间为:
工作方式0:Tmax=2^13 * 1us=8.192ms //其中的1us就是计数脉冲周期(机器周期)
工作方式1:Tmax=2^16 * 1us=65.536ms
工作方式2/3:Tmax=2^8 * 1us=0.256ms
所以在编程时,我们选择定时器时,要看是否在当前所选工作方式的量程内,不要出现这种情况:你要我1ms进入一次定时中断,而你又选择的工作方式2/3,这样超过它的量程。这样是不行的。
**
【注】:在编程中定时器/计数器的使用方法:

1.对TMOD赋值,以确定T0和T1的工作方式。2.根据要定时的时间,由公式计算初值,并将其写入TH0、TL0或TH1、TL1。3.        中断方式时,打开定时器中断(ET0/ET1)及总中断EA。4.        使TR0或TR1置位,启动定时/计数器定时或计数 三、外部中断篇

1、外部中断:用到的控制寄存器TCON(主要是低四位,高四位与定时器有关):






1、IT0:外部中断0触发方式控制位。当IT0=0时,为电平触发方式(低电平有效)。当IT0=1时,为边沿触发方式(下降沿有效)。
2、IE0:外部中断0中断请求标志位。Cpu检测到外部中断引脚存在中断请求信号时,硬件自动将IE0置1。注意:当IT0选择为边沿触发时,当CPU响应此中断时由硬件将IE0位清零。若IT0选择位电平触发时,则需要在中断服务程序中由软件将IE0清零。
3、IT1:外部中断1触发方式控制位。同上
4、IE1:外部中断1中断请求标志位。同上
注:编程时外部中断的使用方法

1、设置IT0或IT1确定外部中断的触发方式;2、打开外部中断(EX0/EX1)及总中断EA。 四、串口中断篇

1、串口中断:用到的相关寄存器

(1)串口控制寄存器SCON,每位具体说明见前面分析。





(2)电源控制寄存器PCON,分析见前面。





注意:
1、 方式0总共8位(8位数据位);方式1总共10位(1位起始位、8位数据位、1位停止位);方式2和方式3总共11位(1位起始位、9位数据位(包括有一位TB8或RB8,需提前置好)、1位停止位)。如果有停止位,在串口调试助手中就要选择!
2、 串口中双方通信,就要确定好一个传送速率(波特率),波特率的计算要涉及到定时器的参与。所以在串口中断编程中既要设置串口的寄存器,还要设置选择的定时器的寄存器。
3、 一个小知识:除了往SBUF中发送数据给串口外,还可以使用printf的方式(前提引入#include的头文件)





4、 编程操作流程:
a)        设置串口的工作方式(SCON)。b)        设置计数器工作方式(TMOD)。c)        确定波特率是否加倍(PCON)。d)        根据波特率的计算公式,求出定时器/计数器的计数初值(TH0、TL0或TH1、TL1)。 5、 中断方式时,打开定时器中断(ET0/ET1)及总中断EA。
6、 使TR0或TR1置位,启动定时/计数器定时或计数。
实例





注:上图中,因为定时器工作在方式2/方式3时,是8位自动重装,通常对TLX、THX初始化时装入相同的定时器/计数器初值,以便以相同的初值进行连续计数/定时。
2、波特率计算方法:

串口通信中引入:波特率的计算与串口的工作方式有关。
方式0的波特率 =  fosc/12   //(fosc为晶振频率)方式2的波特率 =((2*SMOD)/64)· fosc 方式1的波特率 =((2*SMOD)/32)·(T1溢出率)方式3的波特率 =((2*SMOD)/32)·(T1溢出率)T1 溢出率 = fosc /{12×(256-X)}   //X表示定时器/计数器1的计数初值。 注:当串行口工作工作于方式1或3时,通常以定时器/计数器1工作于方式2,即8位重装计数初值方式,作为串口工作于方式1或3的波特率发生器。
溢出率为溢出周期的倒数。若计数初值为X(即从X开始计数),那么以工作在方式2的8位自动重装计数,则可以计数256,从而需要计数的位数为:256-X。这么多位数需要多少个机器周期呢? 1/fosc易知为一个晶振周期(也就是拍节),12/fosc也就是一个机器周期(因为单片机中一个机器周期为12个晶振周期)。所以溢出的周期为:(12/fosc)*(256-X)。溢出率也就出来了。
通常使用定时器/计数器1工作与方式2作为波特率发生器,串口工作与方式1。是因为该方式具有自动重装计数初值功能,可避免反复重装计数初值带来的定时误差,使波特率更加稳定。按上述公式可以推得计数初值为:X=2^8-((fosc *2^SOMD)/(32 * 12 * 波特率))
小知识点:
无源和有源蜂鸣器的区别:
无源这里的“源”不是指电源,而是指震荡源。也就是说,有源蜂鸣器内部带震荡源,所以只要一通电就会叫。而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。
正是根据无源蜂鸣器的这一特点,可以通过控制给蜂鸣器引脚输入高低电平的时间,使蜂鸣器发出“哆啦咪法索拉稀”的声音,而有源蜂鸣器则不可以控制音频。
CH340芯片–>用于u***转串口;DS1302–低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功能。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分