找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机+ADC0832数字电压表设计 0-5v,含有仿真与报告和代码

[复制链接]
跳转到指定楼层
楼主
ID:445903 发表于 2018-12-22 16:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
目录
1 数字电压表的简介
1.1数字电压表简介
1.2数字电压表的的背景与意义
2 设计总体方案
2.1 设计要求
2.2 设计思路
2.3 设计方案
3 硬件电路设计              5
3.1 A/D转换模块              5
3.2 单片机系统              8
3.3 复位电路和时钟电路              10
3.4 LCD显示系统设计              11
3.5 总体电路设计              13
4 程序设计              14
4.1 程序设计总方案              14
4.2 系统子程序设计              14
5 仿 真              16
5.1软件调试              16
5.2显示结果及误差分析              16
5.2.1 显示结果
5.2.2 误差分析
结 论
参考文献
附 录            

1 数字电压表的简介1.1数字电压表简介
在电量的测量中,电压、电流和频率是最基本的三个被测量,其中电压量的测量最为经常。而且随着电子技术的发展,更是经常需要测量高精度的电压,所以数字电压表就成为一种必不可少的测量仪器。数字电压表简称DVM,它是采用数字化测量技术,把连续的模拟量转换成不连续、离散的数字形式并加以显示的仪表。由于数字式仪器具有读数准确方便、精度高、误差小、测量速度快等特而得到广泛应用。
    传统的指针式刻度电压表功能单一,进度低,容易引起视差和视觉疲劳,因而不能满足数字化时代的需要。采用单片机的数字电压表,将连续的模拟量如直流电压转换成不连续的离散的数字形式并加以显示,从而精度高、抗干扰能力强,可扩展性强、集成方便,还可与PC实时通信。数字电压表是诸多数字化仪表的核心与基础。以数字电压表为核心,可以扩展成各种通用数字仪表、专用数字仪表及各种非电量的数字化仪表。目前,由各种单片机和A/D转换器构成的数字电压表作全面深入的了解是很有必要的。
1.2数字电压表的的背景与意义
电压表已经有100多年的发展历史,虽然不断改进与完善,仍然无法满足现代电子测量的需求,近二十年,微电子技术,计算机技术,集成技术,网络技术等高新技术得到了迅猛发展。这一背景和形势,不断地向仪器仪表提出了更高、更新、更多的要求,如要求速度更快、灵敏度更高、稳定性更好、样品量更少、遥感遥测更远距、使用更方便、成本更低廉、无污染等。同时也为仪器仪表科技与产业的发展提供了强大的推动力,并成了仪器仪表进一步发展的物质、知识和技术基础。
数字电压表(Digital Voltmeter简称DVM)自1952年问世以来,显示出强大的生命力,现已成为在电子测量领域中应用最广泛的一种仪器。数字电压表可以显示清晰、直观,读数准确,准确度高,分辨力强,测量范围广,扩展能力强,测量速度快,输入阻抗高,集成度高,微功耗和抗干扰能力强等优点,独占电压表产品的熬头。
    DVM的高速发展,使它已成为实现测量自动化、提高工作效率不可缺少的仪表,数字化是当前计量仪器发展的主要方向之一,而高准度的DC-DVC的出现,又使DVM进入了精密标准测量领域。随着现代化技术的不断发展,数字电压表的功能和种类将越来越强,越来越多,其使用范围也会越来越广泛。采用智能化的数字仪器也将是必然的趋势,它们将不仅能提高测量准确度,而且能提高电测量技术的自动化程序,可以扩展成各种通用数字仪表、专用数字仪表及各种非电量的数字化仪表(如:温度计、湿度计、酸度计、重量、厚度仪等),几乎覆盖了电子电工测量、工业测量、自动化仪表等各个领域。从而提高计量检定人员的工作效。
    目前数字电压表的内部核心部件是A/D转换器,转换器的精度很大程度上影响着数字电压表的准确度,本课程设计A/D转换器采用ADC0832对输人模拟信号进行转换,控制核心STC89C52再对转换的结果进行运算和处理,最后驱动输出装置显示数字电压信号。


2 设计总体方案
    该设计主要由三个模块组成:A/D转换模块,数据处理模块及显示模块。A/D转换主要由芯片ADC0832来完成,它负责把采集到的模拟量转换为相应的数字量在传送到数据处理模块;数据处理则由芯片STC89C52来完成,其负责把ADC0832传送来的数字量经过一定的数据处理;产生相应的显示码送到显示模块进行显示。
