搜索
您的当前位置:首页基于单片机的数字电流表的设计本科生

基于单片机的数字电流表的设计本科生

来源:飒榕旅游知识分享网


本科生毕业论文(设计)

题目: 基于单片机的数字电流表的设计

学 院 电子信息工程学院 学科门类 工 学

专 业 电子信息工程 学 号 指导教师

2015年05月30日

摘 要

随着时代的进步,电子科学技术的日益更新,传统电工电子测量仪器——模拟测量仪表即使可以直观地从刻度盘读出表针偏转了多少格或占了满刻度的百分之几等,也满足不了对测量数据的精确要求,那么就需要更高、更准精度的仪器来替代。同时传统的模拟测量仪表在计算时需要对读数加以换算和说明,而且不同的观察者会带来不同的人为“视差”,即使同一个观察者处于不同的位置也可能会得到不同的结果和偏差。然而,数字电流表就能够克服这些问题,它的测量结果直接以数字的形式在显示屏上显示出来。数字电流表不仅具有读数准确,设计简单,随身携带的优点,而且操作方法简单,人们使用起来也非常方便,这些优点使数字电流表在近年来的电工电子的测量中应用更加广泛。

本文基于AT89C51单片机,论述数字电流表的工作原理及设计过程。利用Protel软件设计、Keil C软件和Proteus仿真软件,根据所给数字电流表的技术指标和要求,确定电流表所需的元器件和最佳设计方案,这种方法简单易行,最终得到比较理想,符合设计要求的数字电流表。

关键词:C51单片机;A/D转换器;数字电流表

Abstract

With the progress of time, increasingly updating electronic science and technology, traditional electric and electronic measuring instruments - analogue measurement instruments, even intuitively read from the dial hands deflected the number of cells or accounted for a few percent of full scale, also can not meet the exact requirements of the measured data, then you need higher precision and more accurate instrument instead. While traditional analog measuring instruments need to be converted in the calculation and description of the readings, and different observers will bring a different man, \"parallax\same observer in different locations may get different results and error . However, the digital meter will be able to overcome these problems, its measurement results in digital form directly on the screen out. Digital ammeter reading is not only accurate, simple design, the advantages of portable, and simple method of operation, it is also very easy to use, these advantages make digital ammeter in electric and electronic measuring more widely in recent years.

Based on AT89C51 microcontroller, digital ammeter discussed the working principle and design process. Use Protel software design, Keil C software and Proteus simulation software, depending on the digital ammeter technical indicators and requirements, determine the required components and ammeter best design, this method is simple, and ultimately get the ideal, in line with Digital ammeter design requirements.

Key words: C51 microcontroller digital ammeter; A / D converter; digital ammeter

目 录

摘 要 ........................................................................................................ I Abstract ................................................................................................... II 目 录 ...................................................................................................... III 1.引言 ..................................................................................................... 1

1.1 研究背景及意义 .............................................................................. 1 1.2 国内外研究现状 .............................................................................. 2 1.3 本文主要内容安排 .......................................................................... 2 2.数字电流表的理论 .................................................................................. 2

2.1 数字电流表的工作原理 .................................................................... 2 2.2 A/D转换器 ................................................................................... 3 2.3 AT89C51单片机 ............................................................................ 5 2.4 液晶显示器 .................................................................................... 8 3.数字电流表的设计 .................................................................................. 9

3.1 方案论证 ....................................................................................... 9 3.2 任务指标 ..................................................................................... 10 3.3 整体电路图 .................................................................................. 10 4.软件设计 ............................................................................................. 11

4.1 软件设计的主程序流程图 ............................................................... 11 4.2 编程语言介绍 ............................................................................... 11 4.3 Protel99SE软件的介绍 ................................................................. 12 5.系统调试及实物制作 ............................................................................. 13 5.1 硬件系统的调试 ............................................................................ 13 5.2 系统软件的调试 ............................................................................ 13 5.3 整体系统的调试 ............................................................................ 14 5.4 实际硬件制作结果 ........................................................................ 14 6.总结与展望 ......................................................................................... 14 参考文献 .................................................................................................. 16 致 谢 ..................................................................................................... 17 附 录 ..................................................................................................... 18

1.引言

1.1 研究背景及意义

数字电流表(Digital ammeter)简称AMP,它的测量原理是通过数字化测量技术,把输入的连续模拟量(直流输入电流)转换成不连续、离散的数字形式,然后通过液晶显示屏来显示的仪表。过去传统的指针式电流表不仅功能单一,而且精确度低,无法满足现今数字化时代的需求,然而基于单片机的数字电流表,不仅具有精确度高、抗干扰能力强,可扩展性强、集成方便的特点,还可以与PC进行当前实时通信等信息的传输。现今,基于各种型号单片机、A/D 转换器等设计成的数字电流表,已经在电子电工测量、工业自动化仪表、自动检测系统等许多智能化测量领域起到了举足轻重的地位,得到了越来越多使用者的青睐,体现出数字电流表强大的生命力。与此同时,各种基于AMP扩展而成的通用及专用数字化仪表仪器,也把电量和非电量测量的技术水平提高到更高的位置。

在进行课题设计之前,我们要学会如何在互联网和图书馆查找所需的资料,同时复习过去所学的课程知识并加深理解记忆,不仅为毕业设计打好良好基础,同时也为以后的工作做充分的准备。通过对毕业设计题目的分析,了解数字电流表的组成特性和工作原理;学会如何使用数字电流表测量数据、调试、校准的方法;学会如何进行分流电路的连接设进和计算;学习了解过载电路保护的工作原理和功用。最终,通过本课程设计,我们掌握电子设计的基本步骤和方法,培养自己分析问题、解决问题和处理问题的能力。

