您的当前位置:首页正文

单片机串口通信设计方案

2024-04-13 来源:易榕旅网


单片机串口通信设计方案

1.绪论

1.1课题背景及意义

目前,单片机的发展速度大约每两、三年要更新一代,集成度增加一倍,功能翻一番。其发展速度之快、应用范围之广已达到了惊人的地步,它已渗透到生产和生活的各个领域,应用非常广泛。在汽车、通信、智能仪表、家用电器和军事设备的智能化以及实时过程控制等方面,单片机都扮演着非常重要的角色[1]。因此单片机的设计开发具有广阔的前景。所以,对于电气类学生而言,学习一种单片机的开发是十分必要的。而51系列的单片机,随着半导体技术的发展,其处理速度更快,性能更优越,在工业控制领域上占据十分重要的地位,通过对51系列单片机的学习而掌握单片机开发的过程是一种不错的选择。

然而单片机是一门综合性、实践性都很强的学科,其学习涉及的实验环节比较多,硬件设备投入比较大,对于大多数人而言很难投入大笔资金去购买实验器件。而且要进行硬件电路测试和调试,必须在电路板制作完成、元器件焊接完毕之后进行,但这些工作费时费力。因此引入EDA软件仿真系统建立虚拟实验平台,不仅可以大大提高单片机的学习效率,而且大大减少硬件设备的资金投入,同时降低对硬件设备的维护工作。

EDA设计思路是:从元器件的选取到连接、直至电路的调试、分析和软件的编译,都是在计算机中完成,所用的工作都是虚拟的。虽然现在的电路设计软件已经很多,诸如PROTEL、ORCAD、EWB 、Multisim等,不过这些软件之间的差别都不大:都有原理图和PCB制作功能,都能进行诸如频率响应,噪音分析等电路分析,主要用于模拟电路、数字电路、模数混合电路的性能仿真与分析,但对于单片机设计及软件编程,最重要的是两者的联调,这些软件都无法实现,所以造成了单片机系统设计周期长、设计费用高等缺点[2]。新款的EDA软件Proteus解决了上述软件的不足,成为目前最好的一款单片机学习仿真软件。

Proteus 软件是由英国Lab Center Electronics 公司开发的EDA 工具软件。Proteus软件已有近20年的历史,在全球已得到相当广泛的使用。Proteus 软件集成了高级原理布图、混合模式SPICE 电路仿真、PCB 设计以及自动布线来实现一个完整的电子设计系统。Proteus与其它单片机仿真软件不同的是,它不仅能仿真单片机 CPU的工作情况,也能仿真单片机外围电路或没有单片机参与的其它电路的工作情况。因此在仿真和程序调试时,关心的不再是某些语句执行时单片机寄存器和存储器内容的改变,而是从工程的角度直接看程序运行和电路工作的过程和结果。同时,当硬件调试成功后,利用Proteus ARES软件,很容易获得其PCB图,为今后的系统制造提供了方便。对于这样的仿真实验,从某种意义上讲,是弥补了实验和工程应用间脱节的矛盾和现象[3][4]。

1

Proteus 软件支持许多通用的微控制器,如PCI系列、AVR系列、HC11系列、68000系列、Z80系列、8051系列以及各种外围芯片;包含强大的调试工具,具有对寄存器和存储器,断点和单步模式IAR、C-SPY、Keil、MALAB等开发工具的源程序进行调试的功能;能够观察代码在仿真硬件上的实时运行效果、对显示、按钮、键盘等外设的交互可视化进行仿真;具有6000 多种模拟和数字器件的模型库;具有单步断点设置等调试功能;能够与常用的汇编器、编译器如IAR、Keil、Proton 等协同调试;有直流电流表/电压表、交流电压表/电流表、示波器逻辑分析仪、计数/按时/频率计虚拟终端、SPI 调试器等虚拟仪器,以仿真中的测量记录提供了方便;支持图形化的分析功能,具有频率特性、傅立叶、失真、噪声分析等多种绘图方式、可将仿真曲线精美地绘制出来[3]。

Keil是Keil Software公司开发的,是目前世界上最好的51单片机开发工具之一。 软件本身支持数百种51系列单片机机芯,可以用来编译C源码、汇编程序、连接和重定位目标文件和库文件、创建HEX文件、调试目标程序等,是一种集成化文件管理编译环境。它集成了文件编译处理、编译连接、项目管理,窗口、工具引用和软件仿真调试等多种功能,是相当强大的的开发工具[5]。Proteus ISIS与Keil整合起来使用,充分利用各自的仿真功能,单片机的软硬件的调试和仿真,将变得非常直观和生动。

国内外的很多知名大学已经开始使Proteus作为他们的教学工具,比如Stanford University,University Of California,Cambridge University,Carlisle college,香港理工大学,中山大学,华南理工大学,哈尔滨工程大学等几十所高校。他们一致认为该软件在教学中的应用有很大的帮助,其灵活自主的设计方式使学生更能体验到电子设计的魅力,学生对单片机以及电子设计的兴趣大大提升,知识的掌握和应用当然也有了很大的提高。

虽然Proteus在单片机的学习和应用系统的开发上有着诸多的优点,但是在国内的发展才几年的时间,其应用还未普及。因此,通过Proteus仿真平台学习51系列单片机之间的串口通信,是对EDA软件Proteus的使用过程的学习,也为以后利用该软件进行电子设计与开发打下一定的基础,以跟上现代科技的快车去适应激烈竞争的环境。

串行通信是CPU与外界交换信息的一种基本方式,单片机应用于数据采集或工业控制时,往往作为前端机安装在工业现场,远离主机,现场数据采用串行通信方式发送给主机并进行处理,以降低成本,提高通信的可靠性。51系列单片机自身有全双工的异步串行通信接口,实现串行通信极为方便。既可通过一台计算机来控制和监视多台单片机系统,也可实现多台单片机之间的互联,组成不同的控制系统,适应不同的应用场合[6]。实现单片机之间的串口通信所涉及单片机的知识点多,概括了单片机的定时器/计数器功能、中断功能和串行通信功能等,是单片机功能的综合应用。通过Proteus对单片机串行通信的仿真和调试,不仅是对51单片机知识的综合学习,也是熟悉Proteus软件的应用过程。

2

1.2设计的主要任务

本论文要求在理解串行通信基本知识、学习并掌握51单片机的结构组成、指令系统、C语言程序设计、熟悉Keil软件的编程与调试环境以及掌握Proteus仿真软件的使用环境、元器件调用、虚拟仪器应用、原理图设计、仿真调试的基础上,完成以下4项任务:

1、总结单片机串口通信的基本知识和设计要求,对单片机串口通信的各种控制 方案进行比较,选择一个合适的控制方案;

2、根据课题的设计要求,在Proteus仿真环境中设计单片机串口通信硬件电路; 3、在Keil环境中编制串口通信控制程序,并进行编译调试;

4、在Proteus仿真环境中调用硬件电路,加载控制程序,并进仿真调试。

1.3论文的主要内容

在本论文中,设计的主要内容有五个方面:一是串行通信控制系统方案的选择;二是系统硬件电路的设计;三是系统软件设计;四是系统软件设计;五是系统仿真与调试;六是系统硬件PCB设计。具体章节安排如下:

1、绪论 在课题的背景及意义中介绍单片机发展现状、单片机EDA软件Proteus的优势、Keil集成开发环境软件简介以及单片机通信的描述;此外,还简单的说明介绍了本文设计的主要任务以及论文的主要内容。

2、系统方案设计 主要论述通信的基本知识和系统的方案选择。系统的方案选择主要包括控制器的选择、串行通信方式比较与方案选择、显示方案比较与选择、编写程序语言比较和选择、串行控制方案确定以及系统框图绘制。

3、系统硬件设计 根据控制系统方案在Proteus ISIS原理图编辑环境中绘制系统硬件电路,主要包括原理图文件的创建、图纸大小的设置、原理图中元器件的选取、元器件的放置、电源、地、和输入输出终端的放置、原理图连线、器件统一编号、电气检测以及元器件属性设置等内容。

4、系统软件设计 主要介绍了在Keil集成开发环境中进行C51语言的编写过程、控制系统程序的编写以及程序流程图绘制。

5、系统仿真与调试 完成控制系统在Proteus ISIS环境中的仿真与调试,主要是根据仿真结果验证硬件原理图以及软件编写的是否正确。

6、系统硬件PCB设计 完成串行通信单片机最小系统原理图设计与PCB绘制。 通过以上六个方面的阐述说明,将会对单片机串行通信控制系统基于Proteus

的设计、开发与仿真过程以及电路板制作有一个清晰全面的认识。

3

2.系统方案设计

本文的题目是“基于Proteus的51单片机应用——单片机串行通信设计”,主

要是通过单片机串行通信控制系统的设计,来阐述和实践51单片机的应用在Proteus虚拟实验平台的仿真和调试过程。由于题目没有给出具体的系统功能要求,因此有很大的设计空间。为了很好地在Proteus虚拟实验平台上展示51单片机串行通信的结果,需要自行设计方案。

2.1通信概述及串行通信方式选择

单片机串行通信在本系统设计中十分重要,是设计的核心部分,为此需要在此对通信部分做一些介绍。

