找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 54992|回复: 24
打印 上一主题 下一主题
收起左侧

基于单片机数字电压表设计毕业设计 完整版下载

  [复制链接]
跳转到指定楼层
楼主

点击处处下载word格式的论文:
基于单片机数字电压表设计毕业设计完整版.rar (1.42 MB, 下载次数: 485)

下面是论文预览(只有部分图片):
黑龙江职业学院毕业论文(设计)
摘   要

在日常维修、教学和科研中,电压表是不可缺少的。本课题目的就是以单片机为基础设计出一种结构简单、工作可靠、灵活性好的数字电压表。
本文首先介绍了数字电压表的发展现状及课题的目的和意义。然后,对基于单片机的数字电压表的硬件系统、软件系统的设计原理及具体实现方案作以详细介绍,其中,在硬件部分,较为详细的讨论了硬件的选择、设计原理、使用方法和功能,同时,对各部分接口电路作以介绍;在软件部分,介绍了软件所使用的编程语言和编程思路。最后,对电路调试、印刷PCB板的制作及系统的抗干扰设计作了进一步分析和总结。
本文设计的数字电压表,其硬件电路所用元件较少、成本低、调节简单;软件采用C语言编程,其灵活性高,可读性强。经过理论研究、原理设计和整机调试,实验结果表明,该方案可行。


Abstract

In routine maintenance, teaching and research, voltage meter is indispensable. A direct current digital voltage meter has been designed, which is based on MCU, and has a simple structure, reliable, flexible.
Firstly,this paper introduced the development of the base on MCU digital voltage meter and the purpose and significanceof topic. Then in details this paper described the design principle of hardware and software systems. And in details the hardware part present a discussion in hardware selection, design principles, instructions and the function, further more,some of the interface circuit have been introduced. The software part introduced the programming language and programming ideas used in codes. Finally, the circuit debugging, the printed plate of PCB production and the anti-jamming system were designed to further analysis and synthesis.
The digital voltage meter designed here, have less components in the hardware part, lower cost and easier testing; software used C programming language which is high flexibility and strong readability. After theoretical research, principle design and debugging, the experimental results suppose it is feasible of choosing this program.



Keywords: Micro Controller Unit;voltage meter;A/D Converters;
Series Bus



  

第1章  绪 论
1.1 课题概述
1.1.1 数字电压表的发展历程
1.1.2 国内外的发展现状与趋势
1.2 课题的意义和目的
1.3 本文所作的主要工作
第2章  基于单片机数字电压表的总体设计
2.1 设计指标
2.2 系统概述
2.2.1 硬件电路图及工作过程简介
2.2.2 软件程序设计简介
2.3 小结
第3章  基于单片机数字电压表的硬件设计
3.1 器件的选择
3.2 A/D转换电路
3.2.1 A/D转换芯片的选择
3.2.2 ADC0809转换原理介绍
3.2.3 ADC0809芯片介绍
3.2.4 ADC0809与单片机的接口方法
3.3 单片机介绍
3.3.1 单片机介绍
3.3.2 采用AT89C51的原因
3.3.3 AT89C51芯片主要性能参数
3.3.4 功能介绍
3.3.5 芯片管脚介绍及分配
3.4 显示驱动单元设计
3.4.1 ZLG7289芯片介绍
3.4.2 ZLG7289的主要特征
3.4.3 ZLG7289引脚功能说明
3.4.4 ZLG7289与单片机及数码管的连接
3.4.5 时序图中的各项延迟时间
3.4.6 控制指令
3.5 SPI接口技术
3.5.1 SPI总线简介
3.5.2 SPI总线的基本结构
3.5.3 数据的传输
3.6 电压显示电路
3.7 小结
第4章  基于单片机数字电压表的软件设计
4.1 软件系统整体设计
4.1.1 C51简介
4.1.2 程序流程图
4.1.3 数据采集模块的设计
4.1.4 数据处理模块的设计
4.2 原程序见附录A
4.3 小结
第5章  基于单片机数字电压表的抗干扰设计
5.1硬件系统的可靠性与抗干扰设计
5.1.1 供电系统抗干扰措施
5.1.2 接地
5.1.3 传输通道的抗干扰措施
5.2 软件系统的可靠性与抗干扰设计
5.3 小结
第6章  电路制作及调试
6.1 PCB板的制作
6.2 系统外观
6.3电路调试
6.3.1 调试步骤
6.3.2 可能出现的问题解答
6.4 系统调试及结果分析
6.4 小结
结    论
致    谢
参考文献
附录 基于单片机的数字电压表设计C51原程序




第1章  绪 论1.1 课题概述1.1.1 数字电压表的发展历程



数字电压表简称DVM,它是采用数字化测量技术设计的电压表。从性能来看:数字电压表的发展从一九五二年美国NLS公司由四位电子管数字电压表精度千分之一到现在已经出现8位数字电压表。参数可测量直流电压、交流电压、电流、阻抗等。测量自动化程度不断提高,可以和计算机配合显示、计算结果、然后打印出来。目前世界上美国FLUKE公司,在直流和低频交流电量的校准领域居国际先进水平。例如该公司生产的“4700A”多功能校准器和“8505”危机数字多用电压表,可用8位显示,直流精度可达到±5/10-6,读书分辨力为0.1μV。带有A/D变换模式、数据输出接口形式IEEE-488。具有比率测量软件校准和有交流电阻、电流选件。还具有高精度电压校准器“5400A”、“5200A”、“5450A”等数字仪表,都是作为一级计量站和国家级计量站使用的标准仪表。还有英国的“7055”数字电压表采用脉冲调制技术。日本横河公司的“2501”型采用三次采样等等在不断的蓬勃发展[1]。
从发展过程来看:数字电压表自1952年问世以来,已有50年多年的发展史,大致经历了五代产品。第一代产品是20世纪50年代问世的电子管数字电压表,第二代产品属于20世纪60年代出现的晶体管数字电压表,第三带产品为20世纪70年代研制的中、小规模集成电路的数字电压表。今年来,国内外相继推出有大规模集成电路(LSI)或超大规模集成电路(VLSI)构成的数字电压表、智能数字电压表,分别属于第四代、第五代产品。它们不仅开创了电子测量的先河,更以高准确度、高可靠性、高分辨力、高性价比等优良特性而受到人民的青睐[2]。
1.1.2 国内外的发展现状与趋势
数字电压表作为电压表的一个分支,在近五十年间得到巨大发展,构成数字电压表的核心器件已从早期的中小规模电路跨入到大规模ASIC(专用集成电路)阶段。数字电压表涉及的范围也从传统的测量扩展至自动控制、传感、通信等领域,展示了广阔的应用前景。
传统电压表的设计思路主要分为:用电流计和电阻构成的电压表;用中小规模集成电路构成的电压表;用大规模ASIC(专用集成电路)构成的电压表。这几中电压表设计方式各有优势和缺点,分别适用于几种特定的应用环境,同时,也为很多新颖的电压表的设计所借鉴和依据[2]。
近入21世纪,随着信息技术一日千里的发展,电压表也必经历从单一测量向数据处理、自动控制等多功能过度的这一历程,特别是计算机技术的发展必将



出现智能化技术。因此,把电压表和计算机技术相结合的智能化电压表就将成为21世纪的新课题。目前,数字化仪器与微处理器取得令人瞩目的进展,就其技术背景而言,一个内藏微处理器的仪表意味着计算机技术向仪器仪表的移植,它所具有的软件功能使仪器 呈现出有某种延伸,强化的作用。这相对于过去传统的、纯硬件的仪器来说是一种新的突破,其发展潜力十分巨大,这已为70年代以来仪表发展的历史所证实。概括起来,具有微处理器的仪表具有以下特点:①测量过程的软件控制对测量数据进行存储及运算的数据处理功能是仪表最突出的特点;②在仪器的测量过程中综合了软件控制及数据处理功能,使一机多用或仪器的多功能化易于实现,成为这类仪器的又一特点;③以其软件为主体的智能仪器不仅在使用方便、功能多样化等方面呈现很大的灵活性[3]。
下面从5个方面阐述新型数字仪表的发展趋向。
  1.广泛采用新技术,不断开发新产品
随着科学技术的发展,新技术的广泛应用,新器件的不断出现。首先是A/D转换器:20世纪90年代世界各国相继研发了新的A/D转换技术。例如,四斜率A/D转换技术(美国)、余数再循环技术(美国)、自动校准技术(英国)、固态真有效值转换技术(英国)、约瑟夫森效应基准源(2个纳米稳定度)、智能化专用芯片(80C51系列,荷兰)等,这些新技术使数字电压表向高准确度、高可靠性及智能化、低成本方向发展。另外,集成电路的发展使电压表只在外围配置少量元器件,即可构成完整的智能仪表,可以完成储存、计算、比较、控制等多项功能[4]。
  2.广泛采用新工艺
新一代数字仪表正朝着标准模块化的方向发展。预计在不久的将来,更多的数字仪表将由标准化、通用化、系列化的模块所构成,给电路设计、安装调试和维修带来极大方便。
  3.多从显示仪表
