51单片机内部常用功能单元介绍:串口-常用通信方式、定时器/计数器、中断管理

[TOC]

51单片机功能单元

一、定时器&计数器

  1. 数量:两个可编程的16位的定时器/计数器T0和T1;都是16位加法计数结构;分为高8位和低8位;TH0、TL0,TH1、TL1;
    定时器/计数器T0、T1是80C51的中断源之一,当数据寄存器溢出,则向CPU申请中断。数据寄存器的复位状态为0。为使计数值或定时值满足自己的要求,需预先将数据寄存器赋值,称为初值设定,中断中也要重新设定初值。

  2. 定时器和计数器本质:都是计数器,对下降沿进行计数,计数达到溢出后置为标志位或者进入中断;

  3. 两者的区别:

    定时器是对内部的机械周期脉冲进行计数,每个脉冲都是一个机械周期;定时时间=机器周期*(2^L-初值) (L=13,16,8)

计数器则是通过外部IO口进行脉冲计数,一个脉冲加一个数;对应IO口:T0-P3.4,T1-P3.5;

计数长度:计数长度=(2^L-初值) (L=13,16,8)

两者的模式切换通过TMOD控制

  1. TMOD结构图:

TMOD

  1. TMOD详解

    GATE:门控位

    GATE =1,由中断引脚INT0(P3.2)、INT1(P3.3)和TCON中的位TR0、TR1共同控制来启动定时器/计数器
    
    GATE =0,由TR0和TR1置位来启动定时器/计数器**(一般为0)**

    C/!T:模式选择位:

    1时,计数器模式;
    
    0时,定时器模式;

    M0 & M1共同控制工作方式:

工作方式

项目开发一般用01,考试大概率考00;

  1. 启动停止与中断控制寄存器TCON

TCON

TFx:定时器或者计数器溢出时置位1,请求中断,中断程序进入后自动清零;

TRx:定时器启动控制位,当其等于1时定时器/计数器启动;

  1. 中断允许控制寄存器:IE
    IE

    ETx:定时器/计数器的中断允许位
    EA:CPU总中断的允许位

  2. 定时器/计数器使用:(重点)

    工作方式的设置:

        伪代码:
    1
    2
    3
    4
    5
    //设置定时器0工作在16位模式
    //C语言
    TMOD=0x01; //定时器
    //汇编
    MOV TMOD, #01H;

    计数初值的计算+装载:

        伪代码:
    1
    2
    3
    4
    5
    6
    7
    8
    //机械周期1us,设置500us中断一次为FE0C
    //C语言
    TH0=0xFE;
    TL0=0x0C;
    //汇编
    MOV TH0, #0FEH ;
    MOV TL0, #0cH ;

    中断允许位的设置:

        伪代码:
    1
    2
    3
    4
    5
    6
    //C 	
    EA=1;
    ET0=1;
    //assembly
    SETB EA ;turn on all interrupt
    SETB ET0 ;turn on 0 interrupt

    开启定时器:

        伪代码:
    1
    2
    3
    4
    5
    6
    7
    //c
    TR0=1;

    //assembly
    SETB TR0 ;turn on

    CLR TR0 ;turn off !
  3. 使用实例:

    定时器使用方式(中断方式):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    ORG		0000H;
    AJMP MAIN;
    ORG 001BH;
    AJMP IRQ1;
    MAIN:
    MOV TMOD, #00H ;工作模式0,高8+低5
    MOV TH1, #0FCH
    MOV TL1, #03H
    SETB TR1;
    SETB ET1;
    SETB EA;
    AJMP $;

    IRQ1:
    MOV TMOD, #00H
    MOV TH1, #0FCH
    CPL P1.0
    RETI ;中断返回一定要加!

    计数器使用方式(中断方式):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    ORG		0000H;
    AJMP MAIN;
    ORG 001BH;
    AJMP IRQ1;

    MAIN:
    MOV TMOD, #04H ;计数器模式
    MOV TH1, #0FCH ;一千个下降沿中断一次
    MOV TL1, #03H
    SETB TR1;
    SETB ET1;
    SETB EA;
    AJMP $;

    IRQ1:
    MOV TMOD, #00H
    MOV TH1, #0FCH
    CPL P1.0
    RETI ;中断返回一定要加!

    查询方式则是判断TF溢出标志,变高后进入自定义韩式处理数据,清空标志;

二、并行口&串行口

    并行口:并行传输数据(不常用)    
    占据资源大,错误率高,但快

    **串行口:(重要)**

            稳定,占据IO口小,准确,稍微慢
  1.  **串行口控制寄存器SCON:**

    在这里插入图片描述

                 SM0和SM1:串行口方式选择位;
                     00-移位寄存器方式
                     01-8位UART,波特率可变
                     10-9位UART,波特率为fosc/64或fosc/32(PCON决定)
                     11-9位UART,波特率可变
                     方式1为**常用**通信方式;方式2、3为多机通信,方式0为移位寄存器,**不常用**;
    
                 重要标志位:
                 TI:发送完成标志
                 RI:接收完成标志
  2. 串口波特率与定时器1关联,公式如下:

                波特率=2^SMOD * fosc / [32 * 12(2^K-初值)];(fosc系统主频)
    
     **波特率翻倍寄存器:PCON**
     只有最高位(SMOD)有效:为1时波特率翻倍,为0时不翻倍    

方式1串口通信接收代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
ORG		0000H
LJMP MAIN
ORG 0023H
LJMP RX_TI

MAIN:
MOV SCON, #50H
MOV PCON, #00H
MOV TMOD, #02H
MOV TH1, #0FDH
MOV TL1, #0FDH
SETB TR1
SETB EA
SETB ES

RX_TI:
PUSH ACC
MOV TH1, #0FDH
MOV TL1, #0FDH
MOV A, SBUF
;处理
POP ACC
RETI

发送套用代码:

1
2
3
4
MOV		SBUF,	A
JNB TI, $
CLR TI
RET

三、中断系统

    **所有中断控制位:**
    TCON:
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210105190702240.png)

    TF1、TF0:定时器溢出标志、请求中断:
    IE1、IE0:外部中断溢出请求:
    IT1、IT0:外部中断触发方式选择-1下降沿触发、0低电平触发

    SCON:
    内部TI、RI触发接收发送中断。

    **所有中断允许位:**
位序号 EX0 ET0 EX1 ET1 ES ET2 / EA
说明 外部中断0 定时/计数0 外部中断1 定时/计数1 串行口中断 定时2溢出中断(8052用) 全局中断允许位
    **中断处理跳转地址:**
中断源 矢量单元
外部中断0 0003H
定时器0溢出中断 000BH
外部中断1 0013H
定时器1溢出中断 001BH
串行口 0023H
定时器2溢出中断 002BH

注:进入中断后一般需要对现场进行保护:

使用PUSH和POP做现场保护

1
2
3
4
5
6
7
;对A和PSW压栈保护
PUSH ACC
PUSH PSW

;对A和PSW出栈保护
POP PSW
POP ACC