电子表单片机报告

时间:2024.4.21

单片机应用系统设计说明书

设计题目:基于Proteus的多功能数字钟设计  

一、系统设计小组工作分工

二.系统设计目标

 

本文介绍了PROTEUS与Keil联调开发51系列单片机应用系统的方法以及基于PROTEUS环境下的带闹铃功能的时钟的仿真设计。将Keil C开发的程序用Proteus设计的仿真电路中交互运行调试的方法,设计LCD显示时钟。在基于PROTEUS环境下的带闹铃功能的时钟的仿真设计中,使用AT89C51芯片自带的定时器实现时钟功能,然后显示在LCD显示屏上。通过在Proteus环境下的实验证明,在PROTEUS环境下可以完成单片机系统的硬件设计和软件调试,测试系统的性能,在实际应用中可以降低设计成本,缩短开发周期,提高效率。 

关键词:Proteus;仿真;单片机;时钟;闹钟

目录

第一章 绪论... 4

1.1 研究背景... 4

1.2选题的意义... 4

第二章 Proteus时钟显示的硬件部分... 7

2.1 硬件电路图... 7

2.1.1 用LM1601LCD设计的电路图... 7

2.1.2 工作原理... 8

2.2 单片机部分... 8

2.2.1 单片机的选择... 8

2.2.2 单片机简介... 8

2.3 显示部分... 12

第三章 Proteus时钟显示的软件部分... 14

3.1 软件简介... 14

3.1.1 Keil简介... 14

3.1.2 Proteus简介... 16

3.2 Proteus软件与Keil uVision3软件联合仿真的建立... 18

3.3 PROTEUS中仿真实验的一般流程... 20

3.4 软件设计... 21

3.5 软硬联合调试... 24

结 论... 24

第一章 绪论

1.1 研究背景

近年来,由于微电子技术的迅猛发展,在单片机价格降低的同时其性能不断提高,使得单片机的应用范围得到了极大的扩展,在汽车、通信、办公自动化、工业控制、高级玩具、家用电器等方面都得到了广泛的应用。

单片机作为一种典型的嵌入式系统,其系统设计包括硬件电路设计和控制程序设计两个方面,其调试过程一般分为软件调试、硬件测试、系统调试3个过程。软件调试一般比较容易进行,但如果要进行硬件电路测试和系统调试则比较麻烦,因为要进行这两个过程必须在电路板制作完成、元器件焊接完毕之后进行。而电路板的制作、元器件的安装、焊接是费时费力的,如果采用作为单片机系统的仿真工具PROTEUS VSM ,则不用制作具体的电路板也能够完成以上工作。毫无疑问,在使用PROTEUS VSM 进行系统虚拟开发成功之后再进行实际制作,必然可以提高开发效率、降低开发成本、提高开发速度,而这些因素对于企业来讲是非常重要的。

1.2选题的意义

Proteus是由英国Labcenter electronics公司开发的EDA工具软件。它从1989年出现到现在已经有十多年的历史,在全球广泛使用。Proteus安装以后,主要由两个程序组成:Ares和Isis。前者主要用于PCB自动或人工布线及其电路仿真,后者主要采用原理布图的方法绘制电路并进行相应的仿真。除了上述基本应用之外,Proteus革命性的功能在于它的电路仿真是互动的,针对微处理器的应用,可以直接在基于原理图的虚拟原型上编程,并实现软件代码级的调试,还可以直接实时动态地模拟按钮、键盘的输入,LED、液晶显示的输出,同时配合虚拟工具如示波器、逻辑分析仪等进行相应的测量和观测。

Proteus软件的应用范围十分广泛,涉及PCB制版、spice电路仿真、单片机仿真,在最新的6.9版本中又加入了对ARM7/LPC2000的仿真。本论文主要以单片机的仿真为例,初步探讨该软件的强大功能及其在工程实践和实验教学中的重要作用。

传统的实验的不足之处,可以采用虚拟电子实验来弥补。以虚拟仿真技术为基础的虚拟电子实验室具有很多优点。

1.虚拟仿真软件提供丰富的元器件,可具备数千种类型的元器件及各类元器件的理想参数,此外还可进行扩充,用户也可以自己创建新元件。

2.虚拟仿真软件提供多种虚拟仪器,其功能与实际仪表相同。通过这些虚拟仪器,可免去昂贵的仪表费用,并且不用担心仪器会损害。

3.用户界面友好,易学易用。整个操作界面就像一个电子实验工作台,绘制电路所需的元器件和仿真所需的测试仪器均可直接拖放到屏幕上,点击鼠标就可以将它们连接起来。避免了传统实验中连接线的反复插拔,并解决了常见的连接线连通故障问题。

4.在课堂演示教学时,可通过投影仪和大屏幕展示电路的连接,通过虚拟仪器对电路进行分析测量,将分析结果直观的展示出来,帮助学生理解抽象的概念和原理。

5.具备强大的仿真能力,能完成某些硬件实验无法实现的效果。在虚拟仿真软件中,既可对模拟电路、数字电路、单片机进行分别仿真,也可以对其进行混合仿真。在实际的实验中,为避免仪器的损伤,参数设置需要有一定的范围,而虚拟仪器不存在这样的问题,可观察到在特殊情况下出现的现象。

当然,虚拟仿真不能完全替代真实的实验,只是在很多情况下具有可行性和优越性,是现代计算机技术和先进的教学理论在电子实验中的应用,具有广阔的发展前景。