2.1 设计要求
1、以MCS-52系列单片机为核心器件,组成一个简单的直流数字电压表。
2、采用1路模拟量输入,能够测量0-5V之间的直流电压值。
3、电压显示采用LCD1602液晶屏显示,至少能够显示两位小数。
4、所用的元件较少,成本低,且测量精度和可靠性较高。
2.2 设计思路
1、根据设计要求,选择STC89C52单片机为核心控制器件。
2、A/D转换采用ADC0832实现,与单片机的接口P3的部分口连接。
3、电压显示采用LCD1602液晶屏显示。
4、LCD1602数据传输接口是单片机的P0口,单片机P0需要接上拉电阻。为方便移植,只需将LCD1602三个控制端口与P2口连接即可。
2.3 设计方案
本设计硬件电路设计由6个部分组成:A/D转换电路,STC89C52单片机系统,LCD显示系统、时钟电路、复位电路以及测量电压输入电路。总体硬件电路框图如图2.1所示。

图2.1 系统硬件设计框图


3 硬件电路设计
3.1 A/D转换模块
    现实世界的物理量都是模拟量,能把模拟量转化成数字量的器件称为模/数转换器(A/D转换器),A/D转换器是单片机数据采集系统的关键接口电路,按照各种A/D芯片的转化原理可分为逐次逼近型,双重积分型等等。双积分式A/D转换器具有抗干扰能力强、转换精度高、价格便宜等优点。与双积分相比,逐次逼近式A/D转换的转换速度更快,而且精度更高,比如ADC0809、ADC0808等,它们通常具有8路模拟选通开关及地址译码、锁存电路等,它们可以与单片机系统连接,将数字量送到单片机进行分析和显示。一个n位的逐次逼近型A/D转换器只需要比较n次,转换时间只取决于位数和时钟周期,逐次逼近型A/D转换器转换速度快,因而在实际中广泛使用。
(1) 逐次逼近型A/D转换器原理
逐次逼近型A/D转换器是由一个比较器、A/D转换器、存储器及控制电路组成。它利用内部的寄存器从高位到低位一次开始逐位试探比较。
转换过程如下:
开始时,寄存器各位清零,转换时,先将最高位置1,把数据送入A/D转换器转换,转换结果与输入的模拟量比较,如果转换的模拟量比输入的模拟量小,则1保留,如果转换的模拟量比输入的模拟量大,则1不保留,然后从第二位依次重复上述过程直至最低位,最后寄存器中的内容就是输入模拟量对应的二进制数字量。其原理框图如图3.1所示:

图3.1 逐次逼近式A/D转换器原理图

(2) ADC0832 主要特性
ADC0832为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在0~5V之间。芯片转换时间仅为32μS,据有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。独立的芯片使能输入,使多器件挂接和处理器控制变的更加方便。通过DI数据输入端,可以轻易的实现通道功能的选择。
(3) ADC0832的外部引脚特征
ADC0832有DIP和SOIC两种封装,DIP封装的ADC0832引脚排列如图3.2所示。各引脚说明如下:

      图3.2ADC0832的引脚图

● CS——片选端,低电平有效。
● CH0,CH1——两路模拟信号输入端。
● DI——两路模拟输入选择输入端。
● DO——模数转换结果串行输出端。
● CLK——串行时钟输入端。
● Vcc/REF——正电源端和基准电压输入端。
● GND——电源地。
(4) 单片机对ADC0832的控制原理
    一般情况下ADC0832与单片机的接口应为4条数据线,分别是CS、CLK、DO、DI。但由于DO端与DI端在通信时并未同时有效并与单片机的接口是双向的,所以电路设计时可以将DO和DI 并联在一根数据线上使用。当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用,CLK 和DO/DI 的电平可任意。当要进行A/D转换时,须先将CS端置于低电平并且保持低电平直到转换完全结束。此时芯片开始转换工作,同时由处理器向芯片时钟输入端CLK提供时钟脉冲,DO/DI端则使用DI端输入通道功能选择的数据信号。在第1个时钟脉冲到来之前DI端必须是高电平,表示启动位。在第2、3个时钟脉冲到来之前DI端应输入2位数据用于选择通道功能,其功能项见表3.1所示。