为彻底解决数字仪表不便于观察连续变化量的技术难题;“数字/模拟条图”双显示仪表已成为国际流行款式,它兼有数字仪表准确度高、模拟式仪表便于观察被测量的变化过程及变化趋势这两大优点。
  4.提高安全性
仪器仪表在设计和使用中的安全性,对生产厂家和广大用户都至关重要。一方面厂家必须为仪表设计安全保护电路,并使之符合国家标准;另一方面用户必须安全操作,时刻注意仪表上的各种安全警告指示。
  5.操作简单化
集成电路的发展使电压表只在外围配置少量元件,即可构成完整的智能仪表,可以完成储存、计算、比较、控制等多项功能。这使的按键变少,操作简单。但是数字电压表并不能完全取代指针式的电压表,在反映电压的连续变化和变化趋势方面不如指针表的直观。为克服这种缺憾,20世纪90年代初,一种“数字/光柱”的双重显示仪表已经出现,并成功地应用于生产实践中[5]。
综上所述,十几年来智能仪器虽然有了很大的发展,但总的看来,人们还是较习惯于从硬件的角度做工作,这是由于设计者的(硬件)技术背景,LSI器件不断迅速更新的冲击以及在现阶段仪器硬件更新的数量还很大等因素所造成的。这种趋势虽然仍会继续下去,但从智能仪表的内涵,从软件的角度上看,软件的作用还远未发挥出来,这里有许多的领域等待着去开发。智能仪表最终必然会与人工智能联系起来开创出全新的仪器。从这个观点看,目前的智能仪器尚处于“幼年时期”。所以,就仪表的发展看来电压表会朝着具有微控制处理单元的智能仪表方向发展。
1.2 课题的意义和目的
数字电压表是诸多数字化仪表的核心与基础。以数字电压表为核心,可以扩展成各种通用数字仪表、专用数字仪表及各种非电量的数字化仪表(如:温度计,湿度计,酸度计,重量,厚度仪等),几乎覆盖了电子电工测量,工业测量,自动化仪表等各个领域。除此之外,数字电压还有着传统指针电压表无可比拟的优点:读数直观、准确,显示范围宽、分辨力高,转入阻抗高,功耗小、抗干扰强等[3]。因此 对数字电压表作全面深入的了解是很有必要的。但是传统的数字电压表设计通常以大规模ASIC(专用集成电路)为核心器件,并辅以少量中规模集成电路及显示器件构成,可是这种设计方法灵活性差,系统功能固定,难以更新扩展,不能满足日益发展的电子工业要求[6]。而应用微处理器(单片机)为核心单元的数字电压表,其灵活性高、系统功能扩展简单,性能稳定可靠。在这些背景下,设计一种以单片机为基础、结构简单、工作可靠、灵活性好的数字电压表是很有意义的。
1.3 本文所作的主要工作
1.对系统总体框架进行分析,根据系统所要实现的目标,设计基于单片机的数字电压表的硬件系统,以模块设计法为依据进行系统各个部分的具体设计。
2.设计基于单片机的数字控制系统,发挥单片机的处理功能强大,运算速度快的特点,对被测电压进行实时检测和显示。
3.制作印刷电路板,使硬件电路的设计更加清晰,同时使系统的抗干扰能力进一不加强。
4.针对系统的总体框架和硬件设计的特点,设计相应的软件系统,更合理



的去完成系统测电压的目的。
5.对系统进行整机调试,使得基于单片机的数字电压表的实验结果尽可能的满足设计指标。







第2章  基于单片机数字电压表的总体设计2.1 设计指标
在日常维修、教学和科研中,电压表是不可缺少的,传统的数字电压表设计通常以大规模ASIC(专用集成电路)为核心器件,并辅以少量中规模集成电路及显示器件构成,但是这种设计方法灵活性差,系统功能固定,难以更新扩展,不能满足日益发展的电子工业要求。而应用微处理器(单片机)为核心单元,其灵活性高、系统功能扩展简单,性能稳定可靠。本课题目的就是以单片机为基础设计出一种结构简单、工作可靠、灵活性好的直流数字电压表。要求数字电压表精度为±0.05V,测量范围为0~5V。
2.2 系统概述
本课题所设计的数字电压表主要包括两部分:硬件电路及软件程序。而硬件电路采用ATMEL公司的AT89C51作为主处理器,系统主要由信号采集、A/D转换、数据处理输出、驱动显示等几个功能模块组成。各部分电路的设计及原理将会在硬件电路设计部分详细介绍;程序的设计使用C语言编程,利用Keil 软件对其编译和仿真,详细的设计算法将会在程序设计部分详细介绍。
系统框图(图2.1)如下:

图2-1 硬件原理框图
    被测直流电压由A/D转换单元采集后被量化,再由单片机对A/D转换的结果进行标度变换,得到被测电压的数值,通过单片机对数次转换结果求平均值、并通过SOI串行数据接口把所求平均值输出给显示驱动单元,由该单元完成译码,并驱动数码管显示。



2.2.1 硬件电路图及工作过程简介
电压表的数字化是将连续模拟的电压量经A/D转化后变为不连续的离散的数字量并加以显示[7]。在设计过程中采用分模块设计,按照图2.1把电路分A/D转换、数据处理输出、驱动、显示四个单元,分别设计。
A/D转换器选用的是八位模/数转换器ADC0809。其次,计算机中的数字都是十六进制数,而我们习惯于十进制数的读写,因此,在软件设计中则要把十六进制数转换成十进制数。在显示的时候也是如此。本装置的输出用四位LED显示,因此在软件设计中还要解决数字输出与LED的接口问题。硬件则需要将输出线接到八段数码管上[8]。
    数值显示采用八段数码管,由单片机以动态扫描方式驱动,在此方式下能保证足够的亮度和较长的使用寿命。
由电路原理图2.2可以看出ADC0809通过IN0采集电压信号并送给单片机,单片机将采集来的信号进行一定的处理然后通过串口扩展的共阴极LED数码管显示采集的电压值。
数码管显示是采用动态显示的原理,要显示的数码通过单片机的串口发送然后通过ZLG7289转换为并行信号分别加到四个数码管的SA—DP,而四个数码管的公共端分别接ZLG7289的DIG0-DIG3接口,因此要使哪个数码管显示就把相应
的公共端口置零即可。比如:数字“1”的字型码通过串口发送出来并经过ZLG7289译码加到了四个数码管上,如果其中一个引脚为“0”那么对应的数码管显示数字“1”。在此电路中电压值的三个数字分别通过串口依次的送出,对应的公共端也依次被置“0”,由于两次置“0”的时间间隔很短,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位显示器并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感。因此给人的感觉就是三个数码管同时的显示出电压值四个数字[5]。
数字电压表电路图如图2.2所示:












图2-2 电路原理图

ADC0809的REF(-)接地,REF(+)接电源+5V,因此采集电压的范围是0~5V,A/D转换输出的结果D0~D7为8位二进制数。转换输出的结果在0~255之间分别对应着0~+5V之间的256个电压值,因此单片机必须把A/D转换输出的结果转换成可以显示的电压值,具体的方法是:
                                                               (2.1)

由上公式可知:当ADC0809输出为(11111111)B时,输入电压值VIN=5.00V;当ADC0809输出为(00000000)B时,输入电压值VIN=0.00V;当ADC0809输出为(10000000)B时,输入电压值VIN=2.50V,但是单片机在进行数学运算时结果只读取整数部分,因此当输出为(10000000)B时计算得来的电压值VIN=2.00V。由此可以看出这样运算的输出结果很不准确,在0~+5V之间只有0,1,2,3,4,5六个电压值,所以必须把单片机运算结果中的小数部分保留下来[8]。具体方法是:如果保留小数点后两位,在运算的时候分子乘以100,保留三位就乘以1000。小数点后保留两位的公式如下:
                                                               (2.2)

由新公式可知当ADC0809输出位(10000000)B时,单片机运算结果为2500。然后单片机将250除以10得到商为250,余数为0,再将250除以10得到商为25,余数为0,再将25除以10得到商为2,余数为5。这样就可以得到电压值的四个数字,最后分别将2、5、0、0四个数通过串口送出,显示在四个数码管上,并且把第一个数码管的dp脚(即小数点)直接接地使其一直发亮,那么数码管上就可以显示输入的电压值“2.500”[5]。
2.2.2 软件程序设计简介
开机后首先初始化,使数码管显示为“0.000”然后调用A/D转换子程序启动AD转换器,单片机等待查询转换结束信号,如果有信号则通过并行口读取转换数据并存储,就这样连着读取五次数据后求平均值,再按上面的方法通过串行口把数据传输出,经译码在数码管显示。具体方法和程序见程序设计部分和附录。
2.3 小结
    在电路设计和软件设计中都采用了分模块设计,这种设计方法清晰的电路的功能,为设计和以后的调试和维修带来了极大的方便。特别是在软件设计中,这中方法曾强了程序的可移植性,为以后的功能扩展奠定了基础。