自己在学习单片机的时候,有时候发现单片机的调试与仿真很麻烦,当时就想着有没有一种软件能够用于单片机的仿真,这样可以省去好多在硬件上调试的功夫与时间。于是上网查了一些相关的资料,发现真的有这样的一种软件存在,那就是Proteus软件。

Proteus 是英国Labcenter公司开发的电路分析与实物仿真软件。它运行于Windows操作系统上,可以仿真、分析(SPICE)各种模拟器件和集成电路,该软件的特点是:

①实现了单片机仿真和SPICE电路仿真相结合。具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。

②支持主流单片机系统的仿真。目前支持的单片机类型有:ARM7(LPC21xx)、 8051/52系列、AVR系列、PIC10/12/16/18系列、HC11系列以及多种外围芯片。

③提供软件调试功能。在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状态,因此在该软件仿真系统中,也必须具有这些功能;同时支持第三方的软件编译和调试环境,如Keil C51 uVision2、MPLAB等软件。

④具有强大的原理图绘制功能。总之,该软件是一款集单片机和SPICE分析于一身的仿真软件,功能极其强大。

第二章 Proteus时钟显示的硬件部分

2.1 硬件电路图

2.1.1 用1602LCD设计的电路图

图2-1为1602LCD设计的电路图。

图2-1 1602LCD设计的电路图

2.1.2 工作原理

本系统主要有AT89C51单片机[3]、LCD显示器LM016L、蜂鸣器、若干发光二极管和按钮等元器件组成。RP1为上拉电阻,LCD显示器采用外部电源供电。AT89C51是整个装置的控制核心,AT89C51内带4K字节的闪存可编程可擦除只读存储器,用户程序存放在这里。其自带的定时器用定时触发中断的方式实现时钟的功能,LCD显示器LM016L用来显示时间与各种功能的显示。蜂鸣器与发光二极管用来进行上下午的指示与闹钟的实现。按键实现对系统各功能的控制。系统程序分时钟控制程序和显示器程序两部分。系统的工作是在程序控制下,完成对时钟的显示。

2.2 单片机部分

2.2.1 单片机的选择

  本论文我们采用AT89C51单片机。

2.2.2 单片机简介

在计算机出现以前,有不少能工巧匠做出了不少精巧的机械。进入电器时代后,人们借助电气技术实现了自动控制机械,自动生产线甚至自动工厂,并且大大地发展了控制理论。然而,在一些大中型系统中自动化效果均不理想。只有在计算机出现后,人们才见到了希望的曙光。如今借助计算机逐渐实现了人类的梦想。但是,计算机出现后的相当长的时间里,计算机作为科学武器,在科学的神圣殿堂里默默地工作,而工业现场的测控领域并没有得到真正的应用。只有在单片机(Microcontroller)出现后,计算机才真正地从科学的神圣殿堂走入寻常百姓家,成为广大工程技术人员现代化技术革新,技术革命的有利武器。目前,单片机在民用和工业测控领域得到很广泛的应用。彩电,冰箱,空调,录像机,VCD,遥控器,游戏机,电饭煲等无处不见单片机的影子,单片机早已深深地溶入我们每个人的生活之中。可以说,对于广大的电子应用专业技术人员,目前国和内国外面临的单片机应用技术,如同60年代面临晶体管技术,70年代面临数字集成电路一样。单片机和可编程门阵列相结合,构成新一代电子应用技术是不可能回避的一项新型的工程应用技术。

单片机的用途[4]

(1) 在智能仪表中的应用

这是单片机应用最多最活跃的领域之一。在各类仪器仪表中引入单片机,使仪器仪表智能化,提高测试的自动化程度和精度,简化仪器仪表的硬件结构,提高其性能价格比。

(2) 在机电一体化中的应用

机电一体化产品是指集机械技术,微电子技术,计算机技术于一体,使其产品具有智能化特征的电子产品。它是机械工业发展的方向。

(3) 在实时控制系统中的应用

单片机广泛用于各种实时过程控制系统中,例如工业过程控制、过程监测、航空航天、间断武器、机器人系统等各种实时控制系统。用单片机进行实时系统数据处理和控制,保证系统工作在最佳状态,有利于提高系统的工作效率和产品的质量。

(4)在人们生活中的应用

目前国内外各种家具已经普遍用单片机代替传统的控制电路,例如,洗衣机、电冰箱、空调机、微波炉、电饭煲、收音机、音像、电风扇及许多高级电子玩具都配上了单片机。

(5)在其他方面的应用

单片机还广泛应用于办公自动化领域、商业营销领域、安全防卫、汽车及通信系统、计算机外部设备、模糊控制等领域。

本设计使用AT89C51芯片,AT89C51[5]是一种带4K字节闪存可编程可擦除只读存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压,高性能CMOS 8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

引脚功能说明:

AT89C51芯片如图2-2所示。

wps_clip_image-8932

图2-2 AT89C51

VCC:供电电压。  

GND:接地。  

P0:P0口为一个8位漏极开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。  

P1:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。  

P2:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。  

P3:P3口管脚是8个内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。  

P3口也可作为AT89C51的一些特殊功能口,如下所示:  

口管脚 备选功能  

P3.0 RXD(串行输入口)  

P3.1 TXD(串行输出口)  

P3.2 (外部中断0)  

P3.3 (外部中断1)  

P3.4 T0(记时器0外部输入)  

P3.5 T1(记时器1外部输入)  

P3.6 (外部数据存储器写选通)  

P3.7 (外部数据存储器读选通)  

