51单片机定时器、串口、中断

MCS-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控制

  4. 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

在这里插入图片描述

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

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

  1. 中断允许控制寄存器:IE
    在这里插入图片描述

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

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

    工作方式的设置:

    ​ 伪代码:

    //设置定时器0工作在16位模式
    //C语言
    	TMOD=0x01;				//定时器
    //汇编
    	MOV		TMOD,	#01H;	
    

    计数初值的计算+装载:

    ​ 伪代码:

    //机械周期1us,设置500us中断一次为FE0C
    //C语言
    	TH0=0xFE;
        TL0=0x0C;
    //汇编
    	MOV 	TH0,	#0FEH	;
        MOV		TL0,	#0cH	;
    
    

    中断允许位的设置:
    伪代码:

    //C 	
    	EA=1;
    	ET0=1;
    //assembly
    	SETB	EA		;turn on all interrupt
        SETB	ET0		;turn on 0 interrupt
    

    开启定时器:
    伪代码:

    //c
    	TR0=1;
    
    //assembly
    	SETB 	TR0		;turn on
            
    	CLR 	TR0		;turn off !
    
  3. 使用实例:

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

    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	;中断返回一定要加!
            
    

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

    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串口通信接收代码:

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

发送套用代码:

MOV		SBUF,	A
JNB		TI,		$
CLR		TI
RET

三、中断系统

所有中断控制位:
​ TCON:
在这里插入图片描述

​ 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做现场保护

;对A和PSW压栈保护
PUSH 	ACC
PUSH	PSW

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

猜你喜欢

转载自blog.csdn.net/qq_45396672/article/details/112250463