1.引言
在电量的测量中,电压、电流和频率是最基本的三个被测量,而电压的测量最为常见,现在学生使用的数字万用表能够测量多种电量,并且具有一定的精度,使用方便。为了让学生更好地了解数字电压表的工作原理,从而激发他们对单片机课程的学习兴趣。本文从软硬件设计、proteus仿真、制作实物、误差分析几个方面着手,阐述数字电压表的工作原理、数据的程序处理方法、数字信号软件滤波原理。
2.硬件设计
硬件电路设计由4个部分组成:a/d转换电路,at89c51单片机系统,led显示系统、测量电压输入电路。硬件电路设计框图如图1所示。其总设计框图如下:
此电路的工作原理是:+5v模拟电压信号通过变阻器vr1分压后由adc08008的in0通道进入(由于使用的in0通道,所以adda,addb,addc均接低电平),经过模/数转换后,产生相应的数字量经过其输出通道d0-d7传送给at89c51芯片的p0口,at89c51负责把接收到的数字量经过数据处理,产生正确的7段数码管的显示段码传送给四位led,同时它还通过其四位i/o口p2.0、p2.1、p2.2、p2.3产生位选信号控制数码管的亮灭。
简易数字直流电压表的硬件电路已经设计完成,就可以选取相应的芯片和元器件,利用pROTEUS软件绘制出硬件的原理,并仔细地检查修改,直至形成完善的硬件原理图。但要真正实现电路对电压的测量和显示的功能,还需要有相应的软件配合,才能达到设计要求。
3.软件设计
根据模块的划分原则,将该程序划分初始化模块,a/d转换子程序和显示子程序,这三个程序模块构成了整个系统软件的主程序,如图2所示。
整个程序设计的核心在于对a/d转换的数据进行处理,包括数字滤波处理,数据小数位数的处理等。a/d转换子程序用来控制对输入的模块电压信号的采集测量,并将对应的数值存入相应的内存单元。[page]
显示子程序采用动态扫描实现四位数码管的数值显示,在采用动态扫描显示方式时,要使得led显示的比较均匀,又有足够的亮度,需要设置适当的扫描频率,当扫描频率在70hz左右时,能够产生比较好的显示效果,一般可以采用间隔10MS对led进行动态扫描一次,每一位led的显示时间为1MS.
4.结果及误差分析
由于单片机at89c51为8位处理器,当输入电压为5.00v时,adc0808输出数据值为255(ffh),因此单片机最高的数值分辨率为0.0196v(5/255)。这就决定了电压表的最高分辨率只能到0.0196v,从表1可看到,测试电压一般以0.01v的幅度变化。
当in0口输入电压值为13.5v时,显示结果如图3所示。测量误差为0.1v.
从表1可以看出,简易数字电压表测得的值基本上比标准电压值偏大0-0.01v,这可以通过校正adc0808的基准电压来解决或者通过软件校准的方式来降低误差。因为该电压表设计时直接用5v的供电电源作为电压,所以电压可能有偏差。当要测量大于5v的电压时,可在输入口使用分压电阻,而程序中只要将计算程序的除数进行调整就可以了。
从测试的数据看,其绝对误差均控制在1v以下,而相对误差均在1%以下,能够满足大部分场合应用的需要,如采用实验数据归纳的方法,将得出的数据绘制成曲线,再使用更为合理的算法,将得到更加准确的结果
关键字:数字电压表 adc0808 at89c51
引用地址:
一种简易数字电压表的设计与制作
推荐阅读最新更新时间:2024-03-16 13:35
基于AT89C51单片机的ADC0808程序
AT89C51单片机介绍 AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。 由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。 AT89C51管脚说明 ATMEL公司的AT89C51是一种高效微控制器。采用40引脚双列直插封装形式。AT89C51单片机是高
[单片机]
AT89C51单片机扩展高速串行同步移位输出口的方法
AT89C51(与MCS-51兼容)单片机的串行口在方式0工作状态下,使用移位寄存器芯片可以扩展多个8位并行I/O口。在LED点阵显示屏应用系统中,一般都采用数据同步移位输出方式,并使用移位寄存器芯片(如74LS595)扩展并行I/O口驱动LED点阵显示。LED 点阵显示采用扫描方式,为不产生闪烁感,每秒需要传送50屏点阵显示数据,因此有大量的数据要通过同步移位的方式送到显示驱动电路部分,这就要求单片机能够快速地输出数据。AT89C51单片机的串行口在方式0工作状态下,数据以fosc/12的波特率输出,1个字节数据写入SBUF后,需检查中断标志位 TI是否为“1”并清“0”TI或延时几个机器周期后才能继续写入了一个数据,输出速度慢
[单片机]
STC15F2K60S2单片机数字电压表程序 内部ADC实现
①使用STC15F2K60S2单片机板设计一个数字电压表,只能采用单片机内部ADC实现; ②要求能够测量直流电压范围为0~4.55V,测量误差小于0.005V,测量结果保留三位小数点; ③电压表具有自动超量程报警功能,当测量电压超过4.55V时驱动蜂鸣器报警,电压小于4.55V时自动关闭蜂鸣器; ④电压测量校准与测评以考试当天手上的万用表为准,显示器件自选,要求使用内部基准电压作为参考电压; ⑤采集结果通过USB转串口线上传至PC机,显示格式为:“N路电压:X.XXXV”; ⑥串口传输波特率为57600,晶振采用内部22.1184M,复位引脚不能当做I/O使用; ⑦电压表具有自动休眠功能,每当启动15秒钟后自动进入休眠模式,唤醒后
[单片机]
数字电压表的工作原理
DVM的种类有多种,分类方法也很多,有按位数分的,如3/2位、5位、8位;有按测量速度分的,如高速、低速;有按体积、重量分的,如袖珍式、便携式、台式。但通常是按A/D转换方式的不同将DVM分成两大类,一类是直接转换型,也称比较型;另一类是间接转换型,又称积分型,包括电压-时间变换(VT变换)和电压-频率变换(V-f变换)。 (1)逐次逼近比较型 逐次逼近比较型电压表是利用被测电压与不断递减的基准电压进行比较,通过比较最终获得被测电压值,然后送显示器显示的。虽然逐次比较需要一定时间,要经过若干个节拍才能完成,但只要加快节拍的速度,还是能在瞬间完成一次测量的。图1是逐次逼近比较型数字电压表的原理框图。 图中,数码开关可把由
[测试测量]
AT89C51/55构成温湿度自动监测系统
1系统硬件设计 系统结构如图1所示,采用ATMEL公司生产的51系列单片机AT89C55和AT89C51为核心,其中主机采用AT89C55、从机采用AT89C51。从机负责64点的数据检测,各检测点的温度和湿度经过温、湿度传感器及其转换电路转变为电压信号;经过矩阵网络进行信号选择,所得信号送到相应的信号放大整理电路放大,再进入A/D转换器,进行模数转换,将数字量送入从机,再经从机的数据处理,送给LED进行显示,同时定时传送给主机AT89C55;主机负责收集各粮仓内的数据(可监测50~100个粮仓),实现数据的保存、打印以及调用历史数据,并可巡回显示各粮仓的及时温湿度及报警状态。 AT89C55/51芯片是由ATMEL公司推出的
[单片机]
采用AT89C51+ADC0832+LCD1602的电子称设计
电子称设计,主要用于菜市场的电子称,可以设置价格,根据价格和重量计算出金额,该设计采用了Proteus仿真软件,采用AT89C51为主控,采用ADC0832芯片来进行ADC的转换,采用LCD1602显示屏显示,同时设计了矩阵键盘用于输入价格。设计难度3颗星(满星为5颗)。 首先设计电路图,由于模块不多,所以接口可以随意分配,电路仿真图如下图1。 设计时需要一步一步进行设计,一般设计开始尽量将人机交互的模块优先级调高。这里呢就优先对LCD1602进行设计,驱动程序如下: void wrc(uint8 c) { delay(1); rs=0; rw=0; e=0; P0=c; e=1; del
[单片机]
大型太阳能热水工程控制系统设计
0 引言 太阳能工程热利用是新兴的产业,是现代控制技术和最新太阳能热利用技术相结合的产物。与家用太阳能热水器相比,大型太阳能热水工程能够在更大规模和应用领域中发挥绿色能源的突出特点。随着太阳热水器系统的不断发展,超大采光面积、大吨位储水箱的大型太阳能热水工程有着越来越多的使用。目前市场上大型太阳能热水工程的控制系统大部分只具有温度和水位显示功能,而且分段显示,对温度的控制即使具有辅助加热功能。由于加热时间不能控制而产生过烧,从而浪费大量的电能。以单片机为核心的控制器,对水位实现连续测量。采用DS12C887实时时钟,根据用水时段和天气状况,实现自动上水控制和自动电辅助加热,不仅实现了时间、温度和水位三种参数实时显示,而且具有
[嵌入式]
单片机PWM波(AT89C51、ADC0808)
一、简介 此电路由AT89C51最小系统和ADC0808组成。 二、运行效果 三、代码 /*想要更多项目私wo!!!*/ #include reg52.h #define uint unsigned int #define uchar unsigned char sbit CLK = P2^4; sbit ST = P2^5; sbit EOC = P2^6; sbit OE = P2^7; sbit PWM = P3^0; void DelayMS(uint ms) { uchar i; while(ms--) { for(i=0;i 120;i++); } } voi
[单片机]