P3口同时为闪烁编程和编程校验接收一些控制信号。  

RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。  

ALE:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。  

:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次有效。但在访问外部数据存储器时,这两次有效的信号将不出现。  

:当保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,将内部锁定为RESET;当端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。  

XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。  

XTAL2:来自反向振荡器的输出。  

振荡器特性:   XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。

2.5 显示部分

本设计用1602LCD液晶显示。 LCD显示用来显示当前时钟与闹钟时间。当运行PROTEUS软件时,可以清楚的看到时间。

2.5.1  LCD液晶显示

从液晶显示器的结构来看,无论是笔记本电脑还是桌面系统,采用的LCD显示屏如图2-8都是由不同部分组成的分层结构。LCD由两块玻璃板构成,厚约1mm,其间由包含有液晶材料的5μm均匀间隔隔开。因为液晶材料本身并不发光,所以在显示屏两边都设有作为光源的灯管,而在液晶显示屏背面有一块背光板(或称匀光板)和反光膜,背光板是由荧光物质组成的可以发射光线,其作用主要是提供均匀的背景光源。

背光板发出的光线在穿过第一层偏振过滤层之后进入包含成千上万液晶液滴的液晶层。液晶层中的液滴都被包含在细小的单元格结构中,一个或多个单元格构成屏幕上的一个像素。在玻璃板与液晶材料之间是透明的电极,电极分为行和列,在行与列的交叉点上,通过改变电压而改变液晶的旋光状态,液晶材料的作用类似于一个个小的光阀。在液晶材料周边是控制电路部分和驱动电路部分。当LCD中的电极产生电场时,液晶分子就会产生扭曲,从而将穿越其中的光线进行有规则的折射,然后经过第二层过滤层的过滤在屏幕上显示出来。

液晶显示技术也存在弱点和技术瓶颈,与CRT显示器相比亮度、画面均匀度、可视角度和反应时间上都存在明显的差距。其中反应时间和可视角度均取决于液晶面板的质量,画面均匀度和辅助光学模块有很大关系。

对于液晶显示器来说,亮度往往和他的背板光源有关。背板光源越亮,整个液晶显示器的亮度也会随之提高。而在早期的液晶显示器中,因为只使用2个冷光源灯管,往往会造成亮度不均匀等现象,同时明亮度也不尽人意。一直到后来使用4个冷光源灯管产品的推出,才有很大的改善。

信号反应时间也就是液晶显示器的液晶单元响应延迟。实际上就是指的液晶单元从一种分子排列状态转变成另外一种分子排列状态所需要的时间,响应时间愈小愈好,它反应了液晶显示器各像素点对输入信号反应的速度,即屏幕由暗转亮或由亮转暗的速度。响应时间越小则使用者在看运动画面时不会出现尾影拖拽的感觉。有些厂商会通过将液晶体内的导电离子浓度降低来实现信号的快速响应,但其色彩饱和度、亮度、对比度就会产生相应的降低,甚至产生偏色的现象。这样信号反应时间上去了,但却牺牲了液晶显示器的显示效果。有些厂商采用的是在显示电路中加入了一片IC图像输出控制芯片,专门对显示信号进行处理的方法来实现的。IC芯片可以根据VGA输出显卡信号频率,调整信号响应时间。由于没有改变液晶体的物理性质,因此对其亮度、对比度、 色彩饱和度都没有影响,这种方法的制造成本也相对较高。本设计使用1602LCD显示。

wps_clip_image-15104

图2-8 LCD

1602LCD一般初始化上电复位初始化,对模块进行了下列指令的操作:
  ①清显示,功能设置:
      DL=1:8 位数据接口;
      N=0 :一行显示;
      F=0:5X8 点阵字符字体;
  ②显示开/关控制:
      D=0:关显示;
      C=0:不显示光标;
      B=0:关闪烁;
  ③输入模式设置:
      I/D=1:AC  自动加1;
      S=0:不移位;

需要说明的是,倘若供电电源达不到要求,模块内部复位电路非正常操作,上电复位初始化就会失败。此时,建议用户通过指令设置对模块进行初始化。

第三章 Proteus时钟显示的软件部分

3.1 软件简介

3.1.1 Keil简介

Keil[11]是由美国Keil Software公司出品的单片机开发工具,它是目前最流行的单片机开发工具之一,该软件平台主要包括:C51交叉编译器、A51宏汇编器、BL51连接/重定位器、LIB51库管理器、OH51 Intel HEX格式文件转换器、RTX-51实时操作系统以单片机软件仿真Dscope 51,它将项目管理、源代码编译、程序调试等集成到一个功能强大的Windows 32平台中,支持51汇编、PLM和C语言的混合编程,功能强大、界面友好、易学易用。Proteus是由英国Labcenter公司开发的EDA工具软件,它同其他EDA工具软件一样,能进行原理图编辑、PCB自动及手动布线和电路仿真,而它的特点就在于其强大的仿真功能,不仅可以仿真模拟、数字电路,还可以仿真可编程器件,如单片机、PLD等。