第3章  基于单片机数字电压表的硬件设计
3.1 器件的选择
模数转换器选用ADC0809
单片机用AT89C51
显示驱动用ZLG7289
数码管用四位共阴级LED(SM420364)
退耦电容100nf无极性电容和100μf的电解电容
位电容用10μf的电解电容
零欧电阻   限流电阻
共阴极八段数码管sm420364
3.2 A/D转换电路3.2.1 A/D转换芯片的选择
A/D转换器是模拟量输入通道中的一个环节,单片机通过A/D转换器把输入模拟量变成数字量再处理。
随着大规模集成电路的发展,目前不同厂家已经生产出了多种型号的A/D转换器,以满足不同应用场合的需要。如果按照转换原理划分,主要有3种类型,即双积分式A/D转换器、逐次逼近式A/D转换器和并行式A/D转换器。目前最常用的是双积分和逐次逼近式。
双积分式A/D转换器具有抗干扰能力强、转换精度高、价格便宜等优点,比如ICL71XX系列等,它们通常带有自动较零、七段码输出等功能。与双积分相比,逐次逼近式A/D转换的转换速度更快,而且精度更高,比如ADC0808、ADC0809等,它们通常具有8路模拟选通开关及地址译码、锁存电路等,它们可以与单片机系统连接,将数字量送单片机进行分析和显示[9]。
本设计中,要求精度小于0.5%,则选用分辨率为8位的芯片,如ADC0809,ADC0801,ADC0808就能满足设计要求。本电路采用ADC0809。
3.2.2 ADC0809转换原理介绍
ADC是一种基本的外围扩展器件,其种类很多,工作原理也不仅相同,比较有代表性的是:单积分型,双积分型,脉宽调制型和逐次比较型(逐次逼近型)。从产品性价比、转换速度和精度等方面综合分析,逐次比较型ADC是相对应用比较广的类型之一。所以有着广泛的应用[10]。



黑龙江职业学院毕业论文(设计)
逐次逼近型ADC实际采用的方法上从高到底开始逐位设定,比较模拟量输出,再来确定原设定位的正确与否。逐次比较型ADC原理结构如图2.3所示。其主要由采集保持电路、电压比较器、逐次比较寄存器、数/模转换器ADC和锁存器等部分组成。


其工作原理如下:
首先,被测模拟电压ui通过逐次比较寄存器,将传递进的脉冲CP信号转换成数字信号,该数字量再经过数/模转换器生成对应的模拟量Us。当获得模拟量Us的数值达到并接近被测电压所对应ui后,就可以检测出电压比较器完成最后的反转。此时,逐次比较积存器的计数值就是被测电压ui所对应的数字量,从而完成模拟量的转换。以上的分析表明,逐次比较的模/数转换方法,归根到底是数/模转换,采用逐次与模拟量进行比较后得到最终的数字标定值[11]。
3.2.3 ADC0809芯片介绍
ADC0809是一种8位逐次逼近型A/D转换器。带8个模拟量输入通道,芯片内有通道地址译码锁存器,有输出三态数据锁存器,启动信号为脉冲启动方式,每个通道的转换时间大约为100μs,可以和单片机直接接口[9]。
ADC0809的引脚图和内部逻辑结构如图2.4所示。








           图3-2                               图 3-3
由图1(b)可知,ADC0809由一个8路模拟开关,一个地址锁存与译码器、一个8位A/D转换器和一个三态输出锁存器组成。多路开关可选通8个模拟通道IN0—IN7,允许8路模拟分量输入,共用A/D转换器 进行转换。三态输出锁存器用于锁存A/D转换完的数字量,当OE端为高电平时,才可以从三态输出锁存器取走转换完的数据。
IN0—IN7:8条模拟量输入通道。ADC0809对输入模拟量的要求是信号单极性,电压范围是0—5V,若信号太小,必须进行放大:输入的模拟量在转换过程中应保持不变,如若模拟信号变化太快,则需在输入前增加采样保持电路。
    地址输入和控制线:4条,ALE为地址锁存允许输入线,高电平有效。当ALE线为高电平时,地址锁存与译码器将A,B,C三条地址线的地址信号进行锁存,经译码后被选中的通道的模拟量进转化器进行转换。A,B,C为地址输入线,用于选通IN0—IN7上的一路模拟量输入。通道选择如表2.1所示。
数字量输出及控制线: 11条。START为上跳沿时,所有内部寄存器清零;下跳沿时,开始进行A/D转换:在转换期间,START应保持底电平。EOC为转换结束信号。当EOC为高电平时,表明转换结束:否则,表明正在进行A/D转换。OE为输出允许信号,用于控制三条输出锁存器向单片机输出转换得到的数据。OE=1,输出转换得到的数据。OE=0,输出数据线呈高阻状态。D7—D0为数字量输出线。
    CLK为时钟输入信号线。由于ADC0809的内部没有时钟电路,所需时钟信号必须由外界提供,通常使用频率为500KHz,最大不能超过1280KHz[11]。
    VREF(+),VREF(-)为参考电压输入,决定了输入模拟量的范围。一般情况VREF(-)接地,VREF(+)接+5V电源。
3.2.4 ADC0809与单片机的接口方法
  电路原理图2.2可以看出ADC0809的数据D0—D7直接与单片机的总线P0相连。模拟输入通道地址A、B、C直接接地,因此ADC0809只对通道IN0输入的电压进行模数转换,其他通道直接接地(接地的目的主要是为了减少输入噪声,一般情况对于模数转换芯片中没用到的模拟输入端都这样处理)。时钟CLK由单片机的ALE取得,对于晶振为12MHz的单片机ALE输出为2MHz的方波,但前面提到ADC0809的时钟频率一般为500KHz,最大能超过1280KHz,但在实际应用中2MHz的信号也可以使ADC0809正常工作。START、ALE和OE分别由单片机的WR、RD和P2.7经或非门接入、这样主要是满足ADC0809的信号电平与时序的要求。按此图中的片选接法。ADC0809通道—IN0的地址为7FFFH。
由于EOC未接入单片机,故只能采用延时等待的方法来读取A/D转换的结果(即当单片机启动ADC0809后延时一段时间再主动去读ADC0809的转换结果)。但是如果单片机在进行A/D转换时还要执行其他的程序可以将EOC接在单片机的中断上,这样当A/D转换完后EOC可以对单片机产生中断使其读取A/D转换的结果,这样做单片机的使用效率更高。
3.3 单片机介绍3.3.1 单片机介绍
单片微型计算机简称单片机,又称微型控制或嵌入式控制器,是将计算机的基本部件微型化,使之集成在一块芯片上的微机。单片机有着体积小,功耗低,功能强,性能价格比高、易于推广应用等显著优点,在自动化装置、智能化仪器仪表、过程控制和家用电器等领域得到日益广泛的应用。
3.3.2 采用AT89C51的原因
在众多的51系列单片机中,要算 ATMEL 公司的AT89C51更实用,它是由北京集成电路设计中心在MSC-51单片机的基础上精心设计,由美国生产的至今为止世界上最新型的高性能八位单片机。它不但和8051指令、管脚完全兼容,而且其片内的4K程序存储器是FLASH工艺的,这种工艺的存储器用户可以用电的方式瞬间擦除、改写,一般专为 ATMEL AT89Cx 做的编程器均带有这些功能。显而易见,这种单片机对开发设备的要求很低,开发时间也大大缩短[12]。
3.3.3 AT89C51芯片主要性能参数
与MCS—51产品指令系统完全兼容   
4K字节的可重擦写Flash闪速存储器
1000次擦写周期
全静态操作:0Hz–24Hz
三级加密程序存储器
128×8字节内部RAM
32个可编程I/O口线
2个16位定时/记数器
6个中断源
可编程串行UART通道
底功耗空闲和掉电模式                    图3-4 AT89C51管脚分
3.3.4 功能介绍
AT89C51是一种低损耗、高性能、CMOS八位微处理器,片内有4K字节的在线可重复编程快擦快写存储器,能重复写入/擦除1000次,数据保存时间为十年。它与MCS-51系列单片机在指令系统和引脚上完全兼容,不仅可完全代替MCS-51系列单片机,而且能使系统具有许多MCS-51单片机,而且能使系统具有许多MCS-51系列产品没有的功能。AT89C51可构成真正的单片机最小应用系统,缩小系统体积,增加系统的可靠性,降低了系统成本。只要程序长度小于4K,四个I/O口全部提供给用户。可用5V电压编程,而且擦写时间仅需10毫秒,仅为8751/87C51的擦除时间的百分之一,与8751/87C51的12V电压擦写相比,不易损坏器件,没有两种电源的要求,改写时不拔下芯片,适合许多嵌入式控制领域。工作电压范围宽2.7V-6V,全静态工作,工作频率宽,在0M Hz-24M Hz内,比8751/87C51等51系列的6MHz-12 MHz更具有灵活性,系统能快能慢。AT89C51芯片提供三级程序存储器加密,提供了方便灵活而可靠的硬加密手段,能完全保证程序或系统不被仿制[13]。
另外,AT89C51还具有MCS-51系列单片机的所有优点。128×8位内部RAM,32位双向输入输出线,两个十六位定时/计数器,5个中断源,两级中断优先级,一个全双工异步串行口及时钟发生器等。
3.3.5 芯片管脚介绍及分配
引脚描述:
    VCC:电源
GND:电源地

