串口UART初始化文件“UartInit.c”
#include <REGX52.H>
//文件说明
/*
*****************************
*@file UartInit.c
*@author RuiXiong
*@version V1.0.0
*@date 2024/04/02
*@brief 串口UART初始化
*****************************
*/
//函数说明
/*
*****************************
*@brief 串口UART初始化
*@param 无
*@return 无
*****************************
*/
void UartInit(void) //4800bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x40; //8位数据,可变波特率
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFA; //设定定时初值
TH1 = 0xFA; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}
/*
*****************************
*@brief 串口发送一个字节数据
*@param byte 要发送的一个字节数据
*@return 无
*****************************
*/
void SendByte (unsigned char byte)
{
SBUF = byte;
while (T1 == 0);
T1 = 0;
}
主文件“main.c”
#include <REGX52.H>
#include "Delay.h"
#include "UartInit.h"
int main (void)
{
unsigned char sec = 0x00;
UartInit ();
while (1)
{
SendByte (sec);
sec++;
Delay (1000);
}
return 0;
}
1,错误描述
烧录代码后,stc-isp中的串口助手中,接收缓冲区不会按1s间隔显示数据00 01 02 03....;
按一次复位键接收缓冲区就显示一次00 01;
2,解决办法
1,打开串口UART初始化文件“UartInit.c”
2,将函数SendByte中的串口发送中断标志位T1改为TI;
Tips:就算你写错成T1(1,2,3的1),编译时也不会报错,如果我不是习惯每一个模块完成后编译调试,我根本检查不出这个错误!!!
void SendByte (unsigned char byte)
{
SBUF = byte;
while (TI == 0);//发送完毕后硬件自动将TI置1
/*
注意是TI(I,J,K的I)不是T1(1,2,3的1),
你要是写T1编译也不会报错就很操蛋,Debug成狗
*/
TI = 0;
}
3,总结
1,以后看手册的时候一定要仔细,尤其不要把1与I,0与O搞错!!!
2,接收缓冲区不显示数据,我第一时间应该优先检查SendByte函数。
3,如果确定是某一个模块出错了,但是语法,甚至逻辑没有问题,那一定去仔细检查书写。
4,每一个模块完成后一定要调试,多测试!!!!这真是一个好习惯。