单片机[5]开发中除必要的硬件外,同样离不开软件,我们写的汇编语言源程序要变为CPU可以执行的机器码有两种方法,一种是手工汇编,另一种是机器汇编,目前已极少使用手工汇编的方法了。机器汇编是通过汇编软件将源程序变为机器码,用于MCS-51单片机的汇编软件有早期的A51,随着单片机开发技术的不断发展,从普遍使用汇编语言到逐渐使用高级语言开发,单片机的开发软件也在不断发展,Keil软件是目前最流行开发MCS-51系列单片机的软件,这从近年来各仿真机厂商纷纷宣布全面支持Keil即可看出。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部份组合在一起。运行Keil软件需要Pentium或以上的CPU,16MB或更多RAM、20M以上空闲的硬盘空间、WIN98、NT、WIN20##、WINXP等操作系统。掌握这一软件的使用对于使用51系列单片机的爱好者来说是十分必要的,如果你使用C语言编程,那么Keil几乎就是你的不二之选(目前在国内你只能买到该软件、而你买的仿真机也很可能只支持该软件),即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。

Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。用过汇编语言后再使用C来开发,体会更加深刻。

Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。下面详细介绍Keil C51开发系统各部分功能和使用。

C51[7]工具包的整体结构,其中uVision与Ishell分别是C51 for Windows和for Dos的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。开发人员可用IDE本身或其它编辑器编辑C或汇编源文件。然后分别由C51及A51编译器编译生成目标文件(.OBJ)。目标文件可由LIB51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。ABS文件由OH51转换成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。

  使用独立的Keil仿真器时,注意事项 :

  1.仿真器标配11.0592MHz的晶振,但用户可以在仿真器上的晶振插孔中换插其他频率的晶振。

  2.仿真器上的复位按钮只复位仿真芯片,不复位目标系统。

  3.仿真芯片的31脚()已接至高电平,所以仿真时只能使用片内ROM,不能使用片外ROM;但仿真器外引插针中的31脚并不与仿真芯片的31脚相连,故该仿真器仍可插入到扩展有外部ROM(其CPU的引脚接至低电平)的目标系统中使用。

Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。

3.1.2 Proteus简介

Proteus[6]软件是来自英国Labcenter electronics公司的EDA工具软件,是一个电子设计的教学平台、实验平台和创新平台,涵盖了电工电子实验室、电子技术实验室、单片机应用实验室等的全部功能。它是一种组合了高级原理布图、混合模式SPICE仿真、PCB设计以及自动布线进行完整的电子设计的软件。采用Proteus仿真软件进行虚拟单片机实验,可以仿真单片机及其外围器件电路,可用来仿真51系列、AVR、PIC等常用的MCU及其外围电路,具有比较明显的优势,如涉及到的实验实习内容全面、硬件投入少、学生可以自行实验、实验过程

中损耗小、与工程实践最为接近等。它提供了30多个元件库,数千种元件,涉及到数字和模拟、交流和直流等,并且有丰富的仪表资源。

(1)   Proteus 的工作过程[21]

运行proteus 的ISIS程序后,进入该仿真软件的主界面。在工作前,要设置view 菜单下的捕捉对齐和system下的颜色、图形界面大小等项目。通过工具栏中的p(从库中选择元件命令)命令,在pick devices 窗口中选择电路所需的元件,放置元件并调整其相对位置,元件参数设置,元器件间连线,编写程序;在source 菜单的Definecode generation tools 菜单命令下,选择程序编译的工具、路径、扩展名等项目;在source 菜单的Add/remove source files 命令下,加入单片机硬件电路的对应程序;通过debug 菜单的相应命令仿真程序和电路的运行情况。

(2)Proteus 软件所提供的元件资源

Proteus 软件所提供了30 多个元件库,数千种元件。元件涉及到数字和模拟、交流和直流等。

(3)Proteus 软件所提供的仪表资源

对于一个仿真软件或实验室,测试的仪器仪表的数量、类型和质量,是衡量实验室是否合格的一个关键因素。在Proteus 软件包中,不存在同类仪表使用数量的问题。

       Proteus 还提供了一个图形显示功能,可以将线路上变化的信号,以图形的方式实时地显示出来,其作用与示波器相似但功能更多。

(4)Proteus 软件所提供的调试手段[8]

       Proteus 提供了比较丰富的测试信号用于电路的测试。这些测试信号包括模拟信号和数字信号。

       对于单片机硬件电路和软件的调试,Proteus 提供了两种方法:一种是系统总体执行效果,一种是对软件的分步调试以看具体的执行情况。

       对于总体执行效果的调试方法,只需要执行debug 菜单下的execute 菜单项或F12 快捷键启动执行,用debug菜单下的pause animation 菜单项或pause 键暂停系统的运行;或用debug 菜单下的stop animation 菜单项或shift-break 组合键停止系统的运行。其运行方式也可以选择工具栏中的相应工具进行。

       对于软件的分步调试,应先执行debug 菜单下的start/restart debugging 菜单项命令,此时可以选择step over 、step into 和 step out 命令执行程序(可以用快捷键F10、F11 和ctrl+F11),执行的效果是单句执行、进入子程序执行和跳出子程序执行。在执行了start / restart debugging 命令后,在debug 菜单的下面要出现仿真中所涉及到的软件列表和单片机的系统资源等,可供调试时分析和查看。

Proteus软件按其功能可分为三大部分[12]

1.智能原理图输入系统ISIS(Intelligent SchematicInput System),用于编辑电路原理图,软件自带元件库,元件库中虚拟元件品种丰富,包含超过8000个虚拟元件,编辑电路原理图只需从元件库中找到相应元件并将其拖曳到编辑窗口,用导线将元器件引脚连接即可;