数字电流表和传统的指针式电流表相比,具有如下优点: 1.可以直观准确的读取数字; 2.能够显示小数点后面的位数; 3.测量时数字分辨率高,准确度高; 4.可以测量的量程范围较大; 5.能够扩展; 6.工作效率高; 7.输入阻抗高;

8.电路集成度高,功率消耗少; 9. 抗干扰能力较强。

综上可知,数字型电流表代替传统指针电流表不仅是时代发展的必然趋势,也是现今市场的迫切需求。而此次课题的选择和设计正是基于AT89C51单片机来进行设计的。

1.2 国内外研究现状

数字电流表自问世以来,已经经过多年的发展和改进,大体上可以概括为五代产品。第一代产品是电子管数字电流表,问世于20世纪50年代,第二代产品是晶体管数字电流表,问世于20世纪60年代,第三代产品是中、小规模集成电路的数字电流表,研制于20世纪70年代。第四代、第五代产品是近些年来由国内外相继研制推出的由大规模集成电路(LSI)或者超大规模集成电路(VLSI)组成的数字电流表、智能数字电流表。这些数字电流表的问世不仅在电子测量的进程中开创了先河,更凭借着准确度高、可靠性强、分辨力高、性价比高等优良特性而备受人们的喜爱。

1.3 本文主要内容安排

前期通过查阅大量的杂志、期刊、论文等相关重要的资料、文献之后,对基于单片机的数字电流表的设计思路进行大体的把握,具体的行文章节安排如下。

第一章:引言中介绍数字电流表的研究背景和意义,发展现状和取得的研究成果。 第二章:详细的介绍数字电流表的基本理论知识。

第三章:详细的介绍数字电流表的设计方案和数字电流表的任务指标以及整体电路图的设计。

第四章:介绍Protel99SE软件的使用和编程语言的学习。 第五章:对数字电流表进行硬件、软件和整体系统的调试。 第六章:对论文进行总结和展望。

2.数字电流表的理论

2.1 数字电流表的工作原理

数字电流表是一个可以将输入的连续模拟电流量经过A/D转换器转变为不连续、离散的数字形式,并通过液晶显示屏显示出电流读数的仪表,和指针式电流表相比,数字式电流表有着测量数据准确明了,显示的读数位数精度高等特点,类似于常用的数字式万用表,其使用性能相当广泛实用。

首先我们通过单片机和外部扩展电路做成一个理想的电压[1],硬件电路设计由7个部分组成:主控模块AT89C51单片机系统,A/D转换电路,显示系统,驱动电路,复位电路,晶振电路以及测量电压输入电路。硬件电路设计框图如图2-1所示:

复位电路 主控模块AT89C51 晶振电路 A/D转换器 电压信号 驱动电路 显示模块

图2-1 系统硬件设计框图

人们常说的电流表指的是灵敏电流计,由于其量程太小,不能直接测量电流,只能通过它检测有无电流和电流的流向,所以需将一个理想电压表改装成一个多量程或者量程较大的数字电流表。本次课题设计是基于一个内阻为无穷大数字电压表的基础上,并联上一个分流电阻来构成的数字电流表,其工作原理如图2-2所示,电路图用G表示。当待测电流流过电阻,电流表的量程就由G的满量程电压和电阻的阻值来决定,记U为G的满量程电压,根据欧姆定律U=RI,当U和R已知,则电流表的满量程电流就是I的数值。

图2-2 数字电流表的基本工作原理

2.2 A/D转换器

数模转换器,又称D/A转换器,简称DAC,它的主要功能是把数字量转变成模拟量。D/A转换器的组成基本上包括4个部分,即权电阻网络、运算放大器、基准电源和模拟开关。模数转换器中一般都要用到数模转换器,模数转换器即A/D转换器,简称ADC,它

的主要功能是把连续的模拟信号转变为离散的数字信号[2]。通过对转换器的了解与本设计的要求,同时考虑到具体转换器的具有性能指标等特点,我们选择PCF8591作为本设计的A/D转换器。

PCF8591转换器是一个具有单片集成、能够进行独立供电、功耗低、8-bit CMOS数据获取的器件。PCF8591有着4个模拟输入、1个模拟输出和1个串行I2C总线接口。PCF8591的地址引脚有3个,分别为A0、A1和A2,可用来进行硬件地址的编程,可以在不添加额外硬件的情况下,在同一个I2C总线上接入8个PCF8591器件。在PCF8591器件上输入地址、输出地址、控制信号和数据信号通常都是通过双线双向的I2C总线以串行的方式进行传输信息的[3]。

PCF8591具有多路模拟量输入、内置跟踪保持、8-bit模数和数模转换等功能,而且I2C总线的最大速率决定了PCF8591的最大转化速率。

特征如下: [1]独立的供电系统

[2]PCF8591的电压操作范围是2.5V-6V [3]待机消耗电流低

[4]通过I2C总线串行输入/输出

[5]PCF8591通过3个硬件地址引脚寻址 [6]PCF8591的采样率由I2C总线速率决定 [7]4个模拟输入可以编程为单端型或差分输入 [8]自动增量频道选择

[9]PCF8591模拟电压的范围从VSS到VDD [10]PCF8591内置跟踪保持电路 [11]8-bit逐次逼近A/D转换器

[12]实现DAC增益可以通过1路模拟输出来实现 原理图如图2-3所示:

SCLSDAA0A1A2EXTVDDVSSI2C总线接口状态寄存器DAC数据积存器ADCA数据积存器上电复位逻辑控制振荡器OSCAIN0AIN1AIN2AIN3模拟多路开关采样/保持比较器逐次比较寄存器逻辑AOUT驱动器采样/保持DACVREF AGND

