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
 
 
 
 
 
 
                














