一:声明一个你要发送的字符串列表
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,然后勾选波特率倍速,这样可以大幅度的减少误差。但是其他配置一般要严格遵守我的设置。
#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为波特率发生器
三:大多数串口收发有问题,都是两边的波特率没有检测好,请仔细查看。