表3.1 功能表

    如表3.1所示,当配置位2位数据为1、0时,只对CH0 进行单通道转换。当配置2位数据为1、1时,只对CH1进行单通道转换。当配置2位数据为0、0时,将CH0作为正输入端IN+,CH1作为负输入端IN-进行输入。当配置2位数据为0、1时,将CH0作为负输入端IN-,CH1作为正输入端IN+进行输入。到第3个时钟脉冲到来之后DI端的输入电平就失去输入作用,此后DO/DI端则开始利用数据输出DO进行转换数据的读取。从第4个时钟脉冲开始由DO端输出转换数据最高位D7,随后每一个脉冲DO端输出下一位数据。直到第11个脉冲时发出最低位数据D0,一个字节的数据输出完成。也正是从此位开始输出下一个相反字节的数据,即从第11个时钟脉冲输出D0。随后输出8位数据,到第19个脉冲时数据输出完成,也标志着一次A/D转换的结束。最后将CS置高电平禁用芯片,直接将转换后的数据进行处理就可以了,图3.3为ADC0832时序图。

图3.3 ADC0832时序图

3.2 单片机系统
(1) STC89C52性能
STC89C52是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含有4KB的可反复擦写的只读程序存储器和128字节的随机存储器。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容,由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的STC89C52是一种高效微控制器,它为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
    STC89C52功能性能:与MCS-51成品指令系统完全兼容;4KB可编程闪速存储器;寿命:1000次写/擦循环数据保留时间:10年;全静态工作:0-24MHz;三级程序存储器锁定;128*8B内部RAM;32个可编程I/O口线;2个16位定时/计数器;5个中断源;可编程串行UART通道;片内震荡器和掉电模式。
(2) STC89C52各引脚功能
STC89C52提供以下标准功能:4KB的Flash闪速存储器,128B内部RAM,32个I/O口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内震荡器及时钟电路,同时,AT89C52可降至0Hz静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作,掉电方式保存RAM中的内容,但震荡器停止工作并禁止其他所有工作直到下一个硬件复位。STC89C52采用PDIP封装形式,引脚配置如图3.4所示。

图3.4 STC89C52的引脚图

STC89C52芯片的各引脚功能为:
P0口:这组引脚共有8条,P0.0为最低位。这8个引脚有两种不同的功能,分别适用于不同的情况,第一种情况是89C52不带外存储器,P0口可以为通用I/O口使用,P0.0-P0.7用于传送CPU的输入/输出数据,这时输出数据可以得到锁存,不需要外接专用锁存器,输入数据可以得到缓冲,增加了数据输入的可靠性;第二种情况是89C52带片外存储器,P0.0-P0.7在CPU访问片外存储器时先传送片外存储器的低8位地址,然后传送CPU对片外存储器的读/写数据。P0口为开漏输出,在作为通用I/O使用时,需要在外部用电阻上拉。
P1口:这8个引脚和P0口的8个引脚类似,P1.7为最高位,P1.0为最低位,当P1口作为通用I/O口使用时,P1.0-P1.7的功能和P0口的第一功能相同,也用于传送用户的输入和输出数据。
P2口:这组引脚的第一功能与上述两组引脚的第一功能相同即它可以作为通用I/O口使用,它的第一功能和P0口引脚的第二功能相配合,用于输出片外存储器的高8位地址,共同选中片外存储器单元,但并不是像P0口那样传送存储器的读/写数据。
P3口:这组引脚的第一功能和其余三个端口的第一功能相同,第二功能为控制功能,每个引脚并不完全相同,如下表3.2所示:

表3.2 P3口各位的第二功能

P3口各位
第二功能
P3.0  
RXT(串行口输入)
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(片外数据存储器读允许)