P0口:P0口是一组8位漏极开路双向I/O口,也既地址/数据总线复用口。作为输出口用时,每位能吸收电流的方式驱动8个TTL逻辑门电路,对端口写“1”可作为高阻抗输入端用。
在访问外部数据存储器话程序存储器时,这组口线分时转换地址(底8位)和数据总线服用,在访问期间激活内部上拉电阻。
在Flash编程时,P0口接受指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。

P1口:P1口是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口 写“1”,通过内部的上拉电阻把端口拉到高电平,此时可操作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉底时会输出一个电流(IIL)。
Flash编程和程序校验期间,P1接收底8位地址。

P2口:P2口是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对断口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉底时会输出一个电流(IIL)。
在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVE @DPTR)时,P2口送出高8位地址数据。在访问8位地址的外部数据存储器(如执行MOVE @RI指令)时,P2口线上的内容[也即特殊功能存储器(SFR)区中R2寄存器的内容],在整个访问期间不改变。
在Flash编程或校验时,P2亦接收高位地址和其他控制信号。

P3口:P3口是一组带有内部上拉电阻的8位双向I/O口。P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对P3口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。作输入端时,被外部拉底的P3口将用上拉电阻输出电流(IIL)。
P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能,如下表2.2所示:
表 3-5 P3口第二功能表
端口引脚
第二功能
P3.0
  RXD(串行输入口)
P3.1
  TXD(串行输出口)
P3.2
  INT0(外部中断0)
P3.3
  INT1(外部中断1)
P3.4
  T0(定时/记数器0)
P3.5
  T1(定时/记数器1)
P3.6
  WR(外部数据存储器写选通)
P3.7
  RD(外部数据存储器读选通)
P3口还接受一些用于Flash闪速存储器编程和程序校验的控制信号。
RST:复位输入。当振荡器工作时,RET引脚出现两个机器周期以上高电平将使单片机复位。
ALE/PROG:当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的底8位字节。即使不访问外部存储器,ALE仍以时钟振荡频率的1/6输出固定的正脉冲信号,因此它可对外部输出时钟或用于定时目的。要注意的是:每当访问外部数据存储器时将跳过一个ALE脉冲。
对Flash存储器编程期间,该引脚还用于输入编程脉冲(PROG)。
如有必要,可通过对特殊功能寄存器(SFR)区中的8EH的D0位置位,可禁止ALE操作。该位置位后,只有一条MOVE和MOVX指令ALE才会被激活,此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE无效。

PSEN:程序存贮允许(PSEN)输出是外部程序存储器的读选通信号,当AT89C51由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,既输出两个脉冲。在此期间,当访问外部数据存储器,这两次有效的PSEN信号不出现。
EA/VPP:外部访问允许。欲使CPU仅访问外部程序存储器(地址为0000H—FFFFH),EA端必须保持底电平(接地)。需注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。
如EA端为高电平(接VCC端),CPU则执行内部程序存储器中的指令。
Flash存储器编程时,该脚加上+12V的编程允许电源VPP,当然这必须是该器件是使用12V编程电压VPP。

XTAL1:振荡器反相放大器的及内部时钟发生器的输入端。
XTAL2:振荡器反相放大器的输出端。
3.4 显示驱动单元设计3.4.1 ZLG7289芯片介绍
ZLG7289是广州周立功单片机发展有线公司自行设计的数码管显示驱动及键盘扫描管理芯片,可直接驱动8位共阴式数码管(或64只独立LED),同时还可以扫描管理多达64只按键。 ZLG7289内部含有显示译码器,可直接接受BCD码或16进制码,并同时具有2种译码方式。此外,还具有多种控制指令,如消隐、闪烁、左移、右移、段寻址等。ZLG7289采用SPI串行总线与微控制器接口,仅占用少数几根I/O口线。利用片选信号,多片    ZLG7289还可以并接在一起使用,能够方便地实现多于8位的显示或多于64只按键的应用。
3.4.2 ZLG7289的主要特征
很宽的工作电压范围:+2.7-6V;
直接驱动8位共阴式数码管(1英寸以下)或64只独立的LED;
段电流可达15mA以上,字电流可达100mA;
利用功率电路可以方便地驱动1英寸以上的大型数码管;
具有左移、右移、闪烁、消隐、段点亮等强大功能;
要显示的数据提供有两种不同的译码方式(也可以选择不译码);
不接数码管而仅使用键盘管理功能时,工作电流可将至3mA;
与微控制器之间采用SPI串行总线接口,操作方便,占用I/O资源少;
工作温度范围:-40~+85℃;
封装:DIP-28。

3.4.3 ZLG7289引脚功能说明
表3-6 ZLG7289引脚功能表

引脚序号
引脚名称
功能描述
1
RTCC
接电源
2
VCC
电源,+2.7~6V
3
NC
悬空
4
GND
接地
5
NC
悬空
6
SPI总线片选信号,低电平有效
7
CLK
SPI总线时钟输入信号,上升沿有效
8
DIO
SPI总线数据信号,双向
9
键盘中断请求信号,低电平(下将沿)有效
10
SG/KR0
数码管g段/键盘行信号0
11
SF/KR1
数码管f段/键盘行信号1
12
SE/KR2
数码管e段/键盘行信号2
13
SD/KR3
数码管d段/键盘行信号3
14
SC/KR4
数码管c段/键盘行信号4
15
SB/KR5
数码管b段/键盘行信号5
16
SA/KR6
数码管a段/键盘行信号6
17
DP/KR7
数码管dp段/键盘列信号7
18
DIG0/KC0
数码管字选信号0键盘列信号0
19
DIG1/KC1
数码管字选信号1/键盘列信号1
20
DIG2/KC2
数码管字选信号2/键盘列信号2
21
DIG3/KC3
数码管字选信号3/键盘列信号3
22
DIG4/KC4
数码管字选信号4/键盘列信号4
23
DIG5/KC5
数码管字选信号5/键盘列信号5
24
DIG6/KC6
数码管字选信号6/键盘列信号6
25
DIG7/KC7
数码管字选信号7/键盘列信号7
26
OSC2
晶振输出信号
27
OSC1
晶振输入信号
28
复位信号,低电平有效

3.4.4 ZLG7289与单片机及数码管的连接
U1就是ZLG7289。为了使电源更加稳定,在Vcc到GND之间接入47-470μF的电解电容。J1是ZLG7289与微处理器的接口。晶振Y1取4-16MHz,调节电容
C3和C4通常在10pF左右。复位信号是低电平有效,一般只需外接简单的RC















图3-7 只使用数码管的应用电路

复位电路,也可以通过直接拉低 引脚的方法进行复位。
数码管必须是共阴式的,不能直接使用共阳式的。DPY1和DPY2是4位联体式数码管,共同组成完整的8位。数码管在工作时要消耗较大的电流,R9-R16是限流电阻,典型值是270Ω。如果要曾大数码管的亮度,可以适当减小电阻值,最低200Ω[13]。
ZLG7289通常应连接共阴式数码管,应用中无须用到的数码管可以不接,省去数码管不影响使用。ZLG7289与单片机的接口采用3线制I2C串行总线,由、CLK和DIO这3根信号组成。和CLK是输入信号,由单片机提供。DIO信号是双向的,必须接到单片机上具有双向功能的I/O上。设计中使ZLG7289的6-9脚分别于AT89C51的P1.0-P1.3相连。其中6脚为片选输入端CS,低电平有效,可用来向芯片发送数据,7脚CLK为同步时钟输入端,当向芯片发送数据时,此引脚上的电平上生表示数据有效;8脚为串行数据输入/输出端,当芯片接受指令时,此引脚为输入端。SPI信号线的具体意义参见表2.4。操作SPI总线的时序图参见图2-7、2-8。

表3-8 ZLG7289的SPI串行接口信号
信号名称
引脚时序
描述
6
SPI总线片选输入信号,低电平有效
CLK
7
SPI总线时钟输入信号,上升沿有效
DIO
8
SPI总线数据信号,双向





图3-9 存指令时序图(单字节命令)





图3-10 带数据指令时序图(命令字在前,输入数据在后)
3.4.5 时序图中的各项延迟时间
  表中2-5各项参数的测试条件为:VCC=5.0V,Fosc=16MHz
表 3-11 时序延时表
符号
名称
最小值
典型值
单位
T1
片选信号的建立时间
25
50
μs
T2
CLK信号高电平的宽度
5
8
μs
T3
CLK信号低电平的宽度
5
8
μs
T4
命令字与输出数据之间的时间间隔
15
25
μs
3.4.6 控制指令
ZLG7289的控制指令分为单字节纯指令和双字节数据指令两大类。在这里直介绍设计中所用的单字节复位(清除)指令和双字节带数据指令中的下载数据并按方式1进行译码指令[13]。
复位(清除)指令
D7
D6
D5
D4
D3
D2
D1
D0
1
0
1
0
0
1
0
0
这是一条软复位指令,执行后会将数码管所有的显示内容清楚掉,原先设置的所有闪烁、消隐等属性也一并清除,就像硬件复位一样。
下载数据并按方式1进行译码
D7
D6
D5
D4
D3
D2
D1
D0

D7
D6
D5
D4
D3
D2
D1
D0
1
1
0
0
1
a2
a1
a0

