小知识点补充17:
51单片机有一个可编程全双工串行通信接口。由串行数据缓冲器(SBUF)、波特率发生器、控制寄存器及相关控制电路组成。
1,SBUF:包括发送寄存器和接收寄存器。
2,波特率发生器:由定时器T1、时钟信号、分频电路组成。
3,控制寄存器:特殊功能寄存器SCON、PCON
(1)串行口控制寄存器SCON:
SM0 SM1 :串行口方式选择位
SM0 SM1 工作方式 说 明
0 0 0 同步移位寄存器输入/输出。波特率固定为fosc/12
0 1 1 10位UART,波特率可变(由定时T1溢出率控制)
1 0 2 11位UART,波特率为fosc/64或fosc/32
1 1 3 11位UART ,波特率可变(由定时T1溢出率控制)
备注:UART:通用异步收发传输器,方式0常常用于扩展并行IO口,此处的10/11位包含起始位、停止位等
SM2: 方式2和方式3的多机通信控制位,在方式0中SM2必须置0。
REN: 允许串行接收位,由软件置1时,允许接收,清0时。禁止接收
TB8: 方式2和方式3中,发送的第9位数据,需要时由软件置位或复位
在多机通信中,此位=1:表示主机发送的是地址,=0:表示数据
RB8: 方式2和方式3中,接收到的第9位数据,在方式1时,RB 是接收到停止位,在方式0,未使用
TI: 接收中断标志,由硬件置1,在方式0时,串行发送到第8位结束时置1;在其他方式,串行口发送停止位时置1。TI 必须由软件清0
RI: 接收中断标志,由硬件置1。在方式0时( SM2 应置 0),接收到第8位结束时置 1,当SM2=0的其他方式(方式 0,1,3)时,接收到停止位置位“ 1”,当 SM2=1时,若串口工作在方式2和3,接收到的第9位数据(RB8)为1时才激活RI 。在方式1时,只有接收到有效的停止位时才会激活RI。RI必须由软件清0。
DL: 空闲方式控制位,置1后单片机进入空闲方式,电流为 1.7-5mA
PD: 掉电方式控制位,置1后单片机时钟信号停止,单片机停止工作,掉电方式
GF0: 通用标志位
GF1: 通用标志位
SMOD: 串行口波特率倍率控制位,=1时,波特率加倍
SBUF: 地址:99H,串行通信数据缓冲器
3,工作方式2/3
备注:工作方式2或3,第九位数据的装入由以下指令完成:
SETB TB8
CLR TB8
常用波特率表:
(上图中11.05892全部替换成11.0592)
补充知识点:
TTL电平信号规定,+5V等价于逻辑“1”,0V等价于逻辑“0”(采用二进制来表示数据时)。这样的数据通信及电平规定方式,被称做TTL(晶体管-晶体管逻辑电平)信号系统。这是计算机处理器控制的设备内部各部分之间通信的标准技术。
标准TTL输入高电平最小2V,输出高电平最小2.4V,典型值3.4V,输入低电平最大0.8V,输出低电平最大0.4V,典型值0.2V。
根据下图编程使得LED(共阳极接法)从上到下以某个速度轮流显示。(设晶振12MHz)
解析:
串口工作在方式0,串行口将8位数据(需要8个脉冲)以fosc/12的波特率从RXD引脚输出(低位先出),同步移位脉冲由TXD引脚输出,使得RXD引脚输出的数据移入外部移位寄存器,发送完后置TI。
由晶振12MHz可知,串行口数据将以1MHz的波特率从RXD输出(即TXD输出周期为1us的波形)。
符号 引脚 说明
DSA 1 数据输入
DSB 2 数据输入
Q0~Q7 3~6/10-13 输出
GND 7 地 (0 V)
CP 8 时钟输入(低电平到高电平边沿触发)
MR 9 中央复位输入(低电平有效)
VCC 14 正电源
备注:主复位 (MR) 输入端上的一个低电平将使其它所有输入端都无效,非同步地清除寄存器,强制所有的输出为低电平
程序源码:
ENABLE EQU P2.6
ORG 0000H
LJMP START
ORG 000BH
LJMP T0ADDR
ORG 0030H
START:
MOV SCON,#00H
SETB ENABLE
MOV TL0,#0AFH
MOV TH0,#3CH
;50 MS fosc=12MHz
MOV TMOD,#01H
SETB EA
SETB ET0
SETB PT0
CLR F0
MOV R7,#08H
MOV A,#7FH
LOOP:
MOV SBUF,A
JNB TI,$
SETB TR0
CLR TI
JBC F0,$
RR A
DJNZ R7,LOOP
MOV A,#7FH
AJMP LOOP
SJMP $
T0ADDR:
CLR TR0
MOV TL0,#0AFH
MOV TH0,#3CH
;50 MS fosc=12MHz
SETB F0
RETI
END
仿真图:
通过程序,用定时器延时50ms,每隔50ms依次点亮一个LED。
仿真视频:
50ms有点快,所以视频中的LED轮流亮灭变化感觉不明显。
利用单片机串行口工作在方式0下的应用:扩展8位并行口
两片单片机进行通信实验,电路如下:(设晶振11.0592MHz),波特率、工作方式自行设置,要求:A机发送0-9数字并在数码管上显示,B机接收到A机数据后进行筛选,如果接收的数据为数字6,则在数码管显示6,否则显示‘H’,同时A机的P1.0口产生100毫秒的方波信号。
电路图如下:
程序源码:
1,A机源码:
(波特率2400)
;A machine
ORG 0000H
LJMP START
ORG 000BH
LJMP T0ADDR
ORG 0030H
START:
MOV SP,#66H
MOV A,#00H
MOV R7,#0AH
MOV SCON,#50H;0101 0000B
MOV TMOD,#21H;0010 0000B
MOV PCON,#00H
MOV TL1,#0F4H
MOV TH1,#0F4H
MOV TL0,#0AFH
MOV TH0,#3CH
SETB ET0
SETB PT0
SETB EA
CLR P1.0
SETB TR0
SETB TR1
MOV DPTR,#TAB
LOOP:
SETB TR1
MOV SBUF,A
PUSH ACC
MOVC A,@A+DPTR
MOV P0,A
JNB TI,$
CLR TR1
CLR TI
POP ACC
INC A
LCALL DELAY1S
DJNZ R7,LOOP
MOV A,#00H
MOV R7,#0AH
AJMP LOOP
SJMP $
T0ADDR:
CPL P1.0
MOV TL0,#0AFH
MOV TH0,#3CH
RETI
DELAY1S:
MOV R4,#10
D1:
MOV R5,#200
D2:
MOV R6,#250
DJNZ R6,$
DJNZ R5,D2
DJNZ R4,D1
RET
TAB:
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END
2,B机源码:
;B machine
ORG 0000H
LJMP START
ORG 0023H
LJMP UARTADDR
ORG 0030H
START:
MOV SP,#66H
MOV SCON,#50H;0101 0000B
MOV TMOD,#20H;0010 0000B
MOV PCON,#00H
MOV TL1,#0F4H
MOV TH1,#0F4H
SETB EA
SETB ES
SETB TR1
MOV A,R7
MOV P0,A
MOV SBUF,A
SJMP $
UARTADDR:
MOV A,SBUF
CJNE A,#06H,OUTPUT
MOV A,#7DH
MOV P0,A
AJMP RETU
OUTPUT:
MOV A,#76H
MOV P0,A
RETU:
CLR RI
RETI
END
2,A机发送数据不等于6时
备注:示波器中蓝色为A机P1.0输出波形,黄色为A机发送端口波形
仿真视频:
51单片机串口通信