51单片机学习记录-容易写错的串口中断请求标志位TI

文章讲述了在STM8单片机中,通过UartInit.c文件进行串口UART初始化时遇到的问题,发送数据时接收缓冲区不按预期显示。作者发现错误在于SendByte函数中应使用TI中断标志而不是T1,并提醒读者在编程时要仔细阅读手册,检查每个模块并养成调试的好习惯。
摘要由CSDN通过智能技术生成

串口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,每一个模块完成后一定要调试,多测试!!!!这真是一个好习惯。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值