一、STC15单片机串口
1、除STC15F100W系统单片机无串行口功能外,其他STC15系列单片机都有串行口功能。STC15单片机最多有四个采用UART工作方式的全双工异步串行通信接口(串口1、串口2、串口3和串口4)。每个串行口由2个数据缓冲器、一个移位寄存器、一个串行控制寄存器和一个波特率发生器等组成,如下表所示:

2、STC15单片机串行口1有四种工作模式,其中两种工作模式的波特率是可变的,另外两种是固定的,串行口2/串行口3/串行口4都只有两种工作模式,这两种工作模式的波特率都是可变的。

3、STC15单片机串口1可在3组管脚间切换,串口2可在2组管脚间切换,串口3可在2组管脚间切换,串口4可在2组管脚间切换。

4、STC15单片机串口1默认选择定时器2作为其波特率发生器,也可选择定时器1作为其波特率发生器;串口2永远使用定时器2作为波特率发生器;串口3默认选择定时器2作为其波特率发生器,也可选择定时器3作为其波特率发生器;串口4默认选择定时器2作为其波特率发生器,也可选择定时器4作为其波特率发生器。
注:串口1、串口2、串口3、串口4波特率相同时,串口1、串口2、串口3、串口4可共享T2作为波特率发生器。

二、STC15单片机串口寄存器
1、STC15系列单片机串口1寄存器如下表:

2、STC15系列单片机串口1寄存器设置:
(1)PCON寄存器(不可位寻址):电源控制寄存器

SMOD:波特率选择位,当SMOD=1时,串口工作模式1、串口工作模式2、串口工作模式3的波特率加倍;当SMOD=0时,串口工作模式1、串口工作模式2、串口工作模式3的波特率不加倍。
SMOD0:帧错误检测有效控制位,当SMOD0=1时,SCON寄存器中的SM0/FE位用于错误帧检测功能;当SMOD0=0时,SCON寄存器中的SM0/FE位用于SM0功能,和SM1一起指定串行口的工作方式。
(2)AUXR寄存器(不可位寻址):辅助寄存器

UART_M0x6:串口工作模式0通信速率设置位,UART_M0x6=0时,串口1工作模式0的速率是传统8051的速率,12分频;UART_M0x6=0时,串口1工作模式0的速率是传统8051的速率的6倍,2分频。
S1ST2:串口1(UART1)选择定时器2作为波特率发生器的控制位,S1ST2=0时,选择定时器1作为串口1的波特率发生器;S1ST2=1时,选择定时器2作为串口1的波特率发生器。
(3)SCON寄存器(可位寻址):串行控制寄存器

SM0/FE:SM0或帧错误检测位,当PCON寄存器中的SMOD0=1时,SM0/FE用于帧错误检测,当检测到一个无效停止位时,通过UART接收器设置SM0/FE=1,必须由软件清零;当PCON寄存器中的SMOD0=0时,SM0/FE和SM1一起指定串行通信的工作模式,如下表:

SM2:允许模式2或模式3多机通信控制位,在模式2或模式3中,如果SM2位为1且REN位为1,则接收机处于地址筛选状态,此时可以利用接收到的第9位(RB8)来筛选地址帧,当RB8=1时,说明该帧是地址帧,地址信息可进入SBUF,并使RI为1,进而在中断服务程序中再进行地址号比较;当RB8=0时,说明该帧不是地址帧,应丢掉且保持RI=0。在模式2或模式3中,如果SM2位为0且REN位为1,接收机处于地址帧筛选被禁止状态,不论收到的RB8=0或RB8=1,均可使接收到的信息进入SBUF,并使RI=1,此时RB8为校验位。
注:模式1和模式0是非多机通信方式,在这两种方式时,要设置SM2为0
REN:允许/禁止串行接收控制位。当REN=1时,允许串行接收状态,可启动串行接收器RxD,开始接收信息;当REN=0时,禁止串行接收状态。
TB8:在模式2或模式3中,TB8为要发送的第9位数据,由软件置位或清零,可用作数据的校验位或多机通信中表示地址帧/数据帧的标志位。
注:模式1和模式0该位不可用
RB8:在模式2或模式3中,RB8为接收到的第9位数据,可作为奇偶校验位或地址帧/数据帧的标志位。
注:模式0中不用RB8,方式1中也不用RB8,RB8是接收到的停止位
TI:发送中断请求标志位,在模式0中,当串行发送数据第8位结束时,由内部硬件自动置位TI=1,向主机请求中断,响应中断后TI必须用软件清零。在模式1、模式2、模式3中,在停止位开始发送时由内部硬件置位TI=1,响应中断后TI必须软件清零。
RI:接收中断请求标志位,在模式0中,当串行接收到第8位结束时,由内部硬件自动置位RI=1,向主机请求中断,响应中断后RI必须用软件清零。在模式1、模式2、模式3中,串行接收到停止位的中间时刻由内部硬件置位RI=1,响应中断后RI必须软件清零。
(4)SBUF寄存器(不可位寻址):串口1数据缓冲寄存器,SBUF实际是2个缓存器,写SBUF的操作完成待发送数据的加载,读SBUF的操作可获得已接收到的数据。
串行通道发送寄存器是一个输出移位寄存器,在写入SBUF信号的控制下,把数据装入相同的9位移位寄存器,前8位为数据字节,根据不同的串口模式会自动将“1”或TB8的值装入移位寄存器的第9位,并进行发送。
串行通道接收寄存器是一个输入移位寄存器,在模式0时,它的字长为8位,在模式1、模式2、模式3时,它的字长为9位,当一帧接收完毕,移位寄存器中的数据字节装入串行数据缓冲器SBUF中,其第9位则装入RB8位。
(5)AUXR1寄存器(不可位寻址):串口1引脚切换寄存器

串口1建议放在[P3.6/RxD_2,P3.7/TxD_2]或[P1.6/RxD_3,P1.7/TxD_3]上。

(6)CLK_DIV寄存器(不可位寻址):时钟分频寄存器

Tx_Rx:串口1中继广播方式设置位,当Tx_Rx=0时,串口1为正常工作方式,满足正常串口通信;当Tx_Rx=1时,串口1为中断广播方式,即将RxD端口输入的电平状态实时输出在TxD外部管脚上,TxD外部管脚可以对RxD管脚输入信号进行实时整形放大输出,TxD管脚的对外输出反映RxD端口输入的电平状态。
(7)SADEN寄存器(不可位寻址):从机地址掩模寄存器
![]()
(8)SADDR寄存器(不可位寻址):从机地址寄存器
![]()
注:串口自动地址识别首先将串口设置为9位Uart,SM2=1,从机MCU会自动过滤掉非地址数据(第9位为0的数据),而对SBUF中的地址数据(第9位为1的数据)自动与SADDR和SADEN所设置的本机地址进行比较,若地址相匹配,则会将RI置1,并产生中断,否则不予处理。
从机地址的设置通过SADDR和SADEN两个寄存器进行设置,SADDR为从机地址寄存器,里面存放本机的从机地址,SADEN为从机地址屏蔽位寄存器,用于设置地址信息的忽略位,设置方法如下:
- SADDR=11001010
- SADEN=00001111
则匹配地址为xxxx1010,即只要主机送出的地址数据中的低4位为1010就可以和本机地址相匹配,而高4位被忽略,可以为任意值;
(9)IE寄存器(可位寻址):中断允许寄存器

EA:CPU的总中断允许控制位,当EA=1时,CPU开放中断;当EA=0时,CPU屏蔽所有中断。
ES:串行口中断允许位,当ES=1时,允许串行口中断,当ES=0时,禁止串行口中断。
(10)IP寄存器(可位寻址):中断优先级控制寄存器

PS:串行口1中断优先级控制位,当PS=0时,串行口1中断为最低优先级中断(优先级0);当PS=1时,串行口1中断为最高优先级中断(优先级1)
3、STC15系列单片机串口2寄存器如下表:

4、STC15系列单片机串口2寄存器设置:
(1)S2CON寄存器(不可位寻址):串行口2控制寄存器

S2SM0:指定串行口2的工作方式,如下表:
S2SM2:允许模式1多机通信控制位,在模式1时,当S2SM2位为1且S2REN位为1时,则接收机处于地址筛选状态,此时可以利用接收到的第9位(S2RB8)来筛选地址帧,当S2RB8=1时,说明该帧是地址帧,地址信息可进入S2BUF,并使S2RI为1,进而在中断服务程序中再进行地址号比较;当S2RB8=0时,说明该帧不是地址帧,应丢掉且保持S2RI=0。在模式1中,如果S2SM2位为0且S2REN位为1,接收机处于地址帧筛选被禁止状态,不论收到的S2RB8=0或S2RB8=1,均可使接收到的信息进入S2BUF,并使S2RI=1,此时S2RB8为校验位。
注:模式0是非多机通信方式,在这种方式时,要设置S2SM2为0
S2REN:允许/禁止串行口2接收控制位。当S2REN=1时,允许串行接收状态,可启动串行接收器RxD2,开始接收信息;当S2REN=0时,禁止串行接收状态。
S2TB8:在模式1中,S2TB8为要发送的第9位数据,由软件置位或清零,可用作数据的校验位或多机通信中表示地址帧/数据帧的标志位。
注:模式0该位不可用
S2RB8:在模式1中,S2RB8为接收到的第9位数据,可作为奇偶校验位或地址帧/数据帧的标志位
注:模式0中不用S2RB8,S2RB8是接收到的停止位
S2TI:发送中断请求标志位,在停止位开始发送时由内部硬件置位S2TI=1,响应中断后S2TI必须软件清零。
S2RI:接收中断请求标志位,在串行接收到停止位的中间时刻由内部硬件置位S2RI=1,响应中断后S2RI必须软件清零。
(2)S2BUF寄存器(不可位寻址):串行口2数据缓冲寄存器,S2BUF实际是2个缓存器,写S2BUF的操作完成待发送数据的加载,读S2BUF的操作可获得已接收到的数据。
串行通道发送寄存器是一个输出移位寄存器,在写入S2BUF信号的控制下,把数据装入相同的9位移位寄存器,前8位为数据字节,根据不同的串口模式会自动将“1”或S2TB8的值装入移位寄存器的第9位,并进行发送。
串行通道接收寄存器是一个输入移位寄存器,在模式0、模式1时,它的字长为9位,当一帧接收完毕,移位寄存器中的数据字节装入串行数据缓冲器S2BUF中,其第9位则装入S2RB8位。
(3)P_SW2寄存器(不可位寻址):外围设备功能切换控制寄存器2


(4)IE寄存器(可位寻址):中断允许寄存器

EA:CPU的总中断允许控制位,当EA=1时,CPU开放中断;当EA=0时,CPU屏蔽所有中断。
(5)IE2寄存器(不可位寻址):中断允许寄存器2

ES2:串行口2中断允许位,当ES2=1时,允许串行口2中断,当ES2=0时,禁止串行口2中断。
(6)IP2寄存器(不可位寻址):中断优先级控制寄存器2

PS2:串行口2中断优先级控制位,当PS2=0时,串行口2中断为最低优先级中断(优先级0);当PS2=1时,串行口2中断为最高优先级中断(优先级1)
5、STC15系列单片机串口3寄存器如下表:

6、STC15系列单片机串口3寄存器设置:
(1)S3CON寄存器(不可位寻址):串行口3控制寄存器

S3SM0:指定串行口3的工作方式,如下表:

S3ST3:串口3(UART3)选择定时器3作为波特率发生器的控制位,S3ST3=0时,选择定时器2作为串口3波特率发生器;S3ST3=1时,选择定时器3作为串口3波特率发生器。
S3SM2:允许模式1多机通信控制位,在模式1时,当S3SM2位为1且S3REN位为1时,则接收机处于地址筛选状态,此时可以利用接收到的第9位(S3RB8)来筛选地址帧,当S3RB8=1时,说明该帧是地址帧,地址信息可进入S3BUF,并使S3RI为1,进而在中断服务程序中再进行地址号比较;当S3RB8=0时,说明该帧不是地址帧,应丢掉且保持S3RI=0。在模式1中,如果S3SM2位为0且S3REN位为1,接收机处于地址帧筛选被禁止状态,不论收到的S3RB8=0或S3RB8=1,均可使接收到的信息进入S3BUF,并使S3RI=1,此时S3RB8为校验位。
注:模式0是非多机通信方式,在这种方式时,要设置S3SM2为0
S3REN:允许/禁止串行口3接收控制位。当S3REN=1时,允许串行接收状态,可启动串行接收器RxD3,开始接收信息;当S3REN=0时,禁止串行接收状态。
S3TB8:在模式1中,S3TB8为要发送的第9位数据,由软件置位或清零,可用作数据的校验位或多机通信中表示地址帧/数据帧的标志位。
注:模式0该位不可用
S3RB8:在模式1中,S3RB8为接收到的第9位数据,可作为奇偶校验位或地址帧/数据帧的标志位
注:模式0中不用S3RB8,S3RB8是接收到的停止位
S3TI:发送中断请求标志位,在停止位开始发送时由内部硬件置位S3TI=1,响应中断后S3TI必须软件清零。
S3RI:接收中断请求标志位,在串行接收到停止位的中间时刻由内部硬件置位S3RI=1,响应中断后S3RI必须软件清零。
(2)S3BUF寄存器(不可位寻址):串行口3数据缓冲寄存器,S3BUF实际是2个缓存器,写S3BUF的操作完成待发送数据的加载,读S3BUF的操作可获得已接收到的数据。
串行通道发送寄存器是一个输出移位寄存器,在写入S3BUF信号的控制下,把数据装入相同的9位移位寄存器,前8位为数据字节,根据不同的串口模式会自动将“1”或S3TB8的值装入移位寄存器的第9位,并进行发送。
串行通道接收寄存器是一个输入移位寄存器,在模式0、模式1时,它的字长为9位,当一帧接收完毕,移位寄存器中的数据字节装入串行数据缓冲器S3BUF中,其第9位则装入S3RB8位。
(3)P_SW2寄存器(不可位寻址):外围设备功能切换控制寄存器2


(4)IE寄存器(可位寻址):中断允许寄存器

EA:CPU的总中断允许控制位,当EA=1时,CPU开放中断;当EA=0时,CPU屏蔽所有中断。
(5)IE2寄存器(不可位寻址):中断允许寄存器2

ES3:串行口3中断允许位,当ES3=1时,允许串行口3中断,当ES3=0时,禁止串行口3中断。
7、STC15系列单片机串口4寄存器如下表:

8、STC15系列单片机串口4寄存器设置:
(1)S4CON寄存器(不可位寻址):串行口4控制寄存器

S4SM0:指定串行口4的工作方式,如下表:

S4ST4:串口4(UART4)选择定时器4作为波特率发生器的控制位,S4ST4=0时,选择定时器2作为串口4波特率发生器;S4ST4=1时,选择定时器4作为串口4波特率发生器。
S4SM2:允许模式1多机通信控制位,在模式1时,当S4SM2位为1且S4REN位为1时,则接收机处于地址筛选状态,此时可以利用接收到的第9位(S4RB8)来筛选地址帧,当S4RB8=1时,说明该帧是地址帧,地址信息可进入S4BUF,并使S4RI为1,进而在中断服务程序中再进行地址号比较;当S4RB8=0时,说明该帧不是地址帧,应丢掉且保持S4RI=0。在模式1中,如果S4SM2位为0且S4REN位为1,接收机处于地址帧筛选被禁止状态,不论收到的S4RB8=0或S4RB8=1,均可使接收到的信息进入S4BUF,并使S4RI=1,此时S4RB8为校验位。
注:模式0是非多机通信方式,在这种方式时,要设置S4SM2为0
S4REN:允许/禁止串行口4接收控制位。当S4REN=1时,允许串行接收状态,可启动串行接收器RxD4,开始接收信息;当S4REN=0时,禁止串行接收状态。
S4TB8:在模式1中,S4TB8为要发送的第9位数据,由软件置位或清零,可用作数据的校验位或多机通信中表示地址帧/数据帧的标志位。
注:模式0该位不可用
S4RB8:在模式1中,S4RB8为接收到的第9位数据,可作为奇偶校验位或地址帧/数据帧的标志位
注:模式0中不用S4RB8,S4RB8是接收到的停止位
S4TI:发送中断请求标志位,在停止位开始发送时由内部硬件置位S4TI=1,响应中断后S4TI必须软件清零。
S4RI:接收中断请求标志位,在串行接收到停止位的中间时刻由内部硬件置位S4RI=1,响应中断后S4RI必须软件清零。
(2)S4BUF寄存器(不可位寻址):串行口4数据缓冲寄存器,S4BUF实际是2个缓存器,写S4BUF的操作完成待发送数据的加载,读S4BUF的操作可获得已接收到的数据。
串行通道发送寄存器是一个输出移位寄存器,在写入S4BUF信号的控制下,把数据装入相同的9位移位寄存器,前8位为数据字节,根据不同的串口模式会自动将“1”或S4TB8的值装入移位寄存器的第9位,并进行发送。
串行通道接收寄存器是一个输入移位寄存器,在模式0、模式1时,它的字长为9位,当一帧接收完毕,移位寄存器中的数据字节装入串行数据缓冲器S4BUF中,其第9位则装入S4RB8位。
(3)P_SW2寄存器(不可位寻址):外围设备功能切换控制寄存器2


(4)IE寄存器(可位寻址):中断允许寄存器

EA:CPU的总中断允许控制位,当EA=1时,CPU开放中断;当EA=0时,CPU屏蔽所有中断。
(5)IE2寄存器(不可位寻址):中断允许寄存器2

ES4:串行口4中断允许位,当ES4=1时,允许串行口4中断,当ES4=0时,禁止串行口4中断。
三、STC15单片机串口工作模式
1、STC15系列单片机串口1工作模式
(1)工作模式0:
此模式下串口1工作在同步移位寄存器模式,如下图所示:

模式0发送数据过程:当数据写入发送缓冲器SBUF时启动发送,发送控制端SEND有效(高电平),允许RxD发送数据,同时允许TxD输出同步移位脉冲,串行口将8位数据以SYSclk/12或SYSclk/2的波特率从RxD管脚输出(低位->高位),TxD管脚输出同步移位脉冲,发送完一帧数据(8位),中断标志TI置1,再次发送数据前,必须用软件将TI清0,波形图如下:

模式0接收数据过程:复位接收中断RI,即RI=0,置位允许接收控制位REN=1时,启动接收,接收控制端RECEIVE有效(高电平),允许TxD输出同步移位脉冲,RxD为串行输入端,串行接收数据的波特率为SYSclk/12或SYSclk/2,当接收到一帧数据(8位),中断标志RI置1,再次接收时,必须通过软件将RI清0,波形图如下:

注:模式0时必须清0多机通信控制位SM2,无需定时器提供波特率,直接由单片机的时钟作为同步移位脉冲。
(2)工作模式1:
此模式下串口1工作在8位UART,波特率可变模式(波特率由定时器1或定时器2产生),一帧数据为10位:1位起始位,8位数据位(低位在先)和1位停止位,TxD为发送数据,RxD为接收数据,如下图所示:

模式1发送数据过程:当数据写入发送缓冲器SBUF时启动发送,写SBUF信号还把1装入移位寄存器的第9位,并通知Tx控制单元开始发送,移位寄存器将数据不断右移至TxD端口发送,在数据的左边不断移入0作补充,当数据的最高位移到TxD端口发送,紧随其后的是第9位1,Tx控制单元作最后一次移位输出,然后允许发送信号SEND失效,完成一帧信息的发送,置位中断请求位TI,即TI=1,向主机请求中断处理,波形图如下:

模式1接收数据过程:当软件置位接收允许标志位REN,即REN=1时,接收器便以选定波特率的16倍速率采样串行接收端口RxD,当检测到RxD端口从1->0的负跳变,且RxD端口值保持为0(低电平),持续1波特率时就启动接收器准备接收数据,并立即复位16倍计数器,将1FF值装入移位寄存器,当检测到RxD端口从1->0的负跳变,RxD端口值不为0(低电平),则起始位无效,复位接收电路,复位16倍计数器,并重新检测1->0的跳变,波形图如下:

16倍计数器是将波特率(每位接收时间)均分为16等分,每等分为1个状态,在每位接收时间的7、8、9状态由检测器对RxD端口进行采样,所接收的值是这次采样三中取二(3次采样至少2次相同)的值,以此消除干扰,提高可靠性。
接收的数据从接收移位寄存器的右边移入,已装入的1FF值向左边移出,当起始位0移到移位寄存器的最左边时,完成一帧数据的接收,若同时满足以下两个条件:
- RI=0;
- SM2=0或接收到的停止位为1
则接收到的数据有效,数据载入SBUF,停止位进入RB8,置位RI,向主机请求中断,否则数据丢弃。
注:串行通信工作在模式1时,SM2设置为0
(3)工作模式2:
此模式下串口1工作在9位UART,波特率固定模式(波特率可通过软件对PCON中的SMOD位进行设置,当SMOD=1时,波特率为SYSclk/32;当SMOD=0时,波特率为SYSclk/64),一帧数据为11位:1位起始位,8位数据位(低位在先),1位可编程位(第9位数据)和1位停止位,TxD为发送数据,RxD为接收数据,如下图所示:

模式2发送数据过程:当数据写入发送缓冲器SBUF时启动发送,发送时可编程位(由SCON中的TB8提供,可软件设置为1或0)装入移位寄存器的第9位,并通知Tx控制单元开始发送,移位寄存器将数据不断右移至TxD端口发送,在数据的左边不断移入0作补充,当数据的最高位移到TxD端口发送,紧随其后的是第9位数据,Tx控制单元作最后一次移位输出,然后允许发送信号SEND失效,完成一帧信息的发送,置位中断请求位TI,即TI=1,向主机请求中断处理,波形图如下:

模式2接收数据过程:当软件置位接收允许标志位REN,即REN=1时,接收器便以选定波特率的16倍速率采样串行接收端口RxD,当检测到RxD端口从1->0的负跳变,且RxD端口值保持为0(低电平),持续1波特率时就启动接收器准备接收数据,并立即复位16倍计数器,将1FF值装入移位寄存器,当检测到RxD端口从1->0的负跳变,RxD端口值不为0(低电平),则起始位无效,复位接收电路,复位16倍计数器,并重新检测1->0的跳变,波形图如下:

16倍计数器是将波特率(每位接收时间)均分为16等分,每等分为1个状态,在每位接收时间的7、8、9状态由检测器对RxD端口进行采样,所接收的值是这次采样三中取二(3次采样至少2次相同)的值,以此消除干扰,提高可靠性。
接收的数据从接收移位寄存器的右边移入,已装入的1FF值向左边移出,当起始位0移到移位寄存器的最左边时,完成一帧数据的接收,接收的第9位数据装入SCON的RB8位,若同时满足以下两个条件:
- RI=0;
- SM2=0或者SM2=1,并且接收到的第9数据位RB8=1
则接收到的数据有效,数据载入SBUF和RB8,置位RI,向主机请求中断,否则数据丢弃。
注:在模式2中,接收到的停止位与SBUF、RB8和RI无关。
(4)工作模式3:
此模式下串口1工作在9位UART,波特率可变模式(波特率由定时器1或定时器2产生),一帧数据为11位:1位起始位,8位数据位(低位在先),1位可编程位(第9位数据)和1位停止位,TxD为发送数据,RxD为接收数据,如下图所示:

模式3发送数据过程:当数据写入发送缓冲器SBUF时启动发送,发送时可编程位(由SCON中的TB8提供,可软件设置为1或0)装入移位寄存器的第9位,并通知Tx控制单元开始发送,移位寄存器将数据不断右移至TxD端口发送,在数据的左边不断移入0作补充,当数据的最高位移到TxD端口发送,紧随其后的是第9位数据,Tx控制单元作最后一次移位输出,然后允许发送信号SEND失效,完成一帧信息的发送,置位中断请求位TI,即TI=1,向主机请求中断处理,波形图如下:

模式3接收数据过程:当软件置位接收允许标志位REN,即REN=1时,接收器便以选定波特率的16倍速率采样串行接收端口RxD,当检测到RxD端口从1->0的负跳变,且RxD端口值保持为0(低电平),持续1波特率时就启动接收器准备接收数据,并立即复位16倍计数器,将1FF值装入移位寄存器,当检测到RxD端口从1->0的负跳变,RxD端口值不为0(低电平),则起始位无效,复位接收电路,复位16倍计数器,并重新检测1->0的跳变,波形图如下:

16倍计数器是将波特率(每位接收时间)均分为16等分,每等分为1个状态,在每位接收时间的7、8、9状态由检测器对RxD端口进行采样,所接收的值是这次采样三中取二(3次采样至少2次相同)的值,以此消除干扰,提高可靠性。
接收的数据从接收移位寄存器的右边移入,已装入的1FF值向左边移出,当起始位0移到移位寄存器的最左边时,完成一帧数据的接收,接收的第9位数据装入SCON的RB8位,若同时满足以下两个条件:
- RI=0;
- SM2=0或者SM2=1,并且接收到的第9数据位RB8=1
则接收到的数据有效,数据载入SBUF和RB8,置位RI,向主机请求中断,否则数据丢弃。
注:在模式3中,接收到的停止位与SBUF、RB8和RI无关。
(5)中继广播模式:
此模式下串口1工作在中继广播模式,将RxD端口输入的电平状态实时输出在TxD外部引脚上,TxD外部引脚可对RxD引脚的输入信号进行实时整形放大输出,TxD管脚的对外输出实时反映RxD引脚输入的电平状态。
串口1的中继广播方式可以设置Tx_Rx/CLK_DIV.4来选择,还可以在STC-ISP下载编程软件中设置。
2、STC15系列单片机串口2工作模式
(1)工作模式0:
此模式下串口2工作在8位UART,波特率可变模式(波特率由定时器2产生),一帧数据为10位:1位起始位,8位数据位(低位在先)和1位停止位,TxD为发送数据,RxD为接收数据,如下图所示:
模式0发送数据过程:当数据写入发送缓冲器S2BUF时启动发送,写S2BUF信号还把1装入移位寄存器的第9位,并通知Tx控制单元开始发送,移位寄存器将数据不断右移至TxD端口发送,在数据的左边不断移入0作补充,当数据的最高位移到TxD端口发送,紧随其后的是第9位1,Tx控制单元作最后一次移位输出,然后允许发送信号SEND失效,完成一帧信息的发送,置位中断请求位S2TI,即S2TI=1,向主机请求中断处理,波形图如下:

模式0接收数据过程:当软件置位接收允许标志位S2REN,即S2REN=1时,接收器便以选定波特率的16倍速率采样串行接收端口RxD,当检测到RxD端口从1->0的负跳变,且RxD端口值保持为0(低电平),持续1波特率时就启动接收器准备接收数据,并立即复位16倍计数器,将1FF值装入移位寄存器,当检测到RxD端口从1->0的负跳变,RxD端口值不为0(低电平),则起始位无效,复位接收电路,复位16倍计数器,并重新检测1->0的跳变,波形图如下:

16倍计数器是将波特率(每位接收时间)均分为16等分,每等分为1个状态,在每位接收时间的7、8、9状态由检测器对RxD端口进行采样,所接收的值是这次采样三中取二(3次采样至少2次相同)的值,以此消除干扰,提高可靠性。
接收的数据从接收移位寄存器的右边移入,已装入的1FF值向左边移出,当起始位0移到移位寄存器的最左边时,完成一帧数据的接收,若同时满足以下两个条件:
- S2RI=0;
- S2SM2=0或接收到的停止位为1
则接收到的数据有效,数据载入S2BUF,停止位进入S2RB8,置位S2RI,向主机请求中断,否则数据丢弃。
注:串行通信工作在模式0时,S2SM2设置为0
(2)工作模式1
此模式下串口2工作在9位UART,波特率可变模式(波特率由定时器2产生),一帧数据为11位:1位起始位,8位数据位(低位在先),1位可编程位(第9位数据)和1位停止位,TxD为发送数据,RxD为接收数据,如下图所示:

模式1发送数据过程:当数据写入发送缓冲器S2BUF时启动发送,发送时可编程位(由S2CON中的S2TB8提供,可软件设置为1或0)装入移位寄存器的第9位,并通知Tx控制单元开始发送,移位寄存器将数据不断右移至TxD端口发送,在数据的左边不断移入0作补充,当数据的最高位移到TxD端口发送,紧随其后的是第9位数据,Tx控制单元作最后一次移位输出,然后允许发送信号SEND失效,完成一帧信息的发送,置位中断请求位S2TI,即S2TI=1,向主机请求中断处理,波形图如下:

模式1接收数据过程:当软件置位接收允许标志位S2REN,即S2REN=1时,接收器便以选定波特率的16倍速率采样串行接收端口RxD,当检测到RxD端口从1->0的负跳变,且RxD端口值保持为0(低电平),持续1波特率时就启动接收器准备接收数据,并立即复位16倍计数器,将1FF值装入移位寄存器,当检测到RxD端口从1->0的负跳变,RxD端口值不为0(低电平),则起始位无效,复位接收电路,复位16倍计数器,并重新检测1->0的跳变,波形图如下:

16倍计数器是将波特率(每位接收时间)均分为16等分,每等分为1个状态,在每位接收时间的7、8、9状态由检测器对RxD端口进行采样,所接收的值是这次采样三中取二(3次采样至少2次相同)的值,以此消除干扰,提高可靠性。
接收的数据从接收移位寄存器的右边移入,已装入的1FF值向左边移出,当起始位0移到移位寄存器的最左边时,完成一帧数据的接收,接收的第9位数据装入S2CON的S2RB8位,若同时满足以下两个条件:
- S2RI=0;
- S2SM2=0或者S2SM2=1,并且接收到的第9数据位S2RB8=1
则接收到的数据有效,数据载入S2BUF和S2RB8,置位S2RI,向主机请求中断,否则数据丢弃。
注:在模式1中,接收到的停止位与S2BUF、S2RB8和S2RI无关。
3、STC15系列单片机串口3工作模式
(1)工作模式0:
此模式下串口3工作在8位UART,波特率可变模式(波特率由定时器3或定时器2产生),一帧数据为10位:1位起始位,8位数据位(低位在先)和1位停止位,TxD为发送数据,RxD为接收数据,如下图所示:

模式0发送数据过程:当数据写入发送缓冲器S3BUF时启动发送,写S3BUF信号还把1装入移位寄存器的第9位,并通知Tx控制单元开始发送,移位寄存器将数据不断右移至TxD端口发送,在数据的左边不断移入0作补充,当数据的最高位移到TxD端口发送,紧随其后的是第9位1,Tx控制单元作最后一次移位输出,然后允许发送信号SEND失效,完成一帧信息的发送,置位中断请求位S3TI,即S3TI=1,向主机请求中断处理,波形图如下:

模式0接收数据过程:当软件置位接收允许标志位S3REN,即S3REN=1时,接收器便以选定波特率的16倍速率采样串行接收端口RxD,当检测到RxD端口从1->0的负跳变,且RxD端口值保持为0(低电平),持续1波特率时就启动接收器准备接收数据,并立即复位16倍计数器,将1FF值装入移位寄存器,当检测到RxD端口从1->0的负跳变,RxD端口值不为0(低电平),则起始位无效,复位接收电路,复位16倍计数器,并重新检测1->0的跳变,波形图如下:

16倍计数器是将波特率(每位接收时间)均分为16等分,每等分为1个状态,在每位接收时间的7、8、9状态由检测器对RxD端口进行采样,所接收的值是这次采样三中取二(3次采样至少2次相同)的值,以此消除干扰,提高可靠性。
接收的数据从接收移位寄存器的右边移入,已装入的1FF值向左边移出,当起始位0移到移位寄存器的最左边时,完成一帧数据的接收,若同时满足以下两个条件:
- S3RI=0;
- S3SM2=0或接收到的停止位为1
则接收到的数据有效,数据载入S3BUF,停止位进入S3RB8,置位S3RI,向主机请求中断,否则数据丢弃。
注:串行通信工作在模式0时,S3SM2设置为0
(2)工作模式1
此模式下串口3工作在9位UART,波特率可变模式(波特率由定时器3或定时器2产生),一帧数据为11位:1位起始位,8位数据位(低位在先),1位可编程位(第9位数据)和1位停止位,TxD为发送数据,RxD为接收数据,如下图所示:

模式1发送数据过程:当数据写入发送缓冲器S3BUF时启动发送,发送时可编程位(由S3CON中的S3TB8提供,可软件设置为1或0)装入移位寄存器的第9位,并通知Tx控制单元开始发送,移位寄存器将数据不断右移至TxD端口发送,在数据的左边不断移入0作补充,当数据的最高位移到TxD端口发送,紧随其后的是第9位数据,Tx控制单元作最后一次移位输出,然后允许发送信号SEND失效,完成一帧信息的发送,置位中断请求位S3TI,即S3TI=1,向主机请求中断处理,波形图如下:

模式1接收数据过程:当软件置位接收允许标志位S3REN,即S3REN=1时,接收器便以选定波特率的16倍速率采样串行接收端口RxD,当检测到RxD端口从1->0的负跳变,且RxD端口值保持为0(低电平),持续1波特率时就启动接收器准备接收数据,并立即复位16倍计数器,将1FF值装入移位寄存器,当检测到RxD端口从1->0的负跳变,RxD端口值不为0(低电平),则起始位无效,复位接收电路,复位16倍计数器,并重新检测1->0的跳变,波形图如下:

16倍计数器是将波特率(每位接收时间)均分为16等分,每等分为1个状态,在每位接收时间的7、8、9状态由检测器对RxD端口进行采样,所接收的值是这次采样三中取二(3次采样至少2次相同)的值,以此消除干扰,提高可靠性。
接收的数据从接收移位寄存器的右边移入,已装入的1FF值向左边移出,当起始位0移到移位寄存器的最左边时,完成一帧数据的接收,接收的第9位数据装入S3CON的S3RB8位,若同时满足以下两个条件:
- S3RI=0;
- S3SM2=0或者S3SM2=1,并且接收到的第9数据位S3RB8=1
则接收到的数据有效,数据载入S3BUF和S3RB8,置位S3RI,向主机请求中断,否则数据丢弃。
注:在模式1中,接收到的停止位与S3BUF、S3RB8和S3RI无关。
4、STC15系列单片机串口4工作模式
(1)工作模式0:
此模式下串口4工作在8位UART,波特率可变模式(波特率由定时器4或定时器2产生),一帧数据为10位:1位起始位,8位数据位(低位在先)和1位停止位,TxD为发送数据,RxD为接收数据,如下图所示:

模式0发送数据过程:当数据写入发送缓冲器S4BUF时启动发送,写S4BUF信号还把1装入移位寄存器的第9位,并通知Tx控制单元开始发送,移位寄存器将数据不断右移至TxD端口发送,在数据的左边不断移入0作补充,当数据的最高位移到TxD端口发送,紧随其后的是第9位1,Tx控制单元作最后一次移位输出,然后允许发送信号SEND失效,完成一帧信息的发送,置位中断请求位S4TI,即S4TI=1,向主机请求中断处理,波形图如下:

模式0接收数据过程:当软件置位接收允许标志位S4REN,即S4REN=1时,接收器便以选定波特率的16倍速率采样串行接收端口RxD,当检测到RxD端口从1->0的负跳变,且RxD端口值保持为0(低电平),持续1波特率时就启动接收器准备接收数据,并立即复位16倍计数器,将1FF值装入移位寄存器,当检测到RxD端口从1->0的负跳变,RxD端口值不为0(低电平),则起始位无效,复位接收电路,复位16倍计数器,并重新检测1->0的跳变,波形图如下:

16倍计数器是将波特率(每位接收时间)均分为16等分,每等分为1个状态,在每位接收时间的7、8、9状态由检测器对RxD端口进行采样,所接收的值是这次采样三中取二(3次采样至少2次相同)的值,以此消除干扰,提高可靠性。
接收的数据从接收移位寄存器的右边移入,已装入的1FF值向左边移出,当起始位0移到移位寄存器的最左边时,完成一帧数据的接收,若同时满足以下两个条件:
- S4RI=0;
- S4SM2=0或接收到的停止位为1
则接收到的数据有效,数据载入S4BUF,停止位进入S4RB8,置位S4RI,向主机请求中断,否则数据丢弃。
注:串行通信工作在模式0时,S4SM2设置为0
(1)工作模式1:
此模式下串口4工作在9位UART,波特率可变模式(波特率由定时器4或定时器2产生),一帧数据为11位:1位起始位,8位数据位(低位在先),1位可编程位(第9位数据)和1位停止位,TxD为发送数据,RxD为接收数据,如下图所示:

模式1发送数据过程:当数据写入发送缓冲器S4BUF时启动发送,发送时可编程位(由S4CON中的S4TB8提供,可软件设置为1或0)装入移位寄存器的第9位,并通知Tx控制单元开始发送,移位寄存器将数据不断右移至TxD端口发送,在数据的左边不断移入0作补充,当数据的最高位移到TxD端口发送,紧随其后的是第9位数据,Tx控制单元作最后一次移位输出,然后允许发送信号SEND失效,完成一帧信息的发送,置位中断请求位S4TI,即S4TI=1,向主机请求中断处理,波形图如下:

模式1接收数据过程:当软件置位接收允许标志位S4REN,即S4REN=1时,接收器便以选定波特率的16倍速率采样串行接收端口RxD,当检测到RxD端口从1->0的负跳变,且RxD端口值保持为0(低电平),持续1波特率时就启动接收器准备接收数据,并立即复位16倍计数器,将1FF值装入移位寄存器,当检测到RxD端口从1->0的负跳变,RxD端口值不为0(低电平),则起始位无效,复位接收电路,复位16倍计数器,并重新检测1->0的跳变,波形图如下:

16倍计数器是将波特率(每位接收时间)均分为16等分,每等分为1个状态,在每位接收时间的7、8、9状态由检测器对RxD端口进行采样,所接收的值是这次采样三中取二(3次采样至少2次相同)的值,以此消除干扰,提高可靠性。
接收的数据从接收移位寄存器的右边移入,已装入的1FF值向左边移出,当起始位0移到移位寄存器的最左边时,完成一帧数据的接收,接收的第9位数据装入S4CON的S4RB8位,若同时满足以下两个条件:
- S4RI=0;
- S4SM2=0或者S4SM2=1,并且接收到的第9数据位S4RB8=1
则接收到的数据有效,数据载入S4BUF和S4RB8,置位S4RI,向主机请求中断,否则数据丢弃。
注:在模式1中,接收到的停止位与S4BUF、S4RB8和S4RI无关。
四、STC15单片机串口设置程序
1、Uart.h文件
/*
*******************************************************************************
* 文件名:Uart.h
* 描 述:设置51单片机串口通信
* 版本号:v1.0.0
* 备 注:适用于KingST-51板子
*******************************************************************************
*/
#ifndef _Uart_H
#define _Uart_H
/*******************************************************************************/
//#define ConfigUart1_8bit_Time1_Auto16_ON //设置串口1为8位Uart函数使能,波特率发生器为定时器1,16位自动重装载
//#define ConfigUart1_8bit_Time1_Auto8_ON //设置串口1为8位Uart函数使能,波特率发生器为定时器1,8位自动重装载
//#define ConfigUart1_8bit_Time2_Auto16_ON //设置串口1为8位Uart函数使能,波特率发生器为定时器2,16位自动重装载
//#define ConfigUart1_9bit_Time1_Auto16_ON //设置串口1为9位Uart函数使能,波特率发生器为定时器1,16位自动重装载
//#define ConfigUart1_9bit_Time1_Auto8_ON //设置串口1为9位Uart函数使能,波特率发生器为定时器1,8位自动重装载
//#define ConfigUart1_9bit_Time2_Auto16_ON //设置串口1为9位Uart函数使能,波特率发生器为定时器2,16位自动重装载
//#define ConfigUart1_9Bit_Fixed_Baud_ON //设置串口1为9位Uart函数使能,波特率固定为1/64(SYSclk)或1/32(SYSclk)
//#define ConfigUart1_Sync_Shift_ON //设置串口1为同步移位寄存器函数使能,波特率固定为SYSclk/12或SYSclk/2
//#define ConfigUart1_Relay_Broadcast_ON //设置串口1为中继广播模式函数使能
//#define Uart1Write_ON //设置串口1发送字符串数据函数使能
//#define Uart1Read_ON //设置串口1读取字符串数据函数使能
//#define Uart1Driver_ON //设置串口1接收数据处理函数使能
//#define Printf_Uart1_ON //设置串口1的Printf重定向函数使能
//#define Scanf_Uart1_ON //设置读取串口1数据函数使能
//#define Interrupt_Uart1_ON //设置串口1中断函数使能
//#define ConfigUart2_8bit_Time2_Auto16_ON //设置串口2为8位Uart函数使能,波特率发生器为定时器2,16位自动重装载
//#define ConfigUart2_9bit_Time2_Auto16_ON //设置串口2为9位Uart函数使能,波特率发生器为定时器2,16位自动重装载
//#define Uart2Write_ON //设置串口2发送字符串数据函数使能
//#define Uart2Read_ON //设置串口2读取字符串数据函数使能
//#define Uart2Driver_ON //设置串口2接收数据处理函数使能
//#define Printf_Uart2_ON //设置串口2的Printf重定向函数使能
//#define Scanf_Uart2_ON //设置读取串口2数据函数使能
//#define Interrupt_Uart2_ON //设置串口2中断函数使能
//#define ConfigUart3_8bit_Time2_Auto16_ON //设置串口3为8位Uart函数使能,波特率发生器为定时器2,16位自动重装载
//#define ConfigUart3_8bit_Time3_Auto16_ON //设置串口3为8位Uart函数使能,波特率发生器为定时器3,16位自动重装载
//#define ConfigUart3_9bit_Time3_Auto16_ON //设置串口3为9位Uart函数使能,波特率发生器为定时器3,16位自动重装载
//#define ConfigUart3_9bit_Time2_Auto16_ON //设置串口3为9位Uart函数使能,波特率发生器为定时器2,16位自动重装载
//#define Uart3Write_ON //设置串口3发送字符串数据函数使能
//#define Uart3Read_ON //设置串口3读取字符串数据函数使能
//#define Uart3Driver_ON //设置串口3接收数据处理函数使能
//#define Printf_Uart3_ON //设置串口3的Printf重定向函数使能
//#define Scanf_Uart3_ON //设置读取串口3数据函数使能
//#define Interrupt_Uart3_ON //设置串口3中断函数使能
//#define ConfigUart4_8bit_Time2_Auto16_ON //设置串口4为8位Uart函数使能,波特率发生器为定时器2,16位自动重装载
//#define ConfigUart4_8bit_Time4_Auto16_ON //设置串口4为8位Uart函数使能,波特率发生器为定时器4,16位自动重装载
//#define ConfigUart4_9bit_Time2_Auto16_ON //设置串口4为9位Uart函数使能,波特率发生器为定时器2,16位自动重装载
//#define ConfigUart4_9bit_Time4_Auto16_ON //设置串口4为9位Uart函数使能,波特率发生器为定时器4,16位自动重装载
//#define Uart4Write_ON //设置串口4发送字符串数据函数使能
//#define Uart4Read_ON //设置串口4读取字符串数据函数使能
//#define Uart4Driver_ON //设置串口4接收数据处理函数使能
//#define Printf_Uart4_ON //设置串口4的Printf重定向函数使能
//#define Scanf_Uart4_ON //设置读取串口4数据函数使能
//#define Interrupt_Uart4_ON //设置串口4中断函数使能
//#define ConfigUart_Run_State_ON //设置串口的运行状态函数使能
/*******************************************************************************/
#define Uart_Address 0x31//串口1地址
#define Uart1_R_P3_0_T_P3_1 0x00//选择串口1引脚Rx为P3_0,Tx为P3_1
#define Uart1_R_P3_6_T_P3_7 0x01//选择串口1引脚Rx为P3_6,Tx为P3_7
#define Uart1_R_P1_6_T_P1_7 0x02//选择串口1引脚Rx为P1_6,Tx为P1_7
#define Uart2_R_P1_0_T_P1_1 0x00//选择串口2引脚Rx为P1_0,Tx为P1_1
#define Uart2_R_P4_6_T_P4_7 0x01//选择串口2引脚Rx为P4_6,Tx为P4_7
#define Uart3_R_P0_0_T_P0_1 0x00//选择串口3引脚Rx为P0_0,Tx为P0_1
#define Uart3_R_P5_0_T_P5_1 0x01//选择串口3引脚Rx为P5_0,Tx为P5_1
#define Uart4_R_P0_2_T_P0_3 0x00//选择串口4引脚Rx为P0_2,Tx为P0_3
#define Uart4_R_P5_2_T_P5_3 0x01//选择串口4引脚Rx为P5_2,Tx为P5_3
#define Tx_Clock_12 0x00//定时器是传统8051速度,系统时钟12分频
#define Tx_Clock_01 0x01//定时器速度是传统8051的12倍,系统时钟不分频
#define INT0_P3_2_High 0x01//定时器0外部引脚高电平,允许计数
#define INT1_P3_3_High 0x01//定时器1外部引脚高电平,允许计数
#define INTx_No_Effect 0x00//定时器0/1外部引脚电平无效
#define IP_0 0x00//低
#define IP_1 0x01
#define Sync_Send 0x00//同步移位发送
#define Sync_Receive 0x01//同步移位接收
#define Baud_SySclk_12 0x00//同步移位波特率不加倍
#define Baud_SySclk_02 0x01//同步移位波特率加倍
#define Bit9_0 0x00//第9位为0
#define Bit9_1 0x01//第9位为1
#define MCU_Com_Single 0x00//单机通信
#define MCU_Com_Multi 0x01//多机通信
#define Baud_SySclk_64 0x00//9位Uart波特率为SySclk/64
#define Baud_SySclk_32 0x01//9位Uart波特率为SySclk/32
#define Uart1_Time1_Baud 0x00//串口1_1
#define Uart1_Time2_Baud 0x01//串口1_2
#define Uart2_Time2_Baud 0x02//串口2
#define Uart3_Time3_Baud 0x03//串口3_1
#define Uart3_Time2_Baud 0x04//串口3_2
#define Uart4_Time4_Baud 0x05//串口4_1
#define Uart4_Time2_Baud 0x06//串口4_2
#define Uart_Close 0x00//串口通信关闭(开启后需要重新配置)
#define Uart_Pause 0x01//串口通信暂停(开启后不需要重新配置)
#define Uart_Start 0x02//串口通信开启(配置定时器后会自动开启)
void ConfigUart1_8bit_Time1_Auto16(uint8 GATE_Mode,uint32 Sys_CLK,uint8 T1_CLK_DIV,uint32 Baud,uint8 Uart_Pin,uint8 Priority);//设置串口1为8位Uart,波特率发生器为定时器1,16位自动重装载
void ConfigUart1_8bit_Time1_Auto8(uint8 GATE_Mode,uint32 Sys_CLK,uint8 T1_CLK_DIV,uint32 Baud,uint8 Uart_Pin,uint8 Priority);//设置串口1为8位Uart,波特率发生器为定时器1,8位自动重装载
void ConfigUart1_8bit_Time2_Auto16(uint32 Sys_CLK,uint8 T2_CLK_DIV,uint32 Baud,uint8 Uart_Pin,uint8 Priority);//设置串口1为8位Uart,波特率发生器为定时器2,16位自动重装载
void ConfigUart1_9Bit_Fixed_Baud(uint8 MCU_Com_Bit,uint8 Fix_Baud_Select,uint8 Uart_Pin,uint8 Priority,uint8 Address,uint8 Address_En);//设置串口1为9位Uart,波特率固定为1/64(SYSclk)或1/32(SYSclk)
void ConfigUart1_9bit_Time1_Auto16(uint8 GATE_Mode,uint32 Sys_CLK,uint8 T1_CLK_DIV,uint8 MCU_Com_Bit,uint32 Baud,uint8 Uart_Pin,uint8 Priority,uint8 Address,uint8 Address_En);//设置串口1为9位Uart通信,波特率发生器为定时器1,16位自动重装载
void ConfigUart1_9bit_Time1_Auto8(uint8 GATE_Mode,uint32 Sys_CLK,uint8 T1_CLK_DIV,uint8 MCU_Com_Bit,uint32 Baud,uint8 Uart_Pin,uint8 Priority,uint8 Address,uint8 Address_En);//设置串口1为9位Uart通信,波特率发生器为定时器1,8位自动重装载
void ConfigUart1_9bit_Time2_Auto16(uint32 Sys_CLK,uint8 T2_CLK_DIV,uint8 MCU_Com_Bit,uint32 Baud,uint8 Uart_Pin,uint8 Priority,uint8 Address,uint8 Address_En);//设置串口1为9位Uart通信,波特率发生器为定时器2,16位自动重装载
void ConfigUart1_Sync_Shift(uint8 Mode,uint8 buad_selet,uint8 Uart_Pin,uint8 Priority);//设置串口1为同步移位寄存器函数,波特率固定为SYSclk/12或SYSclk/2
void ConfigUart1_Relay_Broadcast(uint8 Uart_Pin);//设置串口1为中继广播模式
void Uart1Driver(uint8 MCU_Com_Bit,uint16 Rx_Cycle_Time,Uart_Callback Uart_Fun);//设置串口1接收数据处理函数
void Uart1Write(uint8 *buf,uint8 len,uint8 Bit9);//设置串口1发送字符串数据函数
uint8 Uart1Read(uint8 *buf,uint8 len,uint16 Rx_Cycle_Time);//设置串口1读取字符串数据函数
uint8 Scanf_Uart1(uint8 *buf,uint8 buf_len,Delay_Callback Delay_Time);//设置读取串口1数据函数
int16 Printf_Uart1(const char *fmt, ...);//设置串口1的Printf重定向函数
void ConfigUart2_8bit_Time2_Auto16(uint32 Sys_CLK,uint8 T2_CLK_DIV,uint32 Baud,uint8 Uart_Pin,uint8 Priority);//设置串口2为8位Uart通信,波特率发生器为定时器2,16位自动重装载
void ConfigUart2_9bit_Time2_Auto16(uint32 Sys_CLK,uint8 T2_CLK_DIV,uint8 MCU_Com_Bit,uint32 Baud,uint8 Uart_Pin,uint8 Priority);//设置串口2为9位Uart通信,波特率发生器为定时器2,16位自动重装载
void Uart2Driver(uint8 MCU_Com_Bit,uint16 Rx_Cycle_Time,Uart_Callback Uart_Fun);//设置串口2接收数据处理函数
void Uart2Write(uint8 *buf,uint8 len,uint8 Bit9);//设置串口2发送字符串数据函数
uint8 Uart2Read(uint8 *buf,uint8 len,uint16 Rx_Cycle_Time);//设置串口2读取字符串数据函数
uint8 Scanf_Uart2(uint8 *buf,uint8 buf_len,Delay_Callback Delay_Time);//设置读取串口2数据函数
int16 Printf_Uart2(const char *fmt, ...);//设置串口2的Printf重定向函数
void ConfigUart3_8bit_Time2_Auto16(uint32 Sys_CLK,uint8 T2_CLK_DIV,uint32 Baud,uint8 Uart_Pin);//设置串口3为8位Uart通信,波特率发生器为定时器2,16位自动重装载
void ConfigUart3_8bit_Time3_Auto16(uint32 Sys_CLK,uint8 T3_CLK_DIV,uint32 Baud,uint8 Uart_Pin);//设置串口3为8位Uart通信,波特率发生器为定时器3,16位自动重装载
void ConfigUart3_9bit_Time3_Auto16(uint32 Sys_CLK,uint8 T3_CLK_DIV,uint8 MCU_Com_Bit,uint32 Baud,uint8 Uart_Pin);//设置串口3为9位Uart通信,波特率发生器为定时器3,16位自动重装载
void ConfigUart3_9bit_Time2_Auto16(uint32 Sys_CLK,uint8 T2_CLK_DIV,uint8 MCU_Com_Bit,uint32 Baud,uint8 Uart_Pin);//设置串口3为9位Uart通信,波特率发生器为定时器2,16位自动重装载
void Uart3Driver(uint8 MCU_Com_Bit,uint16 Rx_Cycle_Time,Uart_Callback Uart_Fun);//设置串口3接收数据处理函数
void Uart3Write(uint8 *buf,uint8 len,uint8 Bit9);//设置串口3发送字符串数据函数
uint8 Uart3Read(uint8 *buf,uint8 len,uint16 Rx_Cycle_Time);//设置串口3读取字符串数据函数
uint8 Scanf_Uart3(uint8 *buf,uint8 buf_len,Delay_Callback Delay_Time);//设置读取串口3数据函数
int16 Printf_Uart3(const char *fmt, ...);//设置串口3的Printf重定向函数
void ConfigUart4_8bit_Time2_Auto16(uint32 Sys_CLK,uint8 T2_CLK_DIV,uint32 Baud,uint8 Uart_Pin);//设置串口4为8位Uart通信,波特率发生器为定时器2,16位自动重装载
void ConfigUart4_8bit_Time4_Auto16(uint32 Sys_CLK,uint8 T4_CLK_DIV,uint32 Baud,uint8 Uart_Pin);//设置串口4为8位Uart通信,波特率发生器为定时器4,16位自动重装载
void ConfigUart4_9bit_Time2_Auto16(uint32 Sys_CLK,uint8 T2_CLK_DIV,uint8 MCU_Com_Bit,uint32 Baud,uint8 Uart_Pin);//设置串口4为9位Uart通信,波特率发生器为定时器2,16位自动重装载
void ConfigUart4_9bit_Time4_Auto16(uint32 Sys_CLK,uint8 T4_CLK_DIV,uint8 MCU_Com_Bit,uint32 Baud,uint8 Uart_Pin);//设置串口4为9位Uart通信,波特率发生器为定时器4,16位自动重装载
void Uart4Driver(uint8 MCU_Com_Bit,uint16 Rx_Cycle_Time,Uart_Callback Uart_Fun);//设置串口4接收数据处理函数
void Uart4Write(uint8 *buf,uint8 len,uint8 Bit9);//设置串口4发送字符串数据函数
uint8 Uart4Read(uint8 *buf,uint8 len,uint16 Rx_Cycle_Time);//设置串口4读取字符串数据函数
uint8 Scanf_Uart4(uint8 *buf,uint8 buf_len,Delay_Callback Delay_Time);//设置读取串口4数据函数
int16 Printf_Uart4(const char *fmt, ...);//设置串口4的Printf重定向函数
void ConfigUart_Run_State(uint8 Uart_ID,uint8 Uart_Run_State);//设置串口的运行状态函数
#endif
2、串口设置相关函数
(1)设置串口1为8位Uart,波特率发生器为定时器1,16位自动重装载函数
|
函数名称 |
//设置串口1为8位Uart,波特率发生器为定时器1,16位自动重装载函数 void ConfigUart1_8bit_Time1_Auto16(uint8 GATE_Mode, uint32 Sys_CLK, uint8 T1_CLK_DIV, uint32 Baud, uint8 Uart_Pin, uint8 Priority) |
|
输入变量 |
GATE_Mode(设置INT1引脚为定时器1开启控制) |
|
Sys_CLK(当前系统时钟) | |
|
T1_CLK_DIV(定时器1时钟分频系数) | |
|
Baud(串口1通信波特率) | |
|
Uart_Pin(串口1通信引脚) | |
|
Priority(串口1通信中断优先级) | |
|
输出变量 |
无 |
|
返回值 |
无 |
|
示例 |
//设置串口1为8位Uart,引脚为P3_0、P3_1,通信波特率为9600,定时器1为波特率发生器 uint32 Sys_CLK; ConfigUart1_8bit_Time1_Auto16(INTx_No_Effect, Sys_CLK, Tx_Clock_01, 9600, Uart1_R_P3_0_T_P3_1, IP_0) |
(2)设置串口1为8位Uart函数,波特率发生器为定时器1,8位自动重装载函数
|
函数名称 |
//设置串口1为8位Uart函数,波特率发生器为定时器1,8位自动重装载函数 void ConfigUart1_8bit_Time1_Auto8(uint8 GATE_Mode, uint32 Sys_CLK, uint8 T1_CLK_DIV, uint32 Baud, uint8 Uart_Pin, uint8 Priority) |
|
输入变量 |
GATE_Mode(设置INT1引脚为定时器1开启控制) |
|
Sys_CLK(当前系统时钟) | |
|
T1_CLK_DIV(定时器1时钟分频系数) | |
|
Baud(串口1通信波特率) | |
|
Uart_Pin(串口1通信引脚) | |
|
Priority(串口1通信中断优先级) | |
|
输出变量 |
无 |
|
返回值 |
无 |
|
示例 |
//设置串口1为8位Uart,引脚为P3_0、P3_1,通信波特率为9600,定时器1为波特率发生器 uint32 Sys_CLK; ConfigUart1_8bit_Time1_Auto8(INTx_No_Effect, Sys_CLK, Tx_Clock_01, 9600, Uart1_R_P3_0_T_P3_1, IP_0) |
(3)设置串口1为8位Uart函数,波特率发生器为定时器2,16位自动重装载函数
|
函数名称 |
//设置串口1为8位Uart函数,波特率发生器为定时器2,16位自动重装载函数 void ConfigUart1_8bit_Time2_Auto16(uint32 Sys_CLK, uint8 T2_CLK_DIV, uint32 Baud, uint8 Uart_Pin, uint8 Priority) |
|
输入变量 |
Sys_CLK(当前系统时钟) |
|
T2_CLK_DIV(定时器2时钟分频系数) | |
|
Baud(串口1通信波特率) | |
|
Uart_Pin(串口1通信引脚) | |
|
Priority(串口1通信中断优先级) | |
|
输出变量 |
无 |
|
返回值 |
无 |
|
示例 |
//设置串口1为8位Uart,引脚为P3_0、P3_1,通信波特率为9600,定时器2为波特率发生器 uint32 Sys_CLK; ConfigUart1_8bit_Time2_Auto16(Sys_CLK, Tx_Clock_01, 9600, Uart1_R_P3_0_T_P3_1, IP_0) |
(4)设置串口1为9位Uart通信,波特率发生器为定时器1,16位自动重装载函数
|
函数名称 |
//设置串口1为9位Uart,波特率发生器为定时器1,16位自动重装载函数 void ConfigUart1_9bit_Time1_Auto16(uint8 GATE_Mode, uint32 Sys_CLK, uint8 T1_CLK_DIV, uint8 MCU_Com_Bit, uint32 Baud, uint8 Uart_Pin, uint8 Priority, uint8 Address, uint8 Address_En) |
|
输入变量 |
GATE_Mode(设置INT1引脚为定时器1开启控制) |
|
Sys_CLK(当前系统时钟) | |
|
T1_CLK_DIV(定时器1时钟分频系数) | |
|
MCU_Com_Bit(MCU通信方式选择位,单机通信/多机通信) | |
|
Baud(串口1通信波特率) | |
|
Uart_Pin(串口1通信引脚) | |
|
Priority(串口1通信中断优先级) | |
|
Address(从机地址) | |
|
Address_En(从机地址掩码) | |
|
输出变量 |
无 |
|
返回值 |
无 |
|
示例 |
//设置串口1为9位Uart,引脚为P3_0、P3_1,通信波特率为9600,定时器1为波特率发生器 uint32 Sys_CLK; #define Uart_Address 0x31//串口1地址 ConfigUart1_9bit_Time1_Auto16(INTx_No_Effect, Sys_CLK, Tx_Clock_01, MCU_Com_Single, 9600, Uart1_R_P3_0_T_P3_1, IP_0, Uart_Address, 0xFF) |
(5)设置串口1为9位Uart通信,波特率发生器为定时器1,8位自动重装载函数
|
函数名称 |
//设置串口1为9位Uart,波特率发生器为定时器1,8位自动重装载函数 void ConfigUart1_9bit_Time1_Auto8(uint8 GATE_Mode, uint32 Sys_CLK, uint8 T1_CLK_DIV, uint8 MCU_Com_Bit, uint32 Baud, uint8 Uart_Pin, uint8 Priority, uint8 Address, uint8 Address_En) |
|
输入变量 |
GATE_Mode(设置INT1引脚为定时器1开启控制) |
|
Sys_CLK(当前系统时钟) | |
|
T1_CLK_DIV(定时器1时钟分频系数) | |
|
MCU_Com_Bit(MCU通信方式选择位,单机通信/多机通信) | |
|
Baud(串口1通信波特率) | |
|
Uart_Pin(串口1通信引脚) | |
|
Priority(串口1通信中断优先级) | |
|
Address(从机地址) | |
|
Address_En(从机地址掩码) | |
|
输出变量 |
无 |
|
返回值 |
无 |
|
示例 |
//设置串口1为9位Uart,引脚为P3_0、P3_1,通信波特率为9600,定时器1为波特率发生器 uint32 Sys_CLK; #define Uart_Address 0x31//串口1地址 ConfigUart1_9bit_Time1_Auto8(INTx_No_Effect, Sys_CLK, Tx_Clock_01, MCU_Com_Single, 9600, Uart1_R_P3_0_T_P3_1, IP_0, Uart_Address, 0xFF) |
(6)设置串口1为9位Uart通信,波特率发生器为定时器2,16位自动重装载函数
|
函数名称 |
//设置串口1为9位Uart通信,波特率发生器为定时器2,16位自动重装载函数 void ConfigUart1_9bit_Time2_Auto16(uint32 Sys_CLK, uint8 T2_CLK_DIV, uint8 MCU_Com_Bit, uint32 Baud, uint8 Uart_Pin, uint8 Priority, uint8 Address, uint8 Address_En) |
|
输入变量 |
Sys_CLK(当前系统时钟) |
|
T2_CLK_DIV(定时器2时钟分频系数) | |
|
MCU_Com_Bit(MCU通信方式选择位,单机通信/多机通信) | |
|
Baud(串口1通信波特率) | |
|
Uart_Pin(串口1通信引脚) | |
|
Priority(串口1通信中断优先级) | |
|
Address(从机地址) | |
|
Address_En(从机地址掩码) | |
|
输出变量 |
无 |
|
返回值 |
无 |
|
示例 |
//设置串口1为9位Uart,引脚为P3_0、P3_1,通信波特率为9600,定时器2为波特率发生器 uint32 Sys_CLK; #define Uart_Address 0x31//串口1地址 ConfigUart1_9bit_Time2_Auto16(Sys_CLK, Tx_Clock_01, MCU_Com_Single, 9600, Uart1_R_P3_0_T_P3_1, IP_0, Uart_Address, 0xFF) |
(7)设置串口1为9位Uart通信,波特率固定为1/64(SYSclk)或1/32(SYSclk)函数
|
函数名称 |
//设置串口1为9位Uart通信,波特率固定为1/64(SYSclk)或1/32(SYSclk)函数 void ConfigUart1_9Bit_Fixed_Baud(uint8 MCU_Com_Bit, uint8 Fix_Baud_Select, uint8 Uart_Pin, uint8 Priority, uint8 Address, uint8 Address_En) |
|
输入变量 |
MCU_Com_Bit(MCU通信方式选择位,单机通信/多机通信) |
|
Fix_Baud_Select(固定通信波特率选择) | |
|
Uart_Pin(串口1通信引脚) | |
|
Priority(串口1通信中断优先级) | |
|
Address(从机地址) | |
|
Address_En(从机地址掩码) | |
|
输出变量 |
无 |
|
返回值 |
无 |
|
示例 |
//设置串口1为9位Uart,引脚为P3_0、P3_1,通信波特率固定为1/64(SYSclk) uint32 Sys_CLK; #define Uart_Address 0x31//串口1地址 ConfigUart1_9Bit_Fixed_Baud(MCU_Com_Single, Baud_SySclk_64, Uart1_R_P3_0_T_P3_1, IP_0, Uart_Address, 0xFF) |
(8)设置串口1为同步移位寄存器函数,波特率固定为SYSclk/12或SYSclk/2函数
|
函数名称 |
//设置串口1为同步移位寄存器函数,波特率固定为SYSclk/12或SYSclk/2函数 void ConfigUart1_Sync_Shift(uint8 Mode, uint8 buad_selet, uint8 Uart_Pin, uint8 Priority) |
|
输入变量 |
Mode(同步移位寄存器工作模式,发送/接收) |
|
buad_selet(同步移位寄存器波特率选择) | |
|
Uart_Pin(同步移位寄存器通信引脚) | |
|
Priority(同步移位寄存器中断优先级) | |
|
输出变量 |
无 |
|
返回值 |
无 |
|
示例 |
//设置串口1为同步移位寄存器,数据、时钟引脚为P3_0、P3_1,通信波特率固定为SYSclk/12 ConfigUart1_Sync_Shift(Sync_Send, Baud_SySclk_12, Uart1_R_P3_0_T_P3_1, IP_0) |
(9)设置串口1为中继广播模式函数
|
函数名称 |
//设置串口1为中继广播模式函数 void ConfigUart1_Relay_Broadcast(uint8 Uart_Pin) |
|
输入变量 |
Uart_Pin(串口1通信引脚选择) |
|
输出变量 |
无 |
|
返回值 |
无 |
|
示例 |
//设置串口1为中继广播模式,引脚为P3_0、P3_1 ConfigUart1_Relay_Broadcast(Uart1_R_P3_0_T_P3_1) |
|
注意 |
RxD端口输入的电平高电平电压需在3V-5V之间,低电平电压须在0V-1V之间,TxD端口输出的电平全部转化为高电平5V,低电平0V |
(10)设置串口1发送字节数据函数
|
函数名称 |
//设置串口1发送字节数据函数 void Uart1Write(uint8 *buf,uint8 len,uint8 Bit9) |
|
输入变量 |
*buf(所要发送字节数据的数据指针) |
|
len(所要发送字节数据的长度) | |
|
Bit9(Uart通信字节数据第9位,在串口1通信为模式1或模式0时,设置为Bit9_0) | |
|
输出变量 |
无 |
|
返回值 |
无 |
|
示例 |
//设置串口1发送字符串 Uart1Write("jinjiao111540\r\n",sizeof("jinjiao111540\r\n"),Bit9_0); |
(11)设置串口1读取字节数据函数
|
函数名称 |
//设置串口1读取字节数据函数 uint8 Uart1Read(uint8 *buf,uint8 len,uint16 Rx_Cycle_Time) |
|
输入变量 |
*buf(读取字节数据存放变量的数据指针) |
|
len(存放变量的数据长度) | |
|
Rx_Cycle_Time(报文的接收周期,ms) | |
|
输出变量 |
*buf(读取字节数据存放变量的数据指针) |
|
返回值 |
len(读取的字节数据的真实长度,0xFF表明在接收周期内未收到数据) |
|
示例 |
//设置串口1读取字节数据 uint8 Uart_Read_Buff[20]; |
(12)设置串口1接收数据处理函数
|
函数名称 |
//设置串口1接收数据处理函数 void Uart1Driver(uint8 MCU_Com_Bit,uint16 Rx_Cycle_Time,Uart_Callback Uart_Fun) |
|
输入变量 |
MCU_Com_Bit(串口1通信方式,单机通信或多机通信) |
|
Rx_Cycle_Time(串口接收数据周期) | |
|
Uart_Fun(串口接收数据处理函数) | |
|
输出变量 |
无 |
|
返回值 |
无 |
|
示例 |
//设置串口1接收数据处理函数,接收到串口数据后执行Uart_Rx_Multi_Handle_Fun处理 void Uart_Rx_Multi_Handle_Fun(uint8 *buf,uint8 len)//多机通信数据接收处理函数 Uart1Driver(MCU_Com_Multi,5,Uart_Rx_Multi_Handle_Fun); 或 void Uart_Rx_Single_Handle_Fun(uint8 *buf,uint8 len)//单机通信数据接收处理函数 ; Uart1Driver(MCU_Com_Single,5,Uart_Rx_Single_Handle_Fun); |
|
注意 |
Uart1Driver函数需放在主函数中周期调用,调用周期为ms |
(13)设置串口1的Printf函数重定向函数
|
函数名称 |
//设置串口1的Printf函数重定向函数 int16 Printf_Uart1(const char *fmt, ...) |
|
输入变量 |
*fmt(指针,指向Printf函数需要输出的格式字符串) |
|
输出变量 |
无 |
|
返回值 |
ret(输出格式字符串的长度) |
|
示例 |
//设置串口1打印输出执行格式字符串 Printf_Uart1("jinjiao%.2f\r\n",3.14125); |
(14)设置串口1的Scanf函数重定向函数
|
函数名称 |
//设置串口1的Scanf函数重定向函数 uint8 Scanf_Uart1(uint8 *buf,uint8 buf_len,Delay_Callback Delay_Time) |
|
输入变量 |
*buf(指针,指向读取串口1数据存储变量) |
|
buf_len(串口1数据存储变量长度) | |
|
Delay_Time(延时函数) | |
|
输出变量 |
*buf(指针,指向读取串口1数据存储变量) |
|
返回值 |
len(读取串口1数据的真实长度) |
|
示例 |
//设置串口1接收字符串存储在Str中,串口接收数据扫描周期为5*10ms uint8 len=0; void Delay10ms() //@12.000MHz i = 117; len=Scanf_Uart1(Str,sizeof(Str),Delay10ms); |
|
注意 |
该函数执行过程中有阻塞,阻塞时间=5*延时时间 |
(15)设置串口2为8位Uart通信,波特率发生器为定时器2,16位自动重装载函数
|
函数名称 |
//设置串口2为8位Uart,波特率发生器为定时器2,16位自动重装载函数 void ConfigUart2_8bit_Time2_Auto16(uint32 Sys_CLK, uint8 T2_CLK_DIV, uint32 Baud, uint8 Uart_Pin, uint8 Priority) |
|
输入变量 |
Sys_CLK(当前系统时钟) |
|
T2_CLK_DIV(定时器2时钟分频系数) | |
|
Baud(串口2通信波特率) | |
|
Uart_Pin(串口2通信引脚) | |
|
Priority(串口2通信中断优先级) | |
|
输出变量 |
无 |
|
返回值 |
无 |
|
示例 |
//设置串口2为8位Uart,引脚为P1_0、P1_1,通信波特率为9600,定时器2为波特率发生器 uint32 Sys_CLK; ConfigUart2_8bit_Time2_Auto16(Sys_CLK, Tx_Clock_01, 9600, Uart2_R_P1_0_T_P1_1, IP_0) |
(16)设置串口2为9位Uart通信,波特率发生器为定时器2,16位自动重装载函数
|
函数名称 |
//设置串口2为9位Uart通信,波特率发生器为定时器2,16位自动重装载函数 void ConfigUart2_9bit_Time2_Auto16(uint32 Sys_CLK, uint8 T2_CLK_DIV, uint8 MCU_Com_Bit, uint32 Baud, uint8 Uart_Pin, uint8 Priority) |
|
输入变量 |
Sys_CLK(当前系统时钟) |
|
T2_CLK_DIV(定时器2时钟分频系数) | |
|
MCU_Com_Bit(MCU通信方式选择位,单机通信/多机通信) | |
|
Baud(串口2通信波特率) | |
|
Uart_Pin(串口2通信引脚) | |
|
Priority(串口2通信中断优先级) | |
|
输出变量 |
无 |
|
返回值 |
无 |
|
示例 |
//设置串口2为9位Uart,引脚为P1_0、P1_1,通信波特率为9600,定时器2为波特率发生器 uint32 Sys_CLK; ConfigUart2_9bit_Time2_Auto16(Sys_CLK, Tx_Clock_01, MCU_Com_Single, 9600, Uart2_R_P1_0_T_P1_1, IP_0) |
(17)设置串口2发送字符串数据函数
|
函数名称 |
//设置串口2发送字节数据函数 void Uart2Write(uint8 *buf,uint8 len,uint8 Bit9) |
|
输入变量 |
*buf(所要发送字节数据的数据指针) |
|
len(所要发送字节数据的长度) | |
|
Bit9(Uart通信字节数据第9位,在串口2通信为模式0时,设置为Bit9_0) | |
|
输出变量 |
无 |
|
返回值 |
无 |
|
示例 |
//设置串口2发送字符串 Uart2Write("jinjiao111540\r\n",sizeof("jinjiao111540\r\n"),Bit9_0); |
(18)设置串口2读取字节数据函数
|
函数名称 |
//设置串口2读取字节数据函数 uint8 Uart2Read(uint8 *buf,uint8 len,uint16 Rx_Cycle_Time) |
|
输入变量 |
*buf(读取字节数据存放变量的数据指针) |
|
len(存放变量的数据长度) | |
|
Rx_Cycle_Time(报文的接收周期,ms) | |
|
输出变量 |
*buf(读取字节数据存放变量的数据指针) |
|
返回值 |
len(读取的字节数据的真实长度,0xFF表明在接收周期内未收到数据) |
|
示例 |
//设置串口2读取字节数据 uint8 Uart_Read_Buff[20]; |
(19)设置串口2接收数据处理函数
|
函数名称 |
//设置串口2接收数据处理函数 void Uart2Driver(uint8 MCU_Com_Bit,uint16 Rx_Cycle_Time,Uart_Callback Uart_Fun) |
|
输入变量 |
MCU_Com_Bit(串口2通信方式,单机通信或多机通信) |
|
Rx_Cycle_Time(串口接收数据周期) | |
|
Uart_Fun(串口接收数据处理函数) | |
|
输出变量 |
无 |
|
返回值 |
无 |
|
示例 |
//设置串口2接收数据处理函数,接收到串口数据后执行Uart_Rx_Multi_Handle_Fun处理 void Uart_Rx_Multi_Handle_Fun(uint8 *buf,uint8 len)//多机通信数据接收处理函数 if((S2CON&0x04)==0x04)//收到为地址帧 Uart2Driver(MCU_Com_Multi,5,Uart_Rx_Multi_Handle_Fun); 或 void Uart_Rx_Single_Handle_Fun(uint8 *buf,uint8 len)//单机通信数据接收处理函数 ; Uart2Driver(MCU_Com_Single,5,Uart_Rx_Single_Handle_Fun); |
|
注意 |
Uart2Driver函数需放在主函数中周期调用,调用周期为ms |
(20)设置串口2的Printf函数重定向函数
|
函数名称 |
//设置串口2的Printf函数重定向函数 int16 Printf_Uart2(const char *fmt, ...) |
|
输入变量 |
*fmt(指针,指向Printf函数需要输出的格式字符串) |
|
输出变量 |
无 |
|
返回值 |
ret(输出格式字符串的长度) |
|
示例 |
//设置串口2打印输出执行格式字符串 Printf_Uart2("jinjiao%.2f\r\n",3.14125); |
(21)设置串口2的Scanf函数重定向函数
|
函数名称 |
//设置串口2的Scanf函数重定向函数 uint8 Scanf_Uart2(uint8 *buf,uint8 buf_len,Delay_Callback Delay_Time) |
|
输入变量 |
*buf(指针,指向读取串口2数据存储变量) |
|
buf_len(串口2数据存储变量长度) | |
|
Delay_Time(延时函数) | |
|
输出变量 |
*buf(指针,指向读取串口2数据存储变量) |
|
返回值 |
len(读取串口2数据的真实长度) |
|
示例 |
//设置串口2接收字符串存储在Str中,串口接收数据扫描周期为5*10ms uint8 len=0; void Delay10ms() //@12.000MHz i = 117; len=Scanf_Uart2(Str,sizeof(Str),Delay10ms); |
|
注意 |
该函数执行过程中有阻塞,阻塞时间=5*延时时间 |
(22)设置串口3为8位Uart通信,波特率发生器为定时器2,16位自动重装载函数
|
函数名称 |
//设置串口3为8位Uart函数,波特率发生器为定时器2,16位自动重装载函数 void ConfigUart3_8bit_Time2_Auto16(uint32 Sys_CLK, uint8 T2_CLK_DIV, uint32 Baud, uint8 Uart_Pin) |
|
输入变量 |
Sys_CLK(当前系统时钟) |
|
T2_CLK_DIV(定时器2时钟分频系数) | |
|
Baud(串口3通信波特率) | |
|
Uart_Pin(串口3通信引脚) | |
|
输出变量 |
无 |
|
返回值 |
无 |
|
示例 |
//设置串口3为8位Uart,引脚为P0_0、P0_1,通信波特率为9600,定时器2为波特率发生器 uint32 Sys_CLK; ConfigUart3_8bit_Time2_Auto16(Sys_CLK, Tx_Clock_01, 9600, Uart3_R_P0_0_T_P0_1) |
(23)设置串口3为8位Uart通信,波特率发生器为定时器3,16位自动重装载函数
|
函数名称 |
//设置串口3为8位Uart函数,波特率发生器为定时器3,16位自动重装载函数 void ConfigUart3_8bit_Time3_Auto16(uint32 Sys_CLK, uint8 T3_CLK_DIV, uint32 Baud, uint8 Uart_Pin) |
|
输入变量 |
Sys_CLK(当前系统时钟) |
|
T3_CLK_DIV(定时器3时钟分频系数) | |
|
Baud(串口3通信波特率) | |
|
Uart_Pin(串口3通信引脚) | |
|
输出变量 |
无 |
|
返回值 |
无 |
|
示例 |
//设置串口3为8位Uart,引脚为P0_0、P0_1,通信波特率为9600,定时器3为波特率发生器 uint32 Sys_CLK; ConfigUart3_8bit_Time3_Auto16(Sys_CLK, Tx_Clock_01, 9600, Uart3_R_P0_0_T_P0_1) |
(24)设置串口3为9位Uart通信,波特率发生器为定时器3,16位自动重装载函数
|
函数名称 |
//设置串口3为9位Uart通信,波特率发生器为定时器3,16位自动重装载函数 void ConfigUart3_9bit_Time3_Auto16(uint32 Sys_CLK, uint8 T3_CLK_DIV, uint8 MCU_Com_Bit, uint32 Baud, uint8 Uart_Pin) |
|
输入变量 |
Sys_CLK(当前系统时钟) |
|
T3_CLK_DIV(定时器3时钟分频系数) | |
|
MCU_Com_Bit(MCU通信方式选择位,单机通信/多机通信) | |
|
Baud(串口3通信波特率) | |
|
Uart_Pin(串口3通信引脚) | |
|
输出变量 |
无 |
|
返回值 |
无 |
|
示例 |
//设置串口3为9位Uart,引脚为P0_0、P0_1,通信波特率为9600,定时器3为波特率发生器 uint32 Sys_CLK; ConfigUart3_9bit_Time3_Auto16(Sys_CLK, Tx_Clock_01, MCU_Com_Single, 9600, Uart3_R_P0_0_T_P0_1) |
(25)设置串口3为9位Uart通信,波特率发生器为定时器2,16位自动重装载函数
|
函数名称 |
//设置串口3为9位Uart通信,波特率发生器为定时器2,16位自动重装载函数 void ConfigUart3_9bit_Time2_Auto16(uint32 Sys_CLK, uint8 T2_CLK_DIV, uint8 MCU_Com_Bit, uint32 Baud, uint8 Uart_Pin) |
|
输入变量 |
Sys_CLK(当前系统时钟) |
|
T2_CLK_DIV(定时器2时钟分频系数) | |
|
MCU_Com_Bit(MCU通信方式选择位,单机通信/多机通信) | |
|
Baud(串口3通信波特率) | |
|
Uart_Pin(串口3通信引脚) | |
|
输出变量 |
无 |
|
返回值 |
无 |
|
示例 |
//设置串口3为9位Uart,引脚为P0_0、P0_1,通信波特率为9600,定时器2为波特率发生器 uint32 Sys_CLK; ConfigUart3_9bit_Time2_Auto16(Sys_CLK, Tx_Clock_01, MCU_Com_Single, 9600, Uart3_R_P0_0_T_P0_1) |
(26)设置串口3发送字节数据函数
|
函数名称 |
//设置串口3发送字节数据函数 void Uart3Write(uint8 *buf,uint8 len,uint8 Bit9) |
|
输入变量 |
*buf(所要发送字节数据的数据指针) |
|
len(所要发送字节数据的长度) | |
|
Bit9(Uart通信字节数据第9位,在串口3通信为模式0时,设置为Bit9_0) | |
|
输出变量 |
无 |
|
返回值 |
无 |
|
示例 |
//设置串口3发送字符串 Uart3Write("jinjiao111540\r\n",sizeof("jinjiao111540\r\n"),Bit9_0); |
(27)设置串口3读取字节数据函数
|
函数名称 |
//设置串口3读取字节数据函数 uint8 Uart3Read(uint8 *buf,uint8 len,uint16 Rx_Cycle_Time) |
|
输入变量 |
*buf(读取字节数据存放变量的数据指针) |
|
len(存放变量的数据长度) | |
|
Rx_Cycle_Time(报文的接收周期,ms) | |
|
输出变量 |
*buf(读取字节数据存放变量的数据指针) |
|
返回值 |
len(读取的字节数据的真实长度,0xFF表明在接收周期内未收到数据) |
|
示例 |
//设置串口3读取字节数据 uint8 Uart_Read_Buff[20]; |
(28)设置串口3接收数据处理函数
|
函数名称 |
//设置串口3接收数据处理函数 void Uart3Driver(uint8 MCU_Com_Bit,uint16 Rx_Cycle_Time,Uart_Callback Uart_Fun) |
|
输入变量 |
MCU_Com_Bit(串口3通信方式,单机通信或多机通信) |
|
Rx_Cycle_Time(串口接收数据周期) | |
|
Uart_Fun(串口接收数据处理函数) | |
|
输出变量 |
无 |
|
返回值 |
无 |
|
示例 |
//设置串口3接收数据处理函数,接收到串口数据后执行Uart_Rx_Multi_Handle_Fun处理 void Uart_Rx_Multi_Handle_Fun(uint8 *buf,uint8 len)//多机通信数据接收处理函数 Uart3Driver(MCU_Com_Multi,5,Uart_Rx_Multi_Handle_Fun); 或 void Uart_Rx_Single_Handle_Fun(uint8 *buf,uint8 len)//单机通信数据接收处理函数 ; Uart3Driver(MCU_Com_Single,5,Uart_Rx_Single_Handle_Fun); |
|
注意 |
Uart3Driver函数需放在主函数中周期调用,调用周期为ms |
(29)设置串口3的Printf函数重定向函数
|
函数名称 |
//设置串口3的Printf函数重定向函数 int16 Printf_Uart3(const char *fmt, ...) |
|
输入变量 |
*fmt(指针,指向Printf函数需要输出的格式字符串) |
|
输出变量 |
无 |
|
返回值 |
ret(输出格式字符串的长度) |
|
示例 |
//设置串口3打印输出执行格式字符串 Printf_Uart3("jinjiao%.2f\r\n",3.14125); |
(30)设置串口3的Scanf函数重定向函数
|
函数名称 |
//设置串口3的Scanf函数重定向函数 uint8 Scanf_Uart3(uint8 *buf,uint8 buf_len,Delay_Callback Delay_Time) |
|
输入变量 |
*buf(指针,指向读取串口3数据存储变量) |
|
buf_len(串口3数据存储变量长度) | |
|
Delay_Time(延时函数) | |
|
输出变量 |
*buf(指针,指向读取串口3数据存储变量) |
|
返回值 |
len(读取串口3数据的真实长度) |
|
示例 |
//设置串口3接收字符串存储在Str中,串口接收数据扫描周期为5*10ms uint8 len=0; void Delay10ms() //@12.000MHz i = 117; len=Scanf_Uart3(Str,sizeof(Str),Delay10ms); |
|
注意 |
该函数执行过程中有阻塞,阻塞时间=5*延时时间 |
(31)设置串口4为8位Uart通信,波特率发生器为定时器2,16位自动重装载函数
|
函数名称 |
//设置串口4为8位Uart通信,波特率发生器为定时器2,16位自动重装载函数 void ConfigUart4_8bit_Time2_Auto16(uint32 Sys_CLK, uint8 T2_CLK_DIV, uint32 Baud, uint8 Uart_Pin) |
|
输入变量 |
Sys_CLK(当前系统时钟) |
|
T2_CLK_DIV(定时器2时钟分频系数) | |
|
Baud(串口4通信波特率) | |
|
Uart_Pin(串口4通信引脚) | |
|
输出变量 |
无 |
|
返回值 |
无 |
|
示例 |
//设置串口4为8位Uart,引脚为P0_2、P0_3,通信波特率为9600,定时器2为波特率发生器 uint32 Sys_CLK; ConfigUart4_8bit_Time2_Auto16(Sys_CLK, Tx_Clock_01, 9600, Uart4_R_P0_2_T_P0_3) |
(32)设置串口4为8位Uart通信,波特率发生器为定时器4,16位自动重装载函数
|
函数名称 |
//设置串口4为8位Uart通信,波特率发生器为定时器4,16位自动重装载函数 void ConfigUart4_8bit_Time4_Auto16(uint32 Sys_CLK, uint8 T4_CLK_DIV, uint32 Baud, uint8 Uart_Pin) |
|
输入变量 |
Sys_CLK(当前系统时钟) |
|
T4_CLK_DIV(定时器4时钟分频系数) | |
|
Baud(串口4通信波特率) | |
|
Uart_Pin(串口4通信引脚) | |
|
输出变量 |
无 |
|
返回值 |
无 |
|
示例 |
//设置串口4为8位Uart,引脚为P0_2、P0_3,通信波特率为9600,定时器4为波特率发生器 uint32 Sys_CLK; ConfigUart4_8bit_Time4_Auto16(Sys_CLK, Tx_Clock_01, 9600, Uart4_R_P0_2_T_P0_3) |
(33)设置串口4为9位Uart通信,波特率发生器为定时器2,16位自动重装载函数
|
函数名称 |
//设置串口4为9位Uart通信,波特率发生器为定时器2,16位自动重装载函数 void ConfigUart4_9bit_Time2_Auto16(uint32 Sys_CLK, uint8 T2_CLK_DIV, uint8 MCU_Com_Bit, uint32 Baud, uint8 Uart_Pin) |
|
输入变量 |
Sys_CLK(当前系统时钟) |
|
T2_CLK_DIV(定时器2时钟分频系数) | |
|
MCU_Com_Bit(MCU通信方式选择位,单机通信/多机通信) | |
|
Baud(串口4通信波特率) | |
|
Uart_Pin(串口4通信引脚) | |
|
输出变量 |
无 |
|
返回值 |
无 |
|
示例 |
//设置串口4为9位Uart,引脚为P0_2、P0_3,通信波特率为9600,定时器2为波特率发生器 uint32 Sys_CLK; ConfigUart4_9bit_Time2_Auto16(Sys_CLK, Tx_Clock_01, MCU_Com_Single, 9600, Uart4_R_P0_2_T_P0_3) |
(34)设置串口4为9位Uart通信,波特率发生器为定时器4,16位自动重装载函数
|
函数名称 |
//设置串口4为9位Uart通信,波特率发生器为定时器4,16位自动重装载函数 void ConfigUart4_9bit_Time4_Auto16(uint32 Sys_CLK, uint8 T4_CLK_DIV, uint8 MCU_Com_Bit, uint32 Baud, uint8 Uart_Pin) |
|
输入变量 |
Sys_CLK(当前系统时钟) |
|
T4_CLK_DIV(定时器4时钟分频系数) | |
|
MCU_Com_Bit(MCU通信方式选择位,单机通信/多机通信) | |
|
Baud(串口4通信波特率) | |
|
Uart_Pin(串口4通信引脚) | |
|
输出变量 |
无 |
|
返回值 |
无 |
|
示例 |
//设置串口4为9位Uart,引脚为P0_2、P0_3,通信波特率为9600,定时器4为波特率发生器 uint32 Sys_CLK; ConfigUart4_9bit_Time4_Auto16(Sys_CLK, Tx_Clock_01, MCU_Com_Single, 9600, Uart4_R_P0_2_T_P0_3) |
(35)设置串口4发送字节数据函数
|
函数名称 |
//设置串口4发送字节数据函数 void Uart4Write(uint8 *buf,uint8 len,uint8 Bit9) |
|
输入变量 |
*buf(所要发送字节数据的数据指针) |
|
len(所要发送字节数据的长度) | |
|
Bit9(Uart通信字节数据第9位,在串口4通信为模式0时,设置为Bit9_0) | |
|
输出变量 |
无 |
|
返回值 |
无 |
|
示例 |
//设置串口4发送字符串 Uart4Write("jinjiao111540\r\n",sizeof("jinjiao111540\r\n"),Bit9_0); |
(36)设置串口4读取字节数据函数
|
函数名称 |
//设置串口4读取字节数据函数 uint8 Uart4Read(uint8 *buf,uint8 len,uint16 Rx_Cycle_Time) |
|
输入变量 |
*buf(读取字节数据存放变量的数据指针) |
|
len(存放变量的数据长度) | |
|
Rx_Cycle_Time(报文的接收周期,ms) | |
|
输出变量 |
*buf(读取字节数据存放变量的数据指针) |
|
返回值 |
len(读取的字节数据的真实长度,0xFF表明在接收周期内未收到数据) |
|
示例 |
//设置串口4读取字节数据 uint8 Uart_Read_Buff[20]; |
(37)设置串口4接收数据处理函数
|
函数名称 |
//设置串口4接收数据处理函数 void Uart4Driver(uint8 MCU_Com_Bit,uint16 Rx_Cycle_Time,Uart_Callback Uart_Fun) |
|
输入变量 |
MCU_Com_Bit(串口4通信方式,单机通信或多机通信) |
|
Rx_Cycle_Time(串口接收数据周期) | |
|
Uart_Fun(串口接收数据处理函数) | |
|
输出变量 |
无 |
|
返回值 |
无 |
|
示例 |
//设置串口4接收数据处理函数,接收到串口数据后执行Uart_Rx_Multi_Handle_Fun处理 void Uart_Rx_Multi_Handle_Fun(uint8 *buf,uint8 len)//多机通信数据接收处理函数 Uart4Driver(MCU_Com_Multi,5,Uart_Rx_Multi_Handle_Fun); 或 void Uart_Rx_Single_Handle_Fun(uint8 *buf,uint8 len)//单机通信数据接收处理函数 ; Uart4Driver(MCU_Com_Single,5,Uart_Rx_Single_Handle_Fun); |
|
注意 |
Uart4Driver函数需放在主函数中周期调用,调用周期为ms |
(38)设置串口4的Printf函数重定向函数
|
函数名称 |
//设置串口4的Printf函数重定向函数 int16 Printf_Uart4(const char *fmt, ...) |
|
输入变量 |
*fmt(指针,指向Printf函数需要输出的格式字符串) |
|
输出变量 |
无 |
|
返回值 |
ret(输出格式字符串的长度) |
|
示例 |
//设置串口4打印输出执行格式字符串 Printf_Uart4("jinjiao%.2f\r\n",3.14125); |
(39)设置串口4的Scanf函数重定向函数
|
函数名称 |
//设置串口4的Scanf函数重定向函数 uint8 Scanf_Uart4(uint8 *buf,uint8 buf_len,Delay_Callback Delay_Time) |
|
输入变量 |
*buf(指针,指向读取串口4数据存储变量) |
|
buf_len(串口4数据存储变量长度) | |
|
Delay_Time(延时函数) | |
|
输出变量 |
*buf(指针,指向读取串口4数据存储变量) |
|
返回值 |
len(读取串口4数据的真实长度) |
|
示例 |
//设置串口4接收字符串存储在Str中,串口接收数据扫描周期为5*10ms uint8 len=0; void Delay10ms() //@12.000MHz i = 117; len=Scanf_Uart4(Str,sizeof(Str),Delay10ms); |
|
注意 |
该函数执行过程中有阻塞,阻塞时间=5*延时时间 |
(40)设置串口的运行状态函数
|
函数名称 |
//设置串口的运行状态函数 void ConfigUart_Run_State(uint8 Uart_ID,uint8 Uart_Run_State) |
|
输入变量 |
Uart_ID(要设置串口的ID号) |
|
Uart_Run_State(串口的运行状态,关闭,暂停,开启) | |
|
输出变量 |
无 |
|
返回值 |
无 |
|
示例 |
//设置串口1通信暂停,定时器1为波特率发生器 ConfigUart_Run_State(Uart1_Time1_Baud,Uart_Pause) |
五、STC15单片机串口通信测试
1、测试串口1发送数据
(1)打开STC15_Uart工程,选择第一个用例检查CLK_DIV.h、CLK_DIV.LIB、Uart.h、Uart.LIB是否载入,在main函数中设置时钟、设置串口1初始化,点击编译

(2)烧录HEX程序,设置串口号、波特率、校验位、停止位,观察串口1发送数据

工程代码链接:
链接:https://pan.baidu.com/s/1v1vShidAt5Fxbj73toPepg
提取码:859d
1507

被折叠的 条评论
为什么被折叠?



