分享

51串口

 quasiceo 2015-09-21
分类: 其它 2012-06-08 17:07 1970人阅读 评论(0) 收藏 举报
串口通信驱动
[ 2012-5-29 0:29:00 | By: 吴师傅 ]
 
6

.概述

异步串行通信(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单片机串口调试

*程序功能:单片机通过串口和上位机的串口调试软件进行数据交换

*开发工具:WSF-51DB开发板

* MCU型号:AT89S52-24PU

*时钟频率:11.0592MHZ

*程序作者:吴师傅

*版权说明:吴师傅版权所有。转载请注明来源和作者。

**************************************************************************/

#i nclude<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;

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多