dp
x
x
x
d3
d2
d1
d0
在指令格式中,高5位的11001是指令字节段;a2a1a0是数码管显示数据的位地址,位地址编号从左到右的顺序依次位0、1、2、3、4、5、6、7;dp控制小数点是否显示,dp=1时该位的小数点被点亮,dp=0时该位的小数点被熄灭;xxx是无关位;d3d2d1d0是要显示的数据。显示数据按照下表中的规则进行译码:
表3-12 下载数据命令译码方式1
d3d2d1d0(二进制)
d3d2d1d0(十六进制)
显示结果
0
0
0
0
00H
0
0
0
0
1
01H
1
0
0
1
0
02H
2
0
0
1
1
03H
3
0
1
0
0
04H
4
0
1
0
1
05H
5
0
1
1
0
06H
6
0
1
1
1
07H
7
1
0
0
0
08H
8
1
0
0
1
09H
9
1
0
1
0
0AH
A
1
0
1
1
0BH
B
1
1
0
0
0CH
C
1
1
0
1
0DH
D
1
1
1
0
0EH
E
1
1
1
1
0FH
F
3.5 SPI接口技术3.5.1 SPI总线简介
SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议[14]。
3.5.2 SPI总线的基本结构
SPI是一个环形总线结构,由SS(CS)、SCK、SDI、SIO构成,其时序其实很简单,主要是在SCK的控制下,两个双向移位寄存器进行数据交换。
    上升沿发送、下降沿接收、高位先发送。
    上升沿到来的时候,SDO上的电平将被发送到从设备的寄存器中。
    下降沿到来的时候,SDI上的电平将被接收到主设备的寄存器中。
3.5.3 数据的传输
假设主机和从机初始化就绪:并且主机的sbuff=0xaa (10101010),从机的sbuff=0x55 (01010101),下面将分步对SPI的8个时钟周期的数据情况演示一遍(假设上升沿发送数据)[15]。
---------------------------------------------------
脉冲           主机sbuff    从机sbuff     SDI    SDO
---------------------------------------------------
0    00-0     10101010     01010101      0      0
---------------------------------------------------
1    0--1     0101010x     10101011      0      1
1    1--0     01010100     10101011      0      1
---------------------------------------------------
2    0--1     1010100x     01010110      1      0
2    1--0     10101001     01010110      1      0
---------------------------------------------------
3    0--1     0101001x     10101101      0      1
3    1--0     01010010     10101101      0      1
---------------------------------------------------
4    0--1     1010010x     01011010      1      0
4    1--0     10100101     01011010      1      0
---------------------------------------------------
5    0--1     0100101x     10110101      0      1
5    1--0     01001010     10110101      0      1
---------------------------------------------------
6    0--1     1001010x     01101010      1      0
6    1--0     10010101     01101010      1      0
---------------------------------------------------
7    0--1     0010101x     11010101      0      1
7    1--0     00101010     11010101      0      1
---------------------------------------------------
8    0--1     0101010x     10101010      1      0
8    1--0     01010101     10101010      1      0
---------------------------------------------------
    这样就完成了两个寄存器8位的交换,上面的0--1表示上升沿、1--0表示下降沿,sdi、 sdo相对于主机而言的。根据以上分析,一个完整的传送周期是16位,即两个字节,因为,首先主机要发送命令过去,然后从机根据主机的名准备数据,主机在下一个8位时钟周期才把数据读回来。
其中CS是控制芯片是否被选中的,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),对此芯片的操作才有效[16]。这就允许在同一总线上连接多个SPI设备成为可能。接下来就负责通讯的3根线了。通讯是通过数据交换完成的,这里先要知道SPI是串行通讯协议,也就是说数据是一位一位的传输的。这就是SCK时钟线存在的原因,由SCK提供时钟脉冲,SDI,SDO则基于此脉冲完成数据传输。数据输出通过 SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。完成一位数据传输,输入也使用同样原理。这样,在至少8次时钟信号的改变(上沿和下沿为一次),就可以完成8位数据的传输。
3.6 电压显示电路
设计中采用的是8段LED数码管sm420364来显示电压值。LED具有耗电低、亮度高、视角大、线路简单、耐震及寿命长等优点,它由8个发光二极管组成,其中7个按‘8’字型排列,另一个发光二极管为圆点形状,位于右下角,常用于显示小数点。把8个发光二极管连在一起,公共端接高电平,叫共阳极接法,相反,公共端接低电平的叫共阴极接法,根据ZLG7289的要求我们采用共阴极接法。当发光二极管导通时,相应的一段笔画或点就发亮,从而形成不同的发光字符。其8段分别命名为dp g f e d c b a。例如,要显示“0”,则dp g f e d c b a分别为:1100 0000B;要显示“A”,则dp g f e d c b a分别为:0001 0001B(共阳极)。若要显示多个数字,只要让若干个数码管的位码循环为低电平就可以了。
根据设计要求,显示电路需要至少4位LED数码管来显示电压值,则有4位LED循环显示。设计中由ZLG7289的SA~DP驱动LED的段码显示,即显示字符,由ZLG7289的DIG0~DIG3选择LED位码,即选择点亮哪位LED来显示。电路图参考原理图2.1。
3.7 小结
在满足设计要求的前提下,为保证电路造价和维修的方便,在设计中我尽可能的用电路制作中的常用元件。另外除了上述器件外,其他的元件如电阻,电容的选择都是由一些典型电路经测试调节确定的。所以电路显得更于理解和分析,这一点给也将给最后的调试带来很大的方便。


第4章  基于单片机数字电压表的软件设计4.1 软件系统整体设计
系统的软件流程如下:
开始时首先初始化ZLG7289,使数码管显示为“0.000”,然后调用A/D转换子程序启动ADC0809。单片机等待查询转换结束信号,如果有信号则通过并行口读取转换数据并存储,就这样连着读取五次数据后求平均值。再将所求得的结果进行运算Dout100/51,将运算后的结果除以10得到千分位,再把商除以10得到百分位,再除以10又分别得到十分位和个位,最后把个位,十分位,百分位和千分位通过串口发送给ZLG7289经译码后送至数码管显示,此时LED数码管显示的就是ADC0809采集的电压值。
4.1.1 C51简介
C语言是今年来在国内外得到迅速推广应用的一种计算机语言。C语言功能丰富,表达力强,使用灵活方便,应用面广,目标程序效率高,可移植性好,既具有高级语言的优点,又有低级语言的许多特点。因此,C语言特别适合于编写系统软件。C语言诞生后,许多原来用汇编语言编写的软件,现在可以用C语言编写了,而学习和使用C语言要比学习和使用汇编语言容易得多[17]。
51 的编程语言常用的有二种,一种是汇编语言,一种是C 语言。汇编语言的机器代码生成效率很高但可读性却并不强,复杂一点的程序就更是难读懂,而C 语言在大多数情况下其机器代码生成效率和汇编语言相当,但可读性和可移植性却远远超过汇编语言,而且C 语言还可以嵌入汇编来解决高时效性的代码编写问题。对于开发周期来说,中大型的软件编写用C 语言的开发周期通常要小于汇编语言很多[17]。
Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全——Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势[18]。
设计步骤:
  • 建立一个新的项目;
  • 选择所用单片机;
  • 在新建立的项目中加入程序;
  • 保存运行;
  • 编译是否通过。
4.1.2 程序流程图
    系统软件的总体框架如图4-1所示:


图4-1程序流程图
系统上电即初始化,首先,单片机片选A/D转换器,然后发出信号启动A/D转换。此时单片P3.2口开始工作,不断扫描A/D转换结束端口有无结束信号。若有,即启动信号采集,对A/D转换器的数据输出口送来的数值进行存储,又重新开始,并且准备下一次的采集;若没有,则继续等待。每当采集系统采集一次,a的值就自增1,直至采集满5次时归零,然后单片机一边对数据处理,一边进入下一次的扫描。数据处理完之后,通过SPI总线将数据传给ZLG7289,ZLG7289把接收到的数据译码后送显示器显示出来。
4.1.3 数据采集模块的设计
  1.ADC0809内部带有输出锁存器,可以与AT89S51单片机直接相连。
  2.初始化时,使ST和OE信号全为低电平。
  3.送要转换的哪一通道的地址到A,B,C端口上。
  4.在ST端给出一个至少有100ns宽的正脉冲信号。
  5.是否转换完毕,根据EOC信号来判断。            
  6.当EOC变为高电平时,这时给OE为高电平,转换的数据就输出给单片机了。
4.1.4 数据处理模块的设计
     为了得到更高精度和曾强系统的抗干扰能力,当微处理器从ADC0809读取数据后,把连续读入的5次数据进行累加求平均值:
                                                               (4.1)

再由单片机对VO进行标度变换,得到被测电压数值:
                                                               (4.2)

但是单片机在进行数学运算时结果只读取整数部分,且要显示的是三位小数,所以需要给VIN乘以1000:
                      (4.3)
用取余数的方法将电压值按位输出[5]:

  千分位                           取余数输出
百分位                           取余数输出
  十分位                           取余数输出