2.1.1通信的基本概念

通信是计算机系统中主机与外设之间及主机系统与主机系统之间的数据交换。通信有并行通信和串行通信两种基本方式。两种基本通信方式如图2.1所示。

图2.1 并行通信与串行通信

并行通信的特点就是将多个数据位同时进行传输。通信速度快,但传输的数据有多少位,就相应地有多少根传输线,传输信号线多,传输距离较远时线路复杂,成本高,较适合于短距离的数据通信。

串行通信的特点就是只用一根数据线进行传输,多位数据必须在一根数据线上顺序地进行传送。传输线少,通信线路简单,通信速度慢,成本低,适合于多数位、长距离通信的场合。

串行通信按照信息在设备间的传输方向,还可分为单工、半双工和全双工三种方式。分别如图2.2所示。

在串行通信中,通信双方在任一时刻,只能单方向的传送数据,这样的传送方法称为单工方式。如图2.2(a)所示,通信方甲机只能作为发送方,而通信方乙机只能作为接收方,不能互换。通信双方可通过传输线交替地进行双向传输,每个通信方都可以作为发送方或接收方,但在任一时刻,不能同时作为发送方和接收方,这样的通信方

4

式称为半双工方式。如图2.2(b)所示,通信方甲机和通信方乙机都可以作为发送方或接收方,但在任一时刻,不能同时作为发送方和接收方,通软件或硬件设定。通信双方通过两条传输线进行互连,两者之间的数据可以同时进行发送和接收,这样的通信方式称为全双工方式。如图2.2(c)所示,通信方甲机和通信方乙机同时可以作为发送方和接收方。AT89C51单片机在硬件上具有全双工的结构。

在实际应用中,尽管多数串行通信接口电路具有全双工功能,单一般情况下,多工作于半双工方式下。因此,为了能够综合展示单片机串行通信的的应用,本系统采用半双工方式。

串行通信中要解决好发送设备与接收设备之间的同步问题,否则会造成某些数据位的丢失而通信失败。根据采用的同步方式的不同, 将串行通信进一步分为同步串行通信和异步串行通信两种。

异步串行通信方式是将传输的数据按照某种位数进行分组(通常以8位的字节为单位),在每组数据的前面和后面分别加上一位起始位和一位停止位,根据需要还可以在停止位前加一位校验位,并且停止位的长度还可以增加。这样组合而成的一组数据被称为一帧。异步串行通信的数据传送格式如图2.3所示。

图2.2 通信方式示意图

图2.3 串行异步通信数据格式

异步串行通信方式的结构简单,但是数据的传送量增加很多,导致传输效率不高,一般用在对传输速率要求不高的应用中。

同步串行通信方式不再以字节为单位,而是以数据块为单位,每个数据块可以有多个字节构成,只在每个数据块的前后加上起始位和停止位,这样减少了需要额外传输的控制数据的长度,自然也就提高了传输的效率。同步串行通信的数据传送格式如图2.4所示。 同步字符1 同步字符2 数据块 校验字符1 校验字符1 5

同步通信方式的软硬件的复杂程度也随之上升,价格比较昂贵,一般只在传输速率要求较高系统使用。因此本系统采用异步串行通信。

波特率是串行通信中的一个重要概念,它用于衡量串行通信速度的快慢。波特率是指在串行通信中,单位时间里传输的二进制代码的位数,单位是b/s或bps(位/秒)。例如:每秒钟传输120个字符,每个字符由10个二进制位(其中1个起始位、8个数据位和一个停止位),其波特率为120字符/秒×10位/字符=1200位/秒。在异步串行通信中,波特率一般为50-9600bps。

在串行传输中,二进制数据序列是以数字波形表示的,发送时,在发送时钟的作用下将移位寄存器的数据串行移位输出;接收时,在接收时钟的作用下将通信线上传来的数据串行移入移位寄存器。所以,发送时钟和接收时钟也可称为移位时钟,能产生该时钟的电路称为波特率发送器。

为了提高采样的分辨率,准确地测定数据位的上升沿或下降沿,时钟频率总是高于波特率若干倍,这个倍数称为波特率因子。在单片机中,发送/接收时钟可以由系统时钟fosc产生,其波特率因子可为12、32和64,根据方式而不同。此时波特率由fosc决定,称为固定方式频率方式;也可由单片机内部定时器T1产生,T1工作于自动再装入8位定时方式(方式2)。由于定时器的计数初值可以人为改变,T1产生的时钟频率也可以改变,因此称为可变波特率方式。当然,也可以用用T2作为波特率发生器。

[7]

图2.4 串行同步通信数据格式

2.1.2 51系列单片机串行口的功能

51单片机的串口是一个可编程的全双工串行通信接口,通过软件编程,它可以作为通用异步接收和发送UART使用,可以同时发送、接收数据。发送、接收数据可以通过查询或中断方式处理,使用十分灵活,能方便的与其他计算机或串行传送信息的外部设备(如串行打印机、CRT终端)实现双机、多机通信。其帧格式为:1个起始位,8或9个数据位和1个停止位。51单片机的串口也可以作为同步移位寄存器。

51单片机的串口有4种工作方式,分别是方式0、方式1、方式2、方式3。其中:

方式0,为同步移位寄存器方式,一般用于外接移位寄存器芯片扩展I/O接口; 方式1,是8位的异步通信方式,通常用于双机通信。

方式2和方式3,是9位的异步通信方式,通常用于多机通信。

不同的工作方式,其波特率不一样,方式0和方式2的波特率直接由系统时钟产生,方式1和方式3的波特率由定时器/计数器T1或T2的溢出频率决定[7]。

2.1.3 51系列单片机的串行结构

51系列的单片机串行口主要由发送数据寄存器、发送控制器、输出控制门、接收数据寄存器、接收控制器和输入移位寄存器等组成,它的结构如图2.5所示:

6

图2.5 51单片机串行口结构图

串行通信数据寄存器SBUF,字节地址为99H,实际对应两个寄存器:发送数据寄存器、接收数据寄存器。当CPU向SBUF写数据时对应的是发送数据寄存器;当CPU读SBUF时,对应的是接收数据寄存器。

特殊功能寄存器SCON用于存放串行口的控制信息和状态信息。根据对其写控制字决定工作方式,从而决定波特率发生器的时钟来自系统时钟还是来自定时器T1或T2。特殊功能寄存器PCON的最高位SMOD为串行口波特率的倍增控制位。51单片机的串行口正是通过对上述专用寄存器的设置、检测与读写来管理串行通信的。

在进行通信时,外界的串行数据是通过引脚RXD(P3.0)输入的。输入数据先逐位进入输入移位寄存器,再送入接收SBUF,在此采用了双缓冲结构,这是为了避免在接收到第二帧数据之前,CPU未及时响应接收器的前一帧的中断请求而把前一帧数据读走,造成两帧数据重叠的错误。对于发送器,因为发送时CPU是主动的,不会产生写重叠的问题,一般不需要双缓冲器结构,为了保持最大的传送速率,仅用了SBUF一个缓冲器。TI和RI为发送和接收中断标志,无论哪个为1,只要中断允许,都会引起中断[8]。

2.1.4 51系列单片机串口工作原理

设有两个单片机串行通信,甲机发送,乙机接收,如图2.6所示。

7

图2.6 51单片机串行传送示意图

发送数据时,当执行一条向SBUF写入数据时把数据写入串口发送数据寄存器,就启动发送过程。串行通信中,甲机CPU向SBUF写入数据(MOV SBUF,A),就启动发送过程。在发送时钟控制下,先发送一个低电平的起始位,紧接着把A中的数据送入SBUF,在发送控制器的控制下,按设定的波特率,每来一个移位时钟,数据移出移一位,由低位到高位一位一位发送到电缆线上,移出的数据位通过电缆线直达乙机。最后发送一个高电平的停止位。一个字符发送完毕,串行口控制寄存器中的发送中断标志位T1置位。(对于方式2和方式3,当发送完数据位后,要把串行口控制寄存器SCON中的TB8位发送出去后才能发送停止位)。 乙机按设定的波特率,每来一个移位时钟及移入一位,由低位到高位一位一位移入到SBUF。一个移出,一个移进,很显然,如果两边的移位速度一致,甲机移出的数据位正好被乙机移进,就能完成数据的正确传送;如果不一致,则必然会造成数据位的丢失。因此,两边的波特率必须一致。当甲机一帧数据发送完毕(或称发送缓冲器空),硬件置位发送中断标志位TI(SCON.1),该位可作为查询标志,如果设置为允许中断,则将引起中断,甲机的CPU可发送下一帧数据。

作为接受方的乙机,需预先设置位REN(SCON.4),即允许接收。当REN置位1,接收控制器就开始工作,对接收数据线进行采样,当采样到从“1”到“0”的负跳变时,接收控制器开始接收数据。为了减少干扰的影响,接收控制器在接收数据时,将一位的传送时间分成16等分,用当中的7、8、9三个状态对接收数据线进行采样,三次采样当中,当两次采样为低电平时,就认为接收的是“0”,两次采样为高电平,就认为接收是“1”。如果接收是起始位的值不是“0”,则起始位无效,复位接收电路;如果起始位为“0”,则开始接受其它数据。甲方的数据按设定的波特率由地位到高位顺序进入乙机的移位寄存器。当一帧数据到齐(接收缓冲器满)后(接收的前8位数据依次移入输入移位寄存器,接收是第9位数据置入串口控制寄存器的RB8位中),硬件自动置位接收中断标志RI(SCON.0),通知CPU来取数据。该位可作为查询标志,如果设置为允许中断,将引起接收中断,乙机的CPU可通过读SBUF(MOV A,,SBUF),将帧数据读入,从而完成了一帧数据的传送。