图2-3 PCF8591原理图

PCF8591引脚信息[4]如图2-4所示:

图2-4 PCF8591引脚

AIN0~AIN3:模拟信号的输入端。 A0~A2:引脚地址端。

VDD、VSS:电源端(2.5V~6V)。 SDA、SCL:I2C 总线的数据线、时钟线。 OSC:外部时钟的输入端,内部时钟的输出端。

EXT:内部、外部时钟的选择线,EXT 接地时使用内部时钟。 AGND:模拟信号地。

AOUT:A/D 转换输出端。 VREF:基准电源端。

2.3 AT89C51单片机

单片机(Microcontrollers)是一种集成电路芯片,通过超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域得到广泛应用[5]。

AT89C51是一种可以编程、可以擦除的只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压微型处理器,ATMEL生产的AT89C51是一种将多功能8位CPU和闪烁存储器组合在单个芯片中的高效微控制器。采用其AT89C51单片机制作的很多嵌入式控制系统不仅灵活性高而且设计方案价廉,从而深受人们青睐。

1234567891011121314151617181920P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7RSTP3.0(RXD)P3.1(TXD)P3.2(INT0)P3.3(INT1)P3.4(T0)P3.5(T1)P3.6(WR)P3.7(RD)XTAL2XTAL1GNDVCCP0.0(AD0)P0.1(AD1)P0.2(AD2)P0.3(AD3)P0.4(AD4)P0.5(AD5)P0.6(AD6)P0.7(AD7)EA/VPPALE/PROGPSENP2.7(A15)P2.6(A14)P2.5(A13)P2.4(A12)P2.3(A11)P2.2(A10)P2.1(A9)P2.0(A8)4039383736353433323130292827262524232221 图2-5 AT89C51单片机

AT89C51单片机各引脚结构如图2-5所示[6]。 引脚功能介绍:

[1]VCC——接电源引脚。 [2]GND——接地引脚。

[3]P0口:8位,漏极开路的准双向I/O口,具有内部上拉电阻,该引脚可驱动8个

LS型TTL负载。当P0口的管脚第一次写入

“1”时,被定义为高阻输入。P0口能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FLASH编程时,P0 口作为原码输入口,当FLASH进行校验时,P0输出原码,此时P0口外部必须被拉高。

[4]P1口:8位,具有内部上拉电阻的准双向I/O口,P1口缓冲器允许接收输出4个LS型TTL负载。P1口管脚写入“1”后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH进行编程和校验时,P1口作为第八位地址接收。

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

[6]P3口:8位,具有内部上拉电阻的准双向I/O口,可接收输出4个LS型TTL负载。当P3口写入“1”后,它被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL),这是由于上拉的缘故。

P3口也可作为AT89C52的一些特殊功能口,如下所示[7]: P3.0/RXD:8位准双向并行口,串行数据输入口 P3.1/TXD:8位准双向并行口,串行数据输出口

P3.2/INT0:8位准双向并行口,外部中断0申请信号输入端 P3.3/INT1:8位准双向并行口,外部中断1申请信号输入端 P3.4—T0:8位准双向并行口,定时器/计数器0外部脉冲的输入端 P3.5—T1:8位准双向并行口,定时器/计数器1外部脉冲的输入 P3.6/WR:8位准双向并行口,外部数据存储器(RAM)写选通 P3.7/RD:8位准双向并行口,外部数据存储器(RAM)读选通 P3口同时也为闪烁编程和编程校验接收一些控制信号。

[7]RST——复位输入口。当振荡器处于复位器件时,要保持RST脚的两个机器周期的高电平时间。

[8]ALE/PROG——当访问外部存储器时,地址锁存允许输出电平用于锁存地址的低位字节。

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

[9]PSEN——外部程序存储器的选通信号。当处于外部程序存储器取指期间,每个机器周期两次PSEN有效。但处于访问外部数据存储器时,这两次有效的PSEN信号将不会出现。

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

2.4 液晶显示器

LCD(Liquid Crystal Display)是液晶显示器名称的缩写,我们在日常生活中随处可见。液晶显示器不仅具有显示图像质量高,而且采用数字式接口、体积小、质量轻、功耗低等优点,所以在生活中得到广泛应用。

LCD1602是专门用来显示数字、字母、符号等点阵式字符型液晶显示模块,常见的几种规格主要有16*1,16*2,20*2和40*2等,常见的有字符型、点阵型和笔段型。模块内部元器件的主要构成有LCD显示屏、控制器、列驱动器和偏压产生电路[8]。本课题设计以长沙太阳人电子有限公司生产制造的1602液晶显示器为例来简单介绍其用法。常见的1602字符型液晶显示器引脚如图2-6所示:

图2-6 LCD1602引脚

LCD1602引脚采用的是标准16脚接口,其各引脚的功能如下[9]: 引脚1:GND为接地电源。 引脚2:VCC接5V正极电源。

引脚3:VO为调整液晶显示器的对比度端口,当正电源接在其端口时,对比度处于最弱状态;当地电源接在其端口时,对比度处于最高状态(当对比度过高时就会产生“鬼影”,在使用时,可以通过一个10K的电位器来调整对比度)。

引脚4:RS是选择寄存器,当其处于高电平1时,选择数据寄存器;当其处于低电平0时,选择指令寄存器。

引脚5:RW是读写信号线,当其是高电平1时,进行读操作;当其处于低电平时,进行写操作。

引脚6:E(或EN)端是使能(enable)端口,当其处于高电平1时,读取信息;负跳变时执行此指令。

引脚7~14:DB0~DB7是8位的双向数据端。

