基础知识
参考
特殊功能寄存器PCON(控制波特率是否加倍SMOD)、TMOD(T0,T1计时器的功能方式)、TCON(T0,T1计时器的控制)、串口中断、SCON(串口数据控制寄存器)
关闭定时器1中断,设置波特率需要占用定时器1
接收数据和发送数据需要使用特殊功能寄存器SBUF作为暂存
其中TI和RI作为数据发送和接收的标志,需要在程序中手动复位
程序代码
主程序
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
void delay_ms(int ms);
void UART_SendByte(unsigned char Byte);
void uartSendString(char *pS);
void UsartInit()
{
SCON=0X50; //设置为工作方式1
TMOD=0X20; //设置计数器工作方式2
PCON=0X00; //波特率加倍,最高位控制是否加倍
TH1=0XFa; //计数器初始值设置,注意波特率是4800的
TL1=0XFa;
ES=1; //打开接收中断串口
EA=1; //打开总中断
TR1=1; //打开计数器
}
void main()
{
UsartInit(); // 串口初始化
while(1){
delay_ms(1000);
uartSendString("masgjlkj\n");}
while(1);
}
void UART_SendByte(unsigned char Byte)
{
SBUF = Byte;
while (!TI);
TI = 0;
}
void uartSendString(char *pS)
{
while (*pS) //检测字符串结束标志
{
UART_SendByte(*pS++); //发送当前字符
}
}
void Usart() interrupt 4
{
if (RI == 1) //如果接收标志位为1,接收到了数据
{
P2 = ~SBUF; //读取数据,取反后输出到LED
UART_SendByte(SBUF); //将受到的数据发回串口
RI = 0; //接收标志位清0
}
}
延时程序
若想使用准确的时间延时,可以测量实际的时间,
# include <reg52.h>
#include <intrins.h>
void delay_ms(int ms){
int i,j;
for(j=0;j<=ms;j++){
for(i=0;i<=1000;i++) //若使用12mhz的51单片机的1个nop是1us,一个机械周期
_nop_();
}
}
实际操作中的发送(通过使用串口助手查看)
在延时函数中的循环使用100,才能保证发送数据频率基本是1s一次,测试单片机输出如下
下面是选择错误的波特率后,虽然显示,但数据没有可读性