2.虚拟系统模型VSM(Virtual System Modelling),是一个完整的嵌入式系统软、硬件设计仿真平台,包含动态器件库、高级图形分析模块、微控制器虚拟仿真和基于工业标准的SPICE3F5混合型电路仿真器,它不仅可以实现对传统模拟、数字电路的仿真,还能支持ARM7、PIC、AVR、MCS-51等系列的微处理器及PLD的硬件仿真,能支持与多种第三方IDE软件,如Keil的联合调试;

3.ARES高级布线编辑软件(Advanced Routingand Editing Software),可简捷地将ISIS原理图转换为PCB图,最大能支持16个铜箔层、2个丝印层和4个机械层。

在此,我们对Keil仅使用其进行C或者汇编语言的编辑,调试、编译生成hex文件,对proteus仅使用ISIS和VSM功能,编辑原理图,捆绑由Keil生成的hex文件,进行电路仿真

3.2 Proteus软件与Keil uVision3软件联合仿真的建立

Proteus软件与Keil uVision3软件之间可有相互独立和相互联合两种方式进行单片机系统的虚拟仿真。如用Proteus软件独立进行虚拟仿真,就是用Keil uVision3软件的编辑控制程序,在Keil uVision3软件的Option for Target“Target1”选项卡Output中选择Create HEX File选项,然后进行编译,生成*.HEX文件如图3-1。然后,将该文件转到Proteus的ISIS模块中,在所仿真的电路中打开单片机的编辑对话框Edit Component如图3-2,在此窗口中的Program File栏中,选择通过编译生成的*.HEX文件,并在Clock Frequency栏中设置单片机的晶振频率,点击OK完成Edit Component窗口的设置。最后,点击Proteus软件的仿真启动按钮实现电路的仿真。

wps_clip_image-20333

图3-1 生成*.HEX文件

图3-2 对话框Edit Component

    Proteus软件与Keil uVision3软件之间的联合虚拟仿真,指Keil uVision3软件将Proteus软件打开的单片机系统看成一个虚拟的硬件电路,使用Keil uVision3软件对程序进行编译、调试时自动连接Proteus软件中的虚拟单片机系统,虚拟单片机系统的状态随Keil uVision3软件对程序调试实时变化。这样,可实现用Proteus软件与Keil uVision3软件联合虚拟硬件仿真。要实现联合虚拟硬件仿真就必须对Proteus软件与KeiluVision3软件进行如下设置:

1.安装好Proteus软件和Keil uVision3软件后,安装压缩包中的vdmagdi.exe文件,此时在路径为Keil\c51\bin的文件夹里有VDM51.DLL文件。

2.将压缩包中的Prospice.dll文件复制到Proteus7.1根目录的BIN文件夹中,并将原来的文件覆盖。

3.在Proteus软件中打开要仿真的单片机系统原理图,并在Debug菜单中选择Use remote debug monitor。

4.在Keil uVision3软件中打开要进行联合仿真的项目和程序,点击Project并 在Option for Target“Target1”选项卡Debug中选择Use Proteus VSM Simulator。然后,点击Setting按钮进入Host IP和端口Port的设置,如果在同一台计算机上进行联合仿真,则Host IP地址为127.0.0.1,端口设置为8000。如果两台计算机通过互联网进行联合仿真,则Host IP地址为这台计算机的网上IP地址,端口也为8000,这样,就可以实现一台计算机的Keil uVision3软件平台通过互联网去连接远程的另一台计算机,并远程控制另一台计算机的Proteus软件实现虚拟仿真。按上述的步骤进行设置后,Proteus软件和Keil uVision3软件之间即可进行联合仿真。

3.3 PROTEUS中仿真实验的一般流程

电路设计的第一步是进行原理图设计,这是电路设计的基础。只有在设计好的原理图的基础上才可以进行电路图的仿真等。电路原理图的设计流程如图3-15所示:

(1) 新建设计文档。在进行原理图的设计前,首先要构思好原理图,即必须知道所设计的项目需要哪些电路、元器件来完成,用何种模板,然后在PROTEUS ISIS编辑环境中画出电路原理图。

(2) 设置工作环境。根据实际电路的复杂程度来设置图纸的大小及注释的风格等在电路图设计的整个过程中,图纸的大小可以不断地调整。设置合适的图纸大小是完成原理图设计的第一步。

(3) 放置元器件。根据需要从元器件库中添加相应的类;然后从添加元器件对话框中选取需要添加的元器件,将其布置到图纸的合适位置,并对元器件的名称、标注进行设定;在根据元器件之间的走线等联系对元器件在工作平面上的位置进行调整和修改,使得原理图美观、易懂。

(4) 对原理图进行布线。根据实际电路的需要,利用PROTEUS ISIS编辑环境提供的各种工具、指令进行布线,将工作平面上的元器件用导线连接起来,构成一幅完整的电路原理图。

(5) 建立网络表。在完成上述步骤之后,即可看到一张完整的电路图;但要完成电路板的设计,还需要生成网络表文件。网络表是电路板和电路原理图之间的纽带。

(6) 对原理图进行电气规则检查。当完成原理图布线后,利用PROTEUS ISIS编辑环境所提供的电气规则检查命令对设计进行检查,并根据系统提供的错误检查报告修改原理图。

(7) 调整。如果原理图已经通过电气规则检验,那么原理图的设计就完成了,但是对于一般电路设计而言,尤其是较大的项目,通常需要对电路多次修改才能通过电气规则检测。

(8) 存盘和输出报表。PROTEUS ISIS提供了多种报表输出格式,同时可以对设计好的原理图和报表进行存盘和输出打印。