引脚15~16:空脚或背灯电源端。15引脚是背光正极端口,16引脚是背光负极[10]端口。

3.数字电流表的设计

3.1 方案论证

(一)设计方案

该数字电流表的设计主要由电压信号采样电路、A/D(PCF8591)转换电路以及LCD显示电路构成,其中采样电路部分包括采样电阻和差分放大电路,以及芯片电路三个模块。

数字电流表的设计方案如图3-1所示。

电压信号 采样电路 A/D转换器 AT89C51处理数字信号 LCD液晶显示

图3-1 数字电流表设计方案

(二)硬件电路描述

首先通过对论文题目的分析,根据题目要求考虑所用到的单片机,鉴于合理选取及实例的具体分解,同时考虑到本课题的单片机需求,选取AT89C51单片机作为本课题设计的单片机。AT89C51不仅可以按照常规编程方法进行,而且还可以实现在线编程。它能够将通用的微处理器和Flash存储器结合在一起,同时Flash存储器具有可反复擦写功能,有效地降低开发成本。

AT89C51是一种功耗低、性能高的CMOS8位微控制器,具有4K系统可编程Flash 存储器,由Atmel 公司高密度非易失性存储器技术制造。片上的Flash允许程序存储器在系统可编程,也适用于常规的编程器。在单芯片上,AT89C51拥有灵巧的8 位CPU 和可在系统编程Flash,众多的嵌入式控制应用系统都采用其作为核心部件,并且得到广泛应用。

再次,在进行电流测量时,电流输入的是模拟量,而单片机只能处理数字信号,所以需要通过A/D转换芯片进行转换,通过筛选和分析,本课题采用PCF8591作为A/D转换芯片。

A/D转换器的概念:即模数转换(Analog to Digital Conversion),当输入端输入模拟量(比如电压信号)时,会相应输出一个与模拟量相对应的数字量(通常以二进制形式表示)。例如在参考电压VREF为5V,8位的模数转换器情况下,当输入的电压为0V时,输出的数字量为0000 0000,当输入的电压为5V时,输出的数字量为1111 1111。当输入的电压在0V到5V之间变化时,输出的数字量会在0000 0000到1111 1111之间变化。这样每次输入的电压值都会对应输出一个数字量,从而实现了模数转换功能。

最后,电路显示屏部分采用的是LCD1602液晶显示。

3.2 任务指标

本课题设计要求以单片机为基础制作出数字电流表。通过该设计了解A/D转换器的原理、51系列单片机的使用和LCD液晶显示器的使用方法、显示过程。

功能要求为:(1)三位直流数字电流表;(2)量程范围为0-100mA;(3)通过LCD显示屏显示待测电流的数值;(4)8通道进行电流值采集。

本设计系统主要通过硬件设计、软件编程的手段来实现相应的要求功能。第一,根据题目设计的要求制作出能相应功能的电路图。第二,根据电路图编写程序控制单片机(可以使用C语言或者VB语言,本课题采用的是C语言),使单片机能够控制A/D转换器进行模数转换,并通过LCD显示屏直接显示出来相对应的电流值。

3.3 整体电路图

整体电路图设计如图3-2所示。

图3-2 数字电流表整体电路图

4.软件设计

4.1 软件设计的主程序流程图

主程序设计流程图如图4-1所示:

开始 调用LCD初始化子程序 A/D转换值清零 设置LCD DDRAM地址,调用写入指令数据到LCD 调用子程序 LCD上显示

图4-1 主程序设计流程图

4.2 编程语言介绍

C语言是一门通用计算机程序设计语言,美国贝尔实验室的Dennis M. Ritchie在1972年推出的,它的工作单元是由高级语言的基本语句与低级语言的实用性结合而成的,它不仅具有高级语言的特点,还具有汇编语言的特点。1978年后,C语言先后被移植到大、中、小及微型机上,它不仅可以作为工作系统设计语言,编写系统的应用程序,还可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。它有着广泛的应用范围,超强的数据处理能力,不仅在软件开发上,而且各类科研工作上都需要用到C语言,可以用来编写系统软件,三维、二维图形和动画,具体应用体现在单片机以及嵌入式系统开发。

单片机C语言的优点[11]:

1.语言简洁紧凑、使用灵活方便。C语言总共只有32个关键字,9种控制语句,程序书写形式自由,区分大小写。

2.丰富的运算符。C语言有着广泛的运算符范围,总共有34种运算符。在C语言中,赋值符号、括号、强制类型转换等都会当作运算符处理,这样使得C语言的运算类型极其丰富,表达式类型也呈现多样化。

3.丰富的数据类型。C语言的数据类型有整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等。能够实现各种复杂的数据结构的运算,同时引入指针概念,使其具有更高的程序效率。

4.灵活使用的表达方式。C语言具有多种运算符和表达式值的方法,可通过多种途径对问题的表达,其程序设计更主动、灵活。

5.可以直接访问物理地址,对硬件进行操作。 6.生成的目标代码质量高,程序执行效率高。 7.具有很好的移植性能。

8.很强的表达力。C语言的数据结构和运算符非常丰富,包含整型、数组类型、指针类型和联合类型等,可以实现各种数据结构的运算。

4.3 Protel99SE软件的介绍

