医药类网站怎么做seo,设计网站遇到的问题,购物网站有哪些平台,wordpress 中文工单目录快速使用硬知识串行口相关寄存器串行口控制寄存器SCON和PCON串行口数据缓冲寄存器SBUF从机地址控制寄存器SADEN和SADDR与串行口中断相关的寄存器IE和IPH、IP串行口工作模式串行口工作模式0#xff1a;同步移位寄存器串行口工作模式1#xff1a;8位UART#xff0c;波特率…
目录快速使用硬知识串行口相关寄存器串行口控制寄存器SCON和PCON串行口数据缓冲寄存器SBUF从机地址控制寄存器SADEN和SADDR与串行口中断相关的寄存器IE和IPH、IP串行口工作模式串行口工作模式0同步移位寄存器串行口工作模式18位UART波特率可变串行口工作模式29位UART波特率固定串行口工作模式39位UART波特率可变串行通信中波特率的设置示例程序USART.cUSART.h定时器2作为波特率发生器实验main.c实验现象定时器1作为波特率发生器仿真实验main.c实验现象串行口工作模式0发送实验main.c实验现象普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 快速使用
可通过STC-ISP的波特率计算器直接生成初始化函数 6T模式下需将系统频率翻倍 1T的单片机不需要将系统频率翻倍定时器时钟应为1T 范例程序中有写的很好的例程
硬知识 摘自《STC89C52系列单片机器件手册》 中断知识见【51单片机快速入门指南】3中断系统 STC89C52系列单片机内部集成有一个功能很强的全双工串行通信口与传统8051单片机 的串口完全兼容。设有 2 个互相独立的接收、发送缓冲器可以同时发送和接收数据。发送缓 冲器只能写入而不能读出接收缓冲器只能读出而不能写入因而两个缓冲器可以共用一个 地址码 99H 。两个缓冲器统称串行通信特殊功能寄存器 SBUF 。 串行通信设有4种工作方式其中两种方式的波特率是可变的另两种是固定的以供不同应用场合选用。波特率由内部定时器/计数器产生用软件设置不同的波特率和选择不同的工作方式。主机可通过查询或中断方式对接收/发送进行程序处理使用十分灵活。 STC89C52系列单片机串行口对应的硬件部分对应的管脚是P3.0/RxD和P3.1/TxD。 STC89C52系列单片机的串行通信口除用于数据通信外还可方便地构成一个或多个并行I/O口或作串 — 并转换或用于扩展串行外设等。
串行口相关寄存器 串行口控制寄存器SCON和PCON STC89C52系列单片机的串行口设有两个控制寄存器串行控制寄存器SCON和波特率选 择特殊功能寄存器PCON。 串行控制寄存器SCON用于选择串行通信的工作方式和某些控制功能。其格式如下 SCON : 串行控制寄存器 (可位寻址) SM0/FE当PCON寄存器中的SMOD0/PCON.6位为1时该位用于帧错误检测。当检测到一个无效停止位时通过UART接收器设置该位。它必须由软件清零。 当PCON寄存器中的SMOD0/PCON.6位为0时该位和SM1一起指定串行通信的工作方式如下表所示。 其中SM0、SM1按下列组合确定串行口的工作方式 SM2允许方式2或方式3多机通信控制位。在方式2或方式3时如SM2位为1REN位为1则从机处于只有接收到RB8位为1地址帧时才激活中断请求标志位RI为1并向主机请求中断处理。被确认为寻址的丛机则复位SM2位为0从而才接收RB8为0的数据帧。 在方式1时如果SM2位为1则只有在接收到有效的停止位时才置位中断请求标志位RI为1在方式0时SM2 应为0。 REN允许/禁止串行接收控制位。由软件置位REN即REN1为允许串行接收状态可启动串行接收器RxD开始接收信息。软件复位REN即REN0则禁止接收。 TB8 在方式2或方式3它为要发送的第9位数据按需要由软件置位或清0。例如可用作数据的校验位或多机通信中表示地址帧/数据帧的标志位。 RB8 在方式2或方式3是接收到的第9位数据。在方式1若SM20则RB8是接收到的停止位。方式0不用RB8。 TI 发送中断请求标志位。在方式0当串行发送数据第8位结束时由内部硬件自动置位即TI1向主机请求中断响应中断后必须用软件复位即TI0。在其他方式中则在停止位开始发送时由内部硬件置位必须用软件复位。 RI 接收中断请求标志位。在方式0当串行接收到第8位结束时由内部硬件自动置位RI1 向主机请求中断响应中断后必须用软件复位即RI0。在其他方式中串行接收到停止位的中间时刻由内部硬件置位即RI1例外情况见SM2说明必须由软件复位即RI0。 SCON的所有位可通过整机复位信号复位为全“0”。SCON的字节地址尾98H可位寻址各位地址为98H~~9FH可用软件实现位设置。当用指令改变SCON的有关内容时其改变的状态将在下一条指令的第一个机器周期的S1P1状态发生作用。如果一次串行发送已经开始则输出TB8将是原先的值不是新改变的值。 串行通信的中断请求当一帧发送完成内部硬件自动置位TI即TI1请求中断处理当接收完一帧信息时内部硬件自动置位RI即RI1请求中断处理。由于TI和RI以“或逻辑”关系向主机请求中断所以主机响应中断时事先并不知道是TI还是RI请求的中断必须在中断服务程序中查询TI和RI进行判别然后分别处理。因此两个中断请求标志位均不能由硬件自动置位必须通过软件清0否则将出现一次请求多次响应的错误。 电源控制寄存器PCON中的SMOD/PCON.7用于设置方式1、方式2、方式3的波特率是否加倍。电源控制寄存器PCON格式如下 PCON : 电源控制寄存器 (不可位寻址) SMOD波特率选择位。当用软件置位SMOD即SMOD1则使串行通信方式1、2、3的波特率加倍SMOD0则各工作方式的波特率不加倍。复位时SMOD0。 SMOD0帧错误检测有效控制位。当SMOD01SCON寄存器中的SM0/FE位用于FE(帧错误检测)功能当SMOD00SCON寄存器中的SM0/FE位用于SM0功能,和SM1一起指定串行口的工作方式。复位时SMOD00。
串行口数据缓冲寄存器SBUF STC89C52系列单片机的串行口缓冲寄存器(SBUF)的地址是99H实际是2个缓冲器写SBUF的操作完成待发送数据的加载读SBUF的操作可获得已接收到的数据。两个操作分别对应两个不同的寄存器1个是只写寄存器1个是只读寄存器。 串行通道内设有数据寄存器。在所有的串行通信方式中在写入SBUF信号的控制下把数据装入相同的9位移位寄存器前面8位为数据字节其最低位为移位寄存器的输出位。根据不同的工作方式会自动将“1”或TB8的值装入移位寄存器的第9位并进行发送。 串行通道的接收寄存器是一个输入移位寄存器。在方式0时它的字长为8位其他方式时为 9位。当一帧接收完毕移位寄存器中的数据字节装入串行数据缓冲器SBUF中其第9位则装入SCON寄存器中的RB8位。如果由于SM2使得已接收到的数据无效时RB8和SBUF中内容不变。 由于接收通道内设有输入移位寄存器和SBUF缓冲器从而能使一帧接收完将数据由移位寄存器装入SBUF后可立即开始接收下一帧信息主机应在该帧接收结束前从SBUF缓冲器中 将数据取走否则前一帧数据将丢失。SBUF以并行方式送往内部数据总线。
从机地址控制寄存器SADEN和SADDR 为了方便多机通信STC89C52系列单片机设置了从机地址控制寄存器SADEN和SADDR。其中SADEN是从机地址掩模寄存器(地址为B9H复位值为00H)SADDR是从机地址寄存器(地址为A9H复位值为00H)。
与串行口中断相关的寄存器IE和IPH、IP 串行口中断允许位ES位于中断允许寄存器IE中中断允许寄存器的格式如下 IE : 中断允许寄存器 (可位寻址) EA : CPU的总中断允许控制位EA1CPU开放中断EA0CPU屏蔽所有的中断申请。EA的作用是使中断允许形成多级控制。即各中断源首先受EA控制;其次还受各中断源自己的中断允许控制位控制。 ES : 串行口中断允许位ES1允许串行口中断ES0禁止串行口中断。 串行口中断优先级控制位PS/PSH位于中断优先级控制寄存器IP/IPH中中断优先级控制寄 存器的格式如下 IPH: 中断优先级控制寄存器高(不可位寻址) IP : 中断优先级控制寄存器低 (可位寻址) PSH, PS: 串口1中断优先级控制位。 当PSH0且PS0时串口1中断为最低优先级中断(优先级0) 当PSH0且PS1时串口1中断为较低优先级中断(优先级1) 当PSH1且PS0时串口1中断为较高优先级中断(优先级2) 当PSH1且PS1时串口1中断为最高优先级中断(优先级3)
串行口工作模式 STC89C52系列单片机的串行通信有4种工作模式可通过软件编程对SCON中的SM0、SM1的设置进行选择。其中模式1、模式2和模式3为异步通信每个发送和接收的字符都带有1个启动位和1个停止位。在模式0中串行口被作为1个简单的移位寄存器使用。
串行口工作模式0同步移位寄存器 在模式0状态串行通信工作在同步移位寄存器模式当当单片机工作在6T模式时其波特率固定为SYSclk/6。当单片机工作在12T时其波特率固定为SYSclk/12。串行口数据由RxD(RxD/P3.0)端输入同步移位脉冲SHIFTCLOCK由TxD(TxD/P3.1)输出发送、接收的是8位数据低位在先。 模式0的发送过程当主机执行将数据写入发送缓冲器SBUF指令时启动发送串行口即将8位数据以SYSclk/12或SYSclk/6的波特率从RxD管脚输出(从低位到高位)发送完中断标志TI置1TxD管脚输出同步移位脉冲SHIFTCLOCK。波形如图8-1中“发送”所示。 当写信号有效后相隔一个时钟发送控制端SEND有效(高电平)允许RxD发送数据同时允许TxD输出同步移位脉冲。一帧(8位)数据发送完毕时各控制端均恢复原状态只有TI保持高电平呈中断申请状态。在再次发送数据前必须用软件将TI清0。 模式0接收过程模式0接收时复位接收中断请求标志RI即RI0置位允许接收控制位REN1时启动串行模式0接收过程。启动接收过程后RxD为串行输入端TxD为同步脉冲输出端。串行接收的波特率为SYSclk/12或SYSclk/6。其时序图如图8-1中“接收”所示。 当接收完成一帧数据(8位)后控制信号复位中断标志RI被置1呈中断申请状态。当再次接收时必须通过软件将RI清0 工作于模式0时必须清0多机通信控制位SM2使不影响TB8位和RB8位。由于波特率固 定为SYSclk/12或SYSclk/6无需定时器提供直接由单片机的时钟作为同步移位脉冲。 串行口工作模式0的示意图如图8-1所示 由示意图中可见由TX和RX控制单元分别产生中断请求信号并置位TI1或RI 1经“或门“ 送主机请求中断所以主机响应中断后必须软件判别是TI还是RI请求中断必须软件清0中断请求标志位TI或RI。 串行口工作模式18位UART波特率可变 当软件设置SCON的SM0、SM1为“01” 时串行通信则以模式1工作。此模式为8位UART格式一帧信息为10位1位起始位8位数据位(低位在先)和1位停止位。波特率可变即可根据需要进行设置。TxD(TxD/P3.1)为发送信息RxD(RxD/P3.0)为接收端接收信息串行口为全双工接受/发送串行口。 图8-2为串行模式1的功能结构示意图及接收/发送时序图 模式1的发送过程串行通信模式发送时数据由串行发送端TxD输出。当主机执行一条写“SBUF“的指令就启动串行通信的发送写“SBUF”信号还把“1” 装入发送移位寄存器的第9位并通知TX控制单元开始发送。发送各位的定时是由16分频计数器同步。 移位寄存器将数据不断右移送TxD端口发送在数据的左边不断移入“0”作补充。当数据的最高位移到移位寄存器的输出位置紧跟其后的是第9位“1” 在它的左边各位全为 “0” 这个状态条件使TX控制单元作最后一次移位输出然后使允许发送信号“SEND”失效完成一帧信息的发送并置位中断请求位TI即TI1向主机请求中断处理。 模式1的接收过程当软件置位接收允许标志位REN即REN1时接收器便以选定波特率的16分频的速率采样串行接收端口RxD当检测到RxD端口从“1”→“0” 的负跳变时就启动接收器准备接收数据并立即复位16分频计数器将1FFH植装入移位寄存器。复位16分频计数器是使它与输入位时间同步。 16分频计数器的16个状态是将1波特率每位接收时间均为16等份在每位时间的7、 8、9状态由检测器对RxD端口进行采样所接收的值是这次采样直经 “三中取二” 的值即3次采样至少2次相同的值以此消除干扰影响提高可靠性。在起始位如果接收到的值不为 “0”低电平则起始位无效复位接收电路并重新检测1 →0 的跳变。如果接收到的起始位有效则将它输入移位寄存器并接收本帧的其余信息。 接收的数据从接收移位寄存器的右边移入已装入的1FFH向左边移出当起始位0移到移位寄存器的最左边时使RX控制器作最后一次移位完成一帧的接收。若同时满足以下两个条件
RI0SM20或接收到的停止位为1。 则接收到的数据有效实现装载入SBUF停止位进入RB8置位RI即RI1向主机请求中断若上述两条件不能同时满足则接收到的数据作废并丢失无论条件满足与否接收器重又检测RxD端口上的1 →0的跳变继续下一帧的接收。接收有效在响应中断后必须由软件清0即RI0。通常情况下串行通信工作于模式1时SM2设置为0。 串行通信模式1的波特率是可变的可变的波特由定时器/计数器1或独立波特率发生器产生。 串行通信模式1的波特率2SMOD/32×2^{SMOD}/32×2SMOD/32×(定时器/计数器1溢出率) 当单片机工作在12T模式时定时器1的溢出率 SYSclk/12/( 256 - TH1) 当单片机工作在6T模式时 定时器1的溢出率 SYSclk /6/ ( 256 - TH1)
串行口工作模式29位UART波特率固定 当SM0、SM1两位为10时串行口工作在模式2。串行口工作模式2为9位数据异步通信UART模式其一帧的信息由11位组成1位起始位8位数据位(低位在先)1位可编程位(第9位数据)和1位停止位。发送时可编程位(第9位数据)由SCON中的TB8提供可软件设置为1或 0或者可将PSW中的奇/偶校验位P值装入TB8(TB8既可作为多机通信中的地址数据标志位 又可作为数据的奇偶校验位)。接收时第9位数据装入SCON的RB8。TxD为发送端口RxD为接收端口以全双工模式进行接收/发送。 模式2的波特率为 串行通信模式2波特率2SMOD/64×2^{SMOD}/64×2SMOD/64×(SYSclk系统工作时钟频率) 上述波特率可通过软件对PCON中的SMOD位进行设置当SMOD1时选择1/32(SYSclk)当SMOD0时选择1/64(SYSclk) 故而称SMOD为波特率加倍位。可见模式2的波特率基本上是固定的。 图8-3为串行通信模式2的功能结构示意图及其接收/发送时序图。 由图8-3可知模式2和模式1相比除波特率发生源略有不同发送时由TB8提供给移位寄存器第9数据位不同外其余功能结构均基本相同其接收/发送操作过程及时序也基本相同。 当接收器接收完一帧信息后必须同时满足下列条件
RI0SM20或者SM21并且接收到的第9数据位RB81。 当上述两条件同时满足时才将接收到的移位寄存器的数据装入SBUF和RB8中并置位RI1向主机请求中断处理。如果上述条件有一个不满足则刚接收到移位寄存器中的数据无效而丢失也不置位RI。无论上述条件满足与否接收器又重新开始检测RxD输入端口的跳变信息接收下一帧的输入信息。 在模式2中接收到的停止位与SBUF、RB8和RI无关。 通过软件对SCON中的SM2、TB8的设置以及通信协议的约定为多机通信提供了方便。
串行口工作模式39位UART波特率可变 当SM0、SM1两位为11时串行口工作在模式3。 串行通信模式3为9位数据异步通信UART模式其一帧的信息由11位组成1位起始位8位数据位(低位在先)1位可编程位(第9位数据)和1位停止位。发送时可编程位(第9位数据)由SCON中的TB8提供可软件设置为1或0或者可将PSW中的奇/偶校验位P值装入TB8(TB8既可作为多机通信中的地址数据标志位又可作为数据的奇偶校验位)。接收时第9位数据装入SCON的RB8。TxD为发送端口RxD为接收端口以全双工模式进行接收/发送。 模式3的波特率为 串行通信模式3波特率2SMOD/32×2^{SMOD}/32×2SMOD/32×(定时器/计数器1的溢出率) 当单片机工作在12T模式时定时器1的溢出率 SYSclk/12/( 256 - TH1) 当单片机工作在6T模式时 定时器1的溢出率 SYSclk /6/ ( 256 - TH1) 可见模式3和模式1一样其波特率可通过软件对定时器/计数器1或独立波特率发生器的设置进行波特率的选择是可变的。 图8-4为串行口工作模式3的功能结构示意图及其接收/发送时序图。 由图8-4可知模式3和模式1相比除发送时由TB8提供给移位寄存器第9数据位不同外其余功能结构均基本相同其接收发送操作过程及时序也基本相同。 当接收器接收完一帧信息后必须同时满足下列条件
RI0SM20或者SM21并且接收到的第9数据位RB81。 当上述两条件同时满足时才将接收到的移位寄存器的数据装入SBUF和RB8中并置位RI1向主机请求中断处理。如果上述条件有一个不满足则刚接收到移位寄存器中的数据无效而丢失也不置位RI。无论上述条件满足与否接收器又重新开始检测RxD输入端口的跳变信息接收下一帧的输入信息。 在模式3中接收到的停止位与SBUF、RB8和RI无关。 通过软件对SCON中的SM2、TB8的设置以及通信协议的约定为多机通信提供了方便。
串行通信中波特率的设置 STC89C52系列单片机串行通信的波特率随所选工作模式的不同而异对于工作模式0和模式2其波特率与系统时钟频率SYSclk和PCON中的波特率选择位SMOD有关而模式1和模式3的波特率除与SYSclk和PCON位有关外还与定时器/计数器1或BRT独立波特率发生器设置有关。通过对定时器/计数器1或BRT独立波特率发生器的设置可选择不同的波特率所以这种波特率是可变的。 串行通信模式0其波特率与系统时钟频率SYSclk有关 。 当用户在烧录用户程序时在STC-ISP编程器中设置单片机为6T/双倍速时其波特率 SYSclk/12。 当用户在烧录用户程序时在STC-ISP编程器中设置单片机为12T/单倍速时其波特率 SYSclk/2。 一旦SYSclk选定且单片机在烧录用户程序时在STC-ISP编程器设置好则串行通信工作模式0的波特率固定不变。 串行通信工作模式2其波特率除与SYSclk有关外还与SMOD位有关。 其基本表达式为串行通信模式2波特率2SMOD/64×2^{SMOD}/64×2SMOD/64×(SYSclk系统工作时钟频率) 当SMOD1时波特率2/64(SYSclk)1/32(SYSclk) 当SMOD0时波特率1/64(SYSclk)。 当SYSclk选定后通过软件设置PCON中的SMOD位可选择两种波特率。所以这种模式的波特率基本固定。 串行通信模式1和3其波特率是可变的 模式1、3波特率2SMOD/32×(定时器/计数器1的溢出率或BRT独立波特率发生器的溢出率) 当单片机工作在12T模式时定时器1的溢出率 SYSclk/12/( 256 - TH1) 当单片机工作在6T模式时 定时器1的溢出率 SYSclk /6/ ( 256 - TH1) 通过对定时器/计数器1和BRT独立波特率发生器的设置可灵活地选择不同的波特率。在实际应用中多半选用串行模式1或串行模式3。显然为选择波特率关键在于定时器/计数器1 和BRT独立波特率发生器的溢出率的计算。 为选择波特率关键在于定时器/计数器1的溢出率。下面介绍如何计算定时器/计数器1的 溢出率。 定时器/计数器1的溢出率定义为单位时间秒内定时器/计数器1回0溢出的次数即定时器/计数器1的溢出率定时器/计数器1的溢出次数/秒。 STC89C52系列单片机设有两个定时器/计数器因定时器/计数器1具有4种工作方式,而常选用定时器/计数器1的工作方式28位自动重装作为波特率的溢出率。设置定时器/计数器1工作于定时模式的工作方式28位自动重装TL1的计数输入来自于SYSclk经12分频或不分频的脉冲。当单片机工作在12T模式TL1的计数输入来自于SYSclk经12分频的脉冲当单片机工作在6T模式TL1的计数输入来自于SYSclk经6分频的脉冲。可见定时器/计数器1的溢出率与SYSclk和自动重装值N有关SYSclk越大特别是N越大溢出率也就越高。对于一般情况下 当单片机工作在12T模式时时定时器/计数器1溢出一次所需的时间为 当单片机工作在6T模式时定时器/计数器1溢出一次所需的时间为 于是得定时器/计数器每秒溢出的次数即 当单片机工作在12T模式时定时器/计数器1的溢出率SYSclk/12×(28N) (次/秒) 当单片机工作在6T模式时 定时器/计数器1的溢出率SYSclk×6×(28N) (次/秒) 式中SYSclk为系统时钟频率N为再装入时间常数。 下表给出各种常用波特率与定时器/计数器1各参数之间的关系。 常用波特率与定时器/计数器1各参数关系T1x12/AUXR.60)
示例程序 stdint.h见【51单片机快速入门指南】1基础知识和工程创建 由于STC单片机的定时器2才有波特率发生器因此本示例中使用STC的头文件。
USART.c
#include USART.hchar RxBuffer[RxBuffer_Len] {0};
bit USART_Busy;void String_Analysis()
{}void USART_Init(uint8_t USART_Mode, bit Rx_Flag, uint8_t Priority, uint32_t SYSclk, uint32_t Baud_Rate, bit Double_Baud_Flag, bit USART_Timer)
{uint16_t THLx;Priority 3;USART_Mode 3;PCON 0;PCON | (uint8_t)Double_Baud_Flag 7; //波特率倍速控制SCON 0;SCON | (USART_Mode 6); //设置工作模式REN Rx_Flag; //允许/禁止串行接收控制位IPH ~(1 4); //设置中断优先级IPH | ((2 Priority) 3); //设置中断优先级PS (1 Priority); //设置中断优先级if (USART_Mode USART_MODE_1 || USART_Mode USART_MODE_3) {if (USART_Timer){T2MOD 0; //初始化定时器2模式寄存器T2CON 0; //初始化定时器2控制寄存器THLx 65536 - SYSclk / 32 / Baud_Rate; //定时器2 16位自动重装载TL2 THLx; //设置定时初始值TH2 THLx 8; //设置定时初始值RCAP2L THLx; //设置定时初始值RCAP2H THLx 8; //设置定时初始值TR2 1; //定时器开启}else{TMOD 0x0F; //初始化定时器1寄存器TMOD | 1 5; //定时器1 8位自动重装载THLx 256 - (1 (uint8_t)Double_Baud_Flag) * SYSclk / 12 / 32 / Baud_Rate; TH1 THLx; //设置定时初始值TL1 THLx; //设置定时初始值TR1 1; //定时器开启}RCLK USART_Timer;TCLK USART_Timer;}ES 1; //允许串行口中断EA 1; //允许总中断
}/*----------------------------
UART interrupt service routine
----------------------------*/
void Usart_Isr() interrupt 4
{static uint16_t Str_Count 0;if (RI){RI 0; //Clear receive interrupt flagRxBuffer[Str_Count] SBUF; if(RxBuffer[Str_Count] \n){for(Str_Count; Str_Count RxBuffer_Len; Str_Count)RxBuffer[Str_Count] 0;Str_Count 0;String_Analysis();}elseStr_Count;}if (TI){TI 0; //Clear transmit interrupt flagUSART_Busy 0; //Clear transmit USART_Busy flag}
}/*----------------------------
Send a byte data to UART
Input: dat (data to be sent)
Output:None
----------------------------*/
void SendData(char dat)
{while (USART_Busy); //Wait for the completion of the previous data is sentACC dat; //Calculate the even parity bit P (PSW.0)if (P) //Set the parity bit according to P{
#if (PARITYBIT ODD_PARITY)TB8 0; //Set parity bit to 0
#elif (PARITYBIT EVEN_PARITY)TB8 1; //Set parity bit to 1
#endif}else{
#if (PARITYBIT ODD_PARITY)TB8 1; //Set parity bit to 1
#elif (PARITYBIT EVEN_PARITY)TB8 0; //Set parity bit to 0
#endif}USART_Busy 1;SBUF ACC; //Send data to UART buffer
}/*----------------------------
Send a string to UART
Input: s (address of string)
Output:None
----------------------------*/
void SendString(char *s)
{while (*s) //Check the end of the string{SendData(*s); //Send current char and increment string ptr}
}char putchar(char Char)
{SendData(Char);return Char;
}//适配vofa串口示波器的JustFloat格式 浮点为大端
void SendFloat(unsigned char *Data) //发送一个字符
{char i;for(i0;i4;i)SendData(Data[3-i]);
}USART.h
#ifndef USART_H_
#define USART_H_#include STC89C5xRC.H
#include stdint.h
#include stdio.h#define RxBuffer_Len 20
extern char RxBuffer[];/*Define UART parity mode*/
#define NONE_PARITY 0 //None parity
#define ODD_PARITY 1 //Odd parity
#define EVEN_PARITY 2 //Even parity
#define MARK_PARITY 3 //Mark parity
#define SPACE_PARITY 4 //Space parity#define PARITYBIT NONE_PARITY //Testing even parity#define USART_MODE_0 0
#define USART_MODE_1 1
#define USART_MODE_2 2
#define USART_MODE_3 3#define Rx_ENABLE 1
#define Rx_DISABLE 0//STC单片机的4级优先级
#define STC_USART_Priority_Lowest 0
#define STC_USART_Priority_Lower 1
#define STC_USART_Priority_Higher 2
#define STC_USART_Priority_Highest 3#define DOUBLE_BAUD_ENABLE 1
#define DOUBLE_BAUD_DISABLE 0#define USART_TIMER_1 0 //8位自动重装载
#define USART_TIMER_2 1 //16位自动重装载void USART_Init(uint8_t USART_Mode, bit Rx_Flag, uint8_t Priority, uint32_t SYSclk, uint32_t Baud_Rate, bit Double_Baud_Flag, bit USART_Timer);
void SendData(char dat);
void SendFloat(unsigned char *Data); //适配vofa串口示波器的JustFloat格式 浮点为大端//适配vofa串口示波器的JustFloat格式 结束符
#define SendEnd() {SendData(0x00);SendData(0x00);SendData(0x80);SendData(0x7f);} #endif定时器2作为波特率发生器实验
main.c 串口初始化为模式1使能接收串口中断优先级为最低系统频率为11.0592MHz波特率为115200不加倍设置定时器2为串口的波特率发生器每隔0.5s回传收到的数据。
#include STC89C5xRC.H
#include intrins.h
#include stdint.h
#include USART.hvoid Delay1ms() //11.0592MHz
{unsigned char i, j;_nop_();i 2;j 199;do{while (--j);} while (--i);
}void Delay_ms(int i)
{while(i--)Delay1ms();
}//主函数
void main(void)
{USART_Init(USART_MODE_1, Rx_ENABLE, STC_USART_Priority_Lowest, 11059200, 115200, DOUBLE_BAUD_DISABLE, USART_TIMER_2);printf(USART Test.\r\n);while (1){Delay_ms(500);printf(%s, RxBuffer);}
}实验现象
实验符合预期。
定时器1作为波特率发生器仿真实验
main.c 串口初始化为模式1使能接收串口中断优先级为最低系统频率为12MHz波特率为4800加倍此时误差为0.16%是12MHz下定时器1能维持正常通讯的最高常见波特率设置定时器1为串口的波特率发生器每隔0.5s回传收到的数据。
#include STC89C5xRC.H
#include intrins.h
#include stdint.h
#include USART.hvoid Delay1ms() //12.000MHz
{unsigned char i, j;i 2;j 239;do{while (--j);} while (--i);
}void Delay_ms(int i)
{while(i--)Delay1ms();
}//主函数
void main(void)
{USART_Init(USART_MODE_1, Rx_ENABLE, STC_USART_Priority_Lowest, 12000000, 4800, DOUBLE_BAUD_ENABLE, USART_TIMER_1);printf(USART Test.\r\n);while (1){Delay_ms(500);printf(%s, RxBuffer);}
}
实验现象
仿真结果符合预期。
串行口工作模式0发送实验
main.c 串口初始化为模式0不使能接收发送模式串口中断优先级为最低之后的设置值对模式0没有意义每隔0.5s发送OK\n。
#include STC89C5xRC.H
#include intrins.h
#include stdint.h
#include USART.hvoid Delay1ms() //12.000MHz
{unsigned char i, j;i 2;j 239;do{while (--j);} while (--i);
}void Delay_ms(int i)
{while(i--)Delay1ms();
}//主函数
void main(void)
{USART_Init(USART_MODE_0, Rx_DISABLE, STC_USART_Priority_Lowest, 11059200, 115200, DOUBLE_BAUD_DISABLE, USART_TIMER_2);while (1){Delay_ms(500);printf(OK\n);}
}实验现象
此模式下可看作SPI通讯的变体 根据时序逻辑分析仪设置为空闲时时钟线为高LSB数据在时钟的偶数缘有效 抓到的波形