一.概述
异步串行通信(UART)接口是一种重要且常用的通信接口,不管是PC机、单片机或是其他设备,串行通信接口作为不可分割的部分发挥着通信的主导作用。异步串行通信的标准接口分25针串口和9针串口两种,25针串口很久以前已经销声匿迹了,常用的是9针串口。单片机与PC机的串口通信电路很简单,只需要一片MAX232芯片和几个电容就能构成一个稳定的串口通信电路。MAX232芯片是一款±12V和5V相互转换的电平转换芯片。为什么要加一个电平转换芯片?因为PC机串口电平的定义比较奇怪:-12为高电平,+12V为低电平,而单片机串口的高低电平分别为+5V和0V,所以需要将±12V转5V和将5V转±12V电平才能互相正常通信。当PC机和PC机通过串口进行通信时不需要电平转换,但PC机和单片机通过串口通信时必须进行电平转换方可正常通信。
二.电路设计
MAX232芯片有两路输入输出,选择其中一路即可。在WSF-51DB开发板上,单片机的串口通过一个开关选择DB9针串口或USB接口进行通信。如下图,TXDM通过选择开关和单片机的P3.0脚连接,RXDM通过选择开关和单片机的P3.1脚连接。
三.软件设计
/**************************************************************************
*程序名称:51单片机串口调试
*程序功能:单片机通过串口和上位机的串口调试软件进行数据交换
* MCU型号:AT89S52-24PU
*时钟频率:11.0592MHZ
**************************************************************************/
#include<reg52.h>
//串口初始化:
void IniSerialPort(void)
{
TMOD=0X20; //定时器1工作在方式2
TH1=0xfd;
//置定时器初值,波特率9600/0xfd,4800/0xfa;2400/0xf4;19200/0xfd,PCON=0x80;
TL1=0xfd;//注意:要用11.0592MHZ晶振
//EA=1; //总中断打开,采用查询法时不用打开中断
//ES=1; //串口中断开关,采用查询法时不用打开中断
TR1=1; //定时器1打开
REN=1; //串口为工作方式1,允许接收数据
SM0=0;
SM1=1;
}
//串口查询法接收一个字节:
unsigned char ReceiveByte(void)
{
unsigned char rbyte;
while(!RI); //查询接收标志位,是否有数据到达缓冲区
RI=0; //清零接收标志位
rbyte=SBUF; //从缓冲区读取数据
return rbyte;
}
//串口发送一个字节:
void SendByte(unsigned char sbyte)
{
SBUF=sbyte; //发送数据
while(!TI); //等待发送完成
TI=0; //清零发送标志位
}
//串口发送一个字符串:
void SendString(unsigned char *pstr) //定义指针
{
while(*pstr!='\0') //字符串是否发完
{
SendByte(*pstr);//发送字符串数据
pstr++; //指向下一个字符
}
}
//串口中断函数:
void SerialPortInte(void) interrupt 4 //采用串口中断法收发数据
{
unsigned char rbyte;
RI=0; //清零接收标志位
rbyte=SBUF;//读取缓冲区的数据
P2=rbyte; //把数据送到P2口显示
}
//主函数:
int main(void)
{
unsigned char rdata;
IniSerialPort(); //初始化串口
while(1)
{
rdata=ReceiveByte();//采用查询法接收数据
if(rdata==0x55) SendString("How do you do!Can I help you?");
//如果收到0x55,就发送字符串给上位机
else SendByte(rdata);//如果不是0x55,就把数据发回去
}
return 0;
}