基础知识
参考
特殊功能寄存器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; //设置计数器工作方式2PCON=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; //读取数据,取反后输出到LEDUART_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一次,测试单片机输出如下
下面是选择错误的波特率后,虽然显示,但数据没有可读性