51单片机串口收发程序通信

51单片机的串口是个全双工的串ロ,发送数据的同时还可以接收数据。


当串行发送完毕后将在标志位 TI 置 1,同样当收到了数据后,也会在 RI 置 1
无论 RI 或 TI 出现了 1,只要串ロ中断处于开放状态单片机都会进入串口中断处理程序。
在中断程序中要区分出来究竟是发送引起的中断,还是接收引起的中断然後分别进行处理。
看到过一些书籍和文章在串口收、发数据的处理方法上,很多人都有不妥之处
接收数据时,基本上都是使用“中断方式”这是正确合理的。
即:每当收到一个新数据就在中断函数中,把 RI 清零并用一个变量,通知主函数收到了新数据。
发送数据時很多的程序都是使用的“查询方式”,就是执行 while(TI ==0); 这样的语句来等待发送完毕
这时,处理不好的话就可能带来问题。
看了一些网友編写的程序发现有如下几条容易出错:
1.有人在发送数据之前,先关闭了串口中断!等待发送完毕后再打开串口中断。
这样在发送数据的等待期间内,如果收到了数据将不能进入中断函数,也就不会保存的这个新收到的数据
这种处理方法,就会遗漏收到的数据
2.有人在发送数据之前,并没有关闭串口中断当 TI = 1 时,是可以进入中断程序的
但是,却在中断函数中将 TI 清零!
这样,在主函数中的while(TI ==0);将永远等不到发送结束的标志。
3.还有人在中断程序中并没有区分中断的来源,反而让发送引起的中断执行了接收中断的程序。
對此做而论道发表自己常用的方法:
接收数据时,使用“中断方式”清除 RI 后,用一个变量通知主函数收到新数据。
发送数据时也鼡“中断方式”,清除 TI 后用另一个变量通知主函数,数据发送完毕
这样一来,收、发两者基本一致编写程序也很规范、易懂。
更重偠的是主函数中,不用在那儿死等发送完毕可以有更多的时间查看其它的标志。

下面是个实际的问题答案在附件里。 求一个51单片机串口收发程序通信程序  悬赏分:50 | 解决时间: 22:39 |


求一个PC与51单片机串口收发程序通信的程序要求如下:
1、如果在电脑上发送以$开始的字符串,则将整个字符串原样返回(字符串长度不是固定的)
2、如果接收到1,则将P10置高电平接收到0,P10置低电平(用来控制一个LED)
问题补充:可能会将【$ABCD,654ccc,aasdasd,aaaa,sssd,4D】这样的字符串(字符串长度约为50-150个字符)传送给单片机,只能能原样返回

问题答案:下面看一个网上的题目,以及做而論道的解答

求一个51单片机串口收发程序通信程序  悬赏分:50 | 解决时间: 22:39 |


求一个PC与51单片机串口收发程序通信的程序,要求如下:
1、如果在電脑上发送以$开始的字符串则将整个字符串原样返回(字符串长度不是固定的)。
2、如果接收到1则将P10置高电平,接收到0P10置低电平。(用来控制一个LED)

问题补充:可能会将【$ABCD,654ccc,aasdasd,aaaa,sssd,4D】这样的字符串(字符串长度约为50-150个字符)传送给单片机只能能原样返回。

下列程序已经调試成功。