3.4 软件设计

   系统程序分时钟控制程序、显示器程序、声光提示程序和按键扫描程序四部分。系统的工作是在程序控制下,完成对按键触发的响应和对实时时间和功能的显示,发光二极管进行上下午以及闹铃触发的光提示,蜂鸣器进行闹铃触发的声提示。

系统仿真软件流程图如图3-3。

QQ截图20111213203312.jpg

图3-3 系统仿真软件流程图

3.5 软硬联合调试

整个软件通过C语言编程,先在Keil C51集成开发环境下将编好的程序进行编译、调试,调试通过后会生成数码管。HEX文件.运行PROTEUS如图3-4模拟仿真软件,打开已绘制好的仿真电路原理图,选中单片机AT89C5l,左键点击AT89C5l,出现对应的对话框如图3-5,在Program File中找到编译好的“温度.HEX”文件,然后点击“OK”就可以进行仿真了。点击模拟调试按钮的运行按键,进入调试状态,此时可以看到循环显示所采集到的温度值如图3-6.

wps_clip_image-23499

图3-4 Proteus启动画面

图3-5 对话框

图3-6显示

结 论

    从开始接到论文题目到系统的实现,再到论文文章的完成,每走一步对我来说都是新的尝试与挑战。这次做论文的经历也会使我终身受益,我感受到做论文是要真真正正用心去做的一件事情,是真正的自己学习的过程和研究的过程,没有学习就不可能有研究的能力,没有自己的研究,就不会有所突破,那也就不叫论文了。希望这次的经历能让我在以后学习中激励我继续进步。

     本设计利用Proteus与KEIL C51对单片机时钟显示系统进行了仿真设计.从设计结果可以看出,利用Proteus进行单片机系统的仿真设计可以极大地简化单片机程序在目标硬件上的调试工作,程序修改、编译后很快能看到效果,大幅度节省制作电路板的时间,非常适合于设计开发,对于提高产品的开发效率、降低开发成本等有重要意义。

程序如下:

//开闹铃时显示闹铃符号,关时不显示

//设置闹铃按1下进入 设置状态;按2下,退出设置状态;

//设置时间按1下进入设置状态,并停止计时;按2下,推出设置状态,并开始计时

//当设置闹铃、时间没按下时,调时、调分不起作用

//不可以在设置时间的过程中设置闹铃,不可以在设置闹铃的过程中设置时间

//设置闹铃后,闹铃时间在第一行显示

//每当设置闹铃时,闹铃都初始化为00:00,设置完后,闹铃消失

//lcd1602有64B的CGRAM,可用来写入自定义字符,5*8点阵的可写8个(每个占8字节),5*11点阵的可写4个(每个占16字节)

//写命令wcmd(0x40),显示所写入字符,送入数据0x00-0x07(对应显示8个字符)。

#include<reg52.h>

#include<ds18b20.h>

#define uint unsigned int

#define uchar unsigned char

void inc_second();

void inc_minute();

void inc_hour();

void beep();

void disp_sfm(uchar x,uchar y,uchar dat);

#define PORT P0

sbit lcdrs=P2^7;//LCD数据命令选择端

sbit lcden=P2^6;//LCD使能端

sbit setsj=P2^0;//设置时间

sbit setnl=P2^1;//设置闹铃

sbit ts=P2^2;//调整小时

sbit tf=P2^3;//调整分钟

sbit knl=P2^4;//开闹铃

sbit gnl=P2^5;//关闹铃

sbit lam=P1^0;//AM指示灯

sbit lpm=P1^1;//PM指示灯

sbit lnl=P1^2;//闹铃就绪指示灯

sbit fm=P3^6;//蜂鸣器端口

//sj为设置时间按下的标志,nlflag为闹铃键按下的标志;tzflag为调时(1)、分按下(2)的标志

uchar sj,tzflag,nlflag,tznl,wdnum,hwnum;

uchar hour,minute,second,tcnt,nlhour,nlminute,nldk;

uchar code table[]="    23:59:50";

uchar code bmp[]={0x0e,0x11,0x1f,0x00,0x0a,0x00,0x00,0x00,

0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00};//闹铃符号

void wcmd(uchar cmd)

{

       lcden=0;

       lcdrs=0;

       PORT=cmd;  

       delay(5);

       lcden=1;

       delay(5);

       lcden=0;

}

void wdata(uchar dat)

{

       lcden=0;

       lcdrs=1;

       PORT=dat;

       delay(5);

       lcden=1;

       delay(5);

       lcden=0;

}

void goxy(uchar x,uchar y)

{

       if(x==1)

              wcmd(0x80+y);

       else

              wcmd(0x80+0x40+y);

}

void disp_str(uchar *str)

{

       while(*str)

       {    

              wdata(*str);

              str++;

       }

}

void disp_bmp(uchar x,uchar y,uchar dat)

{

       goxy(x,y);

       wdata(dat);

}

void lcd_init()

{

        uchar i ;

       wcmd(0x38);//显示模式设置:16*2,5*7,8位数据接口

       wcmd(0x0c);//开显示,不显光标,光标不闪烁

       wcmd(0x06);//地址自动加1

       wcmd(0x01);//清屏

       wcmd(0x40);//写CGRAM

    for (i=0;i<16;i++)      

           wdata(bmp[i]);

       goxy(2,0);

       disp_str(table);      

}

void timer0_init()

{

       TMOD=0X01;

       TH0=0x4c;

       TL0=0;

       EA=1;

       ET0=1;

       TR0=1;

}