Protel99SE是澳大利亚Protel Technology公司研制开发的,是一个全32位的电路板设计软件,在电子行业的CAD软件中,是一款常用的电子电路设计软件,也是电子设计者的首选软件。早期的Protel主要作为印制板自动布线工具使用,对运行的环境要求很低,但它的功能也较少,只有电路原理图绘制与印制板设计功能,其印制板自动布线的布通率也低,而现今的Protel安装于Windows9X/2000/NT操作系统下,采用设计库管理模式,可以进行联网设计,具有很强的数据交换能力和开放性及3D模拟功能,可以用于设计原理图、设计印制电路板、设计可编程逻辑器件和电路仿真等,可以设计32个信号层,16个电源--地层和16个机加工层,同时还兼容一些其它设计软件的文件格式,如ORCAD,PSPICE,EXCEL等,其多层印制线路板的自动布线可实现高密度PCB的100%布通率[12]。用户如果需要进行软件升级或获取更详细的资料,可以到公司网址:www.protel.com查询。

Protel99SE中主要功能模块如下:

(1)Advanced Schematic 99SE(原理图设计系统)

该模块包括电路图编辑器、电路图元器件编辑器和各种文本编辑器,主要用于电路原理图的设计、原理图元件的设计和生成各种原理图报表等。

(2)Advanced PCB 99SE(印刷电路板设计系统)

该模块提供了一个功能强大,可以交互友好的PCB设计环境,主要用来进行PCB设计、元器件封装设计、报表的生成及PCB输出。

(3)Advanced Route 99SE(自动布线系统)

该模块是一个集成无网格自动进行布线的系统,有着高效的布线效率。 (4)Advanced Integrity 99SE(PCB信号完整性分析)

该模块能够进行精确的板级物理信号分析,可以检查串扰、过冲、下冲、延时和阻抗等问题,并自动给出相应的具体解决方案。

(5)Advanced SIM 99SE(电路仿真系统)

该模块是一个基于最新的Spice3.5标准仿真器,给用户的设计前端提供了完整、直观的问题解决方案。

(6)Advanced PLD 99SE(可编程逻辑器件设计系统)

该模块是一个集成性PLD开发环境,可通过原理图或者CUPL硬件描述语言来作为设计前端,能够提供工业标准的JEDEC输出。

5.系统调试及实物制作

5.1 硬件系统的调试

(一)元器件焊接

在进行焊接前先要对整个电路板进行详细的检查。首先用万用表对印制的电路板进行检查,主要是检测电路板是否存在断路等情况,然后对照着电路原理图与PCB图将相应的元器件进行焊接。

(二)电路测试

电路板焊接完成后,在进行通电测试之前先对元器件的引脚主要进行两个方面的检查:第一检查引脚是否出现虚焊或者其他信号线是否存在短路情况;第二是针对引脚功能的检查。

5.2 系统软件的调试

在硬件调试进行一切正常之后,接下来我们需要做的就是软件调试。具体调试步骤如下:

1.调试存储模块。确保存储模块能够进行读写信息。 2.调试单片机和数模转换模块。 3.调试显示模块。

5.3 整体系统的调试

在进行完硬件和软件部分的调试和检测之后,最后我们需要将程序捎入单片机中。提供3V的电压源,使整个模块均处于正常的工作状态,对电流表分别进行最大值和最小值的检测。在已知大致估计的电流数值的情况下,如果数字电流表显示屏测试的数值没有较大的偏差,则整体调试成功。

5.4 实际硬件制作结果

根据电路图自己制作出实物,其测试结果:能正常测量0——100mA电流,达到毕业设计的大部分设计要求。实物测试结果如图5-1所示:

图5-1 实际制作效果图

6.总结与展望

至此为止,本课题设计论文的整体内容已经基本完成,本章主要讲述对前面内容的撰写以及实物制作的总结,并在此基础上,提出对以后的工作建议和设想。随着电子科学技术的快速发展,未来的数字电流表需要向更精准,更智能方向发展。数字电流表由于其读数准确,精度高,测量量程大,效率快等优点,在日常生活中得到较为广泛的应用。

本设计是以单片机AT89C51芯片为核心的数字电流表,介绍了51单片机和A/D转换器的结构,从而更深层次地分析数字电流表的设计原理、软件仿真及其检测调试等一系列的内容。先从数字电流表理论入手结合数字电压表的设计原理,利用取电阻上的电流来

达到测试相应电流的目的。同时给出了使用Protel软件来设计原理图的步骤以及实物制作的流程。

当今社会是信息化的时代,而数字电流的测量又在其中占据着一个非常重要的地位,电流表作为测量仪器中非常关键的器件,有着非常广阔的应用前景。研究出精度高、性能优的电流表有重大的实际价值和更深远的意义。

参考文献

[1]胡红博. 基于单片机控制的新型交流电压表系统[C]. 贵州:遵义师范学院,2008. [2]康华光. 模拟电子技术基础(第五版)[M]. 北京:高等教育出版社,2006. [3]康华光. 数字电子技术基础(第五版)[M]. 北京:高等教育出版社,2006. [4]万文略. 单片机原理及应用技术[M]. 重庆:重庆大学出版社,2004. [5]张毅刚. 单片机原理及接口技术[M]. 北京:人民邮电出版社,2011. [6]王彦朋. 大学生电子设计与应用[M]. 北京:中国电力出版社,2007.

[7]张毅刚,彭喜元,董继成. 单片机原理及应用[M]. 北京:高等教育出版社,2003. [8]先锋工作室. 单片机程序设计实例[M]. 北京:清华大学出版社,2003.

[9]万福君,渊松峰. 单片微机原理系统设计与应用[M]. 合肥:中国科学技术大学出版社, 2001.

[10]戴佳,陈斌. 51单片机应用系统开发典型实例[M]. 北京:中国电力出版社,2005. [11]纪纲. C程序设计实用教程[G]. 北京:中国铁道出版社,2009. [12]关健. 电子CAD技术[S]. 北京:电子工业出版社出版社,2006.

致 谢

