《IO模拟串口通信.docx》由会员分享,可在线阅读,更多相关《IO模拟串口通信.docx(20页珍藏版)》请在三一办公上搜索。
1、单片机IO口模拟串口实现数据通信1设计任务与要求本设计为单片机IO口模拟串口实现数据通信,它可以用单片机的IO口实现单片机RX和TX的功能。具体要求如下:l 用单片机的P3.4和P3.5分别模拟RX和TX的串行通信功能,能够接收和发送数据。l 通过PC机的键盘输入字符,并传送给单片机,由单片机接收后,发达给PC机,由PC机加以显示。l 单片机接收由键盘输入的数据后,如果是数字,则由数码管显示,并由LED灯表示其ASCII码,如果是其他字符,则由仅由LED灯显示其ASCII码。总体方案设计2.1串行通信的方式设计本设计要求用单片机的IO口来模拟串口的串行通信,因此有必要先简要介绍一下单片机的IO
2、和通信的基本原理与串行口P3.0和P3.1。2.1.1并行I/O口MCS-51单片机共有4个双向的8位并行I/O端口(Port),分别记作P0-P3,共有32根口线,各口的每一位均由锁存器、输出驱动器和输入缓冲器所组成。实际上P0-P3已被归入特殊功能寄存器之列。这四个口除了按字节寻址以外,还可以按位寻址。由于它们在结构上有一些差异,故各口的性质和功能有一些差异。P0口是双向8位三态I/O口,此口为地址总线(低8位)及数据总线分时复用口,可驱动8个LS型TTL负载。P1口是8位准双向I/O口,可驱动4个LS 型负载。P2口是8位准双向I/O口,与地址总线(高8位)复用,可驱动4个LS型TTL负
3、载。P3口是8位准双向I/O口,是双功能复用口,可驱动4个LS型TTL负载。P1口、P2口、P3口各I/O口线片内均有固定的上拉电阻,当这3个准双向I/O口做输入口使用时,要向该口先写“1”,另外准双向I/O口无高阻的“浮空”状态,故称为双向三态I/O 口。2.1.2通信的基本原理串行通信只用一位数据线传送数据的位信号,即使加上几条通信联络控制线,也用不了很多电缆线。因此串行通信适合远距离数据传送。,如大型主机与其远程终端之间、处于两地的计算机之间采用串行通信就非常经济。当然串行通信要求有转换数据格式、时间控制等逻辑电路,这些电路目前已被集成在大规模集成电路(称为可编程串行通信控制器),使用很
4、方便。通信方式有两种:并行通信和串行通信。通常根据传送的的距离决定采用哪种通信方式。例如,在IBMPC机与外部设备(如打印机等)通信时,距离小于30m,则可采用并行通信方式,当距离大于30m时,则要采用串行通信方式。89C51单片机具有并行和串行两种基本通信方式。并行通信是指数据的各位同时进行传送(发送或接收)的通信方式。其优点是传送速度高;缺点是数据有多少位,就需要多少根传送线。例如,89C51单片机与打印机之间的数据传送就属于并行通信。图1所示为89C51单片机与外设之间8位数据并行通信的连接方法。并行通信在位数多、传送距离又远时就不太合适了。 图1 两种通信方式连接串行通信指数据是一位一
5、位按顺序传送的通信方式。它的突出优点是只需一对传输线(利用电话线就可以作为传输线),这样大大降低了传送成本,特别适用于远距离通信;其缺点是传送速度较低。假设并行传送N位数据所需时间为T,那么串行传送的时间至少为NT,实际上问题总是大于NT的,图71所示为串行通信方式的连接方法。串行通信的传送方式通常有3种:单向(或)单工配置,只允许数据向一个方向传送;半双向(或半双工)配置,允许数据向两个方向中的任一方向传送,但每次只能有一个站点发送;全双向(或全工)配置,允许同时双向传送数据,因此,全双工配置是一对单向配置,它要求两端的通信设备都有完整和独立的发送和接收能力。串行通信有两种基本的通信方式:异
6、步通信和同步通信。l 异步通信在异步通信中,数据是一帧一帧(包括一个字符代码或一字节数据)传送的,第一帧的数据格式如图2所示。在帧格式中,一个字符由4部分组成:起始位、数据位、奇偶校验位和停止位。首先是一个起始位(0),然后是58位数据 (规定低位在前,高位在后),接下来是奇偶校验位(可省略),最后是停止位(1)。起始位(0)信号只占一位,用来通知接收设备一个待接收的字符开始到达。线路上在不传送字符时应保持为1。接收端不断检测线路的状态,若连续为1以后又测到一个0,就知道发来一个新字符,应马上准备接收。字符的起始位还被用作同步接收端的时钟,以保证以后的接收能正确进行。起始位后面紧接着是数据位,
7、它可以 5位(D0D4)、6位、7位或8位(D0D7)。奇偶校验(D8)只占一位,但在字符中也可以规定不用奇偶校验位,则这一位就可以省去。也可用这一位(1/0)来确定这一帧中的字符所代表信息的性质(地址/数据等)。停止位用来表征字符的结束,它一定是高电位(逻辑1)。停止位可以是1位、1.5位或2位。接收端收到停止位后,知道上一字符已传送完毕,同时也为接收下一个字符作好准备只发再接收到0,就是新字符的起始位。若停止位以后不是紧接着传送下一个字符,则使线路电平保持为高电平(逻辑1)。图73(a)表示一个字符紧接一个字符传送的情况,上一个字符的停止位和下一个字符的起始位是紧邻的;图73(b)则是两个
8、字符间有空闲位的情况,空闲位为期不远,线路处于等待状态。存在空闲位正是异步通信的特征之一。例如规定用ASCII编码,字符为7位,加1个奇偶校验位、1个起始位、1个停止位,则一帧共10位。同步通信 同步通信中,在数据开始传送前用同步字符来指示(常约定12个),并由时钟来实现发送端和接收端同步,即检测到规定的同步字符后,下面就连续按顺序传送数据,直到通信告一段落。同步传送时,字符与字符之间没有间隙,也不用起始位和停止位,仅在数据块开始时用同步字符SYNC来指示。波特率 波特率,即数据传送速率,表示每秒钟传送二进制代码的位数,它的单位是b/s。波特率对于CPU与外界的通信是很重要的。假设数据传送速率
9、是120字符/s,而每个字符格式包含1个代码位(1个起始位、1个终位、8个数据位)。这时,传送的波特率为: 10b字符120字符s1200bs每一位代码的传送时间Td为波特率的倒数。 Td1b(1200bs-1)0.833ms异步通信的传送速率在50b/s-19200b/s之间,常用于计算机到终端机和打印机之间的通信、直通电报以及无线电通信的数据发送等。 图2 异步通信的一般数据格式串行通信协议 通信协议是对数据传送方式的规定,包括数据格式定义和数据位定义等。通信双方必须遵守统一的通信协议。串行通信协议包括同步协议和异步协议两种。在此只讨论异步串行通信协议和异步串性协议规定的字符数据的传送格式
10、。(1)起始位通信线上没有数据被传送时处于逻辑1状态。当发送设备要发送一个字符数据时,首先发出一个逻辑0信号,这个逻辑低电平就是起始位。起始位通过通信线传向接收设备,接收设备检测到这个逻辑低电平后,就开始准备接收数据位信号。起始位所起的作用就是设备同步,通信双方必须在传送数据位前协调同步。(2)数据位当接收设备收到起始位后,紧接着就会收到数据位。数据位的个数可以是5、6、7或8。IBM-PC中经常采用7位或8位数据传送,89C51串行口采用8位或9位数据传送。这些数据位被接收到移位寄存器中,构成传送数据字符。在字符数据传送过程中,数据位从最低有效位开始发送,依次顺序在接收设备中被转换为并行数据
11、。(3)奇偶校验位数据位发送完之后,可以发送奇偶校验位。奇偶校验用于有限差错检测,通信双方需约定已知的奇偶校验方式。如果选择偶校验,那么组成数据位和奇偶位的逻辑1的个数必须是偶数;如果选择奇校验,那么逻辑1的个数必须是奇数。(4)停止位约定 在奇偶位或数据位(当无奇偶校验时)之后发送的是停止位。停止位是一个字符数据的结束标志,可以是1位,1.5位或2位的高电平。接收设备收到停止位之后,通信线路上便又恢复逻辑1状态,直至下一个字符数据的起始位到来。(5)波特率设置 通信线上传送的所有位信号都保持一致的信号持续时间,每一位的信号持续时间都由数据传送速度确定,而传送速度是以每秒多少个二进制位来衡量的
12、,这个速度叫波特率。如果数据以300个二进制位每秒在通信线上传送,那么传送速度为300波特,通常记为300b/s。2.1.3 89C51的串行口89C51单片机除具有4个8位并行口外,还具有串行接口。此串行接口是一个全双工串行通信接口,即能同时进行串行发送和接收数据。它可以作UATR(通用异步接收和发送器)用,也可以作同步移位寄存器用。使用串行接口可以实现89C51单片机系统之间点对点的单机通信和89C51与系统机(如IBM-PC机等)的单机或多机通信。通信和89C51与系统机(如IBM-PC机等)的单机或多机通信。图3 串行口内部结构示意图结 构89C51通过引脚RXD(P3.0,串行数据接
13、收端)和引脚TXD(P3.1,串行数据发送端)与外界进行通信。其内部结构简化示意图如图3所示。图3中有两个物理独立的接收、发送缓冲器SBUF,它们占用同一低值99H,可同时发送、接收数据。发送缓冲器只能写入,不能读出;接收缓冲器只能读出,不能写入。串行发送与接收的速率与移位时钟同步。89C51用定时器T1作为串行通信的波特率发生器,T1溢出率经2分频(或不分频)后又经16分频作为串行发送或接收的移位脉冲。移位脉冲的速率即是波特率。从图中可看出,接收器是双缓冲结构,在前一个字节被从接收缓冲器SBUF读出之前,第二个字节即开始被接收(串行输入至移位寄存器),但是,在第二个字节接收完毕而前一个字节C
14、PU未读取时,会丢失前一个字节。串行口的发送和接收都是以特殊功能寄存器SBUF的名义进行读或写的。当向SBUF发“写”命令时(执行“MOV SBUF,A”指令),即是向发送缓冲器SBUF装载并开始由TXD引脚向外发送一帧数据,发送完便使发送中断标志位TI=1。在满足串行口接收中断标志位RI(SCON.0)=0的条件下,置允许接收位REN(SCON.4)=1就会接收一帧数据进入移位寄存器,并装载到接收SBUF中,同时使RI=1。当发读SBUF命令时(执行“MOV A,SBUF”命令),便由接收缓冲器(SBUF)取出信息通过89C51内部总线送CPU。 对于发送缓冲器,因为发送时CPU是主动的,不
15、会产生重叠错误,一般不需要用双缓冲器结构来保持最大传送速率。2、串行口控制字及控制寄存器89C51串行口是可编程接口,对它初始化编程只用两个控制字分别写入特殊功能寄存器SCON(98H)和电源控制寄存器PCON(87H)中即可。2.1.4 用IO口模拟串口通信IO口没有89C51的串口结构,因此IO不能自动发送数据和接收数据,也没有发送中断标志和接收中断标志。而89C51串口还有T1计时器的参与,用来产生波特率。因此,需要在程序中模拟串口的通信方式以及定义数据的格式。模拟串口的通信方式采用方式1,即为10位为一帧数据接口,1个起始位、8位数据位(低位在前)和1位停止位,共10位。并且每位持续的
16、时间为100us。先发送或接收起始位0,接着准备发送或接收8位数据位,最后发送或接收停止位1。本设计中采用P3.4来模拟TX串口发送端口,用P3.5来模拟RX串口接收端口。因此发送的10位数据由P3.4送出,接收的10位数据由P3.5输入,并等待CPU进行处理。2.2 数码管显示设计本设计主要在于显示,显示由键盘输入的字符的ASCII码,如果是数字,则由一位LED数据管显示,并由LED灯显示。若为其他的字符,仅由LED灯显示。从键盘输入字符通过软件模拟或者通过PC机中附件中终端设备来显示。输入与显示可以由C函数库存中的函数printf和scanf来实现。单片机中通常使用7段LED构成字型“8”
17、,另外,还有一个小数点发光二极管,以显示数字、符号及小数点。这种显示器有共阴极和共阳极两种。发光二极管的阳极连在一起的(公共端K0)称为共阳极显示器,阴极连在一起的(公共端K0)称为共阴极显示器。一位显示器由8个发光二极管组成,其中,7个发光二极管构成字型“8”的各个笔划a-g,另一个小数点为dp发光二极管。当在某段发光二极管上施加一定的正向电压时,该段笔划即亮;不加电压则暗。为了保护各段LED不被损坏,须外加限流电阻。以共阴极LED为例,各LED公共阴极K0接地。若向个控制端a、b、g、dp顺次送入11100001信号,则该显示器显示“7.”字型共阴极与共阳极7段LED显示数字0-9的编码(
18、a段为最低位,dp点为最高位)。如表1所示。表1 共阴极和共阳极7段LED显示字型编码表显示字符0123456789共阴极段选码3F(B)06(36)5B(DB)4F(CF)66(F6)6D(FD)7D(FD)07(87)7F(FF)6F(EF)共阳极段选码C0(40)F9(79)A4(24)B0(30)99(19)92(12)82(02)F8(78)80(00)90(10)LED显示器有静态显示和动态显示两种方式。为了节省单片机的外部资源,采用动态显示技术。但是,本设计只需要采用一位数码管显示ASCII码,因此无须采用动态显示,因为P口有锁存器的功能,只要将待输出的七段码输出到接数码管的P口
19、即可无须重复扫描。数码管的显示会维持到下一个七段码输出改变为止。2.2 LED灯显示设计LED,即发光二极管,当它的两端正向导通时,电阻很小,有电流通过,当加反向电压时,电阻可以看成无穷大,无电流通过。因此它有普通二极管的功能,另外,它的另一个重要用途是将电信号变为光信号,通过光缆传输,然后再用光电二极管接收驱动一光电二极管。因此,发光二极管有电平指示作用。在本设计中,将LED灯的负极接到P口,也是为了防止一上电就导通。若将正极接到P口,一上电复位,P口输出即为高电平,LED导通,没有对信号的指示作用。因此,必须将负极接到P口,然后正极通过一个限流电阻接到5V电源。当P口输出高电平时(包括复位
20、的高电平),LED灯灭,当P口输出低电平时,LED灯亮,指示输出为低电平。单元电路设计3.1硬件设计本设计的总体电路原理图如附录1所示。3.1.1复位电路设计MCS-51单片机的复位是由外部的复位电路来实现的。复位引脚RST通过一个斯密特触发器与复位电路相连,斯密特触发器用来抑制噪声,在每个机器周期的S5P2,斯密特触发器的输出电平由复位电路采样一次,然后才能得到内部复位操作所需要的信号。上电复位:上电复位电路是种简单的复位电路,只要在RST复位引脚接一个电容到VCC,接一个电阻到地就可以了。上电复位是指在给系统上电时,复位电路通过电容加到RST复位引脚一个短暂的高电平信号,这个复位信号随着V
21、CC对电容的充电过程而回落,所以RST引脚复位的高电平维持时间取决于电容的充电时间。为了保证系统安全可靠的复位,RST引脚的高电平信号必须维持足够长的时间。电路图如图4所示。 图4 复位电咯3.1.2时钟电路时钟是单片机的心脏,单片机各功能部件的运行都是以时钟频率为基准,有条不紊的一拍一拍地工作。因此,时钟频率直接影响单片机的速度,时钟电路的质量也直接影响单片机系统的稳定性。常用的时钟电路有两种方式:一种是内部时钟方式,另一种为外部时钟方式。本文用的是内部时钟方式。电路图如图5所示。图5 时钟电路MCS-51单片机内部有一个用于构成振荡器的高增益反相放大器,该高增益反向放大器的输入端为芯片引脚
22、XTAL1,输出端为引脚XTAL2。这两个引脚跨接石英晶体振荡器和微调电容,就构成一个稳定的自激振荡器。3.1.3 显示电路设计本设计的显示电路包括两部分,即数码管显示部分和LED灯显示部分。 数码管显示电路如图6所示。图6 数码管显示电路采用P0口作为段码输出端口,由于只有一位数码管显示,位选端可以直接接地,一直处于选通状态。另外,P0有特殊的物理结构,即漏极开路电路,所以得在输出端接上拉电阻,通过上拉电阻接到5V电源,上拉电阻一般采用1K大小。数码管显示子程序比较简单,只要通过查表找到对应的七段码,输出到数码管,就可以显示出想要的符号或数字。如输入的数字为9,经过查找共阴极的七段码表找到D
23、is_Table9,即0x6f,将0x6f,即01101111B对应的dpgfedcba输出到P0口,即gfdcba六段为高电平,显示为亮,即显示数字9。LED灯显示电路如图所示。图7 LED灯显示电路LED灯显示由P1口来完成,由于是低电平输出有效,即灯灭才表示输出的是高电平,因此不符合习惯,需要对将要输出的段码进行取反运算。比如从键盘输入数字7,ASCII码为37,即00110111B,取反后,为11001000B,将此码输出到P1口,则P1.0、P1.1、P1.2和P1.4、P1.5亮,亮的位表示1,即显示的是37。3.1.4电平转换电路利用89C51单片机的串行口与PC机的串行口COM
24、1或COM2进行串行通信,将单片机采集的数据传送到PC机中,由PC机的高级语言或数据库语言对数据进行整理及统计等复杂处理;或者实现PC机对远程前沿单片机进行控制。在实现计算机与计算机、计算机与外设间的串行通信时,通常采用标准通信接口、这样就能很方便地把各种计算机、外部设备、测量仪器等有机地连接起来,进行串行通信。ELA RS-232C是目前最常用的串行接口标准,用于实现计算机与计算机之间、计算机与外设之间的数据通信。该标准的目的是定义数据终端设备(DTE)之间接口的电气特性。一般的串行通信系统是指微机和调制解调器(modem),如图7-20。调制解调器叫数据电路终端设备(简称DCE)。 RS-
25、232C提供了单片机与单片机、单片机与PC机间串行数据通信的标准接口。通信距离可达到 15 m。为了保证二进制数据能够正确传送,设备控制准确完成,有必要使所用的信号电平保持一致。为满足此要求,RS-232C标准规定了数据和控制信号的电压范围。由于RS-232C是在TTL集成电路之前研制的,所以它的电平不是+5V和地,而是采用负逻辑,规定+3V15V之间的任意电压表示逻辑0电平,-3V15V之间的任意电压表示逻辑1电平。本设计中采用MAX232芯片,电路如图8所示。图8 电路转换电路图此电路图中,从MAX232芯片中两路发送接收中任选择一路作为接口。应注意其发送、接收的引脚要对应。如果使T1 I
26、N接单片机的发送端TXD,也就是T0,则PC机的RS232的接收端RXD一定要对应接T1 OUT引脚。同时,R1 OUT接单片机的RXD引脚,PC机的RS232的发送端TXD对应妆R1 IN引脚。3.2软件设计本设计的程序流程图如图9所示。发送字符串1和2初始化四个P口由PC机显示字符串1平和字符串2,并准备接收数据接收PC机键盘输入的数据在P1口用LED显示接收到的字符的ASCII码用数码管显示数字字符接收到的字符为数字?发送字符到PC机,并由PC机显示发送换行字符接收到回车键开始 N Y图9 总的程序流程图本设计的主要程序部分是发送和接收数据,即发送和接收10位数据。在数据发送和接收时,关
27、键在于延时,延时的长短决定了波特率,即数据传送的速率。识别此数据传送完和是否开始传送的标志是起始位和停止位。因此在发送数据前要发送起始位0,然后再发送8位数据,最后发送1位停止位。接收时,是否是新的数据,即是否决定接收数据,得判定是否为起始位0,接收完后,再判定接收的是否为停止位1。单片机IO口模拟串口实现数据通信的源程序如附录2所示。4系统仿真本设计仿真图如附录3所示。附录3中图1为输入数字7时的显示情况。从图1可以看出,数码管显示7,LED灯为00110111B,即37H,也就是数字7的ASCII。附录3中图2为输入a时的显示情况。从图2可以看出,数码管不显示,LED灯为0110001B,
28、即61H,也就是a的ASCII。5收获与体会在学完单片机刚好一个学期以后,进行了这次课程设计,也是我第一次利用单片机进行系统地设计。基于单片机的多功能数字钟是比较普遍的一个课题,在参考了多个设计以后,我独立地完成了此设计,感觉收获颇丰。单片机是电子信息工程专业的一门非常重要的课程,它涉及到了现代工业的各个领域。此设计基本上运用到了单片机的主要资源,如P口的输出,数码管的静态显示技术。此外,虽然在很久以前就已经学完了C语言,但是学习单片机的过程中,用的是汇编语言,本次设计利用的是C语言,在对C语言比较生疏的情况下进行此次课程设计有助于复习C语言的基本知识。在做本设计的过程中,自己的编程能力得到了
29、很大地提高,也把设计与工程实践联系起来了。在设计完后,需要仿真系统,本设计中利用了protel画电路图,利用 KeilC编写并调试程序,然后利用proteus仿真。在此设计前,这三个软件只是掌握了一些基本操作,完全是了解的水平,proteus更是很陌生。完成此设计后,基本上掌握了运用这三个软件开发作品。设计完后,还可以利用protel把设计的作品PCB板画出来,并组装焊接。6参考文献1李朝青. 单片机原理及接口技术(第三版)M.北京:北京航空航天大学出版社,2005年2靳达.单片机应用系统开发实例导航M.北京:人民邮电出版社,2003年3谭浩强.C语言程序设计(第三版)M.北京:清华大学出版社
30、,2005年附录1 基于单片机的多功能数字钟电路原理图 附录2 基于单片机的多功能数字钟源代码#include #include #include typedef unsigned char uchar;typedef unsigned int uint;#define DISPLAY P0 #define LED P1 sbit TX = P34;sbit RX = P35;uchar code Dis_Table =0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07, 0x7F,0x6F,0x77,0x7C,0x39,0x5e,0x79,0x71; /0xed,
31、0x88,0xb5,0xb9,0xd8,0x79,0x7d,0xa8,0xfd,0xf9;uchar Buf=0;uchar temp;bit Flag=0;void DelayMs(uint t) uchar i; while(t-) for(i = 0; i 112; i+); void Uart_Delay() uchar t = 7;while(t-)_nop_(); void Intial() P1 = 0xFF; P2 = 0xFF; P0 = 0x00; P3 = 0xFF;void IOsend_char( unsigned char ch ) unsigned char h,
32、 da , temp; da = ch; TX = 0; Uart_Delay(); for( h = 0; h 8; h+ ) temp = da & 0x01; TX = temp; da = _cror_( da,1 ); Uart_Delay(); TX = 1; Uart_Delay(); void IOsend_string( unsigned char *str ) unsigned char k, l; l = strlen( str ); for( k = 0; k = l; k+ ) IOsend_char( *( str+k ) ); void IOrec_char(void)unsigned char h, da = 0; while( RX ) ; Uart_Delay(); Uart_Delay(); for( h = 0; h = 0x30 & Buf = 0x39)n = Buf & 0x0F;DISPLAY = Dis_Tablen;IOsend_char(Buf);DelayMs(1);DelayMs(1);if(Buf = 0x0D) IOsend_char(0x0A);DelayMs(1);DelayMs(1); 附录3 基于单片机的多功能数字钟系统仿真图图1 键盘输入7时的显示仿真图图2 键盘输入a时的显示仿真图- 20 - 20 -