一、需要了解的寄存器
1.SCON:串行通信控制寄存器(可以字节寻址,也可以位寻址)
位地址 | 9FH | 9EH | 9DH | 9CH | 9BH | 9AH | 99H | 98H |
SCON | SM0 | SM1 | SM2(多机通信:【0:双机,1:多级】) | REN(接受控制:【0:禁止,1为允许】) | TB(发送数据第9位) | RB(接收数据第9位) | TI(发生中断标志位) | RI(接收中断标志) |
PS:其中SM0和SM1为工作方式选择位,可选择四种工作方式:
SM0 | SM1 | 方式 | 说明 | 波特率 |
0 | 0 | 0 | 移位寄存器 | fosc/12 |
0 | 1 | 1 | 10位异步收发器(8位数据) | 可变 |
1 | 0 | 2 | 11位异步收发器(9位数据) | fosc/64或fosc/32 |
1 | 1 | 3 | 11位异步收发器(9位数据) | 可变 |
PS:
(1)TI/RI在任何工作方式下都必须由软件清0
(2)单片机复位时,SCON所有位均清0
2.PCON:电源控制寄存器
PCON | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
位名称 | SMOD | GF1 | GF0 | PD | IDL |
(1)SMOD的作用:在串口工作模式为1、2、3下,其SMOD=1,则波特率加倍。SMOD=0,则波特率不加倍。
3.IE:中断允许控制寄存器
ES:串口中断控制允许位,ES=0,串口中断禁止,ES=1,串口中断允许
二、串口通信需要知识
1.异步通信和同步通信的区别
(1)异步通信:异步在于,发送方和接受方用的时钟不一样,控制其发送和接收。传输的字符有间隙,并且间隙任意。
(2)同步通信,同步在于,发送方和接收方要协调好各自的时钟,要能使得双方的时钟都能达到同步要求。而且传输的字符之间不留间隙。
2.串口通信的机制
(1)单工:只能发送或者接收,其中一种。
(2)半双工:能发送和接收,但是两者不能同时进行。
(3)全双工:能发送和接收,两者可以同时进行。
3.比特率:每秒传输的比特的位数。单位是:bit/s,简称:bps。
4.串行接口结构:
逻辑上:发送SBUF和接收SBUF是指的同一个。但是物理上,其分别指的不一样。
eg:SBUF=a;则该SBUF指的是发送SBUF.
a=SBUF,则该SBUF指的是接收SBUF将数据赋值给变量a了。
5.波特率的计算公式:
方式0的波特率 = fosc/12
方式2的波特率 =(2SMOD/64)· fosc
方式1的波特率 =(2SMOD/32)·(T1溢出率)
方式3的波特率 =(2SMOD/32)·(T1溢出率)
三、51串口通信实践代码:
/*
串口收发程序,把发送的数据接收后用P1口的LED灯以二进制的形式显示
并且蜂鸣器发出提示声,再把接收的数据加1发出。
操作流程:
(1)使用STC ISP 软件界面上的串口助手。选择对应的串口号
(2)设置波特率为9600,选择HEX模式发送和接收
*/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit beep = P2^3;//蜂鸣器接口
uchar num;//发送暂存变量
void delay(uint z)
{
uint x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
}
void UART_init()
{
TMOD = 0x20; //T1工作模式2,8位自动重装
TH1 = 0xfd;
TL1 = 0xfd; //波特率为9600
TR1 = 1; //启动T1定时器
SM0 = 0;
SM1 = 1; //串口工作方式1 10位异步
REN = 1; //串口允许接收
EA = 1; //开总中断
ES = 1; //开串口中断
}
void main()
{
UART_init(); //串口初始化
while(1);
}
void UART() interrupt 4
{
if(RI) //检测是否接收完成
{
num = SBUF; //num 取出接收缓冲器的值
P1 = SBUF;
beep = 0;
delay(100);
beep = 1;//蜂鸣器发出滴提示声
num++;//把接收的数据加1并发送
RI = 0;
SBUF = num;
while(!TI);
TI = 0;
}
}