Vcc为+5V电源线,Vss接地。
ALE:地址锁存允许线,配合P0口的第二功能使用,在访问外部存储器时,89C52的CPU在P0.0-P0.7引脚线去传送随后而来的片外存储器读/写数据。在不访问片外存储器时,89C52自动在ALE线上输出频率为1/6震荡器频率的脉冲序列。该脉冲序列可以作为外部时钟源或定时脉冲使用。
/EA:片外存储器访问选择线,可以控制89C52使用片内ROM或使用片外ROM,
若/EA=1,则允许使用片内ROM, 若/EA=0,则只使用片外ROM。
/PSEN:片外ROM的选通线,在访问片外ROM时,89C52自动在/PSEN线上产生一个负脉冲,作为片外ROM芯片的读选通信号。
RST:复位线,可以使89C52处于复位(即初始化)工作状态。通常89C52复位有自动上电复位和人工按键复位两种。
XTAL1和XTAL2:片内震荡电路输入线,这两个端子用来外接石英晶体和微调电容,即用来连接89C52片内OSC(震荡器)的定时反馈回路。
3.3 复位电路和时钟电路
(1) 复位电路设计
单片机在启动运行时都需要复位,使CPU和系统中的其他部件都处于一个确定的初始状态,并从这个状态开始工作。MCS-51单片机有一个复位引脚RST,采用施密特触发输入。当震荡器起振后,只要该引脚上出现2个机器周期以上的高电平即可确保时器件复位。复位完成后,如果RST端继续保持高电平,MCS-51就一直处于复位状态,只要RST恢复低电平后,单片机才能进入其他工作状态。单片机的复位方式有上电自动复位和手动复位两种,图3.5是51系列单片机统常用的上电复位和手动复位组合电路,只要Vcc上升时间不超过1ms,它们都能很好的工作。

图3-5  复位电路



图3.5 复位电路

(2) 时钟电路设计
单片机中CPU每执行一条指令,都必须在统一的时钟脉冲的控制下严格按时间节拍进行,而这个时钟脉冲是单片机控制中的时序电路发出的。CPU执行一条指令的各个微操作所对应时间顺序称为单片机的时序。MCS-51单片机芯片内部有一个高增益反相放大器,用于构成震荡器,XTAL1为该放大器的输入端,XTAL2为该放大器输出端,但形成时钟电路还需附加其他电路。
    本设计系统采用内部时钟方式,利用单片机内部的高增益反相放大器,外部电路简,只需要一个晶振和2个电容即可,如图3.6所示。

图3.6  时钟电路

电路中的器件选择可以通过计算和实验确定,也可以参考一些典型电路的参数,电路中,电容器C1和C2对震荡频率有微调作用,通常的取值范围是30±10pF,在这个系统中选择了33pF;石英晶振选择范围最高可选24MHz,它决定了单片机电路产生的时钟信号震荡频率,在本系统中选择的是12MHz,因而时钟信号的震荡频率为12MHz。
3.4 LCD显示系统设计
(1) LCD的选择
    在应用系统中,设计要求不同,使用的LCD显示器的位数也不同,因此就生产了位数,尺寸,型号不同的LCD显示器供选择,在本设计中,选择采用LCD1602液晶屏显示。LCD1602是字符型液晶,显示字母和数字比较方便,控制简单,成本较低。
(2) LCD1602显示器的管脚功能
1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表3.3所示。

表3.3 引脚接口说明表

编号
符号
引脚说明
编号
符号
引脚说明
1
VSS
电源地
9
D2
数据
2
VDD
电源正极
10
D3
数据
3
VL
液晶显示偏压
11
D4
数据
4
RS
数据/命令选择
12
D5
数据
5
R/W
读/写选择
13
D6
数据
6
E
使能信号
14
D7
数据
7
D0
数据
15
BLA
背光源正极
8
D1
数据
16
BLK
背光源负极
    第1脚:VSS为地电源。第2脚:VDD接5V正电源。第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第7~14脚:D0~D7为8位双向数据线。第15脚:背光源正极。第16脚:背光源负极。
(3) LCD显示器与单片机接口设计
由于单片机的并行口不能直接驱动LCD显示器,所以在一般情况下,必须采用专用的驱动电路芯片,使之产生足够大的电流,显示器才能正常工作[7]。如果驱动电路能力差,即负载能力不够时,显示器亮度就低,而且驱动电路长期在超负荷下运行容易损坏,因此,LCD显示器的驱动电路设计是一个非常重要的问题。
为了简化数字式直流电压表的电路设计,在LCD驱动电路的设计上,可以利用单片机P0口上外接的上拉电阻来实现,即将LCD的D0-D7段显示引脚与P0口并联到上拉电阻之间,这样,就可以加大P0口作为输出口德驱动能力,使得LCD能按照正常的亮度显示出数字。
3.5 总体电路设计
经过以上的设计过程,可设计出基于单片机的简易数字直流电压表硬件电路原理图如图3.7所示。

