一、串口寄存器的配置
1.1现在先讲自己配置的方法,之后讲一下简便方法。
从数据手册中看相关的寄存器,然后根据数据手册配置。
1.2串行控制寄存器SCON和PCON
STC89C52系列单片机的串口设有两个控制寄存器:串行控制寄存器SCON和波特率选择特殊功能寄存器PCON。因为此时我们需要用到的工作方式是方式1也就是8位UART,波特率可变,所以把SM0和SM1配成01,SM2是多机通信控制位,在此时我们可以不用,REN是允许/禁止串行接受控制位,为1允许接收,为0禁止接收。在这里我们只用来发数据可以配0或者1都不影响。在这里不用停止位只有8位数据,所以TB8和RB8都不用,这里先不使用中断,只是单纯的传输数据所以中断位都不配置。
所以SCON是0101 0000,SCON=0x50.
接下来根据PCON电源控制寄存器配置,(这里对于波特率的计算比较麻烦,可以用软件配)
接下来几个寄存器都是中断的这里暂时不配置,因为这里只是简单的数据发送。
其实这时候串口的寄存器配置好了,但是用到串口时因为波特率的关系所以还需要配置下Timer1定时器,之前对于定时器的配置已经说明了,不同的是这里对于串口的波特率传输比较快,所以用双8位自动重装的模式,这样初始值就不用手动赋值。所以TMOD &=0x0F;TMOD |=0x20;然后设置初值,因为初值涉及到波特率的计算,所以之后讲,先讲软件配置的方法。
二、波特率软件生成
之前说此单片机的晶振是12Mhz,但是这次使用串口的时候发现,12Mhz在发送数据的时候会有误差,所以改成11.0592MHZ发现没问题,下面是用软件生成串口配置的格式。若是12MHZ的单片机需要勾上波特率倍数,这样可以减少误差。
虽然平时用软件比较方便,但是有时候还是得学会自己配置,可以帮助对电路原理图的理解。
三、发送数据
发送数据的话只需在SBUF寄存器中发出想给的数据就行了。例如:SBUF=0xFF;我这里是定义每一秒发送一个数据从0一直加加。
但是需要最好判断一下标志位TI这是发送中断标志位,当TI等于1时发送,但是得自己手动清0;
最后下载,打开串口助手。
void UART_SendByte(unsigned char Byte)
{
SBUF=Byte;
while(TI==0);
TI=0;
}
四、完整代码
头文件大家自己声明下,模块化编程之后方便使用。
4.1main.c
#include <REGX52.H>
#include "Delay.h"
#include "UART.h"
unsigned char Number;
void main()
{
UART_Init();
while(1)
{
UART_SendByte(Number);
Number++;
Delay1ms(1000);
}
}
4.2UART.c
#include "UART.h"
#include <REGX52.H>
/**
* @brief 串口初始化
* @parm
* @retval
*/
void UART_Init()//4800bps@12.000MHz
{
//启动定时器1
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFA; //设定定时初值
TH1 = 0xFA; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}
/**
* @brief 串口发送一个字节数据
* @parm 无
* @retval 无
*/
void UART_SendByte(unsigned char Byte)
{
SBUF=Byte;
while(TI==0);
TI=0;
}
4.3Delay.c
void Delay1ms(int xms) //@12.000MHz
{
unsigned char i, j;
while(xms--!=0)
{
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}