下面来具体说下如何设置各个寄存器来实现串口通信:
以下寄存器均位8位寄存器,从右到左依次是从二进制低位到高位,第一行表格每一个代表一个二进制位,表格里的内容代表此二进制位的名字,最后一行为本文所使用的配置,第一个表格中间一行表示高四位用来控制
timer1,低四位控制Timer2。紧跟表格下方的第一行为此文配置,第二行为配置说明,剩下的为各二进制位的功能讲解。
TMOD寄存器:
GATE
|
C/T(__)
|
M1
|
M0
|
GATE
|
C/T(__)
|
M1
|
M0
|
Timer 1
|
Timer 0
|
0
|
0
|
1
|
0
|
0
|
0
|
0
|
0
|
TMOD=0x20;
此配置作用:使用Timer1的mode2工作模式,提供自动加载的8位定时器/计数器→TH1
GATE位:为Timer的控制开关,为0时只要TCON寄存器的TR位为1即可启动定时器,称为内部启动,为1时则需要TR位为1,同时外部给INT0引脚一个高电平,称为外部启动,我们只用内部启动,外部启动作为了解。
C/T(__)位:为0时使用单片机内部的计数器,为1时使用外部的计数器。非特殊情况下都使用内部计数器。
M1、M0组合设置定时器(Timer)的四种工作模式
M1
|
M0
|
|
0
|
0
|
模式0:两个13位定时器/计数器
|
0
|
1
|
模式1:两个16位定时器/计数器
|
1
|
0
|
模式2:两个8为自动载入定时器/计数器
|
1
|
1
|
模式3:一个8位定时器/计数器,一个8位计时器(比较特殊,不需理解)
|
另一个Timer的各位功能同上。
TCON寄存器:
TF1
|
TR1
|
TF0
|
TR0
|
IE1
|
IT1
|
IE0
|
IT0
|
TCON(只使用TR)
作用:TR=1, 启动Timer1
此寄存器只需了解TR1控制Timer1,TR0控制Timer0,详细见TMOD寄存器GATE位讲解。
SCON寄存器:
SM0
|
SM1
|
SM2
|
REN
|
TB8
|
RB8
|
TI
|
RI
|
0
|
1
|
0
|
1
|
0
|
0
|
0
|
0
|
SCON=0x50;
此配置作用:使用串行端口的mode1
SM0、SM1组合设置串行端口的模式
SM0
|
SM1
|
Mode
|
功能简介
|
比特率
|
0
|
0
|
0
|
移位寄存器
|
OSC/12
|
0
|
1
|
1
|
8位UART
|
可变
|
1
|
0
|
2
|
9位UART
|
OSC/32或OSC/64
|
1
|
1
|
3
|
9位UART
|
可变
|
(UART是一个将并行输入转为串行输出的芯片,集成在单片机内,了解即可)(OSC:晶振频率)
SM2: Mode 0时,SM2=0;
Mode 1 时,若SM2=1,且收到有效的停止位,则RI=1,(产生RI中断),否则RI=0;
Mode 2 或 3 时,若SM2=1,且收到的第9位为1,则RI=1(产生RI中断)。
REN:为1,开始接收,为0,停止接收。
TB8:mode2或3传送数据时,本位为第9位传送位,可通过写代码来设定或清除。
RB8:mode2或3接收数据时,本位为第9位接收位;
mode1时,若SM2=0,则本位为停止位;
mode0时,本位无作用。
TI:本位为传送中断标志位,当中断结束时,本位并不会恢复为0,必须在代码中清除。
Mode1、2、3时,若完成传送停止位,则本位自动设定为1,并产生TI中断。
Mode0时,若完成传送第8位,则本位自动设定为1,产生TI中断。
RI:本位为接收中断标志位,当中断结束时,本位并不会恢复为0,必须在代码中清除。
Mode1、2、3时,若完成接收停止位,则本位自动设定为1,并产生RI中断。
Mode0时,若完成接收第8位,则本位自动设定为1,产生RI中断。
PCON寄存器:
SMOD | - | - | - | GF1 | GF0 | PD | IDL |
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
PCON=0x80;此配置作用:使SMOD=1,计算比特率 此寄存器不作理解,只需知道设置SMOD值可影响波特率计算即可。 比特率计算公式(串行端口mode1):比特率=(2SMOD/32)*(OSC/(12*(256-TH1)))
3