51单片机串口发送多个16进制数据

串口发收数据

    • 发送主要逻辑
    • 接收主要逻辑
    • 计算波特率
    • 完整代码
    • 避坑指南

发送主要逻辑

一:声明一个你要发送的字符串列表

unsigned char code table[]={0x7E,0x03,0x01,0x02,0xEF};

二:配置串口寄存器
这里使用的是9600波特率,12MHz的晶振

//初始化函数
void UART_Init()	//[email protected]			 
{
	PCON |= 0x80;		//使能波特率倍速位SMOD
	SCON = 0x50;		//8位数据,可变波特率
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xF9;		    //设定定时初值
	TH1 = 0xF9;		    //设定定时器重装值
	ET1 = 0;		    //禁止定时器1中断
	TR1 = 1;		    //启动定时器1
	EA = 1;         	//启动所有中断
	ES = 1;             //中断使能
}
//定义发送函数
void UART_SendByte(unsigned char Byte[],length);

void UART_SendByte(unsigned char Byte[],length)
{
	unsigned char i;
	for(i=0;i<length;i++)    //循环发送
	{
		SBUF=Byte[i];		 //一次只能发送8位,SBUF位系统的缓存区
		while(!TI);
		TI = 0;
	}
}

接收主要逻辑

在上文串口配置成功的前提下,我们继续编写接收程序。

void UART_Routine() interrupt 4	   //串口中断,优先级是查表配置的,必须是4
{
	if(RI==1)		 //receive 接收标志位,接收完毕RI就等于1
	{	
		RI=0;
	}
}

计算波特率

这里直接用软件生成,因为我项目的需要,所以波特率调整位9600。但是各位实际在用的时候,建议选4800,然后勾选波特率倍速,这样可以大幅度的减少误差。但是其他配置一般要严格遵守我的设置。
51单片机串口发送多个16进制数据_第1张图片

完整代码

#include <REGX52.H>
#include"UART.h"
#include"Delay.h"

unsigned char length;
void UART_Init();
void UART_SendByte(unsigned char Byte[],length);

unsigned char code table[]={0x7E,0x03,0x01,0x02,0xEF};
void main()
{
	UART_Init();
	while(1)
	{	
		length = sizeof(table)
		UART_SendByte(table);
		Delay(3000);
	
	}
}

void UART_Init()				 
{

	PCON |= 0x80;		//使能波特率倍速位SMOD
	SCON = 0x50;		//8位数据,可变波特率
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xF9;		//设定定时初值
	TH1 = 0xF9;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
	EA = 1;
	ES = 1;

}
void UART_SendByte(unsigned char Byte[],length)
{
	unsigned char i;
	for(i=0;i<length;i++)
	{
		SBUF=Byte[i];		 //一次只能发送8位
		while(!TI);
		TI = 0;
	}
}

void UART_Routine() interrupt 4	   
{
	if(RI==1)		 //receive 接收标志位,接收完毕RI就等于1
	{
		RI=0;
	}
}

避坑指南

一:如果你配置了接收程序,在串口初始化的时候一定要记得加下这两条命令

	EA = 1;
	ES = 1;

二:在我们用软件计算波特率的时候会带有这两条语句,如果我们照样加进去的话就会报错,因此我们删除即可。

	AUXR &= 0xBF;		//定时器1时钟为Fosc/12,即12T
	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器

三:大多数串口收发有问题,都是两边的波特率没有检测好,请仔细查看。

你可能感兴趣的:(stm32(单片机),串口通信,单片机)