图3.7 简易数字电压表电路图

此电路的工作原理是:+5V模拟电压信号通过变阻器VR1分压后由ADC0832的IN0通道进入(由于使用的IN0通道,所以ADDA,ADDB,ADDC均接低电平),经过模/数转换后,产生相应的数字量经过其输出通道D0-D7传送给STC89C52芯片的P1口,并且此时单片机STC89C52负责把接收到的数字量经过数据处理,产生正确的信号传给LCD1602,LCD1602经过正确的线段显示。此外,STC89C52还控制ADC0832的工作。其中,单片机STC89C52通过定时器中断从P3.3输出方波,接到ADC0832的CLOCK,P3.4发正脉冲启动A/D转换,并检测A/D转换是否完成,转换完成后,P3.5置高从P1口读取转换结果送给LCD显示出来。
数字直流电压表的硬件电路设计完成,就可以选取相应的芯片和元器件,Proteus软件绘制出硬件的原理,并仔细地检查,直至形成完善的硬件原理图。但要真正实现电路对电压的测量和显示的功能,还需要有相应的软件配合,才能达到设计要求。
4 程序设计
    系统的软件程序中主函数含有初始化程序,同时分别调用AD0832转换程序、数据转换程序、显示函数,在显示程序中包含LCD1602驱动程序。以此完成整个系统的运行。
4.1 程序设计总方案
根据模块的划分原则,将该程序划分初始化模块,A/D转换子程序和显示子程序,这三个程序模块构成了整个系统软件的主程序,如图4.1所示。

图4.1 数字式直流电压表主程序框图

4.2 系统子程序设计
(1)初始化程序
所谓初始化,是对将要用到的MCS_51系列单片机内部部件或扩展芯片进行初始工作状态设定,初始化子程序的主要工作是设置定时器的工作模式,初值预置,开中断和打开定时器等。
(2)显示子程序
显示子程序采用字符型液晶显示,此模块模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。
在本设计中,为了简化硬件设计,主要采用软件定时的方式,即用定时器0溢出中断功能实现11μs定时,通过软件延时程序来实现5ms的延时。
(3)A/D转换子程序
A/D转换子程序用来控制对输入的模块电压信号的采集测量,并将对应的数值存入相应的内存单元,其转换流程图如图4.2所示。

图4.2 A/D转换流程图


5 仿 真5.1软件调试
    软件调试的主要任务是排查错误,错误主要包括逻辑和功能错误,这些错误有些是显性的,而有些是隐形的,可以通过仿真开发系统发现逐步改正。Proteus软件可以对基于微控制器的设计连同所有的周围电子器件一起仿真,用户甚至可以实时采用诸如LED/LCD、键盘、RS232终端等动态外设模型来对设计进行交互仿真。Proteus支持的微处理芯片包括8051系列、AVR系列、PIC系列、HC11系列及Z80等等。Proteus可以完成单片机系统原理图电路绘制、PCB设计,更为显著点的特点是可以与u Visions3 IDE工具软件结合进行编程仿真调试。
   本系统的调试主要以软件为主,其中系统电路图的绘制和仿真我采用的是Proteus软件,而程序方面,采用的是C语言,用Keil软件将程序写入单片机。
5.2显示结果及误差分析5.2.1 显示结果
  • 当IN0口输入电压值为0V时,显示结果如图5.1所示,测量误差为0.01V。

图5.1 输入电压为0V时,LCD的显示结果


2.当IN0输入电压值为2.10V时,显示结果如图5.2所示。测量误差为0.01V。

图5.2输入电压为2.10V时,LCD的显示结果

3. 当IN0口输入电压值为5.00V时,显示结果如图5.3。测量误差为0V。

图5.3 输入电压为5.00V时,LCD的显示结果

5.2.2 误差分析
通过以上仿真测量结果可得到简易数字电压表与“标准”数字电压表对比测试表,如下表5.1所示:

表5.1 简易数字电压表与“标准”数字电压表对比测试表

