at89c51双机串口通信课程设计.doc_第1页
at89c51双机串口通信课程设计.doc_第2页
at89c51双机串口通信课程设计.doc_第3页
at89c51双机串口通信课程设计.doc_第4页
at89c51双机串口通信课程设计.doc_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程设计题目 串口通信 二级学院 专 业 班 级 学生姓名 学号 指导教师 摘要本课程设计利用两片AT89C51实现双机串口通信;主机发送并显示 10 以下的随机数,从机显示该数的阶乘值,通过开关改变主机输出的数值。设计电路并编写一个串行口方式1收发程序,实现两片AT89C51之间的通信,甲机将数据发送到乙机并显示出来,同样,乙机也可将数据发送到甲机显示出来。目录一、概述21、串口通信的意义 22、本人所做的工作 23、系统主要功能 2二、硬件电路设计及描述21、方案选择及设计思想 22、原理框图,各功能单元之间的逻辑关系33、工作原理 34、原理电路图,各元器件之间的实际连接关系 75、元器件清单列表 8三、软件设计流程及描述81、系统模块层次结构图 82、程序流程图 93、源程序代码 11四、测试17五、总结18六、参考文献 18一、概述1、串口通信的意义计算机与外界的信息交换称为通信。通信的基本方式可分为并行通信和串行通信两种。所谓并行通信是指数据的各位同时在多根数据线上发送或接收。串行通信是数据的各位在同一根数据线上依次逐位发送或接收。串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。2、本人所做的工作在这次的课程设计中我主要负责从机接收数据及编写程序使LED正确显示出主机发送数据的阶乘数值,。3、系统主要功能本设计系统是实现两片AT89C51之间的通信,甲机将数据发送到乙机并显示出来,甲机随机发送09的数字,而乙机则显示该数字的阶乘值。二、硬件电路设计及描述1、方案选择及设计思想 一开始设计了两种结构,如下:Pc机单片机电平转换显示阶乘值 图1单片机(从机)单片机(主机)显示阶乘值显示发的数 图22、原理框图,各功能单元之间的逻辑关系发送数据主机把检测到的数据放到发送缓存区,同时通过P1口输出显示检测P2口输入的数据从机进入中段,接收数据并保存进入主程序,把接收到的数据处理后通过P2、P1口输出显示处理后的数据3、工作原理在串行通信中,数据是在两个站之间传送的。按照数据传送方向,串行通信可分为三种制式。1). 单工制式(Simplex)单工制式是指甲乙双方通信只能单向传送数据。单工制式如图1所示。2). 半双工制式(Half duplex) 半双工制式是指通信双方都具有发送器和接收器,双方既可发送也可接收,但接收和发送不能同时进行,即发送时就不能接收,接收时就不能发送。半双工制式如图2所示。3). 全双工制式(Full duplex) 全双工制式是指通信双方均设有发送器和接收器,并且将信道划分为发送信道和接收信道,两端数据允许同时收发,因此通信效率比前两种高。全双工制式如图3所示。AT89C51内部有一个可编程全双工串行通信接口。该部件不仅能同时进行数据的发送和接收,也可作为一个同步移位寄存器使用。下面将对其内部结构、工作方式以及波特率进行介绍。图4 AT89C51串行口结构框图 1). 串行数据缓冲器SBUF SBUF是串行口缓冲寄存器,包括发送寄存器和接收寄存器,以便能以全双工方式进行通信。此外,在接收寄存器之前还有移位寄存器,从而构成了串行接收的双缓冲结构,这样可以避免在数据接收过程中出现帧重叠错误。发送数据时,由于CPU是主动的,不会发生帧重叠错误,因此发送电路不需要双重缓冲结构。在逻辑上,SBUF只有一个,它既表示发送寄存器,又表示接收寄存器,具有同一个单元地址99H。但在物理结构上,则有两个完全独立的SBUF,一个是发送缓冲寄存器SBUF,另一个是接收缓冲寄存器SBUF。如果CPU写SBUF,数据就会被送入发送寄存器准备发送;如果CPU读SBUF,则读入的数据一定来自接收缓冲器。即CPU对SBUF的读写,实际上是分别访问上述两个不同的寄存器。2). 串行控制寄存器SCON 串行控制寄存器SCON用于设置串行口的工作方式、监视串行口的工作状态、控制发送与接收的状态等。它是一个既可以字节寻址又可以位寻址的8位特殊功能寄存器。3)SM0 SM1:串行口工作方式选择位。其状态组合所对应的工作方式如表所示。4)TI:发送中断标志位。TI=1,表示已结束一帧数据发送,可由软件查询TI位标志,也可以向CPU申请中断。注意:TI在任何工作方式下都必须由软件清0。SMOD:串行口波特率倍增位。在工作方式1工作方式3时,若SMOD=1,则串行口波特率增加一倍。若SMOD=0,波特率不加倍。系统复位时,SMOD=0。AT89C51串行通信共有4种工作方式,它们分别是方式0、方式1、方式2和方式3,由串行控制寄存器SCON中的SM0 SM1决定。本设计用串行口方式1收发程序,实现两片AT89C51之间的通信。串口通信方式11)方式1发送 方式1输出时,数据由TXD输出,一帧信息为10位,1位起始位0,8位数据位(先低位)和1位停止位1。当执行一条数据写发送缓冲器SBUF的指令,就启动发送。图中TX时钟的频率就是发送的波特率。发送开始时,内部发送控制信号变为有效。将起始位向TXD输出,此后,每经过一个TX时钟周期,便产生一个移位脉冲,并由TXD输出一个数据位。8位数据位全部发送完毕后,置“1” TI。2)方式1接收 数据从RXD(P3.0)脚输入。当检测到起始位的负跳变时,开始接收数据。定时控制信号有两种):接收移位时钟(RX时钟,频率和波特率相同)和位检测器采样脉冲(频率是RX时钟的16倍,1位数据期间,有16个采样脉冲),当采样到RXD端从1到0的跳变时就启动检测器,接收的值是3次连续采样(第7、8、9个脉冲时采样)进行表决以确认是否是真正的起始位(负跳变)的开始。当一帧数据接收完,须同时满足两个条件,接收才真正有效。 RI=0,即上一帧数据接收完成时,RI=1发出的中断请求已被响应,SBUF中的数据已被取走,说明“接收SBUF”已空。 SM2=0或收到的停止位=1(方式1时,停止位已进入RB8),则收到的数据装入SBUF和RB8(RB8装入停止位),且置“1”中断标志RI。若这两个条件不同时满足,收到的数据将丢失。波特率波特率(band rate)是异步通信中每秒钟传送的二进制数码的位数(比特数),单位是位/秒。 作用:1、反映串行通信的速率; 2、反映对传输通道的要求:波特率越高,要求的传输通道的频带宽度就越宽异步通信:波特率为每秒传送的字符数和每个字符位数的乘积。方式 1、3: 波特率=2SMOD(T1溢出率)/32对波特率需要说明的是,当串行口工作在方式1或方式3,且要求波特率按规范取1200、2400、4800、9600时,若采用晶振12MHz和6MHz,按上述公式算出的T1定时初值将不是一个整数,因此会产生波特率误差而影响串行通信的同步性能。解决的方法只有调整单片机的晶振频率fosc,为此有一种频率为11.0592MHz的晶振,这样可使计算出的T1初值为整数。表9-2列出了串行方式1或方式3在不同晶振时的常用波特率和误差。 用两块AT89C51模拟主机和从机,在主机的P2口低4位处设4个按键,并连上高电平,通过按键来给P2口输入09的随机数,在主机的程序里编写的程序主要实现检测P2口的数值,并通过LED显示出来,然后把这个数发出到从机去。在从机里,先通过中断程序取出接收到的数据,然后处理,通过P1来控制片选,P2口来扫描输出高低电平,让LED显示接收到的数的阶乘值。4、原理电路图,各元器件之间的实际连接关系图5 原理电路图5、元器件清单列表:单片机(AT89C51)两片 U1 U2按键开关6个 K1 K2 K3 K4 K5 K6电容6个 C1(20pf) C2(20pf) C3(22uf) C4(20pf) C5(22pf) C6(20pf)电阻两个(1K) R1 R21位的共阴LED数码管1个 2位的共阳LED数码管1个4位的共阳LED数码管1个12Mhz的晶振两个 X1 X2三、软件设计流程及描述1、系统模块层次结构图检测输入值发送:显示出该数送数据到发送缓存区发送数据 图6取数据接收:处理显示出该数的阶乘值 图72、程序流程图通过P1口输出显示YES检测P2口的值判断是否是09的数发送数据初始化发送程序: NO 图8初始化接收程序:进入中断,取出接收到的数据判断接收到的是不是09的数YES NO输出显示该数的阶乘值 图93、源程序代码发送程序:#include void csh()P2=0;SM0=0;SM1=1;/通信方式设为方式1/REN=1;TI=0;RI=0;PCON=0;TH1=0xFd;TL1=0XFd;TMOD=0X20;EA=1;ET1=0;ES=1;TR1=1;/初始化设置/void main()int i,j;char c=0;csh();while(1)ES=0;TI=0;c=P2;/检测P2口输入的数据/if(P2=0) P1=0x3f; if(P2=1) P1=6; if(P2=2) P1=0x5b; if(P2=3) P1=0x4f;if(P2=4) P1=0x66;if(P2=5) P1=0x6d;if(P2=6) P1=0x7d;if(P2=7) P1=7;if(P2=8) P1=0x7f;if(P2=9) P1=0x6f;/通过P1口输出并显示输入的数据/SBUF=c;/把检测到的数据放到发送缓存区发送/while(!TI);TI=0;ES=1;for(j=0;j30;j+)for(i=0;i5000;i+)/可以设置延时的长短来改变发送数据的快慢/;接收程序#include int c=0;void csh()P2=0xFF;SM0=0;SM1=1;/通信方式设为方式1 /REN=1;TI=0;/ 清串口发送中断标志 RI=0; PCON=0; /波特率不倍增TH1=0xFd; /*设定初值,波特率9600*/ TL1=0XFd;TMOD=0X20; /设置定时器1为工作方式2, 8-bit 自动装载方式 ET1=0; /禁止T1中断EA=1;ES=1; /*开串口中断*/TR1=1; /*启动定时器T1*/初始化设置/void delay1ms(int count) int i; int j; for(i=0;icount;i+) for(j=0;j120;j+); /定义一个延时函数/ void intrr() interrupt 4 char temp;temp=SBUF; c=temp;/进入中断取出接收到的数据/ RI=0; ES=1;void main() csh();while(1) if(c=1) P1=1; P2=0xF9; delay1ms(2); P1=2; P2=0x40; delay1ms(2); P1=4; P2=0x40; delay1ms(2); P1=8; P2=0x40; delay1ms(2); P1=0x10; P2=0x40; delay1ms(2); P1=0x20; P2=0x40; delay1ms(2); ;/显示000001/ if(c=2) P1=1; P2=0x24; delay1ms(2); P1=2; P2=0x40; delay1ms(2); P1=4; P2=0x40; delay1ms(2); P1=8; P2=0x40; delay1ms(2); P1=0x10; P2=0x40; delay1ms(2); P1=0x20; P2=0x40; delay1ms(2); ;/显示000002/ if(c=3) P1=1; P2=2; delay1ms(2); P1=2; P2=0x40; delay1ms(2); P1=4; P2=0x40; delay1ms(2); P1=8; P2=0x40; delay1ms(2); P1=0x10; P2=0x40; delay1ms(2); P1=0x20; P2=0x40; delay1ms(2); ;/显示000006/ if(c=4) P1=1; P2=0x19; delay1ms(2); P1=2; P2=0x24; delay1ms(2); P1=4; P2=0x40; delay1ms(2); P1=8; P2=0x40; delay1ms(2); P1=0x10; P2=0x40; delay1ms(2); P1=0x20; P2=0x40; delay1ms(2); ;/显示000024/ if(c=5) P1=1; P2=0x40; delay1ms(2); P1=2; P2=0x24; delay1ms(2); P1=4; P2=0xF9; delay1ms(2); P1=8; P2=0x40; delay1ms(2); P1=0x10; P2=0x40; delay1ms(2); P1=0x20; P2=0x40; delay1ms(1); ;/显示000120/ if(c=6) P1=1; P2=0x40; delay1ms(2); P1=2; P2=0x24; delay1ms(2); P1=4; P2=0x78; delay1ms(2); P1=8; P2=0x40; delay1ms(2); P1=0x10; P2=0x40; delay1ms(2); P1=0x20; P2=0x40; delay1ms(2); ;/显示000720/ if(c=7) P1=1; P2=0x40; delay1ms(2); P1=2; P2=0x19; delay1ms(2); P1=4; P2=0x40; delay1ms(2); P1=8; P2=0x12; delay1ms(2); P1=0x10; P2=0x40; delay1ms(2); P1=0x20; P2=0x40; delay1ms(2); ;/显示005040/ if(c=8) P1=1; P2=0x40; delay1ms(2); P1=2; P2=0x24; delay1ms(2); P1=4; P2=0x30; delay1ms(2); P1=8; P2=0x40; delay1ms(2); P1=0x10; P2=0x19; delay1ms(2); P1=0x20; P2=0x40; delay1ms(2); ;/显示40320/ if(c=9) P1=1; P2=0x40; delay1ms(3); P1=2; P2=0; delay1ms(3); P1=4; P2=0; delay1ms(3); P1=8; P2=0x24; delay1ms(3); P1=0x10; P2=2; delay1ms(3); P1=0x20; P2=0x30; delay1ms(2); ;/显示362880/ ;/对接收到的数据处理,通过P1、P2口控制输出显示该数的阶乘/四、测试1、实验电路如上图所示,通信双方都是AT89C51单片机,将其中一方的TXD与另一方的RXD相连,RXD与另一方的TXD相连。2、由于串行口的输出是TTL电平,因此这种连接方式只适用于短距离通信,若要增加通信距离,可采用RS232或其他接口,甚至加接调制解调器。3、本例采用的波特率为1.2kb/s,fosc=6MHZ。4、发送数据时,只要将数据写入SBUF即可将待发送的数据按事先设置好的方式和波特率从TXD端串行输出。接收数据时要先使REN=1,当一帧数据从RXD

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论