51单片机模拟串口发送接收数据(不使用SBUF)

发布于:2022-12-13 ⋅ 阅读:(593) ⋅ 点赞:(0)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

不使用SBUF模拟串口发送和接受数据,使用定时器实现此功能。
1.mcu向电脑发送数据,电脑接收数据。
2.电脑向mcu发送数据,mcu接收数据,并把接收的数据发送给电脑。

一、配置定时器

设置好定时器的定时时间,波特率9600,也就是每秒钟可以发送9600个0xFF(8bit数据(1byte))。每发送一个数据,TF0位置1,然后软件清零。

void timer0_init(unsigned int u32_baud)
{
	SCON = 0x50;
	TMOD &= 0XF0;
	TMOD |= 0X02;			//定时器0的模式2
	TH0 = TL0 = 256 - (FOSC/12)/(u32_baud);
	TF0 = 0;				//定时器0的溢出标志位
	TR0 = 0;				//初始化先关闭定时器,等要发送数据的时候才打开定时器,这样发送数据不会出错。
	PIN_TXD = 1;
}

void wait_TF0(void)
{
	while(!TF0);
	TF0 = 0;
}

二、串口发送

串口没有时钟线,全靠约定波特率来发送和接收数据,所以串口对波特率要求严格,一但时间对不上,数据就会有误差。所以不用的时候需要关闭定时器,用的时候才打开定时器。

void uart_send_byte(u16 u16_byte)
{
	u16 num = 8;
	TR0 = 1;				//开启定时器0
	PIN_TXD = (bit)0;		//发送起始位
	wait_TF0();

	while (num--)
	{
		PIN_TXD = (bit)(u16_byte & 0x01);
		wait_TF0();
		u16_byte >>= 1;
	}

	PIN_TXD = (bit)1;		//发送结束位
	wait_TF0();
	TR0 = 0;
}

三、串口接收

void uart_read_byte()
{
	u8 u8_output = 0;
	u8 i = 8;
	TR0 = 1;			//开启定时器0
	while(PIN_RXD);
	wait_TF0();

	while(i--)
	{
		u8_output >>= 1;
		if(PIN_RXD)
		{
			u8_output |= 0X80;			//
		}
		wait_TF0();
	}

	if(PIN_RXD == 1)
	{
		uart_send_byte(u8_output);
	}
	TR0 = 0;
}

四、主函数

单片机的运行速度很快所以你下载完程序之后不会直接看到0x34,按下复位键后,串口助手才能收到0x34。

void main()
{
	timer0_init(9600);
	uart_send_byte(0x34);
	while(1)
	{
		if(PIN_RXD == 0)
		{
			uart_read_byte();
		}
	}
}

五、波形图

5.1串口调试助手

1.按下复位键后,电脑接收到0x34,电脑发送0x56,单片机接收到0x56,再发送给电脑。在这里插入图片描述

5.2逻辑分析仪抓取波形

在这里插入图片描述

在这里插入图片描述



网站公告

今日签到

点亮在社区的每一天
去签到