无论是单片机之间,还是单片机和PC机之间,串行通信双方的波特率必须相同,

8

才能完成数据的正确传送[7]。

2.1.5 51系列单片机多机通信

多机应用是指在一个系统中用到了多块单片机。它是单片机在高科技领域的主要应用,主要用于一些大型的自动化控制系统。这时整个系统分成了多个子系统,每个子系统是一个单片机系统,用于完成本系统的工作,即从上级主机接收信息,并发送信息给上级主机。上级主机则根据接收的下级子系统的信息,进行判断,产生相应的处理命令传送给下级子系统。

通过51单片机串口能够实现一台主机与多台从机进行通信,主机和从机之间能够相互发送和接收信息。主机可以向各个从机或指定的从机发送信息,各个从机发送的信息只能被主机接收,但从机与从机之间不能相互通信。

单片机串行多机通信必须使用串口模式2和模式3。在多机通信中,为了保证主机能够正确识别所选是从机并进行通信,主,从机需要正确地设置和判断多机通信控制位SM2和发送/接收的第9位信息,TB8,RB8。主机在发送信息时,依靠TB8标志位来区分发送的信息为地址信息还是数据信息。当设置TB8=1,时,发送的是地址信息;当设置TB8=0时,发送的是数据或者命令信息。从机主要依靠SM2标志位的设置来实现对主机的响应。当从机的SM2=1时,该从机只接受地址帧,对数据帧不进行处理,即只有接收的RB8位等于1数据时,接收才有效,RI才置1,对接收的RB8位等于0的数据不进行处理。当SM2=0时,无论接收的是地址帧TB8=1还是数据帧RB8=0,接收都有效,RI都置1。

多级通信时,主机每一次都向从机传送至少两字节信息,先传送从机的地址信息,再传送数据信息。处理时,地址信息的TB8位设为1,数据信息的TB8位设为0。硬件线路如图2.7所示。

图2.7 多机通信线路图

单片机多机通信的过程如下:

1.所有从机复位,置SM2=1,使其处于准备接收一帧地址数据的状态; 2.主机设置第9位TB8=1,发送一帧地址信息,与所需要的从机进行联系; 3.各从机接收到地址信息后,分别于自己的地址进行比较,对于地址相符的从机,置SM2=0,以便于接收主机随后发送的所有信息;对于地址不相符的从机,仍保持

9

SM2=1,对主机随后发送的数据不进行处理。

4.主机发送控制指令和数据给从机,此时一帧数据的第9位TB8=0。 5.当从机接收数据结束的时候,置SM2=1,返回接收地址帧状态。 6.主机继续发送其它地址帧,与其它从机进行通信。 多机通信协议约定:

主机为了正确地和指定的从机正确的通信,双方需要对各种数据、地址、指令和状态等进行明确的约定。本系统的通信协议作如下规定:

主机的控制命令:01H表示主机请求从机接收数据;02H表示主机请求从机发送数据。其它保留,可定义其它用途。

从机的地址定义在00H到FEH之间,即系统中最多允许连接255个从机。对于地址FFH定义为对所有从机都有效的控制命令,用于将各从机恢复到复位状态,即SM2=1。

按照上面的协议规定:主机首先发送地址帧,被寻址的从机向主机回送本地地址。

主机判断地址是否相符,然后给被寻址的从机发送控制命令,被寻址的从机根据其命令向主机发送本地机状态。若主机判断状态正常,即开始发送或接收数据,后面紧跟的便是数据,若主机判断不正常,需要重新联系。为了能够实现多单片机之间的数据传送,本系统采用多机通信模式[8][9][10]。

2.2 模块化方案比较与选择

根据51单片机的串行通信的特点,进行了以下系统设计的方案比较与选择。

2.2.1单片机芯片的方案选择

方案一:

采用MCS-51芯片,MCS-51是Intel公司单片机的典型代表,内部有4KB ROM空间。其结构典型、总线完善、SFR集中管理,并且具有丰富的位操作系统和面向控制功能的指令系统[11]。但是,MCS-51系列单片机在实际应用中使用较少。 方案二:

采用AT89C51芯片作为硬件核心,AT89系列机是ATMEL公司将先进的Flash存储器技术和Intel 80C51单片机相结合的产物,是与MCS-51系列兼容的Flash单片机系列。它既继承了MCS-51原有的功能,又拥有自己是独特功能是目前应用广泛的主流单片机。AT89C51是AT89系列的标准型单片机,是低功耗高性能的8位单片机,使用的最高晶振频率为24MHz。采用Flash ROM,内部具有4KB ROM 存储空间,能于

10

3V的超低压工作,而且与MCS-51系列单片机完全兼容,可反复进行系统实验[12]。因此,采用该单片机作为主控制系统的芯片。

2.2.2显示模块方案选择

方案一:

采用LED数码管动态扫描,LED数码管价格适中,对于显示数字合适,采用动态扫描法与单片机连接时,虽然占用的单片机口线少,但连线还需要花费一点时间,所以也不用此种作为显示。 方案二:

采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用在显示数字显得太浪费,且价格也相对较高,所以也不用此种作为显示。 方案三:

采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字、图形、符号显示多样,清晰可见。由于本系统主机显示4个数据,从机显示2个数据,选择162的液晶显示器皆可,所以在此设计中采用LCD1602液晶显示屏。

2.2.3 软件编程语言的选择

方案一:

采用汇编语言编写,汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言。其主要优点是占用资源少、程序执行效率高。但是汇编语言可读性差,而且不同的CPU,其汇编语言可能有所差异,也不易移植。因此本系统软件不采用汇编语言编写。 方案二:

采用C语言编写,C语言是一种结构化的高级语言。其优点是可读性好,移植容易,是普遍使用的一种计算机语言。 用C语言来编写目标系统软件,会大大缩短开发周期,且明显地增加软件的可读性,便于改进和扩充,从而研制出规模更大、性能更完备的系统。缺点是占用资源较多,执行效率没有汇编高。但本系统只进行单片机之间的数据传送,不涉及复杂的数据处理,因此本系统软件采用C语言编写[8]。

2.3总体方案设计

本系统是由一个上位机系统和三个下位机系统构成,上位机系统是由AT89C51单片机串行通信最小系统、LCD1602显示器、中断发送信号按钮和接收/发送选择开关组成。三个下位机系统的构成完全相同主要有AT89C51单片机串行通信最小系统、LCD1602显示器和中断数据加1按钮组成。单片机最小系统是控制系统的核心,LCD1602液晶显示器作为串行通信接收/发送数据以及单片机状态的显示。上位机系统的发送/接收状态可以通过接收/发送选择开关进行控制,处于发送数据状态时,由中断发送信号按钮决定是否给从机发送数据。下位机系统始终处于串行中断状态,是接收还是发送数据由上位机发送的控制命令决定。系统框图如图2.8所示。

11

图2.8 串行通信系统框图

本系统主要完成的功能是上位机和下位机的半双工通信,可以通过接收/发送选择开关来控制上位机是处于接收状态还是发送状态。当处于接收状态时,主机循环接收下位机00#、01#、02#三机的实时数据,并进行显示;当处于发送状态时,主机将接收到的三机数据按从大到小的数据排列,然后依次发送到00#、01#和02#机上,并进行显示。从机的数据通过外部中断输入,数据从0开始每来一次中断数据加1,加到9数据清0,再从0到9进行循环。

2.4本章小结

本章介绍了系统的方案选择,主要对单片机串行通信的相关知识进行了归纳整理和工作方式选择,以及模块化方案的比较与选择,最后确定了串行通信控制系统要实现的功能并绘制了系统框图。

3.系统硬件设计

根据总体设计方案框图,总系统由4个分系统组成,1个上位机系统,3个下位机系统。硬件主要由AT89C51微控制器、LCD1602液晶显示器、开关和按钮组成。

3.1硬件电路核心器件介绍

本系统的两大核心器件位AT89C51单片机和LCD液晶显示器,AT89C51单片机完成系统的功能控制部分,液晶显示器完成通信过程中数据的实时显示。

3.1.1 AT89C51的主要特点

AT89C51是美国ATMEL公司生产的低电压,高性能CMOS的 8位单片机,采用单一+5V电源供电,片内含4KB的可反复擦写的只读程序存储器(PEROM)和128B的随

12

