STC15单片机编程——串口通信

一、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];
uint8 Uart_Read_Buff_Len=0;
Uart_Read_Buff_Len=Uart1Read(Uart_Read_Buff,sizeof(Uart_Read_Buff),5);

(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)//多机通信数据接收处理函数
{
      if(RB8==1)//收到为地址帧
      {
          ;
      }
      else if(RB8==0)//收到为数据帧
      {
          ;
       }        
}

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;
uint8 Str[10]={0};

void Delay10ms()        //@12.000MHz
{
    unsigned char i, j;

    i = 117;
    j = 184;
    do
    {
        while (--j);
    } while (--i);
}

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];
uint8 Uart_Read_Buff_Len=0;
Uart_Read_Buff_Len=Uart2Read(Uart_Read_Buff,sizeof(Uart_Read_Buff),5);

(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)//收到为地址帧
      {
            ;
      }
      else if((S2CON&0x04)==0x00)//收到为数据帧
     {
            ; 
      }  
}

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;
uint8 Str[10]={0};

void Delay10ms()        //@12.000MHz
{
    unsigned char i, j;

    i = 117;
    j = 184;
    do
    {
        while (--j);
    } while (--i);
}

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];
uint8 Uart_Read_Buff_Len=0;
Uart_Read_Buff_Len=Uart3Read(Uart_Read_Buff,sizeof(Uart_Read_Buff),5);

(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)//多机通信数据接收处理函数
{
           if((S3CON&0x04)==0x04)//收到为地址帧
            {   
                ;
            }
            else if((S3CON&0x04)==0x00)//收到为数据帧
            {
                ;   
            }      
}

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;
uint8 Str[10]={0};

void Delay10ms()        //@12.000MHz
{
    unsigned char i, j;

    i = 117;
    j = 184;
    do
    {
        while (--j);
    } while (--i);
}

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];
uint8 Uart_Read_Buff_Len=0;
Uart_Read_Buff_Len=Uart4Read(Uart_Read_Buff,sizeof(Uart_Read_Buff),5);

(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)//多机通信数据接收处理函数
{
           if((S4CON&0x04)==0x04)//收到为地址帧
            {   
                  ;
            }
            else if((S4CON&0x04)==0x00)//收到为数据帧
            {
                  ;
            }       
}

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;
uint8 Str[10]={0};

void Delay10ms()        //@12.000MHz
{
    unsigned char i, j;

    i = 117;
    j = 184;
    do
    {
        while (--j);
    } while (--i);
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值