串口通信论文.docx
《串口通信论文.docx》由会员分享,可在线阅读,更多相关《串口通信论文.docx(24页珍藏版)》请在冰豆网上搜索。
串口通信论文
第一章单片机介绍
单片微型计算机简称单片机,是典型的嵌入式微控制器(MicrocontrollerUnit),常用英文字母的缩写MCU表示单片机,它最早是被用在工业控制领域。
单片机由芯片内仅有CPU的专用处理器发展而来。
最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对体积要求严格的控制设备当中。
INTEL的Z80是最早按照这种思想设计出的处理器,从此以后,单片机和专用处理器的发展便分道扬镳。
早期的单片机都是8位或4位的。
其中最成功的是INTEL的8031,因为简单可靠而性能不错获得了很大的好评。
此后在8031上发展出了MCS51系列单片机系统。
基于这一系统的单片机系统直到现在还在广泛使用。
随着工业控制领域要求的提高,开始出现了16位单片机,但因为性价比不理想并未得到很广泛的应用。
90年代后随着消费电子产品大发展,单片机技术得到了巨大提高。
随着INTELi960系列特别是后来的ARM系列的广泛应用,32位单片机迅速取代16位单片机的高端地位,并且进入主流市场。
而传统的8位单片机的性能也得到了飞速提高,处理能力比起80年代提高了数百倍。
目前,高端的32位单片机主频已经超过300MHz,性能直追90年代中期的专用处理器,而普通的型号出厂价格跌落至1美元,最高端[1]的型号也只有10美元。
当代单片机系统已经不再只在裸机环境下开发和使用,大量专用的嵌入式操作系统被广泛应用在全系列的单片机上。
而在作为掌上电脑和手机核心处理的高端单片机甚至可以直接使用专用的Windows和Linux操作系统。
单片机比专用处理器更适合应用于嵌入式系统,因此它得到了最多的应用。
事实上单片机是世界上数量最多的计算机。
现代人类生活中所用的几乎每件电子和机械产品中都会集成有单片机。
手机、电话、计算器、家用电器、电子玩具、掌上电脑以及鼠标等电脑配件中都配有1-2部单片机。
而个人电脑中也会有为数不少的单片机在工作。
汽车上一般配备40多部单片机,复杂的工业控制系统上甚至可能有数百台单片机在同时工作!
单片机的数量不仅远超过PC机和其他计算的总和,甚至比人类的数量还要多。
单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。
相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。
概括的讲:
一块芯片就成了一台计算机。
它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。
同时,学习使用单片机是了解计算机原理与结构的最佳选择。
它是一种在线式实时控制计算机,在线式就是现场控制,需要的是有较强的抗干扰能力,较低的成本,这也是和离线式计算机的(比如家用PC)的主要区别。
单片机是靠程序运行的,并且可以修改。
通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,这是别的器件需要费很大力气才能做到的,有些则是花大力气也很难做到的。
一个不是很复杂的功能要是用美国50年代开发的74系列,或者60年代的CD4000系列这些纯硬件来搞定的话,电路一定是一块大PCB板!
但是如果要是用美国70年代成功投放市场的系列单片机,结果就会有天壤之别!
只因为单片机的通过你编写的程序可以实现高智能,高效率,以及高可靠性!
由于单片机对成本是敏感的,所以目前占统治地位的软件还是最低级汇编语言,它是除了二进制机器码以上最低级的语言了,既然这么低级为什么还要用呢?
很多高级的语言已经达到了可视化编程的水平为什么不用呢?
原因很简单,就是单片机没有家用计算机那样的CPU,也没有像硬盘那样的海量存储设备。
一个可视化高级语言编写的小程序里面即使只有一个按钮,也会达到几十K的尺寸!
对于家用PC的硬盘来讲没什么,可是对于单片机来讲是不能接受的。
单片机在硬件资源方面的利用率必须很高才行,所以汇编虽然原始却还是在大量使用。
一样的道理,如果把巨型计算机上的操作系统和应用软件拿到家用PC上来运行,家用PC的也是承受不了的。
可以说,二十世纪跨越了三个“电”的时代,即电气时代、电子时代和现已进入的电脑时代。
不过,这种电脑,通常是指个人计算机,简称PC机。
它由主机、键盘、显示器等组成。
还有一类计算机,大多数人却不怎么熟悉。
这种计算机就是把智能赋予各种机械的单片机(亦称微控制器)。
顾名思义,这种计算机的最小系统只用了一片集成电路,即可进行简单运算和控制。
因为它体积小,通常都藏在被控机械的“肚子”里。
它在整个装置中,起着有如人类头脑的作用,它出了毛病,整个装置就瘫痪了。
现在,这种单片机的使用领域已十分广泛,如智能仪表、实时工控、通讯设备、导航系统、家用电器等。
各种产品一旦用上了单片机,就能起到使产品升级换代的功效,常在产品名称前冠以形容词——“智能型”,如智能型洗衣机等。
现在有些工厂的技术人员或其它业余电子开发者搞出来的某些产品,不是电路太复杂,就是功能太简单且极易被仿制。
究其原因,可能就卡在产品未使用单片机或其它可编程逻辑器件上。
第二章单片机串行口结构
第一节串行口的结构
8051串行接口是一个可编程的全双工串行通讯接口。
它可用作异步通讯方式(UART),与串行传送信息的外部设备相连接,或用于通过标准异步通讯协议进行全双工的8051多机系统也可以通过同步方式,使用TTL或CMOS移位寄存器来扩充I/O口。
8051单片机通过引脚RXD(P3.0,串行数据接收端)和引脚TXD(P3.1,串行数据发送端)与外界通讯。
SBUF是串行口缓冲寄存器,包括发送寄存器和接收寄存器。
它们有相同名字和地址空间,但不会出现冲突,因为它们两个一个只能被CPU读出数据,一个只能被CPU写入数据,可对SBUF直接进行读/写。
8051单片机的串行口主要由两部分组成:
一部分是由T1及其内部的一些控制开关和分频器组成的波特率发生器,提供串行口发送和接收数据时所需的时钟信号;另一部分是如图1-1所示的内部结构。
(一).串行数据缓冲器SBUF
SBUF实际上市两个物理上独立的发送缓冲器和接收器,可同时发送、接收
数据,实现全双工串行通信,两个缓冲器共用一个特殊功能寄存器字节地址99H。
串行发送时,从内部总线向发送缓冲器SBUF写入数据,串行接收时,从接收缓冲器SBUF中读出数据。
(二).串行口控制逻辑
接受来自波特率发生器的时钟信号。
控制内部的输入移位寄存器,将外部的串行数据转换成并行数据送入接收缓冲器SBUF,并控制产生接收结束标志RI。
控制内部的输出移位寄存器,将发送缓冲器SBUF中的并行数据转换成串行数据输出,并控制产生发送结束标志TI。
(三).控制寄存器
控制8051单片机串行口的控制寄存器主要是串行口控制寄存器SCON,另外
还有一个电源管理寄存器PCON。
第二节串行口控制寄存器SCON及串行口的工作方式
(一).SCON用于定义串行口的工作方式及实施接收和发送控制。
字节地址为98H,其各位定义如下表:
D7
D6
D5
D4
D3
D2
D1
D0
SM0
SM1
SM2
REN
TB8
RB8
TI
RI
SM0、SM1:
串行口工作方式选择位,其定义如下:
SM0、SM1
工作方式
功能描述
波特率
00
方式0
8位移位寄存器
Fosc/12
01
方式1
10位UART
可变
10
方式2
11位UART
Fosc/64或fosc/32
11
方式3
11位UART
可变
其中fosc为晶体震荡器频率
SM2:
多机通讯控制位。
在方式0时,SM2一定要等于0。
在方式1中,当(SM2)=1则只有接收到有效停止位时,RI才置1。
在方式2或方式3当(SM2)=1且接收到的第九位数据RB8=0时,RI才置1。
REN:
接收允许控制位。
由软件置位以允许接收,又由软件清0来禁止接收。
TB8:
在方式2或方式3中,要发送的第9位数据位,根据需要由软件置1或清0。
例如,可约定作为奇偶校验位,或在多机通讯中作为区别地址帧或数据帧的标志位。
RB8:
接收到的数据的第9位。
在方式0中不使用RB8。
在方式1中,若(SM2)=0,RB8为接收到的停止位。
在方式2或方式3中,RB8为接收到的第9位数据。
TI:
发送中断标志。
在方式0中,第8位发送结束时,由硬件置位。
在其它方式的发送停止位前,由硬件置位。
TI置位既表示一帧信息发送结束,同时也是申请中断,可根据需要,用软件查询的方法获得数据已发送完毕的信息,或用中断的方式来发送下一个数据。
TI必须用软件清0(如CLRTI)。
RI:
接收中断标志位。
在方式0,当接收完第8位数据后,由硬件置位。
在其它方式中,在接收到停止位的中间时刻由硬件置位(例外情况见于SM2的说明)。
RI置位表示一帧数据接收完毕,可用查询的方法获知或者用中断的方法获知。
RI也必须用软件清0(如CLRRI)。
(二).8051单片机的全双工串行口可编程为4种工作方式,现分述如下:
方式0为移位寄存器输入/输出方式。
可外接移位寄存器以扩展I/O口,也可以外接同步输入/输出设备。
8位串行数据者是从RXD输入或输出,TXD用来输出同步脉冲。
输出串行数据从RXD引脚输出,TXD引脚输出移位脉冲。
CPU将数据写入发送寄存器时,立即启动发送,将8位数据以fos/12的固定波特率从RXD输出,低位在前,高位在后。
发送完一帧数据后,发送中断标志TI由硬件置位。
输入当串行口以方式0接收时,先置位允许接收控制位REN。
此时,RXD为串行数据输入端,TXD仍为同步脉冲移位输出端。
当(RI)=0和(REN)=1同时满足时,开始接收。
当接收到第8位数据时,将数据移入接收寄存器,并由硬件置位RI。
方式1为波特率可变的8位异步通信接口方式。
TXD和RXD分别用于串行发送和接收数据。
方式1发送:
发送过程中,当CPU执行一条写入发送缓冲器SBUF的指令时,就启动发送。
发送开始时,内部发送信号SEND变为有效(低电平),将起始位向TXD输出,此后,每经过一个TX时钟周期,便产生一个移位脉冲,TXD引脚就输出一位数据。
8位数据全部发送完毕,发送结束标志位TIL置1,然后SEND信号失效。
方式1接收:
当检测到RXD引脚上有1到0的跳变时开始接收过程。
方式2和方式3:
方式2和方式3均为9位异步通信接口方式,他们的工作原理相似,一的区别就是方式2波特率固定,方式3波特率是可变的。
方式2和方式3的发送和接收过程与方式1类似。
所不同的是,发送时,要先根据通信协议有软件设置待发送的第九位数据TB8,然后将要发送的8位数据写入发送缓存器SBUF启动发送。
接收时,装入RB8中的是第九位数据,而不是停止位。
第三节波特率的定义与运算
所谓波特率,就是指串行口每秒钟发送或接收数据的位数,单位为bps。
设发送以为所需要的时间为T,则波特率为1/T。
在串行通讯中,收发双方的数据传送率(波特率)要有一定的约定。
在8051串行口的四种工作方式中,方式0和2的波特率是固定的,而方式1和3的波特率是可变的,由定时器T1的溢出率控制。
方式0
方式0的波特率固定为主振频率的1/12。
方式2
方式2的波特率由PCON中的选择位SMOD来决定,可由下式表示:
波特率=2的SMOD次方除以64再乘一个fosc,也就是当SMOD=1时,波特率为1/32fosc,当SMOD=0时,波特率为1/64fosc
方式1和方式3
定时器T1作为波特率发生器,其公式如下:
波特率=
定时器T1溢出率
T1溢出率=T1计数率/产生溢出所需的周期数
式中T1计数率取决于它工作在定时器状态还是计数器状态。
当工作于定时器状态时,T1计数率为fosc/12;当工作于计数器状态时,T1计数率为外部输入频率,此频率应小于fosc/24。
产生溢出所需周期与定时器T1的工作方式、T1的预置值有关。
定时器T1工作于方式0:
溢出所需周期数=8192-x
定时器T1工作于方式1:
溢出所需周期数=65536-x
定时器T1工作于方式2:
溢出所需周期数=256-x
因为方式2为自动重装入初值的8位定时器/计数器模式,所以用它来做波特率发生器最恰当。
当时钟频率选用11.0592MHZ时,易获得标准的波特率,所以很多单片机系统选用这个看起来“怪”的晶振就是这个道理。
下表列出了定时器T1工作于方式2常用波特率及初值。
常用波特率Fosc(MHZ)SMODTH1初值
19200 11.0592 1 FDH
9600 11.0592 0 FDH
4800 11.0592 0 FAH
2400 11.0592 0 F4H
1200 11.0592 0 E8H
例如960011.05920FDH
波特率=
定时器T1溢出率
T1溢出率=T1计数率/产生溢出所需的周期数
产生溢出所需的周期数=256-FD(253)=3
SMOD=011059200/12*3*1/32=9600
第三章单片机串口通信原理图模块
第一节单片机最小系统原理图
图2—1是单片机最小系统时钟电路,它是由一个晶振和两个微调电容组成的并联谐振回路,晶振可以在1.2MHz到12MHz之间选择,两个电容值在5-30pF之间选择,电容的大小可起到频率微调的作用。
复位电路采用手动电平方式复位。
电平复位是通过RST端经电阻与电源VCC接通来实现的。
图2—1单片机最小系统原理图
第二节扩展电路
图2—2PB口扩展电路图
图2—2和图2—3是扩展输出口PA和扩展输出口PB,它们是通过74HC573来实现的。
当74HC573的锁存使能端为高时,锁存对于数据是输出同步的;当锁存使能端变低时,符合建立时间和保持时间的数据会被锁存。
图2—3PA口扩展电路图
X=不用关心;Z=高阻态
图2—4扩展输入口PD
图2—4是扩展输入口PD,它是由74HC245来实现的。
第1脚DIR,为输入输出端口转换用,DIR=“1”高电平时信号由“A”端输入“B”端输出,DIR=“0”低电平时信号由“B”端输入“A”端输出。
第2~9脚“A”信号输入输出端,A1=B1、、、、、、A8=B8,A1与B1是一组,如果DIR=“1”OE=“0”则A1输入B1输出,其它类同。
如果DIR=“0”OE=“0”则B1输入A1输出,其它类同。
第11~18脚“B”信号输入输出端,功能与“A”端一样。
第19脚OE,使能端,若该脚为“1”A/B端的信号将不导通,只有为“0”时A/B端才被启用,该脚也就是起到开关的作用。
TRUTHTABLE真值表:
ControlInputs控制输入
Operation运行
G
DIR
L
L
B数据到A总线
L
H
A数据到B总线
H
X
隔开
H=高电平L=低电平×=不定
第三节位选译码器
图2—5是位选译码器,它是由74HC138来实现的,用来实现数码管的位选。
74HC138译码器可接受3位二进制加权地址输入(A0,A1和A2),并当使能时,提供8个互斥的低有效输出(Y0至Y7)。
74HC138特有3个使能输入端:
两个低有效(E2和E3)和一个高有效(E1)。
除非E2和E3置低且E1置高,否则74HC138将保持所有输出为高。
图2—574HC138
输入()
输出
C
B
A
Y0
Y1
Y2
Y3
Y4
Y5
Y6
Y7
L
L
L
L
H
H
H
H
H
H
H
L
L
H
H
L
H
H
H
H
H
H
L
H
L
H
H
L
H
H
H
H
H
L
H
H
H
H
H
L
H
H
H
H
H
L
L
H
H
H
H
L
H
H
H
H
L
H
H
H
H
H
H
L
H
H
H
H
L
H
H
H
H
H
H
L
H
H
H
H
H
H
H
H
H
H
H
L
真值表
第四节8位动态数码管
8位数码管是用来显示接收数据和发送数据的,如图2—6所示:
图2—68位动态数码管
第五节RS232电路
图2—7RS232电路图
图2—7是RS232电路图,MAX232芯片是专门为电脑的RS-232标准串口设计的单电源电平转换芯片,使用+5v单电源供电。
第一部分是电荷泵电路。
由1、2、3、4、5、6脚和4只电容构成。
功能是产生+12v和-12v两个电源,提供给RS-232串口电平的需要。
第二部分是数据转换通道。
由7、8、9、10、11、12、13、14脚构成两个数据通道。
其中13脚(R1IN)、12脚(R1OUT)、11脚(T1IN)、14脚(T1OUT)为第一数据通道。
8脚(R2IN)、9脚(R2OUT)、10脚(T2IN)、7脚(T2OUT)为第二数据通道。
TTL/CMOS数据从T1IN、T2IN输入转换成RS-232数据从T1OUT、T2OUT送到电脑DB9插头;DB9插头的RS-232数据从R1IN、R2IN输入转换成TTL/CMOS数据后从R1OUT、R2OUT输出。
第三部分是供电。
15脚GND、16脚VCC(+5v)。
第六节2X8键盘
串口通信发送数据是通过键盘来实现的,如图2—8所示:
图2—82X8键盘
结束语
经过两个星期的设计与制作,串口通讯课程设计基本完成。
51系列单片机的串口有4个模式,可分别用作串并转换、并串转换、异步串行通信(2种模式)。
异步串行通信中,有1+8+1和1+8+1+1两种帧格式,多机通信是特殊的通信方式,基本原理是两组移位寄存器。
将并行通信转换成串行通信模式(发送部分),或反之(接收部分),可全双工运行。
速度通过移位脉冲决定,具体一般通过定时器1的自动装载模式产生的溢出脉冲给出。
电平上采用的是CMOS逻辑。
以上是物理层和数据链路层的单片机串口模块的约定,其他层需要软件人员根据需要自行把握。
另外,电平需要根据实际通信环境做变换。
相信串口通信是学习单片机的一个必不可少的基础,通过本次课程设计,我们对知识的理解有原先的理论学习上升到了实际应用,尽管在硬件焊板上我们出现了很大的错误,从而导致电路板被焊坏,但是我们也曾经努力想法弥补。
对于不足与漏洞我们会积极弥补与纠正,对于长处与优点我们会努力总结与发扬。
由于我们的硬件设施没能成功所以我们在软件仿真上下了很大的力气。
经过全组成员的讨论编写共同努力下,程序终于编写成功并且仿真效果良好。
通过本次课程设计我们学到了很多东西,受益匪浅,我感觉理论到实际是一个艰难的过程,必须勤动手,才能发现问题,是自己得到真正的提高。
经过这次的课程设计我学到了很多知识,给我以后学习工作提供了不少宝贵经验。
并且通过这次做课程设计也使我发现了很多学习上的不足,主要是动手能力不足,做板做坏也是一个例证,我会在以后的工作学习中努力自我完善。
但在本次课程设计中最重要的收获并不是掌握一些关于本次设计的基础知识,而是学会一种思维方法,以及与同学们之间互相帮助的精神。
致谢
这次的课程设计基本达到我们预期的想法,除了硬件焊接出现了部分问题。
在实际过程中,老师给予我们很多帮助,尤其是刘青正老师,在我们设计过程中,刘老师给了我们很多积极地引导,对我们在实际操作过程中出现的错误,及时提醒我们改正,也感谢刘老师给我们提供这次锻炼的机会。
同时也感谢广西工学院图书馆提供各方面资料。
参考文献
[1]夏路易等.电路原理图与电路板设计教Protel99SE.北京:
北京希望电子出版社,2002.6
[2]朱定华.Protel99SE原理图和印制板设计.北京:
清华大学出版社,2008.5
[3]杨欣.电路设计与仿真—基于Multisim8与Protel2004.北京:
清华大学出版社.2006.4
[4]陈忠平.单片机原理及接口(第2版).北京:
清华大学出版社,2011.5
[5]赵建领.零基础学单片机C语言程序设计.北京:
机械工业出版社,2009.4
附录
程序流程图
程序如下:
#include
sbitCE=P2^4;//74HC245开关
sbitPAE=P2^7;//PA口使能
sbitPBE=P2^6;//PB口使能
unsignedintsend;//发送数
unsignedintrec;//接收数
unsignedcharselect[]={0xef,0xdf};//列扫描代码
unsignedcharcom[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};//数码管位选代码
unsignedcharshuma[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,
0xe0,0xfe,0xf6};//数码管显示代码
/**********延时程序*****************/
voiddelay(unsignedlongintcount)
{
while(count--);
}
/*****串口中断初始化*******/
voidUART_Int(void)
{
SCON=0X40;//选择串口工作方式1
TMOD=0X20;//选择定时器1,工作方式2
TH1=0XFD;//波特率为9600b/s、晶振频率为11.0592MHz时,定时器初值为FDH
TL1=0XFD;
EA=1;//开总中断开关
ES=1;//开串口中断开关
TR1=1;//开定时器1中断开关
REN=1;//允许接收
}
/*****串口发送ASCII数据*************/
voidUART_send(unsignedintDATA){
SBUF=DATA;
while(!
TI);
TI=0;
delay(3500);
}
/**********发送十进制数据*********/
voidsend_shu(unsignedintshu)
{
if(shu>=10)
{
UART_send(0x30+shu/10);
UART_send(0x30+shu%10);
}
elseUART_send(0x30+shu);
}
/***********显示发送的数据************/
voidshuma_send(unsignedintsender)
{
unsignedintqian;
unsignedintbai;
unsignedintshi;
unsignedintge;
qian=sender/1000;
bai=(sender%1000)/100;
shi=(sender%100)/10;
ge=sender%10;
PAE=1;//显示个位数字
P0=com[7];
PAE=0;
PBE=1;
P0=shuma[ge];
PBE=0;
delay(50);
PAE=1;//显示十位数字
P0=com[6];
PAE=0;
PBE=1;
P0