要求
在单片机实训平台上,利用51单片机的串行接口与上位机建立传输通道进行信息的收发。采用8位的UART模式,即模式1,波特率为9600BPS。数据发送采用查询的方式,数据接收采用中断的方式。
系统上电初始化后,单片机向上位机发送两个字节:0x5a和0xa5,然后等待接收上位机的数据,每接到一个字节后,在该字节的基础上加一,然后返回给上位机。
训练重点:
1.串口通信的初始化,注意工作模式与波特率的设置
2.串口通信单字节发送的程序设计
3.串口通信接收中断服务函数的设计
代码
串口
首先需要有串口初始化,在接收的时候需要中断函数。
由于在数据发送成功、数据接收成功都会产生中断,需要判断
sfr AUXR = 0x8e;
/*==========串口的初始化==========*/
void InitUart()
{
TMOD = 0x20;
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1;
SCON = 0x50;
AUXR = 0x00;
ES = 1;
EA = 1;
}
/*=========在接收的时候用到中断函数=======*/
void ServiceUart() interrupt 4
{
if(RI == 1) //是否接收到一个完整的数据
{
RI = 0;
urdat = SBUF; //发送
SendByte(urdat + 1); //接收
}
if(TI == 1) //是否发送完成
{
}
}
题目要求
题目要求先发送0x5a、0xa5
void main()
{
InitUart();
SendByte(0x5a); //题目要求发送5a
SendByte(0xa5);
while(1)
{
}
}
完整代码
//信息的收发
#include"reg52.h"
sfr AUXR = 0x8e;
unsigned char urdat = 0;
void SendByte(unsigned char dat);
/*==========串口的初始化==========*/
void InitUart()
{
TMOD = 0x20;
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1;
SCON = 0x50;
AUXR = 0x00;
ES = 1;
EA = 1;
}
/*=========在接收的时候用到中断函数=======*/
void ServiceUart() interrupt 4
{
if(RI == 1) //是否接收到一个完整的数据
{
RI = 0;
urdat = SBUF; //发送
SendByte(urdat + 1); //接收
}
if(TI == 1) //是否发送完成
{
}
}
/*==========查询发送函数=========*/
void SendByte(unsigned char dat)
{
SBUF = dat;
while(TI == 0);
TI = 0;
}
void main()
{
InitUart();
SendByte(0x5a); //题目要求发送5a
SendByte(0xa5);
while(1)
{
}
}
显示结果:
总结
1.在发送单个字节的时候,可以直接使用SendByte()函数。如:0x5a
2.串口通信中,必须有:串口初始化+串口中断服务函数+查询发送函数
其中,串口初始化、查询发送函数是固定的,直接记!