光阴似箭,岁月如梭。经过几个月的时间终于把毕业论文撰写完成,在写作毕业论文的过程中遇到了许多问题,让我也发现了自己的很多不足之处,未能深刻理解以前学习的理论知识,比如未能熟练掌握Protel软件的使用、对单片机C语言汇编程序掌握得不娴熟,但都在老师和同学的大力帮助下顺利解决。经过本次设计过程,我不仅把以前所学的知识重新温故一遍,而且也学到了许多课外理论知识,更重要是把所学的知识学以致用,提高了动手能力,最终完成了本次设计。在此特别感谢我的指导老师-王**老师,她对我无私的指导和帮助。在论文撰写过程中王老师给我提供了很多有使用价值的建议和指导,王老师严谨的态度,一丝不苟的作风让我深受感动。如果没有王老师的大力帮助我不可能独自完成整个毕业论文的设计。在此向王老师深深的感谢和敬意。

同时感谢这篇论文所涉及的各位学者和研究者。本文借鉴了数位学者的研究成果,如果没有这些学者的学术研究成果启发和帮助,我也很难独立完成本篇论文的撰写。感谢我的同学和朋友,在我写撰论文过程中给予我了很多资料支持和宝贵的意见,还在论文的撰写提供意见和排版的难题过程中提供帮助。在此我一一表示衷心的感谢!

由于我的水平有限,所写的论文中肯定会有不足之处,望请各位老师批评和指正!

附 录

//////////////////////////////////////////////////////////////////显示函数

#include\"MAIN_HEADER.h\" #include\"LCD1602.h\" #include\"KEY.h\"

/*******************************************************************/ /* /* 延时函数 *//* /*******************************************************************/

void Delayms(uint a) {

uchar i; while(a--)

{

for(i=0;i<120;i++); } }

/*******************************************************************/

/* /* LCD初始化设定 /* /*******************************************************************/

void Lcd_Init() {

LCD_RS = 0; LCD_RW = 0;

*/ */ */ */ */

LCD_EN = 0;

Lcd_Wcmd(0x01); Lcd_Wcmd(0x38); Lcd_Wcmd(0x0c);

Lcd_Wcmd(0x06); Lcd_Wcmd(0xd0); }

/*******************************************************************//* /* 清屏函数 /* /*******************************************************************/void Lcd_Clear() {

Lcd_Wcmd(0x01); Delayms(1); }

/*******************************************************************//* /*写指令数据到LCD /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 /* /*******************************************************************/

void Lcd_Wcmd(uchar cmd)

{ LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; P0 = cmd; Delayms(1); LCD_EN = 1; Delayms(1);

*/ */ */ */ */ */*/

LCD_EN = 0;

}

/*******************************************************************/

/* */ /*写显示数据到LCD */ /*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */ /* */ /*******************************************************************/

void Lcd_Wdat(uchar dat) { LCD_RS = 1; LCD_RW = 0; LCD_EN = 0; P0 = dat; Delayms(1); LCD_EN = 1; Delayms(1); LCD_EN = 0; }

/*******************************************************************/

/* /* 设定显示位置 /* /*******************************************************************/ void Lcd_Set_xy(uchar hang,uchar lie) { uchar a;

if(hang == 1) a = 0x80; if(hang == 2) a = 0xc0; a = a + lie - 1; Lcd_Wcmd(a);

Delayms(1);

*/ */ */

}

/*******************************************************************/

/* */ /* 写字符串函数 */ /* */ /*******************************************************************/ void Lcd_String(uchar *p) {

while(1) {

if(*p == '\\0') break; }

////////////////////////////////////////////////////////////////显示头文件

#ifndef _LCD1602_ #define _LCD1602_

#include #include

}

Lcd_Wdat(*p); p++;

Delayms(1);

#define uchar unsigned char #define uint unsigned int

sbit LCD_RS = P1^0; sbit LCD_RW = P1^1;

sbit LCD_EN = P1^2;

extern void Delayms(uint a);

extern void Lcd_Init(); extern void Lcd_Wcmd(uchar cmd);

//LCD1602初始化函数 //LCD1602写命令函数 //LCD1602写数据函数 //LCD1602设置显示位//LCD1602写字符串函

extern void Lcd_Wdat(uchar dat); extern void Lcd_Set_xy(uchar hang,uchar lie); 置函数

extern void Lcd_String(uchar *p); 数

extern void Lcd_Clear();

#endif

//LCD1602清屏函数

///////////////////////////////////////////////////////////////////主函数

#include\"MAIN_HEADER.h\" #include\"LCD1602.h\" #include\"KEY.h\"

#include\"PCF8951.h\"

/*****************************初始化函数*****************************/ void Init() //初始化函数 {

TMOD = 0X11; //定时器0和定时器1设置工作方式1 TH0 =55536/256; //定时器0初值 TL0 =55536%256; //定时器0初值

EA = 1; //打开总中断 ET0 = 1; //定时器0打开 TR0 = 1;

//定时器0打开

// WDT_CONTR = 0X31; //看门狗定时器在12M晶振时131ms复位 }

/****************************主函数******************************/ void MAIN(void) {

uchar display[3]; Init();

Lcd_Init (); Lcd_Clear(); Delayms(10); Lcd_Set_xy(1,1);

Lcd_String(\"I:000mA\");

// Lcd_Set_xy(1,8);

// Lcd_String(\"Vout:1.00\"); // Lcd_Set_xy(2,1);

// Lcd_String(\"V:0.00\"); // Ad_Da(4);

// DA_NUM = (uchar)DA_NUM*0.941; // display[0] = DA_NUM/100+0x30; // display[1] = DA_NUM%100/10+0x30;

// display[2] = DA_NUM%10+0x30; // Lcd_Set_xy(1,13); // Lcd_Wdat(display[0]); // Lcd_Set_xy(1,15); // Lcd_Wdat(display[1]); // Lcd_Wdat(display[2]); while(1) {

uint k;

for(k=10000;k>0;k--) //

{ }

Key(KEY_NUM);

Ad_Da(0);

D[0] = (uchar)D[0]*0.393; display[0] = D[0]/100+0x30;

display[1] = D[0]%100/10+0x30; display[2] = D[0]%10+0x30; Lcd_Set_xy(1,3);

Lcd_Wdat(display[0]); Lcd_Wdat(display[1]); Lcd_Wdat(display[2]);

// // // // // // // // // //

Ad_Da(1);

D[1] = (uchar)D[1]*4;

display[0] = D[1]/100+0x30;

display[1] = D[1]%100/10+0x30; display[2] = D[1]%10+0x30; Lcd_Set_xy(2,3);

Lcd_Wdat(display[0]); Lcd_Set_xy(2,5);

Lcd_Wdat(display[1]); Lcd_Wdat(display[2]);

Ad_Da(2);

// // // // // // // // // // // // // // // // // // // //

D[2] = (uchar)D[2]/0.92;

display[0] = D[2]/100+0x30;

display[1] = D[2]%100/10+0x30; display[2] = D[2]%10+0x30; Lcd_Set_xy(2,7); Lcd_Wdat(display[0]); Lcd_Wdat(display[1]); Lcd_Set_xy(2,10); Lcd_Wdat(display[2]);

Ad_Da(3);

D[3] = (uchar)D[3]/0.92; display[0] = D[3]/100+0x30; display[1] = D[3]%100/10+0x30; display[2] = D[3]%10+0x30; Lcd_Set_xy(2,12); Lcd_Wdat(display[0]); Lcd_Wdat(display[1]); Lcd_Set_xy(2,15); Lcd_Wdat(display[2]);

} }

/////////////////////////////////////////////////////////////主函数头文件

#ifndef _MAIN_HEADER_ #define _MAIN_HEADER_

#include #include

#define uchar unsigned char

#define uint unsigned int

//sfr WDT_CONTR = 0XE1; 寄存器地址定义

//看门狗定时器控制

#endif

////////////////////////////////////////////////////////////数模转换函数

#include\"LCD1602.h\" #include\"PCF8951.h\" #include\"KEY.h\"

uchar AD_CHANNEL; uchar DA_NUM = 100; uint D[5];

/******************************************************************* DAC 变换, 转化函数

*******************************************************************/

bit DACconversion(unsigned char sla,unsigned char c, unsigned char Val) {

Start_I2c(); //启动总线

SendByte(sla); //发送器件地址 if(ack==0)return(0);

SendByte(c); //发送控制字节

if(ack==0)return(0);

SendByte(Val); //发送DAC的数值 if(ack==0)return(0);

Stop_I2c(); //结束总线 return(1); }

/*******************************************************************

ADC发送字节[命令]数据函数

*******************************************************************/ bit ISendByte(unsigned char sla,unsigned char c) {

Start_I2c(); //启动总线 SendByte(sla); //发送器件地址 if(ack==0)return(0);

SendByte(c); //发送数据 if(ack==0)return(0);

Stop_I2c(); //结束总线 return(1);

}

/******************************************************************* ADC读字节数据函数

*******************************************************************/ unsigned char IRcvByte(unsigned char sla) { unsigned char c;

Start_I2c(); //启动总线

SendByte(sla+1); //发送器件地址

if(ack==0)return(0);

c=RcvByte(); //读取数据0

Ack_I2c(1); //发送非就答位 Stop_I2c(); //结束总线 return(c); }

//******************************************************************/ void Ad_Da(AD_CHANNEL) {

switch(AD_CHANNEL) {

case 0: ISendByte(PCF8591,0x41);

D[0]=IRcvByte(PCF8591); //ADC0 模数转换1 break;

case 1: ISendByte(PCF8591,0x42);

D[1]=IRcvByte(PCF8591); //ADC1 模数转换2 break;

case 2: ISendByte(PCF8591,0x43);

D[2]=IRcvByte(PCF8591); //ADC2 模数转换3 break;

case 3: ISendByte(PCF8591,0x40);

D[3]=IRcvByte(PCF8591); //ADC3 模数转换4 break;

case 4: DACconversion(PCF8591,0x40, DA_NUM); //DAC 数模转换 break;

}

// if(++AD_CHANNEL>4) AD_CHANNEL=0; }

////////////////////////////////////////////////////////////////////数模转换头文件 #ifndef _PCF8951_

#define _PCF8951_

#include #include

#define uchar unsigned char #define uint unsigned int

#define PCF8591 0x90 //PCF8591 地址 #define _Nop() /*定义空指令*/

sbit SCL=P2^0; //I2C 时钟 sbit SDA=P2^1; //I2C 数据

extern uchar AD_CHANNEL; extern uchar DA_NUM; extern uint D[5];

extern bit ack; /*应答标志位*/

extern void Start_I2c(); //起动总线函数

extern void Stop_I2c(); //结束总线函数 extern void Ack_I2c(bit a); //应答子函数

extern void SendByte(unsigned char c); //字节数据发送函数

extern unsigned char RcvByte(); //无子地址读字节数据函数

extern bit DACconversion(unsigned char sla,unsigned char c, unsigned char Val);

extern bit ISendByte(unsigned char sla,unsigned char c); extern unsigned char IRcvByte(unsigned char sla); extern void Ad_Da(AD_CHANNEL);

#endif

////////////////////////////////////////////////////////////////////IIC函数

#include\"LCD1602.h\" #include\"PCF8951.h\" #include\"KEY.h\"

bit ack;

/******************************************************************* 起动总线函数 函数原型: void Start_I2c();

功能: 启动I2C总线,即发送I2C起始条件.

********************************************************************/ void Start_I2c() {

SDA=1; /*发送起始条件的数据信号*/ _Nop(); SCL=1;

_Nop(); /*起始条件建立时间大于4.7us,延时*/ _Nop();

_Nop(); _Nop(); _Nop();

SDA=0; /*发送起始信号*/

_Nop(); /* 起始条件锁定时间大于4μs*/ _Nop(); _Nop(); _Nop();

_Nop();

SCL=0; /*钳住I2C总线,准备发送或接收数据 */ _Nop(); _Nop(); }

/******************************************************************* 结束总线函数

函数原型: void Stop_I2c();

功能: 结束I2C总线,即发送I2C结束条件.

********************************************************************/ void Stop_I2c() {

SDA=0; /*发送结束条件的数据信号*/ _Nop(); /*发送结束条件的时钟信号*/ SCL=1; /*结束条件建立时间大于4μs*/ _Nop();

_Nop(); _Nop(); _Nop(); _Nop();

SDA=1; /*发送I2C总线结束信号*/ _Nop(); _Nop(); _Nop();

_Nop();

}

/******************************************************************* 字节数据发送函数

函数原型: void SendByte(UCHAR c);

功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对 此状态位进行操作.(不应答或非应答都使ack=0)

发送数据正常,ack=1; ack=0表示被控器无应答或损坏。 ********************************************************************/ void SendByte(unsigned char c) {

unsigned char BitCnt;

for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/ {

if((c<SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/ _Nop();

_Nop(); /*保证时钟高电平周期大于4μs*/ _Nop(); _Nop();

_Nop(); SCL=0; }

_Nop(); _Nop();

SDA=1; /*8位发送完后释放数据线,准备接收应答位*/ _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); _Nop();

if(SDA==1)ack=0;

else ack=1; /*判断是否接收到应答信号*/ SCL=0; _Nop(); _Nop(); }

/******************************************************************* 字节数据接收函数 函数原型: UCHAR RcvByte();

功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号), 发完后请用应答函数应答从机。

********************************************************************/ unsigned char RcvByte() {

unsigned char retc; unsigned char BitCnt;

retc=0;

SDA=1; /*置数据线为输入方式*/ for(BitCnt=0;BitCnt<8;BitCnt++) {

_Nop();

SCL=0; /*置时钟线为低,准备接收数据位*/ _Nop();

_Nop(); /*时钟低电平周期大于4.7μs*/ _Nop(); _Nop(); _Nop();

SCL=1; /*置时钟线为高使数据线上数据有效*/ _Nop(); _Nop();

SCL=0; _Nop(); _Nop();

return(retc); }

/******************************************************************** 应答子函数 函数原型: void Ack_I2c(bit a);

功能: 主控器进行应答信号(可以是应答或非应答信号,由位参数a决定) ********************************************************************/ void Ack_I2c(bit a) {

if(a==0)SDA=0; /*在此发出应答或非应答信号 */ else SDA=1; _Nop(); _Nop();

_Nop(); SCL=1;

_Nop();

_Nop(); /*时钟低电平周期大于4μs*/ _Nop(); _Nop(); _Nop();

SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/ _Nop();

_Nop(); } // //

///******************************************************************* //DAC 变换, 转化函数

//*******************************************************************/

//bit DACconversion(unsigned char sla,unsigned char c, unsigned char Val) //{

// Start_I2c(); //启动总线

// SendByte(sla); //发送器件地址 // if(ack==0)return(0);

// SendByte(c); //发送控制字节 // if(ack==0)return(0);

// SendByte(Val); //发送DAC的数值 // if(ack==0)return(0);

// Stop_I2c(); //结束总线 // return(1); //}

//

///******************************************************************* //ADC发送字节[命令]数据函数

//*******************************************************************/ //bit ISendByte(unsigned char sla,unsigned char c) //{

// Start_I2c(); //启动总线

// SendByte(sla); //发送器件地址 // if(ack==0)return(0);

// SendByte(c); //发送数据 // if(ack==0)return(0);

// Stop_I2c(); //结束总线 // return(1); //} //

///******************************************************************* //ADC读字节数据函数

//*******************************************************************/ //unsigned char IRcvByte(unsigned char sla) //{ unsigned char c; //

// Start_I2c(); //启动总线

// SendByte(sla+1); //发送器件地址 // if(ack==0)return(0);

// c=RcvByte(); //读取数据0

//

// Ack_I2c(1); //发送非就答位 // Stop_I2c(); //结束总线 // return(c); //} //

////******************************************************************/ //void Ad_Da()

//{

// static uchar AD_CHANNEL = 0; // switch(AD_CHANNEL) // {

// case 0: ISendByte(PCF8591,0x41);

// D[0]=IRcvByte(PCF8591)*2; //ADC0 模数转换1 // break; //

// case 1: ISendByte(PCF8591,0x42);

// D[1]=IRcvByte(PCF8591)*2; //ADC1 模数转换2 // break;

//

// case 2: ISendByte(PCF8591,0x43);

// D[2]=IRcvByte(PCF8591)*2; //ADC2

模数转换3

// break; //

// case 3: ISendByte(PCF8591,0x40);

// D[3]=IRcvByte(PCF8591)*2; //ADC3 模数转换4 // break; //

// case 4: DACconversion(PCF8591,0x40, DA_NUM); //DAC 数模转换 // break; // }

// if(++AD_CHANNEL>4) AD_CHANNEL=0; LCD_LED =! LCD_LED ; //}

文本仅供参考,感谢下载!

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

Top