void timer0() interrupt 1

{

       TH0=0x4c;

       TL0=0;

       tcnt++;

       if(tcnt==20)

       {

              tcnt=0;

              inc_second();

              disp_sfm(2,4,hour);

              disp_sfm(2,7,minute);

              disp_sfm(2,10,second);

              wdata(' ');

              wdata(' ');

              wdata(' ');

              wdata(' ');

              wdata(' ');      

       }

}

inc_minute_nop()

{

       minute++;

       if(minute==60)

              minute=0;

}

void inc_second()

{

       second++;

       if(second==60)

       {

               second=0;

               inc_minute();

       }

       if(second%2)  //隔一秒":"闪一次

       {goxy(2,9);wdata(' ');}

       else

       {goxy(2,9);wdata(':');}

}

void inc_minute()

{

       minute++;

       if(minute==60)

       {

              minute=0;

              inc_hour();

       }

}

void inc_hour()

{

       hour++;

       if(hour==24)

              hour=0;  

}

void inc_nlminute()

{

       nlminute++;

       if(nlminute==60)

              nlminute=0;

}

void inc_nlhour()

{

       nlhour++;

       if(nlhour==24)

              nlhour=0;

}

void disp_sfm(uchar x,uchar y,uchar dat)

{

       uchar shi,ge;

       shi=dat/10+'0';

       ge=dat%10+'0'; //加'0'表示算出的数要加上0的ascII码才能显示出想要的数

       goxy(x,y);

       wdata(shi);

       wdata(ge);

}

void led_apm()

{

       if(hour<12)          

       {

              lpm=1;

              lam=0;

              goxy(2,0);

              wdata('A');

              wdata('M');

       }

       else

       {

              lam=1;

              lpm=0;

              goxy(2,0);

              wdata('P');

              wdata('M');

       }

}

void tzsjfun()

{

       if(nlflag==0)//若闹铃没按下,则可设置时间,否则无效

       {

                     if(setsj==0)

                     {

                            delay(2);

                            while(!setsj);

                            delay(2);

                            if(setsj==1) //表示按下了设置时间,且已经消抖

                            {                 

                                   sj++;      

                                   if(sj==1)

                                          TR0=0;//按下1次停止计时

                           

                                   if(sj==2) //第2次按下表示设置完毕

                                   {

                                          TR0=1;

                                          sj=0;                                  

                                   }

                            }                         

                     }

                  if(sj)//要调整时间

                     {

                            goxy(2,9);

                            wdata(':');

                            if(ts==0)

                            {

                                   delay(2);

                                   while(!ts);

                                   delay(2);

                                   if(ts==1)              

                                          tzflag=1;                                                                                                  

                            }

                            if(tf==0)

                            {

                                   delay(2);

                                   while(!tf);

                                   delay(2);

                                   if(tf==1)

                                          tzflag=2;                                   

                            }

                     }           

                     if(tzflag)

                     {

                            if(tzflag==1)

                            {                         

                                   tzflag=0;

                                   inc_hour();

                                   disp_sfm(2,4,hour);                                  

                            }

                            if(tzflag==2)

                            {

                                   tzflag=0;

                                   inc_minute_nop();

                                   disp_sfm(2,7,minute);                        

                            }

                     }

              }

      

}

void nl0()

{

       nlhour=0;

       nlminute=0;

       disp_sfm(1,4,nlhour);

       wdata(':');

       disp_sfm(1,7,nlminute);

}

void nldisappear()

{

       uchar i;

       goxy(1,0);

       for(i=0;i<9;i++)

              wdata(' ');

       delay(2);

}

void tznlfun()

{

       if(sj==0)//若设置时间没按下,则可设置闹铃,否则无效

       {    

              if(wdnum==0)

              {     if(setnl==0)

                     {

                            while(!setnl);

                            delay(5);

                            if(setnl==1)

                            {

                                   nlflag++;

                                   if(nlflag==1)

                                          nl0();                                                                                  

                                   if(nlflag==2)//按下1次闹铃键,设置闹铃;按下2次,设置完毕;

                                   {     nlflag=0;                            

                                          nldisappear();

                                   }

                            }    

                     }

                     if(nlflag)//要设置闹铃

                     {

                            if(nlhour<12)

                            {     goxy(1,0);

                                   wdata('A');

                                   wdata('M');

                            }

                            else

                            {

                                   goxy(1,0);

                                   wdata('P');

                                   wdata('M');

                            }

                            if(ts==0)

                            {

                                   while(!ts);

                                   delay(5);

                                   if(ts==1)

                                          tznl=1;                                                                         

                            }

                            if(tf==0)

                            {

                                   while(!tf);

                                   delay(5);

                                   if(tf==1)

                                          tznl=2;                                                                                                     

                            }

                     }

                     if(tznl)

                     {           

                            if(tznl==1)

                            {

                                   tznl=0;

                                   inc_nlhour();

                                   disp_sfm(1,4,nlhour);                               

                            }

                            if(tznl==2)

                            {

                                   tznl=0;

                                   inc_nlminute();

                                   disp_sfm(1,7,nlminute);

                            }

                     }

              }

       }

}

void kgnlfun()

{

       if(knl==0)

       {

              while(!knl);

              delay(5);

              if(knl==1)

              {

                     nldk=1;

                     disp_bmp(1,15,0x00);   

              }

       }

       if(gnl==0)

       {

              while(!gnl);

              delay(5);

              if(gnl==1)

              {

                      nldk=2;

                      goxy(1,15);

                      wdata(' ');

              }

       }

}