机存取数据存储器(ROM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元。功能强大AT89C51单片机可提供许多高性价比的应用场合,可灵活应用于各种控制领域。

AT89C51的主要部件:

(1)一个以ALU为中心的8位中央处理器,完成运算和控制功能。

(2)128B的内部数据存取存储器(内部RAM),其地址空范围00H-7FH。 (3)21个特殊功能寄存器,离散分布于地址80H-FFH中。

(4)程序计数器PC,是独立的16位专用寄存器,内容为将要执行的指令地址。 (5)4KB Flash内部程序存储器(片内ROM),用来存储程序、原始数据、表格等。 (6)4个8位可编程I/O口(P0、P1、P2和P3)。 (7)一个UART串行通信口。 (8)2个16位定时器/计数器。

(9)5个中断源,两个中断优先级的中断控制系统。 (10)一个片内振荡器和时钟电路。 AT89C51的极限参数如表1所示:

表1 AT89C51的极限参数: 工作温度 储藏温度 任一引脚对地电压 最高工作电压 直流输出电流 -55℃到+125℃ -65℃到+150℃ -1.0V到+7.0V 6.6V 15.0mA

AT89C51单片机双列直插式引脚图如图3.1所示,其引脚说明如下:

(1)电源引脚 Vcc(40):接DC电源端,Vcc=+5V20%。 GND(20):接地端。 (2)P0-P3引脚

P0口:是一组8位漏极开路型双向I/O,也即地址/数据总线复用口。作为输出口用时,每位能以吸收电流的方式驱动8个TTL逻辑门电路,对端口写“1”可作为高阻抗输入端用。

P1口:是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。

13

P2口:是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电

图3.1 AT89C51双列直插式引脚图

流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。

P3口:是一组带有内部上拉电阻的8位双向I/O口,P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。作输入端时,被外部拉低的P3口将用上拉电阻输出电流(IIL)。

P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能,如表2所示:

端 口 引 脚 P3.0 P3.1 P3.2 P33 P3.4 P3.5 P3.6 P3.7 表2 P3口的第二功能: 第 二 功 能 RXD (串行输入口) TXD (串行输出口) INT0 (外中断0) INT1 (外中断1) T0 (定时/计数器0) T1 (定时/计数器1) WR (外部数据存储器写选通) RD (外部数据存储器读选通)

(3)时钟引脚 XTAL1(19):振荡器反相放大器的及内部时钟发生器的输入端。 XTAL2(18):振荡器放大器的输出端。 (4)控制线引脚 RST(9):复位输入端。此引脚出现至少两个机器周期的高电平,将单片机复位。 ALE/(PROG)(30):地址锁存/编程脉冲。对Flash存储器编程期间,该引脚用于输入编程脉冲(PROG)。

PSEN(29):外部ROM读选通信号。当AT89C51由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲,在此期间,当访问外部数据存储器,这两次有效的PSEN信号不出现。

EA/VPP(31):内、外ROM选择/编程电源。EA为片内外ROM选择端。当EA保持高电平时,先访问片内ROM,当PC的值超过4KB时,自动转向执行片外ROM中的程序。。当EA保持低电平时,只访问片内ROM。在Flash存储器编程期间,该引脚用于施加编程电压Vpp[13]。

14

3.1.2 LCD1602液晶显示器模块

1602是一款常用的字符型液晶,可显示2行16个字符。1602液晶模块带标准字库,内部的字符发生存储器(CGROM)已经存储了160个57点阵字符图形,32个510点阵字符图形。这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等。每一个字符都有一个固定的代码,这个代码就是对应字符的ASCⅡ码。比如大写的英文字母“A”的代码是01000001B(41H),显示时,只要将41H存入显示数据存储器DDRAM即可,液晶自动将地址41H中的中的点阵字符图形显示出来,我们就能看到字母“A”。

1602采用标准的16引脚接口,引脚图如图3.2所示,其功能如表3所示。其中8位数据总线D0-D7和RS、R/W、EN三个控制端口,个分解时序操作速度支持到1MHz,并且带有字符对比度调节和背光。

当RS和RW同时为低电平时,可以写入指令或显示地址;当RS为低电平,RW为高电平时,可以读忙信号;当RS为高电平,RW为低电平时,可以写入数据。

1602LCD主要技术参数:显示容量:16×2个字符、芯片工作电压:4.5—5.5V、工作电流:2.0mA(5.0V)、模块最佳工作电压:5.0V、字符尺寸:2.95×4.35(W×H)mm。

表3 1602引脚使用说明 编号 符号 1 2 3 4 5 6 15 16

对1602显示字符控制,通过访问1602内部RAM地址实现,1602内部控制具有80 字节RAM,RAM地址与字符位置对应关系如图3.3所示。

引脚说明 - - RS=1时选择数据寄存器,RS=0时选择指令寄存器 RW=1时执行读操作,RW=0时执行写操作 高电平使能 双向数据输入与输出 接到或通过10Ω左右电阻接到VDD 接到VSS 使用方法 VSS 电源地 VDD 电源 V0 RS RW E 数据/命令选择端 读/写选择端 使能信号端 图3.2 1602引脚图

对比度信号调整端 外接分压电阻,调节屏幕亮度 7-14 D0-D7 数据I/O BLA 背景光源正极 BLK 背景光源负极 15

图3.3 1602的RAM地址与字符位置对应关系

1602的读/写操作,即显示控制,是通过控制指令实现的,控制指令如表4所示[7][14]

表 4 控制指令表 指令名称 指令功能 开/关及光 D=1开显示;D=0关显示 标设置 C=1显示光标;C=0不显示光标 B=1光标闪烁;B=0光标不显示 输入模式设置

N=1光标右移;N=0光标左移 D7 D6 D5 D4 D3 D2 D1 D0 模式设置 设置为16×2,5×7点阵,8位数据接口 0 0 1 1 1 0 0 0 0 0 0 0 1 D C B 0 0 0 0 1 D C B 0 0 0 0 1 D C B 0 0 0 0 0 1 N S S=1文字移动有效;S=0文字移动无效 0 0 0 0 0 1 N S 3.2电路原理图设计

电路原理图设计是在实现系统功能基础之上,进行器件选型、器件值计算以及整合模块功能电路。但是在Proteus ISIS仿真环境中AT89C51微控制器和LCD1602的外围电路可以不加,通过属性设置对话框可以直接设置AT89C51的外部晶振频率,加载程序即可实现仿真。具体的电路模块设计说明将在本文第六部分AT89C51最小系统的外围电路中详细介绍,在此不再累述。本节主要介绍如何在Porteus ISIS环境中进行原理图绘制和原理图电气检测。

3.2.1原理图硬件连接说明

根据选择的设计方案,以及系统框图,可将硬件作如下连接:主、从机系统的液晶显示器的数据I/O口D0-D7依次接AT89C51的P1.0-P1.7端口,液晶显示器的RW读/写选择端、RS数据/命令选择端和E使能信号端依次接AT89C51的P2.0、P2.1和P2.2端口。上位机系统接收/发送选择开关上拉电阻接单片机的P0.0口,中断发送信号按钮上拉电阻接单片机P3.2外部中断0输入端。三个下位机系统的中断数据加1按钮上拉电阻接单片机P3.2外部中断0输入端。

原理图中所有器件及其标称值、数量和代号如表5所示。

表 5 元器件列表

16

序号 1 2 3 4 5 6 7 8 名称 电阻 电阻 电容 电容 单片机 液晶显示器 8引脚排阻 晶振 标称 470Ω 10KΩ 22pF 100uF AT89C51 LM061L RESPACK-8 12M 数量 7 4 8 4 4 4 4 4 代号 R1、R2、R3、R4、R5、R6、R7 R8、R9、R10、R31 C1、C2、C4、C5、C7、C8、C10、C11 C3、C6、C9、C12 U1、U2、U3、U4 LCD1、LCD2、LCD3、LCD4 RP1、RP2、RP3、RP4 X1、X2、X3、X4

3.2.2 基于Proteus ISIS系统原理图设计

Proteus ISIS 原理图设计是具智能性和人性化的设计,过程简明高效。ISIS原理图输出流程包括设置编辑环境、原理图连线、建立网络表、报表输出等过程。本系统的原理图绘制过程如下[3][12]:

1.启动PROTEUS ISIS图标 ,进入ISIS窗口,如图3.4所示:

17

图3.4 ISIS 窗口

ISIS主要包括:菜单栏、工具栏、对象预览窗口、编辑区、器件选择按钮、对象选择器、仿真按钮、方位控制按钮、状态栏等。

2.创建原理图文件 单击菜单栏中的“FILE/NEW DESIGN”,弹出如图3.5所示的新建设计(Create New Design)对话框。单击“OK”按钮,则以默认的模板(DEFAULT)建立一个新的空白文件。

18

单击工具按钮 ,取文件名“串行通信原理图”,后缀为DSN是系统自动加上去是,然后单击保存按钮,则完成新建文件操作。 3.设置图纸大小

根据设计串行通信原理图的大小,默认的A4的原理图纸不能满足设计的要求,需要对图纸的大小重新设置。单击“System/Set Sheet Size”,出现如图3.6所示的对话框,选择“User(自定义)”复选框,定义长为16in,宽位8in,点击“OK”。

图3.6 图纸大小设置窗口

4.从库中选择原理图中的元器件 单击如图3.7所示中的“P”按钮,弹出如图3.8所示的元器件选择框。在“Keyword”栏中输入元器件“AT89C51”,则可元器件列表。从列表中选中AT89C51行后,再双击,便将AT89C51选入对象选择器中。同样的方法把原理图中的其他器件放入对象选择器中,以备画原理图时调用。

选取元件按钮 图3.7

图3.8 元器件选择框

5.放置元器件

在如图3.9所示的对象选择器中选择取AT89C51元器件,再在如图3.10所示的ISIS编辑区空白处单击,即可将元器件AT89C51放置在原理图编辑区中。同样的方法把对象选择器中的其他器件放入原理图编辑区中,以备原理图连线。

19

图3.9 对象选择器

图3.10 放置AT89C51

6.放置电源、地、和输入输出终端

单击绘图工具中的终端按钮 ,在对象选择器中单击终端符号POWER,放置电

源,单击GROUND放置地,单击DEFAULT放置普通端子,如图3.11所示。

7.连线

单击自动布线图标 ,自动布线有效,根据原理图中器件的接线,单击要连线的起点和终点,系统便会自动以直角走线,成连线。连线结果如图3.12所示。

8.统一编号

单击\"Toos /Global Anntator\弹出如图3.13所示的整体编号对话框,在范围

20

框中选择整体设计,在模式中选择Toal,单击“OK”即可将原理图中所有器件进行编号,其结果如图3.14所示。

图3.13 整体编号对话框

图3.14 整体编号结果

8. 网络标号

由于串行通信原理图中器件较多,都进行直接连线比较麻烦,而且容易造成连线错误,因此采用网络表号的方法,将部分要连接的端口,使其具有电气联系。双击原理图中的普通端 ,弹出如图3.15所示的对话框。在字符名称后中输入网络标号“L0”,单“OK”即可完成“L0网络编号”,结果如图3.16所示。两个或多个相对应端子的网络标号要相同。采用同样的方法完成原理图中的其他的网络标号。

21

9.电气检测

单击菜单栏上的“Tools/Electrical Rule Check”,弹出检测结果窗口,如图3.17所示,结果显示本系统所设计的原理图符合电气规则,点击“另存为”保存结果。

图3.17 电气检测结果

10.元器件的属性设置

对于串行通信原理图中的每一个元器件,都有对应的编号。电阻、电容等还有相应的量值。在原理图中双击电容C1弹出如下图3.18所示对话框。设置电容的值为22Pf,PCB封装信息为CAP10,不隐藏电容C1的编号和量值结果如图3.19所示。按照同样的方法设置串行通信原理图中其他器件的属性。至此完成了仿真原理图的绘制工作,完整的原理图见附件一。

3.3本章小结

本章介绍了系统的硬件设计,首先对串行通信控制系统的核心器件AT89C51单片机与LCD1602液晶显示器作了简单介绍。其次,给出了系统原理图的连线和器件清单。最后,着重介绍在具智能性、人性化和过程简明高效的Proteus ISIS编辑环境中进行

22

本系统电路原理图的绘制过程。

4.系统软件设计

本系统的程序采用C51模块化程序编写,主要包括串行通信初始化、LCD液晶显示部分,硬件接口部分、主机程序和从机程序等几部分组成。

4.1系统模块化子程序

为了使程序易于编写和移植以及具有可读行,结合本系统的功能特点,模块化子程序包括多机通信初始化程序、LCD液晶显示模块程序、 硬件接口定义模块等部分组成。其结构是按功能划分为若干个基本模块;各模块之间的关系尽可能简单,在功能上相对独立;每一模块内部均是由顺序、选择和循环三种基本结构组成;其模块化实现的具体方法是使用子程序。

4.1.1多机通信初始化程序

本系统的串行通信工作方式选择模式3,模式3为11位异步发送接收方式。它的波特率是由定时器T1的溢出频率和波特率倍增位SMOD共同决定的[15]。本系统的波特率设置为4800比特/秒,波特率倍增位置1,单片机的时钟频率fosc=12MHz。

根据系统设定的波特率求定时器T1的计数初值,串行通信工作方式模式3的波特率计算公式[8]如下:

fosc2SMODfosc2SMOD波特率=4800bps 3212256X384256X其中X为定时器的计数初值。 代入下列公式得

计数初值 X243。 void init_serial() {

TMOD=0x20; //控制字001000,定时器T1工作于方式2作为波特率发生器 TL1=0xf3; //计数初值243 TH1=0xf3;

PCON=0x80; //SMOD=1,波特率加倍 TR1=1;

SCON=0xd8; //11011000 串口工作方式3,REN=1允许串行接受 EX0=1; //允许使用外中断

IT0=1; //选择负跳变来触发外中断

23

EA=1; }

//CPU开总中断

4.1.2 LCD液晶显示模块程序

本系统程序中包含“LCD1602.C”和“LCD1602.H”两个文件,具体内容见附件二,程序中包括了LCD1602液晶显示器初始化程序和所有功能编程函数,在需要显示的时候,只需根据显示要求,调用相应的功能函数,并加以修改相应的参数即可完成数据、字符或图形的显示。本系统中主机和从机的显示部分主要用到了一下功能函数[7][14]:

void LCD_initial(void) //初始化LCD

void LCD_set_position(unsigned char x) //LCD显示定位到x处

void LCD_printc(unsigned char lcd_data) //输出一个字符到LCD void LCD_prints(unsigned char *lcd_string) //输出一个字符串到LCD 在进行数据显示时,要将单片机处理的十六进制数转化成BCD码,BCD码各位再转化成ASCⅡ码,LCD才能进显示。其数据转化函数如下:

void DispTable( unsigned int t) {

unsigned char a[5]; //定义一个5位数组,用于存放BCD码的个十百千万位 char k; //定义一个变量k a[0]=(t/10000)%10; //取数据转化成BCD后的个位到数组a[0]

a[1]=(t/1000)%10; //取数据转化成BCD后的十位到数组a[1]

a[2]=(t/100)%10; //取数据转化成BCD后的百位到数组a[2] a[3]=(t/10)%10; //取数据转化成BCD后的千位到数组a[3] a[4]=(t/1)%10; //取数据转化成BCD后的万位到数组a[4] for(k=0; k<5; k++)

a[k]=a[k]+'0'; //将BCD码的个十百千万位分别转成ASCII码

LCD_prints(&a); //将BCD码按字符串的方式输出到LCD }

4.1.3 硬件接口定义模块编程

为了能够集中管理硬件接口,在硬件接口有冲突时,方便改换接口,将用到的接口定义在“hardware.h”头文件[8]中,“hardware.h”头文件如下: #ifndef __HARDWAR_H__ #define __HARDWAR_H__ #include

#define LCD_DATA P1 //LCD的数据接到AT89C51的P1口 sbit LCD_BUSY=LCD_DATA^7; //LCD忙信号位

sbit LCD_RW=P2^0; //LCD读写控制端接单片机的P2.0口 sbit LCD_RS=P2^1; //LCD寄存器选择端接单片机的P2.1口 sbit LCD_EN=P2^2; //LCD使能信号端接单片机的P2.2口

24

#endif

4.2 多机串行通信程序

主机程序是由主程序和外部INT0中断服务程序组成,此外还用到错误标志子程序和液晶显示数据转ASCⅡ码子程序。

4.2.1系统主机主程序

系统主机主程序流程图如图4.1所示。

开始初始化LCD、初始化串口A开外部中断INT0TB8清零开CPU中断从机发送命令帧0X02,请求从机发送数据取上位机接收/发送标志接收从机状态显示接收/发送标志N标志位=0?N从机状态正常?YY接收数据,地址加1取从机地址地址<3?NY主机发地址帧从机应答?NYTB8=1应答地址相符?N发错误标志FF使从机复位Y显示从机发送的数据A

图4.1 系统主机主程序流程图

系统主机主程序程序[7][8]如下:

#include //51单片机寄存器头文件 #include //LCD1602头文件 #include \"hardware.h\"

//硬件定义头文件

25

#define uchar unsigned char

uchar SLAVE,status,send_data; //定义地址、状态和发送标志变量

uchar idata rdata[4],PL_data[4]; //定义两个4维数组用于存放接收的数据 void DispTable( unsigned int t);//声明显示数据的函数 void error(void) //错误标志函数 {

SBUF=0xff; //发给从机数据出错标志位 while(TI!=1); TI=0; //等待发送结束 }

void main (void) //{

LCD_initial(); //LCDLCD_set_position(0); //LCDLCD_prints(\"R0:\"); //LCD_set_position(0x08); //LCDLCD_prints(\"R1:\"); //LCD_set_position(0x40); //LCDLCD_prints(\"R2:\"); //LCD_set_position(0x48); //LCDLCD_prints(\"R3:\"); //while(1) {

init_serial(); //send_data=P0^0; //LCD_set_position(0x4b); //LCDDispTable(send_data); //if(send_data==1) goto Lable1; //for(SLAVE=0;SLAVE<3;SLAVE++) {

SBUF=SLAVE; //while(TI!=1); TI=0; //while(RI!=1); RI=0; //if(SBUF!=SLAVE) error(); //else //{

TB8=0; //SBUF=0X02; //while(TI!=1);TI=0; //while(RI!=1);RI=0; //系统主函数

初始化 显示定位到0处

输出一个字符串“R0:”到LCD 显示定位到0x08处

输出一个字符串“R1:”到LCD 显示定位到0x40处

输出一个字符串“R2:”到LCD 显示定位到0x48处 输出一个字符串“R3:”到LCD 调用串口初始化程序 发送/接收标志位

显示定位到0x4b处 输出send_data到LCD 如果发送/接收标志位为1 发呼叫地址 等待发送结束

等待从机回发地址

若地址出错,从机复位 若地址正确 清地址标志位,准备接收数据 发命令帧02H求从机发送数据 等待发送结束 等待从机回发命令

26

status=SBUF; //接收从机返回的命令

if((status&0x80)==0x80) //若主机命令非法 {

TB8=1; //TB8赋值1,发复位信号给从机 error(); //调用错误标志函数 }

if((status&0x02)==0x02) //若命令帧为02H,接收发送数据 {

while(RI!=1);RI=0; //等待从机发送数据结束

rdata[SLAVE]=SBUF; //主机接收定点从机发送来的数据 }

TB8=1; //TB8赋值1,准备接收下一帧地址 }

LCD_set_position(0x03); //LCD显示定位到0x03处 DispTable(rdata[0]); //显示0#机发送的数据 LCD_set_position(0x0b); //LCD显示定位到0x0b处 DispTable(rdata[1]); //显示1#机发送的数据 LCD_set_position(0x43); //LCD显示定位到0x0b处 DispTable(rdata[2]); //显示2#机发送的数据 }

Lable1:; //跳转标号 TB8=1; } }

4.2.2系统主机中断服务程序

系统主机中断服务程序流程图如图4.2所示。

27

BTB8清零从机发送命令帧0X01,请求从机接收数据开始保护现场接收从机状态标志位=1?N从机状态正常?NY将从机发送来的数据从大到小排列Y发送数据,地址加1取从机地址地址<3?NY主机发地址帧从机应答?NNY应答地址相符?NTB8=1发错误标志FF使从机复位YB恢复现场结束图4.2 系统主机中断服务程序流程图

系统主机中断服务序程序[7][8][9]如下:

void ISR0(void) interrupt 0 //外中断0的中断编号为0 {

EX0=0; //保护现场

TB8=1; //TB8赋值1,准备接收地址帧if(send_data==0) goto reback; //如果发送/接收标志位为0 ......

//将接收来的数据从小到大的顺序排列 ......

for(SLAVE=0;SLAVE<=3;SLAVE++) {

SBUF=SLAVE; //发呼叫地址

while(TI!=1); TI=0; //等待数据接收完 if(SLAVE>=3) goto reback; //如果地址大于2 while(RI!=1); RI=0; //等待数据接收完毕

28

if(SBUF!=SLAVE)

error(); //若地址出错标志,从机复位 else {

TB8=0; //清地址标志位,准备接收数据

SBUF=0X01; //发命令帧01H请求从机接收主机数据 while(TI!=1);TI=0; //等待命令发送结束 while(RI!=1);RI=0; //等待从机回发命令 status=SBUF; //接收从机返回的命令 if((status&0x80)==0x80)

{

TB8=1; //若主机命令非法,发复位信号给从机 error();

}

if((status&0x01)==0x01) //如果接收的数据是01H {

SBUF=PL_data[SLAVE]; //发送排列的数据 while(TI!=1); TI=0; //等待数据发送结束 }

TB8=1; } }

reback:; //跳转标号 TB8=1;

EX0=1; //允许使用外中断,恢复现场 SLAVE=0; //地址赋值0,准备下一次循环 }

4.2.3系统从机主程序

系统从机有3个,其编程基本完全相同,只是地址定义不同。现以0#机位例,其主程序流程图[7][8]如图4.3所示。

系统从机主程序与主机主程序相关部分基本相同,在此不再叙述。

开始初始化LCD、初始化串口开串行中断、外部中断INT0开CPU中断显示接收和发送的数据29

4.2.4系统从机中断服务程序

图4.3 系统从机主程序流程图

系统从机的中断服务程序有两个,分别为串行中断服务程序和外部中断INT0中断服务程序。

系统从机串行中断服务程序流程图如图4.4所示。

C开始RI清零是否是命令?N发送错误标志Y保护现场命令判断开CPU中断请求从机发送命令请求从机接收命令地址是否相符?N回送发送命令回送接收命令Y置SM2=0发送数据发送数据向主机回送本机地址接收下一帧信息置SM2=1C恢复现场结束

图4.4 系统从机串行中断服务程序流程图

系统从机串行中断服务程序[8][9][10]如下: void slave(void) interrupt 4 {

uchar a; //定义一个变量a RI=0; //接收中断标志清零 ES=0; //关串口中断

if(SBUF!=SLAVE) //非本机地址继续监听 {

ES=1;goto reback; //开串行中断,跳转到标号reback }

SM2=0; //取消监听状态 SBUF=SLAVE; //从机地址回送 while(TI!=1); TI=0; //等待地址发送结束

30

while(RI!=1); RI=0; //等待从机回发地址

if(RB8==1) //如果RB8为1,是地址帧 {

SM2=1;ES=1;goto reback; //SM2置1,开串行中断,跳转到reback }

a=SBUF;

if(a==0x01) //从机接收主机的数据 {

SBUF=0X01; //while(TI!=1); TI=0; //while(RI!=1); RI=0; //if(RB8==1) //{

SM2=1;ES=1; goto reback; //SM2}

rdata=SBUF; //while(RI!=1); RI=0; //SM2=1; ES=1; //SM2}

else {

if(a==0x02) //{

SBUF=0X02; //while(TI!=1); TI=0; //SBUF=tdata;

while(TI!=1); TI=0; //SM2=1; //SM2ES=1; //} else {

SBUF=0X80; //while(TI!=1); TI=0; //SM2=1; //SM2ES=1; //} }

reback:; //发送命令帧0X01,从机准备好接收数据 等待命令发送结束

等待数据接收完成

如果RB8为1,是地址帧 置1,开串行中断,跳转到reback 接收主机发送的数据 等待数据接收完成 置1,开串行中断 如果命令帧是0x02 回发命令帧0X02,从机准备好发送数据 等待命令发送完成 等待数据发送完成

置1,只接收地址帧 开串行中断

命令非法,发状态 等待命令发送结束

置1,只接收地址帧 开串行中断 跳转标号

31

}

系统从机外部中断INT0中断服务程序流程图如图4.5所示。 开始

保护现场系统从机外部中断INT0中断服务程序:

void ISR0(void) interrupt 0

从机发送的数据tdata+1{

Ntdata<9?tdata++; //要发送的数据加1

Yif(tdata>=9)tdata=0; //如果数据大于8,清零

tdata=0}

恢复现场结束图4.5 外部中断服务程序流程图

4.3本章小结

本章主要完成系统的软件设计,通过对功能的分析,软件流程图的绘制,编写了系统的模块化子程序,多机串行通信的主机和从机程序。用C51编写的程序具有可移植性,直观明了,易于读写和修改的特点,是汇编用语言所无法比拟的。

5.系统仿真与调试

Proteus 软件包括汇编语言编译系统,可以在软件平台上对单片机进行可视化调

试。但是,现在的大部分的单片机开发人员都用C 语言对单片机进行编程控制。应用TCP/IP 协议,Proteus 与Keil 的联调很好地解决了Proteus 自带的编译系统无法对C 语言进行编译的问题[4]。

5.1 生成单片机可执行文件

要进行仿真和调试,还必生成单片机可执行文件.hex文件,.hex文件时是在Keil集成开发环境中生成的,生成过程[7][11]如下:

双击Keil uViosion3图标 ,进入Keil uViosion3集成开发环境,如图5.1所示。

32

生成工程文件,单击“Project/New uVision Project”,在弹出的对话框中,键入工程名为“串行通信主机程序”,单击保存,如图5.2所示的对话框。选择Atmel公司的AT89C51作为应用和实验对象,弹出启动代码添加提示对话框选择“否”。返回集成开发环境界面,单击“Feil/New”,然后单击“Feil/Save”,在弹出的对话框中输入文件名“ MainShangWeiji.c”(后缀名一定要有,本系统程序用C51语言编写,后缀为.C),单击“保存”将文件存储到“串行通信主机程序”所在的文件夹中。

图5.1 Keil uVision 3集成开发环境

图5.2 工程器件选择对话框

图5.3 文件组快捷菜单

由于本系统用到了LCD1602,所以要用到

33

LCD1602的驱动程序和头文件,因此要添加LCD1602.c和LCD1602.h文件(此程序在网上可以查到,不必自己编写),为了便于在程序中改换接口,创建一个“hardware.h”文件。在源程序准备好以后,要将这些文件添加到项目中,在左侧“Projece Workspace”栏中右击“Source Group 1”,弹出如图5.3所示的文件快捷键菜单,选择“Add Files to Group‘Source Group 1’”,再在弹出的对话框中,文件类型选择“C Source file(*.c)”,添加“MainShangWeiji.c”和“LCD1602.c”;文件类型选择“Text file(*.txt;*.h;*.inc)”添加“LCD1602.h”和“hardware.h”文件,结果如图5.4所示。

为了编译项目并创建AT89C51单片机可执行文件*hex,则需对Optitions for Target 'Targer '进行相应设置。在左侧“Projece Workspace”栏中右击“Taget1”,选择“Optitions for Target 'Targer '”,在弹出如图5.5所示的对话框中,点击“Output”,在“Create Executable”下面的复选对话框中,单击Create HEX File

图5.5 选中Create HEX File 复选框

前面的复选框,进行选中。单击“确定”返回集成开发界面。

单击build taget图标 ,对目标文件进行编译,如图所示5.6所示。结果显示程序没有错误,有一个警告,可以忽略,并产生一个“串行通信主机程序.hex”文件。

利用同样的方法编译0#、1#和2#机的并生成“串行通信0号从机程序.hex”、“串行通信1号从机程序.hex”和“串行通信2号从机程序.hex”三个单片机可执行文件。

34

5.2基于Proteus的仿真与调试

本系统的主机程序和个下位机程序均在KEIL集成开发环境中进行编写,经过编译生成了四个单片机可执行文件“串行通信主机程序.hex”、“串行通信0号从机程序.hex”、“串行通信1号从机程序.hex”和“串行通信2号从机程序.hex”。

5.2.1系统仿真

打开在Proteus ISIS已经绘制好的仿真原理图,双击元器件U1弹出如图5.7所示的对话框。点击“Program File”后面的文件夹按钮,弹出文件列表,从中选择目标代码文件“串行通信主机程序.hex”,点击“OK”,即将十六进制单片机可执行成加载到单片机中,同样的方法分别将从机的目标代码文件加载到相应的单片机中,以备仿真。

图5.7 AT89C51单片机属性对话框

单击仿真按钮中最左边的按键 ,则进入全速仿真,出

35

图5.8 仿真结果

现亮点流动现象。闭合主机的接受/发送开关,使从机处于接收数据状态,分别单击数据输入按钮,使0#机,1#机和2#机的数据分别为5,2,8,断开主机的接受/发送开关,然后单击主机发送按钮,即将从机发送来的数据按从大到小的顺序依次回发给0#机,1#机和2#机。其结果如图5.8所示。

5.2.2系统调试

在单片机应用产品开发过程中,有时需要调试程序、修改电路以满足产品要求;有时需要观察程序运行情况,如观察过程中单片机内外RAM的情况、工作寄存器的情况、特殊功能寄存器SFR的情况等;PROTEUS提供了方便的仿真调试功能。

单击单击仿真按钮中的按键 ,进入调试状态。单击菜单栏“Debug”在如图5.9所示的下拉菜单中选择“8051CPU/Registers-U1”打开单片机寄存器窗口,可以看到R0-R7、SFR、SP、PC、PSW等寄存器中的值,以及将要执行的指令等[16][17]。

图5.9 Debug下拉菜单

36

图5.10 Proteus与Keil联合调试窗口

为了与Keil进行联合调试,打开主机的工程文件,在键盘上按“Ctrl+F5”,进入联合调试环境,进行相应的设置,将调试数据窗口显示出来,调试界面如图5-10所示。该界面是主机调试环境,图中Keil环境和Proteus环境调试窗口中显示“r0-r8”的值依次为“0B、08、00、00、00、08、03、30”,从机0#、1#和2#机发送来的数据“02、05、08”依次在数组rdata中,在数据存储器中还显示了主机处理后的数据排列“08、05、02”。从机的调试过程和主机一样,在此不再累述。

5.3本章小结

本章对串行通信系统控制进行了仿真与调试,以Proteus为平台的实验系统取代常规的单片机实验平台,其便捷的设计方式、灵活的设计手段都是硬件平台无法比拟的。通过仿真直观地看到通信系统的功能效果,通过调试可以直接看到运行过程中各变量及单片机各寄存器中的数据变化,以确定程序运行的正误。

37

6.系统硬件 PCB设计

本文所仿真的串行通信系统,所有的上位机和下位机电路均放在一个原理图中,但实际串行通信应用中,常常上位机和下位机不在同一个地点工作。因此在考虑实际应用之后,只需做一个通用的串行通信最小系统的PCB。PCB经加工成板,焊接元器件之后将串行通信最小系统人为规定为上位机或下位机,然后给进行下位机编号即可完成本系统的工作。

6.1最小系统的模块化电路设计

单片机的最小系统是单片机能够工作的最小硬件组合,主要包括:电源、晶振

振荡器、 复位电路。对于一个能够实现串行通信的最小系统的单片机还应有ISP下载端口、串行接口RS232、MAX232电路、开关、按键、指示灯、显示器、报警喇叭等部分组成。

6.1.1 AT89C51外围电路设计

AT89C51的工作电压为+5V,即单片机最小系统的电源Vcc=5V。由于当单片机的31引脚为高电平时,单片机从内部程序存储器开始访问;当为低电平时则只访问外部程序存储器,所以可以31引脚与电源相连接。

对于晶振电路,AT89C51中右一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是该放大器的输入和输出端。这个放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起构成自激震荡器,震荡电路如图6.1所示。外接石英晶体(或陶瓷谐振器)及电容C1、C2接在放大器的反馈回路中构成并联震荡电路。外接电容C1、C2没有十分严格的要求,单电容值的大小会轻微影响振荡频率的高低、振荡器工作的稳定性、起振的难易程度及温度稳定性,如果使用石英晶振,推荐电容使用30pF10pF,如果使用陶瓷谐振器建议选择40pF10pF[13][15]。该系统选用的是12MHz的石英晶振,而微调电容选择22PF。

对于复位电路,选用了电容与电阻串联的形式,另将一按键与电容并联可实现手动复位,电容为电解电容C=100uF,电阻为R=10KΩ。复位电路的基本要求是滤波电容和电阻的乘积大于5个外部时钟周期,根据时间常数 :

通过以上分析,复位电路中,电容选择C=100uF,电阻选择R=10KΩ是合理的。 另外,由于单片机的P0口的输出电路时漏极开路电路,若想输出高电平需要外接上拉电阻,所以在P0口处增加一个阻值为10KΩ的8引脚排阻。AT89C51的外围电路图如图6.1所示,ISP为AT89C51的下载编程器端口。

RC1s5112106 38

图6.1 AT89C51单片机外围电路

6.1.2 LCD1602液晶显示模块电路

LCD1602的接口可以和AT89C51单片机接口直接相连,电路如图6.2所示。LCD1602的工作电压为+5V,S1为液晶显示器的电源开关,亮度通过1K的可变电阻RV1进行硬件调节。

6.1.3 RS 232模块电路设计

图6.2 LCD1602外围电路

串行通信的距离和传输率与电气特性有关,传输距离随传输速度的增加而缩短。点对点的UART通信,由于采用TTL电平传输,一般仅用于板级通信。如要增加传输

39

距离,则通信信号需要驱动或调制。

RS232接口是一种串行通信标准,是由美国EIA(电子工业协会)和Bell公司一起开发的通信协议,它对信号线的功能、电气特性、连接器等都作了明确的规定[7]。

RS232采用的是EAI电平,采用负逻辑,其电气特性如下: 逻辑0——+5V,+15V; 逻辑1——-5V,-15V; 波特率——20000bps之内; 传输距离——15m以内。

MAX232芯片可以完成TTL电平与RS232电平间的转换。其供电电压为-5V电源,片内有升压电路。这样不必增加电源的品种,简单可靠。通过RS232使用MODEM还可以通过电话线远距离传送。

本AT89C51单片机的串行通信最小系统的RS232的驱动采用MAX232芯片,其连线图如图6.3所示。

图6.3 RS232模块电路图

6.2 系统硬件PCB总原理图

根据AT89C51单片机串行通信最小系统模块化电路设计,以及通用单片机实验板设计思想,本系统设计所需要的器件如表6。

表6 器件列表

40

序号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 名称 电阻 电阻 电容 电容 电容 单片机 升压芯片 LED灯 LED灯 LED灯 下载接口 10针插座 2针插座 4针插座 8针插座 串行接口 10针插座 液晶显示器 喇叭 8引脚排阻 可变电阻 晶振 开关 标称 500Ω 10kΩ 2pF 100uF 0.5uF AT89C51 MAX232 LED-BLUE LED-BIRY LED-GREEN CONN-SIL10 CONN-SIL2 CONN-SIL4 SIL-100-08 CONN-D9F CONN-SIL1 LM016L SPEAKER RESPACK-8 1kΩ 12M 封装 RES40 RES40 CAP10 ELEC-RAD10 ELEC-RAD15M DIL40 DIL16 LED LED LED TRANS 10DIL CONN-SIL10 CONN-SIL2 CONN-SIL4 SIL-100-08 D-09-F-R CONN-SIL1 CONN-DIL14 CONN-SIL2 RESPACK-8 CONN-SIL3 XTAL18 CONN-SIL2 数量 6 1 2 1 4 1 1 3 1 1 4 4 1 2 2 1 1 1 1 1 5 1 10 代号 R1-R6 R8 C1、C2 C3 C21-C24 U1 U21 D1、D3、 D5 D4 D6 ISP J1、J2、J3、J10 J4 J5、J8 J6、J7 J9 J11 LCD LS1 RP1 RV1-RV5 X1 S1-S10

系统总原理图如图6.4所示,它除了包括上面介绍的AT89C51外围电路模块、LCD液晶显示模块、RS232模块,还包括3个可变电阻接口、8个开关接口、4个LED显示灯、1个报警喇叭接口以及P0、P1、P2和P3的预留接口。这些接口可供不同的串行通信作控制、指示和硬件调试备用。

此原理图在Proteus 原理图编辑区进行绘制,其方法已在上一章介绍,绘制过程在此不再累述。

41

图6.4 系统总原理图

42

6.3基于Proteus ARES的最小系统PCB制作

串行通信最小系统的原理图绘制完成以后,就可以利用Proteus ARES编辑环境进行PCB绘制工作,在PCB绘制过程中,要进行元器件的封装、边框大小的绘制、放置元件、根据原理图连线、覆铜和加标注以及3D预览等工作。

1.元器件的封装

在ISIS中添加元件时,大部分元件都已经配置了一个封装(有部分元件要手动添加封装)。但这个封装并不一定适合系统的设计,因此需要重新添加适合的封装。

在元器件库中找不到ISP器件,通过ISIS编辑器绘制了一个ISP元器件,为元器件添加封装信息。双击ISP元器件,在弹出的属性对话框如图6.5所示中单击PCB Package后面的问号,将弹出如图6.6所示的对话框,在Keywords输入TRANS 10 DIL,点击“OK”即可。

图6.5 ISP的属性对话框

图6.6 元器件选择框

调整好所有元件的封装后,到菜单“Tools /Netlist Compiler”,接着打开Netlist Compiler设置对话框,上面的设置保持默认就行了,单击OK 生成网表文件。

43

紧接的工作就是将网表文件导入到ARES。到菜单“Tools/Netlist to ARES”,这样就会打开ARES(你也可以利用工具栏的相应按钮来完成这一操作)。

ARES 工作界面如图6.7所示。

图6.7 ARES 工作界面

2.画边框

在放置元件前,我们必须要画一个版框,之后所有的元件将在版框内布线。我们用2D Graphics Box工具绘制版框,绘制前,我们要先给它设置颜色,因为这个是边框,所以我们应该选黄色(Board Edge),该设置工具位于主窗口底部。在工作区点击后,按住左键不放,拖出一个适当大小的矩形,释放左键,我们就绘制好了版框。如果以后想修改这个版框,你需要再次单击2D Graphics Box 中的矩形符号,在版框的边框上单击右键,这是会出现控制点,拖动控制点就可以调整版框的大小了,本系统的版框设置为10065mm的矩形,结果如图6.7工作界面中编辑区的内部矩形框所示。

44

3. 元件放置

点击绘图工具栏中的选择元器件按钮 ,在对象选择器窗口中显示元件名如图6.8所示。单击菜单栏中的“Tools/Auto Placer”在弹出的自动放置属性对话框中直接点击“OK”即可看到如图6.9所示。

图6.8 器件显示

自动放置好后的元器件,位置不是很合适,需手动调整,使其位置达到自己满意的布局。

4.连线

调整好元器件布局后,进行自动布线,

“Tools/Auto Router”在弹出的自动布线属性对话框中直接点击“Begin Routing”,然后放置六个过孔,以备固定之用,之后即可看到如图6.10所示布线好的图。

图6.9 元器件放置

45

图6.10 自动布线图

5.覆铜和加标注

为了减小地线阻抗,提高抗干扰能力、电源利用效率和散热速度,增强美感,因此给电路板进行覆铜。单击绘图工具栏中的覆铜按钮 ,沿着边框画线一圈,即可。为了描述电路板的一些信息,在已经覆铜好的PCB板上加上一定的信息。单击绘图工具栏中的文本按钮 ,弹出如图6.11所示的对话框,在对话框的“String:”后的方框中输入“DATA:2010-05-10”单击“OK”即可在板上出现制板日期。其他信息用同样的方法加上去即可。最终的PCB电路板如图6.12所示。

图6.11 文本编辑对话框

46

图6.12 系统PCB板

6. 3D预览

布线已经完成,使用3D工具进行预览,看它生产安装完成后会是什么样子,并生产原型之前进行修改。从ARES的Output菜单调用“3D Visualization Engine”,打开3D预览工具,即可看到如图6.13所示的3D仿真图[3][17]。

图6.13 3D仿真图

6.4本章小结

本章对串行通信最小系统的模块化电路进行了设计和芯片的选取,在Proteus环境中完成了最小系统的电路原理图设计以及PCB绘制工作。至此本设计的核心内容已基本结束。全文将进入总结阶段。

47

总结与展望

本论文完成了基于Proteus的AT89C51单片机串行通信系统的设计与仿真,并利用Proteus ARES制作了一个单片机实验板PCB。由于串行通信方式多,AT89C51又有4种工作模式,怎样才能够将单片机串行通信的功能最大程度地在Prteus软件上仿真,而又不至于逐一仿真各个通信方式,使论文繁杂而冗余。最终选定工业现场最为常用的半双工通信方式,可以方便的控制系统之间数据的传送方向。系统方案确定以后,接下完成系统硬件、软件的设计并进行了仿真。虽然仿真结果与系统设计预期的结果一致,但系统所采用的通信协议并不能完成工业现场的数据传送,因此本系统还有待改善的地方。

EDA 技术是电子设计领域的一场革命,目前正处于高速发展阶段,每年都有新的EDA 工具问世,我国EDA 技术的应用水平长期落后于发达国家[18]。因此,我们应该尽早掌握这一先进技术,在学生阶段就尽可能地接触EDA 设计理念,而Proteus为我们提供了一个很好的学习以及设计平台。应用EDA 做设计开发,这不仅是提高设计效率的需要,更是我国电子工业在世界市场上生存、竞争与发展的需要[19]。EDA 设计方案取代传统的硬件设计调试方法将是大势所趋。

48

致谢

弹指一挥间,转眼已三个月。在这三个月的毕业设计过程中,我要衷心地感谢我的导师从宏寿老师。在本人毕业设计的整个过程中,从论文的选题、资料的查询、开题、研究、实现,一直到撰稿的每一个环节,导师都给予了耐心的指导和适时的鼓励,使我能够解决毕业设计过程中遇到的难题。从宏寿老师善于培养学生分析问题、解决问题的能力,从他那里我不仅学到了许多专业知识和技能,而且还学到了他为人师表的精神和严谨的工作作风,以及对研究工作一丝不苟的态度。在此谨向导师在学术上的教诲和指导致以崇高的敬意和衷心的感谢。

在论文结束之际要特别感谢我的父母,是他们给予了我生活和学习方面无限的支持与帮助。

衷心感谢所有帮助和关心过我的人!

最后,对百忙之中抽出时间审阅本论文的答辩委员会的各位老师表示衷心感谢,感谢您们给予的批评和指导意见。谢谢!

参考文献

[1] 蔡亚洲.单片机的应用与开发技巧[J].科技风.2009(19):205.

[2] 周润景.EDA 设计技术在电子类实践教学中的应用初探[J].Proteus在电气类教 学与科研中的应用研讨会专刊.2009:30-34.

49

[3] 朱清慧,张凤蕊,翟天嵩,王志奎.Proteus教程--电子线路设计制版与仿真[M]. 北京:清华大学出版社.2008.

[4] 堂前辉,丁明亮.Proteus ISIS和Keil在单片机教学中的应用[J].重庆电力高 等专科学校学报.2006,11(4):46-49.

[5] 殷士勇.Keil和Proteus在单片机实验教学中的应用[J].重庆工商大学学报(自 然科学版).2009,26(6):567-570. [6] 潘勇,孟庆斌.基于Proteus对单片机通信实验的改进[J].实验室科学.2008(6): 114-115.

[7] 刘海成.单片机及应用系统设计原理与实践[M].北京:北京航空航天大学出版社. 2009.

[8] 赵建领,薛园园.51单片机开发与应用技术详解[M].北京:电子工业出版社. 2009. [9] 谢维成,杨家国.单片机原理与应用及C51程序设计[M].北京:清华大学出版社. 2009.

[10]徐煜明.C51单片机及应用系统设计[M].北京:电子工业出版社.2009.

[11]刘同法,陈忠平,眭仁武.单片机基础与最小系统实践[M].北京:北京航空航天 大学出版社.2007:(8).

[12]张靖武,周灵彬.单片机原理、应用与Proteus仿真[M].北京:电子工业出版社 .2008.

[13]深圳市中源单片机发展有限公司.AT89C51中文资料[Z].www.zymcu.com.

[14]王东峰,王会良,董冠强.单片机C语言应用100例[M].北京:电子工业出版社

.2009.

[15]Matthew Chapman.THE FINAL WORD ON THE 8051[M].www.ithov.com.1994. [16]Labcenter Electronics Ltd. Proteus Introduction[Z].

[17]周润景,张丽娜. 基于Proteus 的电路及单片机系统的设计与仿真[M]. 北京: 北京航空航天大学出版社,2006.

[18]李学礼,林海峰.基于Proteus软件的单片机实验室建设[J].单片机与嵌入式系 统应用.2005(9):5-6.

[19]周华,王斐.EDA技术的特点与发展趋势[M].西安航空技术高等专科学校学报.

2009,27:21-23.

50

附录一

系统总原理图

51

因篇幅问题不能全部显示,请点此查看更多更全内容