Receiver/Transmitter)功能浏览了一下网页,觉得这篇文章不错所以copy了过来方便自己以后翻阅,复习

    MCS-51系列上有一个通用异步接收/发送器UART,通过引脚RXD[P3.O]和TXD[P3.1]可与外音B进行全双工的串行异步通信发送数据时由TXD端送出,接收时数据由RXD端输入本文将具体介绍51单片机串口收发程序的特点和编程方法,并且在最后给出一个实用嘚单片机与计算机通过串口通信的程序


 MCS-51的串行端口有4种基本工作方式,通过编程设置可以使其工作在任一方式,以满足不同场合的需偠其中方式0主要用于外接移位寄存器,以扩展单片机的I/O电路;工作方式1多用于双机之间或与外设电路的通信;方式2、3除有方式1的功能外还可以作多机通信,以构成分布式多微机系统

    串行端口有两个控制寄存器SCON、PCON,用于设置工作方式、发送或接收的状态、特征位、数据傳送波特率[每秒传送的位数]以及作为中断标志等

  串行端口有一个数据寄存器SBUF[在特殊功能寄存器中的字节地址为99H],该寄存器为发送和接收所共用发送时,只写不读;接收时只读不写。在一定条件下向SBuF写入数据就启动了发送过程;读SBuF就启动了接收过程。

  串行端口的波特率可以用程序来控制在不同工作方式中,由时钟振荡值或由定时器T1的定时溢出时间确定使用十分方便灵活。

    它用于定义串行口的工莋方式及实施接收和发送控制字节地址为98H,其各位定义如下表:

          SM2:多机通讯控制位仅用于方式2和方式3。当发送数据时SM2必须有软件设置為1;接收数据时如果SM2=1只有接收到的第9位数据为1时,RI才置位;如果SM2=0只要接收第9位数据RI就置位。

   TB8:是要发送数据的第9位在方式2或方式3中,要发送的第9位数据根据需要由软件置1或清0。例 如可约定作为奇偶校验位,或在多机通讯中作为区别地址帧或数据帧的标志位。

    RB8:接收箌的数据的第9位在方式0中不使用RB8。在方式1中若(SM2)=0,RB8为接收到的停止位在方式2或方式3中,RB8为接收到的第9位数据

    TI:发送中断标志。发送數据前必须软件清0发送过程中TI一直为0,当发送完一帧数据后由硬件自动置1。如果要再发送必须用软件再清0。在编写串行通信程序的時候可以使用软件查询TI的方法获得数据是否已发送完毕。

    RI:接收中断标志位接收数据前必须软件清0,接收过程中RI一直为0当接收完一幀数据后,由硬件自动置1如果要再接收,必须用软件再清0在编写串行通信程序的时候,可以使用软件查询RI的方法获得数据是否已接收唍毕

    PCON的字节地址为87H,它的第7位SMOD是与串口的波特率设置有关的选择位   SMOD:波特率加倍位。在计算串行方式1、2、3的波特率时SMOD=0波特率不加倍;SMOD=1波特率加倍

    方式0为移位寄存器输入/输出方式。可外接移位寄存器以扩展I/O口也可以外接同步输入/输出设备。波特率固定为fosc/12其Φfosc为时钟。

    输出:串行数据从RXD引脚输出TXD引脚输出移位脉冲。CPU将数据写入发送寄存器SBUF时立即启动发送,将8位数据以fos/12的固定波特率从RXD输絀低位在前,高位在后发送完一帧数据后,发送中断标志TI由硬件置位

    输入:RXD为串行数据输入端,TXD仍为同步脉冲移位输出端当(R1)=0且(REN)=1时,开始接收当接收到第8位数据时,将数据移入接收寄存器并由硬件置位RI。     左面两图分别是方式0扩展输出和输入的接线图74LS164/74LS165是移位寄存器,将输出的串行数据变为8位并行数据将外部输入的8位并行数据变成串行数据。

    方式1为波特率可变的10位异步通讯接口方式发送或接收一帧信息,包括1个起始位08个数据位和1个停止位1。其中的起始位和停止位在发送时自动插入的

    输出:当CPU执行一条指令将数据写入发送緩冲SBUF且TI=0时,就启动发送串行数据从TXD引脚输出,发送完一帧数据后就由硬件置位TI。

输入:在(REN)=1时串行口采样RXD引脚,当采样到1至O的跳变时确认是串行发送来的一帧数据的开始位0,从而开始接收一帧数据只有当8位数据接收完,并检测到高停止位后只有满足①(RI)=0;②(SM2)=0或接收箌的第9位数据为1时,停止位才进入RB88位数据才能进入接收寄存器,并由硬件置位中断标志RI;否则信息丢失所以在方式1接收时,应先用软件清零RI和SM2标志

    方式2为固定波特率的11位uART方式。它比方式1增加了一位可程控为1或0的第9位数据

    输出:发送的串行数据由TXD端输出一帧信息为11位,附加的第9位来自SCON寄存器的TB8位用软件置位或复位。它可作为多机通讯中地址/数据信息的标志位也可以作为数据的奇偶校验位。当CPu执荇一条数据写入SuBF的指令且TI=0时就启动发送器发送。发送一帧信息后置位中断标志TI。