4.2 原程序见附录A4.3 小结
这一章中主要介绍了软件部分的设计方法,另外要注意的是在程序设计上,首先要根据电路功能要求和硬件电路图画出程序流图。然后再写出程序,在程序的编译过程中很难避免会出现错误,这就需要编译器的提示和个人的分析,检查出错误所在,并且修正直到编译的通过为止。为了尽可能减少错误的出现和检查的方便,在写程序时,最好按照规范的程序写法去写,并且最好加上详细的注释。

第5章  基于单片机数字电压表的抗干扰设计5.1硬件系统的可靠性与抗干扰设计
硬件抑制干扰主要从形成干扰的三个方面采取措施[19][20]:
  1.消除和抑制噪声源
  2.破坏干扰通道
  3.消弱接受电路对抗噪声干扰信号的敏感性
对此采用的抗干扰措施有以下几种方法:
5.1.1 供电系统抗干扰措施
    任何电源及输入线路都存在内阻,正是这些内阻引进了电源的噪声干扰。如果无内阻存在,任何噪声都会被电源短路吸收,在线路中不会建立任何干扰电压。为保证电子线路正常工作,防止从电源引入干扰,采取以下措施:
  1.采用交流稳压器供电
用交流稳压器供电可保证供电的稳定性,防止电源系统的过压与欠压,有利于提高整个系统的可靠性[19]。
  2.加装滤波器
(1)低通滤波器:电源系统的干扰源大部分是高次谐波,因此采用低通滤波器滤去高次谐波,以改善电源波形。
(2)退耦滤波器:一个直流电源同时对几个电路供电,为了避免通过电源内阻造成几个电路之间互相干扰,应在每个电路的直流电源进线处加装退耦滤波电容[19]。
5.1.2 接地
    接地是抑制干扰的重要方法,如能将接地和屏蔽正确结合起来,就可以解决大部分干扰问题。在电子电路中,地线有系统地、机壳地(屏蔽地)、数字地(逻辑地)和模拟地等。如果一个电路有两点和两点以上接地,则由于两点间的地电位差而会引起干扰,因此一般采用“单点接地” [20]。
  1.单点接地
    多级电路通过公共接地母线后在一点接地,如图5.1(a)所示。此方法虽然避免了多点接地因地电位差所引起的干扰,但在公共地线上却存在着A、B和C三个不同的对地电位差。如果各级电平相差不大,这种接地方式可以使用,反之则不能使用。因为高电平会产生较大的地电流,并且使这个干扰串入到底电平电路中去。这种接地方式仅限于级数不多、各级电平差异不大或抗干扰能力较强的数字电路[20]。



图5-1(b)图是另一种单点接地方式。此时,A、B和C三点对地电位只与本电路的地电流和地线阻抗有关,各电路之间的电流不形成耦合,该种接地方式一般用于工作频率在1MHz以下的电路。







                 a                                   b  
图5-1 接地方式
  2.数字、模拟电路的接地分开
一个系统既有高速数字电路,又有模拟电路,为避免数字电路对模拟电路
的工作造成干扰,两者的接地不要相混,而分别与电源端地线相连[21]。
5.1.3 传输通道的抗干扰措施
在电子电路信号的传输过程中会产生通道干扰。为了保证传输的可靠性, 在本设计中采取尽可能小连线距离和尽可能大的PCB布线宽度,这样使电磁波对信号的影响降到了最小。
5.2 软件系统的可靠性与抗干扰设计
按照可靠性理论,程序设计最主要任务是,确保应用程序按照给定的顺序有秩序地运行。有序运行的基础是硬件的可靠性,可靠性高的硬件基础可以确保不出现硬件故障;但是在使用时,大量的干扰源虽然不会造成单片机硬件系统的破坏,却常常会破坏数字信号的时序,更改单片机寄存器内容,导致程序运行的不正常。因此,在提高硬件的基础上,必须在程序设计中采取措施,提高软件的可靠性,减少软件错误的发生保证系统的正常运行[22]。
    软件的抗干扰设计有关方面很多,在本设计中只对软件的本质可靠性加以考虑,即本质可靠性程序设计:它是指程序可以不依靠附加的部分就可以完成规定的功能。为了做到程序设计的本质可靠性,程序设计中从以下几个方面做了考虑:
  1.最大限度的减少程序错误和缺陷
    程序在编写和调试时对系统将来所处的环境不可能做到完全的模拟,因此,看似正确的程序,实际上还存在一定的缺陷。这些缺陷,有的是显性的,可以通过进一步的调试与仿真加以改进,还有是隐性的,如因为信号的延时而造成程序的判断错误。这就要求在编写程序时,需作综合、全面、动态的考虑。
  2.足够的时序裕度
    数字系统的协调、有序运行离不开正确的时序。系统在单片机的控制下,实现分时操作,程序运行完全依靠时序调度、切换控制。
(1)复位时序
     在系统中,通常需要复位的不仅仅是单片机,一些带有工作寄存器的外围器件也要复位(如本次设计中的ZLG7289),在软件复位时,必须先复位外围器件,再复位主器件。
(2)器件工作时序
    器件工作时序是器件应用程序设计的基础。程序中必须保证时序工作的正确性,而且要有足够的序裕度。例如:ZLG7289片选信号的建立时间最小为25μs,必须延时25μs后才能发挥后续指令,这是由器件的工作特性决定的。在考虑器件运行时序时,单片机的操作必须保证时序信号的衔接控制和时序信号的时序裕度。
(3)总线时序
    在单片机应用系统,有并行总线与串行总线,串行通信中又有通信总线与扩展总线。这些总线在规范化操作时,其时序由数据通信协议保证,在非规范运行,例如在虚拟总线方式下,其虚拟总线运行的可靠性在于时序的准确模拟。所以在数字电压表的程序设计中必须严格按照ZLG7289的SPI总线时序进行设计[23]。
5.3 小结
   抗干扰的方法很多,以上介绍的只是本设计中所采用的。这些方法也是电路设计中最常用和最好用的,但是对于软件抗干扰就不是所有的电路所能做到的,它只能在含有微处理单元的电路中才可以去实现。并且可以通过软件的方法去补偿一些硬件不能达到的调节,或者通过拟合曲线去处理一些非线形的数据。这也是电路中应用微处理器的一大益处。


第6章  电路制作及调试6.1 PCB板的制作
CAD是Computer Aided Design(计算机辅助制图)的简称。CAD的特点是速度快,准确性高,能极大地减轻工程技术人员的劳动强度。电子线路CAD的基本含义是使用计算机来完成电子线路的设计过程,包括电路原理图的编辑、电路功能仿真、工作环境模拟、印制板设计(自动布线、手动布线)与检测等。电子线路CAD软件还能迅速形成各种各样的报表文件,如元件清单报表,为元器件的采购及工程决算等提供了方便[23]。
目前,电子线路CAD软件种类很多,如早期的Smartwork、TANGO、EESystem、PCAD、OrCAD、Protel等。其功能大同小异,其中Protel具有操作简单、方便、易学等特点,是目前比较流行的电子线路CAD软件之一[24][25]。
Protel99SE是Protel软件系列较新的版本,其强大而先进的功能,使它自推出以来,一直是大多数电子设计者的手选软件。因此,我选用Protel99SE来绘制PCB板。





图6-2敷铜后的PCB图
6.2 系统外观














图6-3 上电后系统图


图6-4 加被测电压后系统图
6.3电路调试6.3.1 调试步骤
  1.按电路原理图进行焊接,在焊接过程中首先要对PCB进行检测,查看PCB是否制作合格。
  2 .按电路原理图焊接元件。
  3 .上电测试:在系统上电开始测量前,要用万用表的电压档对被测电压进行估测,然后以此选择适当的量程,防止过大电压烧坏A/D转换器。选择好量程之后就可以对系统上电测量了。
6.3.2 可能出现的问题解答
  1.上电后电路不工作,数码管无反应
    检查此类错误情况需要从两个方面入手:硬件上,检查电源供电是否正常、晶振是否起振、电路接线是否良好可靠;软件上,检查程序触发的时序是否正确,片选是否选通、程序中延时是否正确。
  2.数码管出现闪烁现象
     正常工作的ZLG7289驱动数码管显示应处于一个很稳定的状态,数码管被点亮后不会出现闪烁和跳动的现象。出现闪烁的很大原因是在选定ZLG7289(即将片选信号/CS置为低电平)后很长时间没有释放,导致7289中断扫描的时间太长,从而肉眼看到数码管出现闪烁和不稳定的现象;正确的使用方法是在CS置为低电平后减少不必要的延时,使ALG7289被中断扫描的时间降到最低而不至于影响显示[25]。
  3.上电后显示正常,就是显示数值不准确。
    显示正常表示硬件电路和软件都正确,对于数值显示不准确需要调节ADC0809的输入比较电压。所以需要找一块更高精度的电压表进行校准。