void nljx()

{

       if(nldk==1)

       {    

              goxy(1,15);

              wdata(0x00); 

              if((nlhour==hour)&&(nlminute==minute))               

              {    

                     lnl=0;

                     beep();                      

              }                         

              else

              {    

                     lnl=1;

                     fm=1;                  

              }    

       }

       else

       {

              goxy(1,15);

              wdata(' ');

              nldk=0;

              lnl=1;

              fm=1;

       }    

}

void keyscan()

{

       tzsjfun();

       tznlfun();

       kgnlfun();

       nljx();

void delay2()

{

       uint x;

       for(x=65;x>0;x--);       

}

void beep()

{

       uint x;

       for(x=20;x>0;x--)

       {

              fm=0;

              delay2();

              fm=1;

              delay2();

       }

}

void wbzd_init()

{

       EA=1;

       EX0=1;

       ET0=1;//下降沿触发

}

void wbzd0() interrupt 0

{

       hwnum++;

       if(hwnum==1)

              nldk=0;

       else

       {

              hwnum=0;

              nldk=1;

       }

}

void main()

{

       hour=23;minute=59;second=50;

       timer0_init();

       lcd_init();      

       wbzd_init();

       while(1)

       {    

              led_apm();            

              keyscan();             

       }

}    

个人体会

   通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。在制作PCB时,发现细心耐心,恒心一定要有才能做好事情,首先是线的布局上既要美观又要实用和走线简单,兼顾到方方面面去考虑是很需要的,否则只是一纸空话。
    在画好原理图后的做PCB版时,由于项目组成员对单面板的不熟悉,导致布线后元件出现在另一边,增加了布线难度,也产生很多不曾注意的问题,今后要牢记这个教训,使以后布线更加顺利。

这次课程设计终于顺利完成了,在设计中遇到了很多专业知识问题,最后在老师的辛勤指导下,终于游逆而解。同时,在老师的身上我们学也到很多实用的知识,在次我们表示感谢!同时,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!

更多相关推荐:
单片机报告

重庆科技学院课程设计成果院系电气与信息工程学院班级电自普1002班学生姓名邹锋学号20xx441603设计地点单位逸夫科技大楼I305设计题目多功能电脑时钟程序设计完成日期20xx年7月5日指导教师评语成绩五级...

单片机总结报告

单片机总结报告IC卡小组成员刘绍凯06291043刘永欢06291044一实验设备二实验原理刘中芳06291045如硬件连接图所示本系统可分为如下几个模块单片机80C196模块复位晶振电路电源电路显示模块键位模...

单片机报告

姓名学号实验一1存储块置全1源代码汇编语言源程序ORG00HSTARTEQU30H起始地址MOVR1STARTMOVR032Rn中设置32字节计数值MOVA0FFHLOOPmovR1AINCR1指向下一个地址D...

单片机实训报告

目录一概述11设计制作产品的背景目的意义12设计制作产品的设计要求13分工情况工作计划及本人所总结工作14本课题的基本内容重点及难点二正文21实验原理22实验流程图23硬件设计24软件设计25C语言程序26简易...

单片机实践报告

电气与信息工程学院实践基地实验报告黑龙江科技学院单片机综合设计性实验实验项目名称生产车间流水线自动控制模拟所属课程名称单片机实验日期20xx91822班级电气086班姓名于安洲学号32号成绩电气与信息工程学院实...

单片机报告

实验一构建单片机最小系统和实验环境熟悉一预习要求1构建单片机最小系统熟悉51单片机的结构及编程方法2按照程序流程图编写出程序二实验目的1熟悉星单片机最小系统的组成和工作原理熟悉KeilC51集成环境软件的使用方...

单片机设计报告

单片机课程设计多功能无线数字钟摘要本系统装置的主要功能包括数字钟无线控制和温度计数字钟通过时钟芯片DS1302实现时钟准确误差小无线控制采用红外遥控成本低操作距离适中温度采集采用温度传感器DS18B20精度高系...

单片机基础实验报告范1

电气与信息工程学院实践基地实验报告黑龙江科技学院单片机综合设计性实验实验项目名称生产车间流水线自动控制模拟所属课程名称单片机实验日期20xx年月日20xx年月日班级电气091姓名冯驰学号07成绩电气与信息工程学...

单片机调研报告

调研报告当今世界科技发展突飞猛进创新创造日新月异科技竞争在综合国力竞争中的地位更加突出近年来随着对科学技术是第一生产力认识的不断深化我国科学技术呈现日益发展繁荣局面战略需求引领学科快速发展基础学科呈现较快发展态...

单片机应用调研报告

单片机应用调研报告单片机是一种集成电路芯片是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM只读存储器ROM多种IO口和中断系统定时器计时器等功能可能还包括显示驱动电路脉宽调制电路模...

单片机计算器报告

单片机课程调查题目计算器系统设计学号1311772姓名杨艳班级应用1301一需求分析本次调查的任务就是要以51系列单片机为核心实现一个简易计算器它的结构非常简单外部主要由键盘和一个LCD1602A液晶显示屏一块...

单片机小车实验报告(陈进源)

单片机控制系统课程设计报告题目专业班级姓名学号指导教师乱飞的苍蝇通信技术1班陈进源090220xx02林佳楠20xx年6月6日一设计目的设计一台基于单片机的智能小车使该小车能在该空房间内自由行驶而不会撞到墙壁即...

单片机报告(46篇)