当前位置:主页 > 查看内容

1天搞定单片机中断——基础知识大全

发布时间:2021-06-15 00:00| 位朋友查看

简介:这篇文章主要针对的是单片机编程中的中断知识。单片机编程其实很简单就是C语言编程难的是各种外围器件的学习以及看懂芯片手册和对芯片进行初试化的操作。因为单片机编程中常常涉及到中断要对各种寄存器进行操作。所以我统一罗列出来方便后面编程时查阅。本篇……

这篇文章主要针对的是单片机编程中的中断知识。单片机编程其实很简单(就是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<stdio.h>的头文件)
在这里插入图片描述
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芯片–>用于usb转串口;DS1302–低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功能。

未完待续!。。。。。

;原文链接:https://blog.csdn.net/qq_41873236/article/details/115437088
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文


随机推荐