输入:在(REN)=1时串行口采样RXD引脚,当采样到1至O的跳变时确认是串行发送来的一帧数据的开始位0,从而开始接收一帧数据在接收到附加的第9位数据后,当满足①(RI)=0;②(SM2)=0或接收到的第9位数据为1时第9位数据才进入RB8,8位数据才能进入接收寄存器并由硬件置位中断标志RI;否则信息丢失。且不置位RI

    式中T1计数率取决于它工作在定时器狀态还是计数器状态。当工作于定时器状态时T1计数率为fOSC门2:当工作于计数器状态时,T1计数率为外部输入此频率应小于fOSC/24。产生溢出所需与定时器T1的工作方式、T1的预置值(×]有关

    因为方式2为自动重装入初值的8位定时器/计数器模式,所以用它来做波特率发生器最恰当这種方式下,T1的溢出率[次/秒]计算式可以表示为:

     IBM PC是国内目前应用最广泛的微机在与串行接口后,可以方便地构成主从分布式多微机系统从机作数据采集或实时控制,主机作数据处理和中央管理等这种多微机系统在过程控制、仪器仪表、生产自动化和企业管理等方面都囿广泛应用。此外微机与单片机串行接口后,可以大大方便单片机的开发过程

    微机与通信时,两者一般都有一定的距离为了克服线蕗上的电损耗,避免信息出错常用RS232C实现信号之间的传输,RS232C电平的最大传输信息的长度为15m(采用150PF的多芯电缆)若希望有更远距离的传送,可鼡RS-422RS-485等标准。

    由于RS232C采用负逻辑即逻辑“1”:-5V—15V;逻辑“O”:+5V—+15V。而TTL的“1”和“0”分别为+2.4V—+5V和+0.4V—OV因此与微机之间必须外接实现。这種转换常用传输驱动器MAX232 MAX232的工作为5V,外围电路简单仅需外接几个即可完成从TTL电平到RS—232电平的转换。

PC的串行I/O信号插座有25脚和9脚两种常鼡9脚插座。9脚插座的主要信号如下:1保护地;2接收数据SIN;3发送数据SOUT;4数据终端准备DTR;5信号地;6数据装置准备DSR;7请求发送CTS;8清除发送CTS;9响铃指示RI在最简单的直接传送串行通信系统中仅用9脚插座中的发送数据、接收数据和信号地3条线即可,具体如下图所示

    串行通信程序设计主要有微机发送接收程序和发送接收程序,微机上的发送和接收程序主要采用计算机高级语言编写如:C/C++、VB等在单片机上主要用汇编或C編写,在使用串口之前必须先对串口进行初始化,主要是设置产生波特率的定时器1、串口控制和中断控制具体步骤如下:

    下面给出一個由汇编语言编写的串行通信程序,单片机的的为11.0592M程序中设置串口波特率为1200位/秒,串行工作方式1把16进制数55H发送出去。

 因此定时器的計数初值为: PC上采用串口调试软件——串口调试助手来接收单片机发送的数据此软件是一个绿色软件。无须安装软件支持常用的300—115200bps波特率,能设置校验、数据位和停止位能以ASCII码或十六进制接收或发送任何数据或字符(包括中文),可以任意设定自动发送并能将接收数据保存成文本文件,能发送任意大小的文本文件软件 界面如下图所示。

此软件可以分为两个主要的区域:数据接收区和数据发送区在数據接收区内有数据接收框,串口类型、波特率、校验位、数据位、停止位、显示方式选择区域等在数据发送区可以选择自动发送和手动發送两种形式,自动发送时只需要在电脑内选择要发送的文件然后点击“发送文件”即可:手动发送时需要选择发送数据的类型软件默認是以2进制发送,如果要以16进制发送必须选中“十六进制发送”选择了发送数据类型后在发送数据区填写要发送的数据或字符然后点击“手动发送”即可,但是必须注意如果选择了十六进制发送发送框中所填字符每两个字符之间应有一个空隔,如:01 23 00 34 45    在界面的最下方可鉯观测到数据发送或者接收的状态,包括:串口类型、波特率、校验位、数据位、停止位以及发送或接收文件的大小(bit)RX、TX。

    当将与微机通過串口连接好后打开串口调试助手,设置好串口的串口类型、波特率、校验位、数据位、停止位、显示方式然后打开单片机,就可以看到串口调试助手的数据接收框内不断的有数据55H出现这就表明单片机已经成功的与微机进行通信。但要注意的是调试串口时插拨串 口接头应尽量关闭计算机。接收数据的窗口如下所示

    以上给出的是一个简单的单片初串行数据发送程序,通过这个程序读名可以了解怎么對的串口进行初始化以及怎么通过串口发送数据当然根据不同的需要读者还可以编写出不同的实用程序,但是最根本的原理还是一样的

我要回帖

更多关于 51单片机串口收发程序 的文章

 

随机推荐