单片机数字电压表
数字电压表姓名潘刚所在学院电子信息工程学院专业班级通信1105班学号 11214048 指导教师付文秀日期2013 年 12月 15日一、实验目的:通过利用单片机设计简易数字电压表,使学生学会使用A/D转换器进行电压信号采集,了解A/D芯片TLC0832转换性能及基本原理,掌握A/D转换器与单片机的接口电路及编程技术。
思考如何利用单片机和A/D实现多路电压监测系统,各路电压值通过数码管轮流显示问题二、实验内容和要求:利用实验平台上的串行模/数转换芯片及4位数码管,设计完成一个数字电压表。
要求:数字电压表可测量0~5V输入电压,电压值通过数码管显示。
三、方案设计:使用ADC0832模拟/数字转换器芯片设计数字电压表电路。
该设计方案以单片机AT89S52为主控芯片,以ADC0832模拟/数字转换器芯片为核心转换模拟/数字量的芯片,组成数字电压表电路。
该电路能准确地测出所被测有效电压值、附加四位显示功能,可精确到有效电压值为0.01V。
四、设计流程图4.1总体设计流程图4.2AD转换关系设计流程图五、软硬件设计5.1 硬件电路设该设计的硬件电路由主控部分(单片机AT89S51)、采集模拟量部分(A/D转换一路ADC0832)、显示部分(四位八段数码管)、电源部分由电脑USB(5V)供电4个部分组成。
各部分之间相互协作,构成一个统一的有机整体,实现数字电压表的功能。
各部分的硬件电路设计如下。
设计总电路图见附录一。
5.2单片机AT89S52外围电路设计5.2.1复位电路设计MCS-51的复位输入引脚RST为MCS-51提供了初始化的手段,可以使程序从指定处开始执行,在MCS-51的时钟电路工作后,只要RST引脚上出现超过两个机器周期以上的高电平时,即可产生复位的操作,只要RST保持高电平,则MCS-51循环复位,只有单RET由高电平变成低电平以后,MCS-51才从0000H地址开始执行程序,本系统采用按键复位方式的复位电路。
5.2.2外部晶振时钟电路设计MCS-51的时钟可以由两种方式产生,一种是内部方式,利用芯片内部的振荡电路;另外一种为外部方式,本论文根据实际需要和简便,采用内部振荡方式,MCS-51内部有一个用于构成振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是此放大器的输入端和输出端,这个放大器与作为反馈元件的片外晶体或陶瓷谐振器一起构成了一个自激振荡器。
MCS-51虽然有内部振荡电路,但要形成时钟,必须外接元件,所以实际构成的振荡时钟电路,外接晶振以及电容C1和C2构成了并联谐振电路接在放大器的反馈回路中,对接电容的值虽然没有严格的要求,但电容的大小会影响振荡频率的高低,振荡器的稳定性,起振的快速性和温度的稳定性。
晶振的频率可在1.2MHZ~12MHZ之间任选,电容C1和C2的典型值在20pf~100pf之间选择,由于本系统用到定时器,为了方便计算,采用了12MHZ的晶振,采用电容选择30pf。
AT89S52具有在系统可编程功能,可以很方便的改写单片机存储器内的程序不需要把芯片中从工作环境中剥离,把AT89S ISP下载口接入电路,可使电路实现该功能。
AT89S52需要接入一个普通12MHz晶振,为其提供稳定的时钟脉冲。
该设计中有4个八段数码显示管LED,所以,在单片机AT89S52外围需要接入4个三极管来驱动数码显示管。
单片机外围电路的设计图如图:5.3:ADC0832部分电路图5. 4显示设计八段数码显示管有两种,一种是共阳数码管,其内部是由八个阳极相连接的发光二极管组成;另一种是共阴数码管,其内部是由八个阴极相连接的发光二极管组成。
二者原理不同但功能相同。
本设计的时间显示选用4个共阳八段数码管LED,其外形和内部结构如图4.3所示:5.5 总体电路图六、实验程序#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,}; //共阳数码管段码表没有小数点 0~9uchar code table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//带小数点的编码 0~9sbit ADCCLK=P1^0;//ADC0832时钟端sbit DI=P1^1;//ADC0832数据输入sbit DO=P1^1;//ADC0832数据输出sbit ADCCS=P1^2;//ADC0832片选端uchar dat=0;//AD值uchar count=0;//定时器计数uchar CH=0;//通道变量uint num,ge,xiao1,xiao2,shi,shi1,ge1,xiao3,xiao4,dy;/**********************************************************/ /*********************************************************** 初始化函数***********************************************************/ void init(){TMOD=0x01;//定时器0工作方式1TH0=0;//赋初值TL0=0;EA=1;//开总中断TR0=1;//启动定时器0ET0=1;//开定时器0中断}/********************************************************* 延时函数**********************************************************/ void delay(uint x){uint a,b;for(a=x;a>0;a--)for(b=110;b>0;b--);}/************************************************** AD转换函数***************************************************/ uint ADC0832(){uint i,test,adval;adval=0;test=0;ADCCS=0; //选通ADC0832_nop_(); //延时ADCCLK=1;//第一个脉冲的上升沿_nop_(); //延时DI=1; //第一个脉冲下降沿之前ADC0832转换启动信号ADCCLK=0;//第一个脉冲的下降沿_nop_(); //延时ADCCLK=1;//第二个脉冲的上升沿_nop_(); //延时if(CH==0)//选通CH0通道{DI=1;//第二个脉冲下降之前送人通道选择第二位ADCCLK=0;//第二个下降沿_nop_();ADCCLK=1;//第三个脉冲上升沿_nop_();DI=0; //第三个脉冲下降沿之前送入通道选择第3位ADCCLK=0;//第三个脉冲的下降沿_nop_();ADCCLK=1;//开始第四个脉冲_nop_();}else //选通CH1通道{DI=1; //第二个脉冲下降沿之前送通道选择的第一位 ADCCLK=0; //第二个下降沿_nop_();ADCCLK=1; //第三个脉冲的上升沿_nop_();DI=1;//第三个脉冲的下降沿之前送通道通道选择的第二位ADCCLK=0;//第三个脉冲的下降沿 _nop_();ADCCLK=1;//开始第四个脉冲_nop_();}ADCCLK=0;//第四个脉冲的下降沿 DO=1;for(i=0;i<8;i++)//读取前八位 {_nop_();ADCCLK=1;_nop_();ADCCLK=0;if(DO)adval|=0x01;elseadval|=0x00;}for(i=0;i<8;i++)//读取后八位 {test>>=1;if(DO)test|=0x80;elsetest|=0x08;_nop_();ADCCLK=1;_nop_();ADCCLK=0;}if(adval==test)//比较前8位与后8位的数值,如果不相同,舍去 dat=test;_nop_();ADCCS=1;//释放ADC0832DO=1;ADCCLK=1;return dat;}/*******************************************************数据转换函数********************************************************/void convdata(uint i)//数据转换函数{shi=i/51;//十位ge=(i%51)*10/51;//小数点后一位xiao1=((i%51)*10%51)*10/51;//小数点后两位dy=(shi*100+ge*10+xiao1)*2;shi1=dy/1000;ge1=dy%1000/100;xiao2=dy%100/10;xiao3=dy%10;}/******************************************************** 显示函数********************************************************/void display(){P2=0xfe;if(shi1==0){P0=0xff;}elseP0=table[shi1];delay(5);P2=0xfd;P0=table1[ge1];delay(5);P2=0xfb;P0=table[xiao2];delay(5);P2=0xf7;P0=table[xiao3];delay(5);P2=0xff;}/********************************************************* 主函数**********************************************************/ void main(){init();while(1){convdata(dat);display();}}/***************************************************中断服务函数*****************************************************/void T0_time() interrupt 1{TH0=0x00;//赋初值TL0=0x00;num++;if(num==10){num=0;dat=ADC0832();}}七、总结本次实验让我对单片机有了更加深刻的理解,实验中遇到了种种问题,从中我明白了从中我明白了不管做什么事,计划是很重要的。
基于单片机的数字电压表设计
基于单片机的数字电压表设计一、引言在电子测量领域中,电压表是一种常用的测量仪器,用于测量电路中的电压值。
传统的模拟电压表由于精度低、读数不便等缺点,逐渐被数字电压表所取代。
数字电压表具有精度高、读数直观、抗干扰能力强等优点,广泛应用于工业自动化、电子设备检测、实验室测量等领域。
本文将介绍一种基于单片机的数字电压表设计方案,详细阐述其硬件电路设计、软件编程实现以及系统性能测试。
二、系统总体设计方案(一)设计要求设计一款基于单片机的数字电压表,能够测量 0 5V 的直流电压,测量精度为 001V,具有实时显示测量结果的功能。
(二)系统组成本数字电压表系统主要由以下几个部分组成:1、传感器模块:用于将输入的电压信号转换为适合单片机处理的电信号。
2、单片机模块:作为系统的核心,负责对传感器采集到的数据进行处理和计算,并控制显示模块显示测量结果。
3、显示模块:用于实时显示测量的电压值。
三、硬件电路设计(一)传感器模块选用 ADC0809 作为模数转换芯片,它具有 8 个模拟输入通道,可以将 0 5V 的模拟电压转换为 8 位数字量输出。
(二)单片机模块选择 AT89C51 单片机作为控制核心,它具有 4K 字节的 Flash 程序存储器和 128 字节的随机存取数据存储器。
(三)显示模块采用液晶显示屏(LCD1602)作为显示器件,它能够清晰地显示数字和字符信息。
四、软件编程实现(一)编程语言选择使用 C 语言进行编程,C 语言具有语法简洁、可移植性强等优点。
(二)主程序流程主程序首先进行系统初始化,包括单片机端口初始化、LCD1602 初始化、ADC0809 初始化等。
然后启动 ADC0809 进行模数转换,读取转换结果并进行数据处理,计算出实际的电压值。
最后将电压值发送到 LCD1602 进行显示。
(三)模数转换子程序ADC0809 的转换过程通过控制其启动转换引脚(START)和读取转换结束引脚(EOC)来实现。
单片机数字电压表的研究
单片机数字电压表的研究单片机数字电压表研究摘要:本文首先简要介绍了单片机数字电压表的结构和原理,然后重点介绍了单片机数字电压表的测量原理,测量精度,测量过程中的干扰和抗干扰措施,以及单片机数字电压表的应用,最后总结了本文的研究内容。
关键词:单片机;数字电压表;测量原理;测量精度;抗干扰;应用1、绪论单片机数字电压表是通过单片机技术和数模转换技术,利用单片机采集电压值,将实测的电压值,转换为2进制或10进制数字,屏幕显示数字形式的电压值,从而实现电压值的测量和显示的仪表。
它是一种精确度和可靠性较高的电压测量仪表,广泛应用于电力系统、实验室、电子测试及家用电器等领域。
2、单片机数字电压表的结构与原理单片机数字电压表由测量部件、功能单元和显示单元组成。
(1)测量部件测量部件是数字电压表的最重要的组成部分,它由电源模块、电压放大器及模数转换器等组成。
电源模块是驱动整个电路的电源,它由滤波模块和功率放大器组成。
电压放大器是实现电压数字量转换的关键部件,通过放大输入信号,把很小的电压转换成较大的电压,以便模数转换器的输入。
模数转换器是实现数字电压表的测量功能,它将电压信号转换成数字信号。
(2)功能单元功能单元由处理器、存储器和控制程序组成,用来实现电压数据的采集、存储、程序运算、控制和显示等功能。
(3)显示单元显示单元由液晶显示屏和相关电路组成,用来显示数字电压表测量的电压值。
3、单片机数字电压表的测量原理数字电压表的测量原理是采用单片机技术和模数转换技术,把被测电压值转换成数字信号,并由处理器处理后输出到液晶显示屏上显示出来。
(1)电压测量电压测量是电压表的最重要组成部分,它所采集的电压数据是决定电压表测量精度的基础。
电压放大器采用了两种类型的补偿技术,一种是电压桥补偿,另一种是精密模拟放大器补偿,通过这两种补偿技术,可以大大提高数字电压表的测量精度。
(2)数模转换数模转换是将模拟信号转换为数字信号的过程,是实现数字电压表测量的关键技术。
单片机数字电压表主控制模块工作原理
单片机数字电压表主控制模块工作原理单片机数字电压表的主控制模块是整个系统的核心,负责采集、处理和显示电压信息。
以下是其工作原理的详细解释:电压输入:外部电路将待测电压接入数字电压表系统。
这个电压可能来自各种测量对象,如电池、电源等。
电压分压:如果输入电压超出了单片机的工作范围,通常会使用电阻分压电路将电压降低到单片机可接受的范围内。
分压电路的设计需要考虑电阻值、稳定性和功耗等因素。
模拟信号采样:单片机通过其内部的模数转换器(ADC,Analog-to-Digital Converter)对分压后的模拟电压进行采样。
ADC将连续的模拟信号转换为相应的数字值,通常以二进制形式表示。
数字信号处理:单片机通过编程,对ADC采样得到的数字信号进行处理。
这可能包括对电压进行校准、滤波、数学运算等操作,以确保精准的电压测量结果。
显示控制:处理后的电压数值通过单片机的输出引脚连接到数字显示模块。
这个模块可能是LED、LCD等数字显示器,用于直观地显示电压数值。
用户界面和控制:主控制模块通常还包括用户界面和控制功能。
用户可以通过按键、旋钮或其他输入设备设置测量范围、选择显示单位等。
电源管理:主控制模块通常需要管理系统的电源。
这包括对电池电量的监测、低功耗设计等,以确保数字电压表的长时间可靠运行。
通信接口(可选):如果数字电压表具备通信功能,主控制模块可能还需要处理与外部设备的数据通信。
这可能包括串口通信、无线通信等。
总体而言,主控制模块在单片机数字电压表中扮演着核心角色,通过采集、处理和显示电压信息,为用户提供准确而便捷的电压测量结果。
其工作原理复杂,设计需要综合考虑电路设计、软件编程和用户交互等多个方面。
51单片机的数字电压表设计不需要仿真
51单片机的数字电压表设计不需要仿真(原创版)目录一、引言二、51 单片机的数字电压表设计原理1.主要硬件2.电路设计3.编程方法三、设计优点1.电路简单2.成本低3.性能稳定四、设计局限性五、总结正文一、引言在电子技术领域,数字电压表是一种重要的测量工具,它可以将模拟信号转化为数字信号,并显示在数码管上。
随着单片机技术的不断发展,基于单片机的数字电压表设计越来越受到关注。
本文将以 51 单片机为例,介绍一种数字电压表的设计方法,该方法不需要仿真。
二、51 单片机的数字电压表设计原理1.主要硬件本设计采用 AT89C51 单片机、AD 转换器 ADC0808 和共阳极数码管为主要硬件。
AT89C51 是一款 8 位单片机,具有较高的执行速度和稳定性;ADC0808 是一款 12 位 A/D 转换器,可以将模拟信号转换为数字信号;共阳极数码管用于显示数字信号。
2.电路设计电路设计主要包括输入电阻分压、ADC0808 的连接和数码管的动态扫描显示。
在输入端,采用电阻分压方式降低输入电压,使其适合 ADC0808 的输入范围。
ADC0808 的输出端连接到单片机的数据总线,单片机根据输出的数字信号进行数据处理。
数码管采用动态扫描显示方式,通过单片机控制数码管的点亮时间,实现数字信号的显示。
3.编程方法编程主要分为两部分:一是数据采集,即将模拟信号转换为数字信号;二是数据处理和显示,即将采集到的数字信号进行处理并在数码管上显示。
在数据采集部分,程序需要发送 ADC0808 的启动信号,并读取转换后的数字信号。
在数据处理和显示部分,程序需要根据数码管的显示要求,控制数码管的点亮时间。
三、设计优点1.电路简单:本设计采用较少的硬件,电路连接简单,易于实现。
2.成本低:主要硬件都是常见的单片机和元器件,成本较低。
3.性能稳定:采用成熟的单片机技术,性能稳定可靠。
四、设计局限性虽然本设计具有较多的优点,但仍然存在一定的局限性。
基于单片机的数字电压表的课程设计
基于单片机的数字电压表的课程设计一、引言在电子测量领域,电压表是一种常见且重要的测量工具。
传统的模拟电压表存在精度低、读数不直观等缺点,而数字电压表则凭借其高精度、高稳定性和直观的数字显示等优势,在电子测量中得到了广泛的应用。
本课程设计旨在基于单片机设计一款数字电压表,以实现对直流电压的准确测量和数字显示。
二、设计要求1、测量范围:0 5V 直流电压。
2、测量精度:优于 01V 。
3、显示方式:四位数码管显示。
4、具备超量程报警功能。
三、系统总体设计本数字电压表系统主要由单片机最小系统、A/D 转换模块、数码管显示模块和报警模块组成。
单片机最小系统作为控制核心,负责整个系统的运行和数据处理。
A/D 转换模块将输入的模拟电压转换为数字量,供单片机读取。
数码管显示模块用于显示测量的电压值。
报警模块在测量电压超过设定范围时发出报警信号。
四、硬件设计1、单片机最小系统选用 STC89C52 单片机,其具有性能稳定、价格低廉等优点。
最小系统包括单片机芯片、晶振电路和复位电路。
2、 A/D 转换模块采用 ADC0809 芯片进行 A/D 转换。
ADC0809 是 8 位逐次逼近型A/D 转换器,具有 8 个模拟输入通道,能够满足本设计的需求。
3、数码管显示模块使用四位共阳极数码管进行电压显示。
通过单片机的 I/O 口控制数码管的段选和位选,实现数字的显示。
4、报警模块采用蜂鸣器作为报警元件,当测量电压超过 5V 时,单片机输出高电平驱动蜂鸣器发声报警。
五、软件设计软件部分主要包括主程序、A/D 转换子程序、数据处理子程序和显示子程序等。
1、主程序负责系统的初始化,包括单片机端口设置、A/D 转换器初始化等。
然后循环调用 A/D 转换子程序、数据处理子程序和显示子程序,实现电压的测量和显示。
2、 A/D 转换子程序控制 ADC0809 进行 A/D 转换,并读取转换结果。
3、数据处理子程序将 A/D 转换得到的数字量转换为实际的电压值,并进行精度处理。
51单片机的数字电压表设计不需要仿真
51单片机的数字电压表设计不需要仿真
摘要:
1.51单片机数字电压表设计简介
2.硬件电路组成及原理
3.软件程序设计要点
4.系统性能与应用
正文:
一、51单片机数字电压表设计简介
51单片机数字电压表设计是一种基于嵌入式技术的电子测量工具,具有体积小、精度高、操作简便等优点。
本设计以51单片机为核心,结合A/D转换器、显示模块等硬件,实现对输入模拟电压信号的采集、处理和显示。
二、硬件电路组成及原理
1.核心控制器:51单片机
2.A/D转换器:将模拟电压信号转换为数字信号
3.显示模块:采用共阳极数码管,实现数字电压值的显示
4.模拟量输入:电阻分压电路,可测量0-5V范围内的电压信号
三、软件程序设计要点
1.初始化:配置单片机的工作模式、时钟频率等参数
2.A/D转换:设置A/D转换器的工作模式,进行电压信号的采样和转换
3.数据处理:对A/D转换后的数字信号进行处理,如数据调整、滤波等
4.显示更新:根据处理后的数据,通过动态扫描显示技术更新数码管的显
示内容
5.循环检测:持续监测输入电压信号,实时更新显示
四、系统性能与应用
本设计的51单片机数字电压表具有以下特点:
1.测量范围:0-5V
2.精度:±1%
3.响应速度:≤100ms
4.电源:直流5V
广泛应用于工业生产、实验室测量、电子产品研发等领域,为工程师提供了一种高效、准确的电压测量解决方案。
通过以上介绍,我们可以了解到51单片机数字电压表的设计原理、硬件组成和软件程序设计方法。
在实际应用中,根据具体需求可以对电路和程序进行优化调整,提高系统的性能和稳定性。
基于单片机的简易数字电压表设计
基于单片机的简易数字电压表设计随着电子技术的迅猛发展,数字电压表在实验室、工业和日常生活中的应用越来越广泛。
本文将详细介绍基于单片机的简易数字电压表的设计过程,包括系统设计思路、硬件选型、软件实现以及调试过程。
设计一个简易数字电压表的目标是实现对直流电压的实时测量,并将其以数字形式显示。
该系统的核心是单片机,它负责数据采集、处理及结果显示。
选用单片机的原因在于其体积小、成本低、易于编程等优点。
在硬件设计方面,系统主要由输入电路、单片机、显示模块和电源模块组成。
输入电路的作用是将待测电压信号转化为单片机可处理的电信号。
一般采用分压电路,通过电阻分压的方法,将高电压降低至单片机的可接受范围。
还需考虑输入电压的范围,以确保测量精度和系统安全。
选用的单片机需具备一定的模拟输入功能,以便对电压进行采样。
常用的单片机型号有51系列、AVR系列及STM32系列等,其中STM32系列因其较高的性能和丰富的外设而受到广泛关注。
在设计中,应根据具体需求选择合适的单片机,并进行必要的引脚配置。
显示模块的选择是系统设计的重要环节,常用的有液晶显示屏(LCD)和七段数码管。
液晶显示屏具有显示内容丰富、可视角度广等优势,但其功耗相对较高。
而七段数码管则以其简洁明了的特性广泛应用于数字电压表中。
在本设计中,建议使用LCD显示模块,以便于显示多位数值及相关信息。
电源模块的设计需确保系统的稳定运行。
一般采用稳压电源,为单片机及其他外设提供稳定的电压供应。
需考虑电源的功耗及散热问题,确保系统在长期工作中不会出现故障。
数据处理模块是整个系统的核心,其主要任务是将采集到的模拟电压信号转换为相应的数字值。
可采用模数转换(ADC)技术,将模拟信号转换为数字信号,并进行必要的线性化处理。
处理过程中,应考虑量化误差及噪声对测量结果的影响。
数据显示模块负责将处理后的电压值通过LCD显示出来。
在这一过程中,需要对显示内容进行格式化,以确保信息的清晰易读。
单片机课程设计-数字电压表
目录1 引言 (1)2设计原理及要求 (2)2.1数字电压表的实现原理 (2)2.2数字电压表的设计要求 (2)3软件仿真电路设计 (4)3.1设计思路 (4)3.2仿真电路图 (4)3.3设计过程 (5)3.4 AT89C51的功能介绍 (5)3.4.1简单概述 (5)3.4.2主要功能特性 (6)3.4.3 AT89C51的引脚介绍 (6)3.5 ADC0808的引脚及功能介绍 (8)3.5.1芯片概述 (8)3.5.2 引脚简介 (9)3.5.3 ADC0808的转换原理 (9)3.6 74LS373芯片的引脚及功能 (9)3.6.1芯片概述 (9)3.6.2引脚介绍 (9)3.7 LED数码管的控制显示 (10)3.7.1 LED数码管的模型 (10)3.7.2 LED数码管的接口简介 (10)4系统软件程序的设计 (11)4.1 主程序 (11)4.2 A/D转换子程序 (12)4.3 中断显示程序 (13)5电压表的调试及性能分析 (14)5.1 调试与测试 (14)5.2 性能分析 (15)6电路仿真图 (15)7总结 (16)参考文献 (18)附录1 源程序 (19)附录2 仿真原理电路 (25)1 引言随着微电子技术的不断发展,微处理器芯片的集成程度越来越高,单片机已可以在一块芯片上同时集成CPU、存储器、定时器/计数电路,这就很容易将计算机技术与测量控制技术结合,组成智能化测量控制系统。
数字电压表(DigitalVoltmeter)简称DVM,它是采用数字化测量技术,把连续的模拟量(直流输入电压)转换成不连续、离散的数字形式并加以显示的仪表。
与此同时,由DVM扩展而成的各种通用及专用数字仪器仪表,也把电量及非电量测量技术提高到崭新水平。
本章重点介绍单片机A/D 转换器以及由它们构成的基于单片机的数字电压表的工作原目前,由各种单片A/D 转换器构成的数字电压表,已被广泛用于电子及电工测量、工业自动化仪表、自动测试系统等智能化测量领域,示出强大的生命力理。
基于单片机的数字电压表设计
基于单片机的数字电压表设计数字电压表在电子技术中使用非常广泛,可以用来测量电路中的直流电压、交流电压以及各种信号的幅度等等。
基于单片机的数字电压表实现了数字电压的读取和显示,具有精确、稳定、易操作等特点,下面将介绍基于单片机的数字电压表的设计原理及实现方法。
一、系统结构基于单片机的数字电压表主要是由程序控制模块、模数转换模块和数字显示模块组成。
程序控制模块主要用来完成开机、校准、测试、功能选择等功能;模数转换模块主要将电压信号转换成数字量,供数字显示模块使用;数字显示模块主要将转换后的数字量显示在LCD液晶屏上。
二、硬件设计1.电源电路电源电路主要用来为电路提供稳定的电压和电流,本电路采用稳压电源芯片LM7805实现,稳压芯片输入端连接外部DC12V/1A电源,输出端连接电路板上的整个电路。
2.输入电路输入电路主要用来将被测电源的电压传递给单片机,常规情况下采用分压电路实现。
在本电路中,电阻R1和电容C1为RC滤波电路,起到滤波作用,防止干扰信号的影响;电阻R2是分压电路中的电阻,它根据电压值的不同设置不同的值,以保证被测电压在单片机内部转换过程中不会对单片机产生影响。
3.单片机模块单片机模块是系统的核心部分,本电路中选用STM32F103C8T6单片机实现模数转换和数码管控制,使用C 语言编写程序,通过模拟输入端口读取电压并进行模数转换,将得到的数字使用查表法将其转换为数码管控制脉冲,控制数码管的亮灭实现数字显示。
4.数字显示模块数字显示模块主要由七段数码管、LCD液晶屏幕、导线和电容等器组成,七段数码管用于展示测量到的电压大小,LCD 液晶屏用于展示功能选项、单位等信息。
导线是电路板内部连接线路,电容等器用来平滑电压波动。
三、软件设计1.引脚定义在程序中首先定义STM32F103C8T6单片机内存地址、输入输出引脚和电平状态,其中A0口用来读取被测电压;B0-B7口用来控制七段数码管的亮灭;C0口用来输出PWM,控制风扇的旋转速度;D0口用来控制蜂鸣器的开启和关闭。
单片机数字电压表(带仿真图C程序)
基于51单片机数字电压表本模块采用ADC0832模数转换芯片,LCD1602液晶显示,测量范围0-5V,精度误差0.01V看了很多网上的课程设计或者毕业论文,得出以下几点:1.数字电压表的方案有很多种,有的采用ADC0809,或者ADC0808等,他们都是8温AD,并口传输数据,具有速率高的优点。
但是硬件复杂,与单片机电路繁琐,焊接起来比较麻烦。
所以本设计采用ADC0832,同样8位AD,特点是串口传输数据,硬件接口简单,且精度误差一致,速率也比较快,对于要求不高的系统非常适合。
2.显示电路,网上采用LED显示居多,本设计采用LCD1602液晶显示,具有硬件搭设简单,显示美观等优点3.本设计方便移植,只需将LCD1602三个控制端口,ADC0832 四个控制端口修改即可。
注意LCD1602数据传输接口是单片机的P0口,如下图,需要接上拉电阻4.程序采用C代码编写,亲测直接可以使用,若需仿真文件,请用E-mail联系邮系。
邮箱:gnsywb@5.网上很多设计数据转换程序有误,不够正确。
在转换过程中,中间变量需设置为int 类型,虽然8位AD输出最高位255,但是余数转换过程中会大于255。
若设计char型,会造成显示输出有误。
void convert(uchar a){ uint temp; //特别注意这里需定义int型(余数将大于255)dis[0]=a/51; //取个位temp=a%51;temp=temp*10; dis[1]=temp/51; //取小数点后第一位temp=temp%51;temp=temp*10; dis[2]=temp/51; //取小数点后第二位}具体电路图如下:1.利用电压表与测量显示电压对比附录:C程序/******************************************** 功能:单片机数字电压表ADC0832+LCD16021,测量范围0-5V2,2路输入电压,可自行设定3,测量精度误差0.01V,LCD液晶显示编写者:小子在西藏gnsywb@编写日期:2012-11-5*********************************************/ #include <reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charsbit lcdrs=P2^4;sbit lcdrw=P2^5;sbit lcden=P2^6; //1602控制端口sbit DI=P3^4;sbit DO=P3^4; //DI和DO与单片机共接口sbit Clk=P3^3;sbit CS=P3^5;//ADC0832控制端口uchar dis[3]={0x00,0x00,0x00}; //显示缓冲区uchar date=0; //AD值uchar CH; //ADC0832通道值/*****************************************AD0832转换程序******************************************/uchar ADC0832(uchar CH){uchar i,dis0,dis1;Clk=0; //拉低时钟DI=1; //初始化_nop_();CS=0; //芯片选定_nop_();Clk=1; //拉高时钟_nop_();if(CH==0) //通道选择{Clk=0; //第一次拉低时钟DI=1; //通道0的第一位_nop_();Clk=1; //拉高时钟_nop_();Clk=0; //第二次拉低时钟,ADC0832 DI接受数据DI=0; //通道0的第二位_nop_();Clk=1;_nop_();}else{Clk=0;DI=1; //通道1的第一位_nop_();Clk=1;_nop_();Clk=0;DI=1; //通道1的第二位_nop_();Clk=1;_nop_();}Clk=0; //第三次拉低时钟,此前DI两次赋值决定通道DI=1; //DI开始失效,拉高电平,便于DO数据传输for(i= 0;i<8;i++) //读取前8位的值{_nop_();dis0<<= 1;Clk=1;_nop_();Clk=0;if (DO)dis0|=0x01;elsedis0|=0x00;}for (i=0;i<8;i++) //读取后8位的值{dis1>>= 1;if (DO)dis1|= 0x80;elsedis1|= 0x00;_nop_();Clk=1;_nop_();Clk=0;}if(dis0==dis1) //两次结束数据比较,若相等date=dis0; //则赋值给dat_nop_();CS=1; //释放ADC0832DO=1; //拉高输出端,方便下次通道选择DI端有效Clk=1; //拉高时钟return date;}/***********************************************数据转换程序功能:将0-255级换算成0.00-5.00的电压数***********************************************/void convert(uchar a){uint temp; //特别注意这里需定义int型(余数将大于255)dis[0]=a/51; //取个位temp=a%51;temp=temp*10;dis[1]=temp/51; //取小数点后第一位temp=temp%51;temp=temp*10;dis[2]=temp/51; //取小数点后第二位}/***************************************** LCD1602驱动程序******************************************/ void delay(uchar z){uint x,y;for(x=z;x>0;x--)for(y=122;y>0;y--);}void write_cmd(uchar cmd)//lcd1602写命令函数{lcdrs=0;lcdrw=0; //选择指令寄存器lcden=1;P0=cmd; //写数据delay(5);lcden=0; //使能拉低lcden=1;}void write_date(uchar date)//lcd1602写数据函数{lcdrs=1;lcdrw=0; //选择数据寄存器lcden=1;P0=date; //写数据delay(5);lcden=0; //使能拉低lcden=1;}void init_lcd1602()//lcd1602初始化{write_cmd(0x01); //清屏write_cmd(0x38); //功能设置write_cmd(0x0c); //显示设置write_cmd(0x06); //输入方式从左到右delay(1);}/***************************************** 显示函数*****************************************/ void display(void){uchar i;write_cmd(0x80);for(i=0;i<3;i++){if(i==1) write_date('.'); //第二位显示小数点write_date (0x30+dis[i]);delay(5);}write_date('V'); //最后一位后显示字符'V'}/************************************************ 主函数***************************************************/ void main(void){CH=0; //选择通道0或1init_lcd1602();//液晶1602显示初始化while(1) //主循环{date=ADC0832(CH);//启动ADC0832转换并接受数据delay(1);convert(date); //数据转换成BCD码display(); //显示数值}}。
