这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 串口通信驱动

共2条 1/1 1 跳转至

串口通信驱动

助工
2014-10-14 20:25:36     打赏

.概述


异步串行通信(UART)接口是一种重要且常用的通信接口,不管是PC机、单片机或是其他设备,串行通信接口作为不可分割的部分发挥着通信的主导作用。异步串行通信的标准接口分25针串口和9针串口两种,25针串口很久以前已经销声匿迹了,常用的是9针串口。单片机与PC机的串口通信电路很简单,只需要一片MAX232芯片和几个电容就能构成一个稳定的串口通信电路。MAX232芯片是一款±12V5V相互转换的电平转换芯片。为什么要加一个电平转换芯片?因为PC机串口电平的定义比较奇怪:-12为高电平,+12V为低电平,而单片机串口的高低电平分别为+5V0V,所以需要将±12V5V和将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;


} 


高工
2014-10-14 20:34:51     打赏
2楼
完美,楼主总结的太棒了

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]