这篇文章主要针对的是单片机编程中的中断知识。单片机编程其实很简单(就是C语言编程),难的是各种外围器件的学习,以及看懂芯片手册和对芯片进行初试化的操作。因为单片机编程中常常涉及到中断,要对各种寄存器进行操作。所以我统一罗列出来,方便后面编程时查阅。本篇不介绍单片机编程中的基本知识(包括c语言知识、单片机基础知识)。
文章目录
- 1、单片机时钟时序单位(晶振周期/拍节、状态、机器周期、指令周期):
- 2、单片机最小系统组成5部分:单片机、晶振电路、复位电路、电源电路、下载电路
- 3、单片机引脚解释:单片机的40个引脚大致可分为4类:电源、时钟、控制和I/O引脚。
- 一、中断简介:
-
- 1、89C51的中断系统有5个中断源 ,2个优先级,可实现二级中断嵌套。
- 2、中断寄存器
-
- (1)定时器控制寄存器TCON:高位才与定时器有关,低位是外部中断相关的
- (2)串行口控制寄存器SCON
- (3)中断允许寄存器IE:
- (4)中断优先级控制寄存器IP:
- (5)电源控制寄存器PCON:
- 二、定时器/计数器篇
-
- 1、定时器/计数器中断:用到的寄存器
-
- (1)寄存器每位详解:
-
-
- 【注】:在编程中定时器/计数器的使用方法:
-
- 三、外部中断篇
-
- 1、外部中断:用到的控制寄存器TCON(主要是低四位,高四位与定时器有关):
-
-
-
- 注:编程时外部中断的使用方法
-
-
- 四、串口中断篇
-
- 1、串口中断:用到的相关寄存器
- 2、波特率计算方法:
注意:
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–低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功能。
未完待续!。。。。。