MCS-51功能单元
一、定时器&计数器
数量:两个可编程的16位的定时器/计数器T0和T1;都是16位加法计数结构;分为高8位和低8位;TH0、TL0,TH1、TL1;
定时器/计数器T0、T1是80C51的中断源之一,当数据寄存器溢出,则向CPU申请中断。数据寄存器的复位状态为0。为使计数值或定时值满足自己的要求,需预先将数据寄存器赋值,称为初值设定,中断中也要重新设定初值。定时器和计数器本质:都是计数器,对下降沿进行计数,计数达到溢出后置为标志位或者进入中断;
-
两者的区别:
定时器是对内部的机械周期脉冲进行计数,每个脉冲都是一个机械周期;定时时间=机器周期*(2^L-初值) (L=13,16,8)
计数器则是通过外部IO口进行脉冲计数,一个脉冲加一个数;对应IO口:T0-P3.4,T1-P3.5;
计数长度:计数长度=(2^L-初值) (L=13,16,8)
两者的模式切换通过TMOD控制
TMOD结构图:
-
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;
启动停止与中断控制寄存器TCON
TFx:定时器或者计数器溢出时置位1,请求中断,中断程序进入后自动清零;
TRx:定时器启动控制位,当其等于1时定时器/计数器启动;
-
中断允许控制寄存器:IE
ETx:定时器/计数器的中断允许位
EA:CPU总中断的允许位 -
定时器/计数器使用:(重点)
工作方式的设置:
伪代码:
//设置定时器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 !
-
使用实例:
定时器使用方式(中断方式):
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口小,准确,稍微慢
-
串行口控制寄存器SCON:
SM0和SM1:串行口方式选择位;
00-移位寄存器方式
01-8位UART,波特率可变
10-9位UART,波特率为fosc/64或fosc/32(PCON决定)
11-9位UART,波特率可变
方式1为常用通信方式;方式2、3为多机通信,方式0为移位寄存器,不常用;重要标志位: TI:发送完成标志 RI:接收完成标志
串口波特率与定时器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触发接收发送中断。
所有中断允许位:
中断处理跳转地址:
中断源 | 矢量单元 |
---|---|
外部中断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