标准电压值/V
简易电压表测量值/V
绝对误差/V
0.00
0.00
0.01
0.50
0.51
0.01
1.00
1.00
0.00
1.50
1.51
0.01
2.10
2.11
0.01
2.50
2.50
0.00
3.00
3.00
0.00
3.56
3.56
0.00
4.00
4.00
0.00
5.00
5.00
0.00

    由于单片机STC89C52为8位处理器,当输入电压为5.00V时,ADC0832输出数据值为255(FFH),因此单片机最高的数值分辨率为0.0196V(5/255)。这就决定了电压表的最高分辨率只能到0.0196V,从上表可看到,测试电压一般以0.02V的幅度变化。
    从上表可以看出,简易数字电压表测得的值基本上比标准电压值偏大0-0.01V,这可以通过校正ADC0832的基准电压来解决。因为该电压表设计时直接用5V的供电电源作为电压,所以电压可能有偏差。当要测量大于5V的电压时,可在输入口使用分压电阻,而程序中只要将计算程序的除数进行调整就可以了。



结 论
经过一段时间的努力,课程设计-基于单片机的简易数字电压表基本完成。但设计中的不足之处仍然存在。这次设计是我第一次设计电路,并用Proteus实现了仿真。在这过程中,我对电路设计,单片机的使用等都有了新的认识。通过这次设计学会了Proteus和Keilc软件的使用方法,掌握了从系统的需要、方案的设计、功能模块的划分、原理图的设计和电路图的仿真的设计流程,积累了不少经验。
基于单片机的数字电压表使用性强、结构简单、成本低、外接元件少。在实际应用工作应能好,测量电压准确,精度高。系统功能、指标达到了课题的预期要求、系统在硬件设计上充分考虑了可扩展性,经过一定的改造,可以增加功能。本文设计主要实现了简易数字电压表测量一路电压的功能,详细说明了从原理图的设计、电路图的仿真再到软件的调试。
通过本次设计,我对电子测量有了进一步的了解。无论是在硬件连接方面还是在软件编程方面。本次设计采用了STC89C52单片机芯片,与以往的单片机相比增加了许多新的功能,使其功能更为完善,应用领域也更为广泛。设计中还用到了模/数转换芯片ADC0832,以前在学单片机课程时只是对其理论知识有了初步的理解。通过这次设计,对它的工作原理有了更深的理解。在调试过程中遇到很多问题,硬件上的理论知识学得不够扎实,对电路的仿真方面也不够熟练。
总之这次电路的设计和仿真,基本上达到了设计的功能要求。在以后的实践中,我将继续努力学习电路设计方面的理论知识,并理论联系实际,争取在电路设计方面能有所提升。

  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. sbit lcdrs=P2^4;
  6. sbit lcdrw=P2^5;
  7. sbit lcden=P2^6; //1602控制端口
  8. sbit DI=P3^4;
  9. sbit DO=P3^4;  //DI和DO与单片机共接口
  10. sbit Clk=P3^3;
  11. sbit CS=P3^5;//ADC0832控制端口
  12. uchar  dis[3]={0x00,0x00,0x00}; //显示缓冲区
  13. uchar date=0; //AD值
  14. uchar CH;    //ADC0832通道值
  15. /*****************************************
  16. AD0832转换程序
  17. ******************************************/
  18. uchar ADC0832(uchar CH)

  19. {
  20.     uchar i,dis0,dis1;
  21.                
  22.               Clk=0;    //拉低时钟
  23.    DI=1;   //初始化
  24.    _nop_();
  25.               CS=0;    //芯片选定
  26.     _nop_();
  27.     Clk=1;   //拉高时钟
  28.     _nop_();

  29.               if(CH==0)      //通道选择
  30.     {
  31.       Clk=0;      //第一次拉低时钟
  32.       DI=1;     //通道0的第一位
  33.       _nop_();
  34.       Clk=1;    //拉高时钟
  35.                 _nop_();
  36.       Clk=0;    //第二次拉低时钟,ADC0832 DI接受数据
  37.       DI=0;   //通道0的第二位
  38.       _nop_();
  39.       Clk=1;
  40.       _nop_();
  41.     }
  42.     else
  43.     {
  44.       Clk=0;
  45.       DI=1;      //通道1的第一位
  46.       _nop_();
  47.       Clk=1;
  48.       _nop_();
  49.       Clk=0;
  50.       DI=1;      //通道1的第二位
  51.       _nop_();
  52.       Clk=1;
  53.       _nop_();
  54.     }
  55.               Clk=0;  //第三次拉低时钟,此前DI两次赋值决定通道
  56.     DI=1;   //DI开始失效,拉高电平,便于DO数据传输

  57.     for(i= 0;i<8;i++)      //读取前8位的值
  58.     {
  59.        _nop_();
  60.        dis0<<= 1;
  61.        Clk=1;   
  62.        _nop_();
  63.        Clk=0;
  64.        if (DO)
  65.           dis0|=0x01;  
  66.       else
  67.          dis0|=0x00;
  68.     }
  69.     for (i=0;i<8;i++)      //读取后8位的值
  70.     {
  71.        dis1>>= 1;
  72.        if (DO)
  73.         dis1|= 0x80;
  74.        else
  75.         dis1|= 0x00;
  76.        _nop_();
  77.        Clk=1;
  78.        _nop_();
  79.        Clk=0;
  80.     }
  81.               if(dis0==dis1) //两次结束数据比较,若相等
  82.                 date=dis0;    //则赋值给dat  
  83.     _nop_();
  84.     CS=1;  //释放ADC0832
  85.     DO=1;  //拉高输出端,方便下次通道选择DI端有效
  86.     Clk=1;  //拉高时钟
  87. return date;
  88. }
  89. /***********************************************
  90. 数据转换程序
  91. 功能:将0-255级换算成0.00-5.00的电压数
  92. ***********************************************/
  93. void convert(uchar a)
  94. {            
  95.     uint temp;       //特别注意这里需定义int型(余数将大于255)
  96.               dis[0]=a/51;     //取个位
  97.               temp=a%51;
  98.               temp=temp*10;
  99.               dis[1]=temp/51;  //取小数点后第一位
  100.               temp=temp%51;
  101.               temp=temp*10;
  102.               dis[2]=temp/51;  //取小数点后第二位
  103. }
  104. /*****************************************
  105. LCD1602驱动程序
  106. ******************************************/
  107. void delay(uchar z)
  108. {
  109.               uint x,y;
  110.               for(x=z;x>0;x--)
  111.                             for(y=122;y>0;y--);            
  112. }
  113. void write_cmd(uchar cmd)//lcd1602写命令函数
  114. {
  115.               lcdrs=0;
  116.               lcdrw=0;    //选择指令寄存器
  117.               lcden=1;
  118.               P0=cmd;     //写数据
  119.               delay(5);
  120.               lcden=0;    //使能拉低
  121.               lcden=1;
  122. }
  123. void write_date(uchar date)//lcd1602写数据函数
  124. {
  125.               lcdrs=1;
  126.               lcdrw=0;    //选择数据寄存器
  127.               lcden=1;
  128.               P0=date;     //写数据
  129.               delay(5);
  130.               lcden=0;    //使能拉低
  131.               lcden=1;
  132. }
  133. void init_lcd1602()//lcd1602初始化
  134. {
  135.               write_cmd(0x01);  //清屏
  136.               write_cmd(0x38);  //功能设置
  137.               write_cmd(0x0c);  //显示设置
  138.               write_cmd(0x06);  //输入方式从左到右
  139.               delay(1);
  140. }
  141. /*****************************************
  142. 显示函数
  143. *****************************************/
  144. void display(void)
  145. {
  146.               uchar i;
  147.               write_cmd(0x80);
  148.               for(i=0;i<3;i++)
  149.               {
  150.                             if(i==1) write_date('.'); //第二位显示小数点
  151.                             write_date (0x30+dis[i]);
  152.                             delay(5);
  153.               }
  154.               write_date('V');  //最后一位后显示字符'V'
  155.             
  156. }
  157. /************************************************
  158.       主函数
  159. ***************************************************/

  160. void main(void)

  161. {
  162.    CH=0;       //选择通道0或1
  163.   init_lcd1602();//液晶1602显示初始化
  164.    while(1)       //主循环                             
  165.    {
  166.                             date=ADC0832(CH);//启动ADC0832转换并接受数据
  167.                             delay(1);
  168.                             convert(date);  //数据转换成BCD码
  169.                      display();      //显示数值
  170.     }
  171. }
复制代码

全部资料51hei下载地址:
zhc仿真与报告.rar (298.21 KB, 下载次数: 200)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:552840 发表于 2019-6-26 09:43 | 只看该作者
有没有仿真图的程序文件
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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