串口中断发送和接收数据代码思路 (串口中断接收发送数据代码)

上节分享了定时器的综合应用实例程序,其他的视频课程的代码相对都比较简单,就不再单独的贴出了(如果有需要分享的,可以单独留言具体的视频课程的标题,后续再做相关的分享)。从本节开始,陆续分享关于串口通信的一些代码,这也是部分网友一直私信要求分享的,当然也是基于串口的重要性。比如我们平时在程序的调试过程中,经常使用串口来进行相关的调试,打印一些信息或数据到上位机,以便观察和判断程序的逻辑功能是否符合预期。另外在设备和设备之间,设备和上位机之间进行通信时,串口也是一个重要的外设,因此,掌握了串口相关的功能,可以说,单片机的入门就差不多了。本节代码对应的视频课程为:串口发送一串数据到上位机及Printf串口输出重定向的实现,视频链接为:https://www.ixigua.com/6842637474208940548。本节视频课程主要是介绍了如何实现printf重定向到串口的问题,感兴趣的同学可以翻看相关的视频了解具体的实现讲解,也可以直接参考下面的代码,进行相关的调试测试。需要注意的是使用ptintf重定向,格式化输出时,会增加代码的容量,效率不高,一般主要用于调试过程,调试完成后,可以注释掉相关的代码,如果是用于串口的通信,则不建议直接使用printf,可以自己编写相应的串口发送程序代码来实现具体的功能。另外需要注意的是,如果用于串口的数据通信,单片机的晶振最好选择11.0592MHz,因为用该晶振时,波特率计算时,定时器的初值是整数,不存在累积的传输误差。话不多说,下面是具体的代码实现,分为main.c和uart.c。

//main.c
/*********************************************
程序功能:printf串口输出重定向
         配置串口,遵循“9600,N,8,1”。
         波特率:9600bps @11.0592MHz
         无校验位:N
         数据位:8
         停止位:1
***********************************************/
#include <reg51.h>
#include "delay.h"
#include "uart.h"

void main()
{
	unsigned char dat = 88;//格式化输出测试用
	unsigned int dat2 = 1250;//格式化输出测试用
	float dat3 = 12.5;//格式化输出测试用
	UartInit();//串口初始化
	while(1)
	{
		printf("Hello World\r\n");
		printf("dat = %bu\r\n",dat);
		printf("dat2 = %u\r\n",dat2);
		printf("dat3 = %f\r\n",dat3);
		DelayXms(2000);
	}
}
//uart.c
#include "uart.h"

//串口初始化,可借助视频中提到的工具进行配置
void UartInit(void)		//9600bps@11.0592MHz
{
	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;		//8位数据,可变波特率
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xFD;		//设定定时初值
	TH1 = 0xFD;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
}

//串口发送一个字节数据
void sendByte(unsigned char dat)
{
	SBUF = dat;
	while(!TI);
		TI = 0;
}
//串口发送字符串
void sendString(unsigned char *dat)
{
	while(*dat != '\0')
	{
		sendByte(*dat++);
	}
}

char putchar(char c)
{
	sendByte(c);
	return c;
}
//uart.h
#ifndef __UART_H__
#define __UART_H__

#include <reg51.h>
#include <stdio.h>

void UartInit(void);
void sendByte(unsigned char dat);
void sendString(unsigned char *dat);

#endif
//delay.c
#include "delay.h"

/************************************
函数名:DelayXms
功  能:毫秒级延时函数 
参  数:unsigned int  (1 - 65535)
返回值:无
**************************************/
void DelayXms(unsigned int xms)
{
	unsigned int i,j;
	for(i = xms;i>0;i--)
		for(j = 124;j>0;j--);
}
//delay.h
#ifndef __DELAY_H__
#define __DELAY_H__

void DelayXms(unsigned int xms);

#endif

仿真的效果图如下:

注意,如果使用的是proteus仿真的话,可以使用仿真工具虚拟终端进行测试,也可以安装虚拟串口软件,借助虚拟串口进行和上位机进行通信测试。具体的虚拟串口的使用,视频课程中有具体的介绍,可以打开视频进行了解。

串口数据发送或接收如何去判断,串口发送int数据

proteus仿真测试效果

串口数据发送或接收如何去判断,串口发送int数据

虚拟串口终端

串口数据发送或接收如何去判断,串口发送int数据

借助虚拟串口和上位机串口助手进行通信测试

代码仅供有需要的同学参考,有问题可以留言交流。感谢关注,后续会继续分享课程视频的相关代码。