6.4 系统调试及结果分析
设计完成之后,我们要对系统进行调试。调试过程可以利用对部分给定电压的测量结果分析来完成。首先要校对零点:将A/D转换器的模拟输入端口接较准电源,此时可以调整ADC0809参考电压值,直至显示电压和标准电源相同[26]。校准后,就可以进行调试了。表6.1所示为对系统进行测试结果:
表6-1 测试结果
实际电压(V)
显示电压(V)
绝对误差(V)
相对误差(%)
0.000
0.000
0.000
0.0%
0.500
0.506
0.006
1.2%
1.000
1.007
0.007
1.4%
1.500
1.517
0.017
1.2%
2.000
2.019
0.019
0.9%
2.500
2.521
0.021
0.8%
6.4 小结
PCB布线的好坏直接影响着电路工作的可靠性,所以在布线时需要对布线规则和所用元件PCB封装做一些了解,要求做到线于线之间相交的次数最少,无直角连线。在调试上,如果电路出现问题,可根据问题分析可能问题所在模块,然后在根据模块设计时的功能要求去排错修改。另外根据表6.1去评价设计是否满足设计指标要求。若显示电压与实际电压的误差在误差范围之内,则表示系统运行正常;若显示电压与实际电压的误差很大,则有可能是校零电阻没有调整,可以进一步的校准。




黑龙江职业学院毕业论文(设计)

  
一、主要结论
本论文通过参阅大量相关文献,了解现有数字电压表的设计原理和发展方向,在总结了前人经验的基础上,采用单片机为核心控制单元,实现了通过软件来对数据进行处理。在设计中为了节省单片机的端口资源,采用了可以和单片机进行串行通信的显示驱动芯片ZLG7289。另外,考虑到系统到抗干扰性,在电路设计中加入了去耦电容,零欧电阻等用来抗干扰的元件;在电路制作中,PCB严格按照布线规则进行布线,这一措施使系统的可靠性得以提高。在程序设计中最大限度的减少程序缺陷,使程序合理合序运行。最后,通过反复调试,各硬件电路的参数已经确定,系统软件程序也调试完成,系统各项工作指标已满足。



黑龙江职业学院毕业论文(设计)
通过本课题的研究,从原理图的设计到PCB板子的绘制、从实际硬件电路的搭建、调试到软件系统程序的编写、调试,所有工作形成了一个完整的系统。整个工作过程培养了我独立研制的能力,也培养了我工程学的思维能力,让我受益匪浅,为我以后的工作奠定了基础。当然也还存在很多问题,望各位老师批评指正,提出您的宝贵意见。
二、进一步工作及展望
通过实验,证明了本电压表的设计方案的可行性,并且有着很好的开发前景,现就本设计以后完善及功能扩展总结为以下几点:
  1.调校问题。电路在制作时没有考虑ADC0809参考电压要求,所以对电源要求较高为稳定6V。要解决这个问题,可以从两个方面考虑:a.从硬件考虑,给ADC0809参考电压输入端加装滤波、稳压、可调分压电路,具体电路由一个滤波电容、稳压二极管,可变电阻组成。b.从软件考虑,可以拟合一条曲线,经单片机处理对不准确的量化值进行修正。这也是本电路采用单片机后灵活性的体现。并且按照这样做,还可以节省印刷PCB板的面积,降低了制作费用。
  2.精度的提高。由于设计指标要求的精度不是很高,所以用8位AD转换和程序中求多次电压平均值的方法就能充分满足设计要求。但是对于本设计,如果要得到更高的测量精度,可以通过改进程序的方法实现。例如:按误差理论中的计算方法处理数据。
  3.扩展问题。设计指标要求测量范围是0V~+5V。但是实际中要测量的范围多种多样,要测量的度量也不相同,比如温度、压力、湿度等等,所以本电压表在实际应用中还需要根据具体应用环境附加合适的电路完成要求功能。比如要测量高电压时就要加分压电路,要测温度时就要加温度传感器(把温度变为电压量),测不稳定电压要加采样保持电路等等。也就是说,本设计的电压表相当一个表头,在需要数字化显示的仪表中有着广泛的应用。
  4.端口的利用。由于设计中采用了SPI串行总线,芯片的管脚上只占用四根线,节约了芯片的管脚,这样就有足够的端口供以后使用,比如:设计中采用的A/D转换是ADC0809,它能对8路信号进行AD转换,为了利用这个特点,可以方便的在单片机上取三个端口用于ADC0809的地址输入。
总之,由于设计中采用了单片机,而单片机的应用如今已经在工业、电子等方方面面展示出了它的优越性,利用单片机设计电路逐渐成发展趋势,它与外围的简单电路再加上优化程序就可以构建任意的产品,使得本设计成为现实。随着单片机的日益发展,它必将在未来显示出更大的活力,为电子设计增加更多精彩。


致   谢
在毕业设计完成时,作者不由的想起大学最后这一学期的学习生活。在这里,作者首先要感谢的是导师刘群华、韩峰老师这几个月来给予的关心与指导,尤其是他们一丝不苟的科研态度、高度的事业心和责任感时刻感染着作者;老师不仅教授给作者知识,更教给作者做人的道理、做学问的态度,这些都将使作者终生受益,恩师的教导将永不忘记,再一次忠心的感谢老师苦心培育之恩。同时也忠心感谢在做毕业设计的过程中给予作者帮助和关心的老师、同学和朋友们。这里向他们表示深深的谢意,感谢你们这些年来为作者所付出的艰辛和无私的奉献。
在此,忠心的向在百忙之中审阅作者论文的各位老师表示最诚挚的感谢。

参考文献
[1]   刘振忠.数字电压表发展概况和原理.电讯工程.1998,1
[2]  胡学海.单片机原理及应用系统设计.电子工业出版社,2005,2-7
[3]  沙占友.新型数字电压表原理与应用.机械工业出版社.2006,1-6
[4]  柳金龙.浅谈数字电压表的特点.中国计量.2004,8:43-44
[5]   黄亮.基于AT89C51单片机的数字电压表的设计.实用电子制作.2006,10:25-27
[6]  Grinev.V.G,Grineva.L.V. Amplitude digital voltmeter. Instruments and Experimental Techniques,1975,114-117
[7]   王守华,李智.基于PC的数字电压表设计.今日电子.2006,8:81
[8]   何循来.高性能八位单片机AT89C51.半导体技术.1997,8(4):61-63
[9]  宋凤娟,李国忠等.基于89C51单片机的数字电压表设计.2007,29(2): 89-93
[10]  ADC0808/ADC0809 8-Bit up Compatible A/D Cnverters With 8-Channel Multiplexer. National Semiconductor.
[11]  江晓安等.数字电子技术.西安电子科技大学出版社,1993,189-204
[12]  余永权.ATMEL89系列单片机应用技术.北京航天航空大学出版社,2000
[13]  ATMEL Corporation.Microcontroller Data Book.Oct 1995
[14]  苗红霞.单片机实现数字电压表的软硬件设计.河海大学常州分校学报.
        2002,16(3):74-79
[15]   蔡美琴 张为民等.MCS-51系列单片机系统及应用.高等教育出版,2005
[16]  龚尚福,朱宇.微机原理与接口技术.西安电子科技大学出2003.135-142
[17]  王建校,杨建国等.51系列电片机及C51程序设计.科学出版社,2002
[18]  胡大可.基于单片机8051的嵌入式开发指南.电子工业出版社,2001
[19]  杨栓科.模拟电子技术基础.高等教育出版社.2005
[20]  田良,王尧等.综合电子设计与实践.东南大学出版社,2002
[21]  阎智义,王晓梅等.提高数字电压表稳定性的方法.长春工业大学学报.
        2003,24(1):50-53
[22]  刘光斌,刘东等.单片机系统实用抗干扰技术.人民邮政出版社,2003.322-358
[23]  李东生等.Protel99SE电路设计技术入门与应用.电子工业出版社,2004
[24]  余家春.Protel99SE电路设计实用教程.中国铁道出版社,2002
[25]  陈晓平.Protel99SE-电子线路CAD应用教程.东南大学出版社,2005
[26]  孟凡利.直流数字电压表的误差及分析.计量技术.2004,9:25-26

