1、通信相关概念
(1)单工:只能接收或只能发送数据。
(2)半双工:既能发送数据,也能接收数据,但不能同时进行。
(3)全双工:可以同时进行发送和接收数据。
(4)单片机中常用的通信物理接口:I2C、SPI、USB、CAN、UART等。
2、串口
(1)串口:串行数据通信接口。
(2)51单片机串口为全双工模式。
(3)串口数据的一帧格式:UART frame = 起始位 + 数据位 +校验位 + 停止位。
3、寄存器
3.1、SBUF:串口数据缓冲器
(1)SBUF 物理上是有两个,逻辑地址只有一个。
(2)51单片机设有2个独立的接收、发送缓冲器,可以同时接收和发送数据。发送缓冲器只能写入而不能读出,接收缓冲器只能读出而不能写入,因而两个缓冲器可以共用一个地址码(99H)。两个缓冲器统称串行特殊功能寄存器SBUF。
(3)MOV A,SBUF ;接收
(4)MOV SBUF,A ;发送
3.2、SCON:串行口控制寄存器
(1)SMO位和SM1:串行口方式选择(常用的就是方式1)
(2)SM2位:多机通信位。
(3)REN:允许/禁止串行接收控制位。
(4)TB8,RB8,涉及到校验位,当下已经不用,奇偶校验误码率太高。校验可接收到数据后采用CRC校验。
(5) TI ,RI 中断标志位(硬件自动置位,必须软件清0),其他中断是中断服务程序执行完,中断标志位就自动清零了。
3.3、PCON:电源控制寄存器
(1)不可位寻址。
(2)SMOD为波特率选择位。
4、波特率计算
参照数据手册和STC-ISP软件。
5、示例程序
5.1、功能
(1)PC机通过串口发送数据到MCU,MCU将接收到的数据发回给PC机,通过串口助手查看。
(2)串口波特率为4800,串口工作方式为方式1。
5.2、代码
;PC机通过串口发送数据到MCU,MCU将接收到的数据发回给PC机,通过串口助手查看。
;---------------------------------------------------------------------------
ORG 0000H ;ORG为程序段说明伪指令,它向汇编程序说明该程序段的起始地址,所以可以当中断向量地址用
LJMP L_Main ;跳转到L_Main标号处
ORG 0023H ;串口中断向量地址
LJMP I_UART ;跳转到I_UART标号处
L_Main:
;your code
;串口初始化,波特率4800
ORL PCON,#80H ;使能波特率倍速位SMOD;PCON值与0x80H相或
MOV TMOD,#0x20 ;定时器1为8位自动装载模式
MOV TL1, #0F3H ;设置定时初始值,字母开头的16进制字母前面要加0
MOV TH1, #0F3H ;设置定时重载值
MOV SCON,#0x50 ;8位数据,可变波特率
SETB EA ;总中断允许控制位设置为1
SETB ES ;串行口中断允许位
CLR ET1 ;关闭定时器1溢出中断
SETB TR1 ;定时器1开始计时
;---------------------------------------
L_loop:
SJMP L_Loop ;相对转移
;---------------------------------------
F_UartSendByte:
MOV SBUF,A ;中断中已把要发送的内容赋到A中
JNB TI,$ ;发送完成;TI为0则跳转到当前位置$,等于1则往下执行;等于1则说明发送完成
CLR TI ;清发送中断请求标志位
RET ;子程序返回
;---------------------------------------
I_UART: ;只处理接收程序
PUSH ACC ;ACC地址单元中的数据压栈
PUSH PSW ;程序状态字寄存器压栈
JBC TI,L_Exit ;发送数据产生的中断直接退出中断;TI位为1则跳转到L_Exit处
CLR RI ;清中断接收标志位
MOV A,SBUF ;接收数据内容赋值给A
LCALL F_UartSendByte ;调用子程序
L_Exit:
POP PSW ;程序状态字寄存器出栈
POP ACC ;ACC地址单元中的数据出栈
RETI ;中断返回
;---------------------------------------
END