附录 基于单片机的数字电压表设计C51原程序


  1. #include  
  2. sbit ST=P3^6;
  3. sbit OE=P3^7;
  4. sbit EOC=P3^2;
  5. sbit ZLG7289_pinCS=P1^0;
  6. sbit ZLG7289_pinCLK=P1^1;
  7. sbit ZLG7289_pinDIO=P1^2;
  8. unsigned char ZLG7289_Delay_t=4;
  9. /*
  10. 宏定义:ZLG7289_ShortDelay()
  11. 功能:短延时
  12. 说明:延时ZLG7289_ShortDelay_t*2+8)个机器周期
  13. */
  14. void ZLG7289_ShortDelay()
  15. {
  16.    unsigned char t=ZLG7289_Delay_t;
  17.    while(--t!=0);
  18. }
  19. /*
  20. 宏定义:ZLG7289_LongDelay()
  21. 功能:长延时
  22. 说明:延时ZLG7289_LongDelay_t*12+8)个机器周期
  23. */
  24. void ZLG7289_LongDelay()
  25. {
  26.     unsigned char t=ZLG7289_Delay_t*6;
  27.     while(--t!=0);
  28. }



  29. 黑龙江职业学院毕业论文(设计)
  30. /*
  31. 函数:ZLG7289_SPI_Write()
  32. 功能:向SPI总线写入1字节的数据
  33. 参数:
  34. dat:要写入的数据
  35. */
  36. void ZLG7289_SPI_Write(char dat)
  37. {
  38.     unsigned char t=8;
  39.     do
  40.    {
  41.     ZLG7289_pinDIO=(bit)(dat&0x80);
  42.     dat<<=1;
  43.     ZLG7289_pinCLK=1;
  44.     ZLG7289_ShortDelay();
  45.     ZLG7289_pinCLK=0;
  46.     ZLG7289_ShortDelay();
  47.     }while(--t!=0);
  48. }
  49. /*函数:ZLG7289_cmd()
  50. 功能:执行ZLG7289纯指令
  51. 参数:
  52. cmd:命令字
  53. */
  54. void ZLG7289_cmd(char cmd)
  55. {
  56.    char sav=IE;
  57.    IE&=0xFA;
  58.    ZLG7289_pinCS=0;
  59.    ZLG7289_LongDelay();
  60.    ZLG7289_SPI_Write(cmd);
  61.    ZLG7289_pinCS=1;
  62.    ZLG7289_LongDelay();
  63.    IE=sav;
  64. }
  65. //复位(清除)指令
  66. void ZLG7289_Reset()
  67. {
  68.   ZLG7289_cmd(0xA4);
  69. }
  70. /*
  71. 函数:ZLG7289_cmd_dat()
  72. 功能:执行ZLG7289带数据指令
  73. 参数:
  74. cmd:命令字
  75. dat:数据
  76. */
  77. void ZLG7289_cmd_dat(char cmd,char dat)
  78. {
  79.          char sav=IE;
  80.          IE&=0xFA;
  81.          ZLG7289_pinCS=0;
  82.          ZLG7289_LongDelay();
  83.          ZLG7289_SPI_Write(cmd);
  84.          ZLG7289_LongDelay();
  85.          ZLG7289_SPI_Write(dat);
  86.          ZLG7289_pinCS=1;
  87.          ZLG7289_LongDelay();
  88.          IE=sav;
  89. }
  90. /*
  91. 函数:ZLG7289_Download()
  92. 功能:下载数据
  93. 参数:
  94.   mod=0:下载数据且按方式0译码
  95.   mod=1:下载数据且按方式1译码
  96.   mod=2:下载数据且按方式2译码
  97.   x:数码管编号(横坐标),取值0~7
  98.   dp=0:小数点不亮
  99.   dp=1:小数点亮
  100.   dat:要显示的数据
  101.   说明:
  102.   译码方式的具体含义查参考数据手册
  103. */
  104. void ZLG7289_Download(unsigned char mod,char x, bit dp,char dat)
  105. {
  106.           code char ModDat[3]={0x80,0xC8,0x90};
  107.           char d1;
  108.           char d2;
  109.           if(mod>2)mod=2;
  110.           d1=ModDat[mod];
  111.           x&=0x07;
  112.           d1|=x;
  113.           d2=dat&0x7F;
  114.           if(dp)d2|=0x80;
  115.           ZLG7289_cmd_dat(d1,d2);
  116. }
  117. /*
  118. 函数:ZLG7289_Init()
  119. 功能:ZLG7289初始化
  120. 参数:SPI总线的延时值设置,取值1-40(超出范围可能导致错误)
  121. 说明:
  122. t的取值可以参考以下公式:t>=5*f1/f2,其中f1表示89C51的
  123. 晶振频率,f2表示ZLG7289的晶振频率
  124. */
  125. void ZLG7289_Init(unsigned char t)
  126. {
  127.     unsigned char x;
  128.     //I/O口初始化
  129.     ZLG7289_pinCS=1;
  130.     ZLG7289_pinCLK=0;
  131.     ZLG7289_pinDIO=1;
  132.     //延时初始化
  133.     ZLG7289_Delay_t=t;
  134.     //点亮所有数码管
  135.     for(x=0;x<4;x++)
  136.    {
  137.       ZLG7289_Download(1,x,1,8);
  138.    }
  139. }
  140. /***************************************************
  141. ***************主函数*******************************
  142. ****************************************************/
  143. void main()
  144. {
  145. /*********程序初始化***********/
  146.       unsigned long int sum;
  147.       unsigned char gatdata;
  148.       char i,j,x,outdat;
  149.                 int result;
  150.       ST=1;
  151.       OE=1;
  152.       ZLG7289_Reset();
  153.       ZLG7289_Init(4);

  154. /*******初始化结束***************/
  155.      while(1)
  156.     {
  157.                      sum=0;
  158.            gatdata=0;
  159.            for(i=0;i<=5;i++)
  160.              {
  161.               ST=0;
  162.               ZLG7289_ShortDelay();
  163.               ST=1;
  164.               while(1)
  165.                  if(EOC==0)
  166.                    {
  167.                      OE=0;
  168.                      gatdata=P0;
  169.                      OE=1;
  170.                      sum=sum+gatdata;
  171.                                                                       break;
  172.                    }
  173.              }
  174.            result=(sum*1000)/255;
  175.            for(j=0;j<=3;j++)
  176.            {
  177.             outdat=result%10;
  178.             result=result/10;
  179.             if(j==3) x=1;
  180.             else x=0;
  181.             ZLG7289_Download(1,j,x,outdat);
  182.            }
  183.                 }
  184. }
复制代码

0.092.jpg (69.47 KB, 下载次数: 128)

0.092.jpg

0.081.jpg (3.53 KB, 下载次数: 124)

0.081.jpg

0.062.jpg (13.21 KB, 下载次数: 140)

0.062.jpg

评分

参与人数 5黑币 +27 收起 理由
ko44 + 7 共享资料的黑币奖励!
lhxdsd + 5 很给力!
taozi123 + 5 赞一个!
wang245075324 + 5 很给力!
spz24680 + 5 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏14 分享淘帖 顶5 踩
回复

使用道具 举报

沙发
ID:287373 发表于 2018-3-4 11:31 | 只看该作者
学习学习
回复

使用道具 举报

板凳
ID:294836 发表于 2018-3-21 15:14 | 只看该作者
学习学习              
回复

使用道具 举报

地板
ID:307003 发表于 2018-4-12 22:24 | 只看该作者
学习学习
回复

使用道具 举报

5#
ID:271591 发表于 2018-4-29 13:06 | 只看该作者
看起来不错
回复

使用道具 举报

6#
ID:319215 发表于 2018-4-30 09:07 | 只看该作者
学习学习
回复

使用道具 举报

7#
ID:319135 发表于 2018-5-1 19:41 | 只看该作者
很有帮助,谢谢啦
回复

使用道具 举报

8#
ID:343644 发表于 2018-6-2 20:15 | 只看该作者
求原版清晰总电路原理图
回复

使用道具 举报

9#
ID:355437 发表于 2018-6-21 09:33 | 只看该作者
谢谢      
回复

使用道具 举报

10#
ID:348734 发表于 2018-6-22 18:37 | 只看该作者
好东西,,谢谢了
回复

使用道具 举报

11#
ID:416420 发表于 2018-10-27 19:21 | 只看该作者
好东西
回复

使用道具 举报

12#
ID:435796 发表于 2018-11-29 16:48 | 只看该作者
学习学习
回复

使用道具 举报

13#
ID:410167 发表于 2018-11-30 01:06 | 只看该作者
学习学习不错不错谢谢楼主
回复

使用道具 举报

14#
ID:436038 发表于 2018-11-30 14:38 | 只看该作者
很给力
回复

使用道具 举报

15#
ID:449314 发表于 2018-12-18 21:04 | 只看该作者
有没有加上过电压报警功能的
回复

使用道具 举报

16#
ID:479854 发表于 2019-3-8 00:24 | 只看该作者
谢谢
回复

使用道具 举报

17#
ID:493072 发表于 2019-3-18 11:31 | 只看该作者
学习学习,很棒
回复

使用道具 举报

18#
ID:493122 发表于 2019-3-18 13:07 | 只看该作者
好东西非常感谢
回复

使用道具 举报

19#
ID:493280 发表于 2019-3-18 16:04 | 只看该作者
66666666
回复

使用道具 举报

20#
ID:746219 发表于 2020-5-7 16:33 | 只看该作者
以单片机为核心,设计数字电压表,以A/D转换器采集被测量电压的数值,经过单片机运算,计算出被采集电压的数字,将电压数字显示在数码管或LED显示器上。
我是这个题目可以用这个吗
回复

使用道具 举报

21#
ID:907192 发表于 2021-5-18 22:34 | 只看该作者
6-1的表,1.000V的相对误差是不是算错了
回复

使用道具 举报

22#
ID:28992 发表于 2021-5-19 08:08 | 只看该作者
excellent job, thank you!
回复

使用道具 举报

23#
ID:924117 发表于 2021-5-20 21:10 | 只看该作者
再来学习一下,文章中好像有几个图表没有对应上
回复

使用道具 举报

24#
ID:102800 发表于 2021-5-20 21:17 | 只看该作者
正在找这方面资料,谢谢分享
回复

使用道具 举报

25#
ID:1104730 发表于 2023-12-17 18:04 | 只看该作者
结课要求与题目相似,感谢给我很大启发。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表