自动换挡数字电压表 电压表是用于测量当前电路两点之间电压值的仪器,而数字电压表是用模/数转换器将测量电压值转换成数字形式并以数字形式表示的仪器,它是电路设计中最常用的仪器之一。 本章应用实例涉及的知识如下: >数字电压表的实现原理; >运算放大器LM324的应用原理: > A/D芯片ADC0809的应用原理; > 1602数字字符液晶模块的应用原理。 1 自动换挡数字电压表的背景介绍 数字电压表通常都有挡程的概念,所谓挡程是指电压表当前的测量范围,这个范围决定了测量的精度。例如,当被测量电压范围为0~2V时选择0~5V挡就比选择0~10V挡测量精度要高。 自动换挡数字电压表就是一个能自动切换挡程的数字电压表,可以测量0~20V的电压,并且有0~0.2V、0~2V和0~20V三个挡程可供选择,当待测量电压值发生变化之后,电压表可以根据输入电压的情况自动选择合适的挡程进行测量,并且把测量结果显示出来。 2 自动换挡数字电压表的设计思路 2.1 自动换挡数字电压表的工作流程 自动换挡数字电压表的工作流程如图所示。 2.2 自动换挡数字电压表的需求分析 设计自动换挡数字电压表,需要考虑以下几方面的内容: (1) 51单片机使用何种方式将模拟电压值转换为数字值; (2) 51单片机如何控制进行相应的挡位切换:比较 (3) 51单片机如何显示对应的采集值: (4)需要设计合适的单片机软件。 2.3 自动换挡数字电压表的换挡原理 自动换挡数字电压表对当前的输入电压信号进行调理,得到三种不同放大倍率的电压信号,然后分别对这三组信号进行检测,通过相应的算法选择合适的电压信号进行采集。 3 自动换挡数字电压表的硬件设计 3.1 自动换挡数字电压表的硬件模块 自动换挡数字电压表的硬件模块如图所示,其各个部分详细说明如下。 (1) 51单片机:自动换挡数字电压表的核心控制器。 (2)显示模块:显示当前的测量电压。 (3)挡位切换/电压调理模块:对输入电压进行调理,并且选择合适的测量挡位。 (4) A/D采集模块:将当前的模拟电压信号转换为数字信号。 3.2 自动换挡数字电压表的电路 自动换挡数字电压表的电路如图所示,51单片机使用P0端口以及P2.0. P2.1驱动一块1602液晶模块用于显示当前的电压值,使用P1和P3的部分引脚扩展一片ADC0808作为模拟擞字信号转换器,输入的待检测电压信号经过调理模块脚心调理后变成三路独立的信号输出。 图中AMP模块是输入信号电路调理模块,如图所示。 由上图可知,输入信号经过三个不同放大倍率的放大电路进行放大之后,再通过一个跟随器处理得到三个不同倍率的电压信号,以供ADC0808进行处理。 自动换挡数字电压表中涉及的典型元件说明参考下表。 3.3 硬件模块基础-LI\/1324 LM324是四运放集成电路,它采用14脚双列直插塑料封装,其引脚封装结构如图所示。 LM324的内部集成了四组形式完全相同的运算放大器,它们除公用电源外彼此独立,其引脚说明如下。 (1)“+”:同相输入引脚,表示和运放输出引脚Vo的信号相同。 (2)“-”:反相输入引脚,表示和运放输出引脚Vo的信号相反。 (3)“V+”:正电源输入引脚。 (4)“V-”:负电源输入引脚。 (5)“Vo":信号输出端。 运算放大器的具体使用方法可以参考如下内容。 uA741是最常用的通用高增益运算放大器,其基本参数如下: (1)双列直插8引脚或圆筒8引脚封装。 (2)工作电压:+、-12V。 (3)差分电压:+/-30V。 (4)输入电压:+/-18V (5)允许功耗:500mW。 其引脚与OP7运算放大器完全一样,可以互相替代。使用方法如下: 单片机应用系统通常使用集成运算放大器来对信号进行放大操作。集成运算放大器(运放) 是具有很高放大倍数的电路单元,在实际应用电路中,通常结合反馈网络共同组成某种功能模块。由于早期应用于模拟计算机中,用于实现数学运算,故得名“运算放大器”,此名称一直沿用至今。运算放大器是一个从功能的角度命名的电路单元,其功能既可以由分立的元器件实现,也可以在半导体芯片中实现。随着半导体技术的发展,如今绝大部分的运算放大器是以单片的形式存在。运算放大器的种类繁多,应用广泛。 如下图左所示,运算放大器通常包括反相输入端(-,引脚2)、同相输入端(+,引脚3)和一个输出端(引脚1),引脚4和引脚8则分别接供电电源正极和供电电源负极,最常见的集成运算放大器的芯片有uA741等。 使用运算放大器对输入信号进行放大的应用电路如上图右所示,运算放大器的输入和输出电压的关系如下。 从上式可以看到,通过修改R1和R2的电阻值,可以得到不同的放大倍率,下图是一个正弦波通过同相放大器的输入、输出信号波形的对比。 上图是使用集成放大器实现同相放大(也就是说输出电压和输出电压的极性是相同的)的应用电路,而在实际使用中常常使用反相放大电路对电压进行放大,其应用电路如下图所示。 运算放大器反相放大电路的输入、输出电压关系可通过下式获得,下图是正弦波通过反相放大器的输入、输出信号波形对比。 同理可知,通过修改R1和R3的电阻值,可以获得不同的放大倍率。 3.4硬件模块基础——ADC0809 图是ADC0809的外部引脚封装结构,其详细说明如下。 (1) OUT1~OUT8:8位并行数字量输出引脚。 (2) INO~IN7:8位模拟量输入引脚。 (3) VCC:正电源(图中无标示)。 (4) GND:电源地(图中无标示)。 (5)VREF(+):参考电压正端引脚。 (6) VREF(-):参考电压负端引脚。 (7) START: A/D转换启动信号输入端。 (8) ALE:地址锁存允许信号输入端。 (9) EOC:转换结束信号输出引脚,开始转换时为低电平,当转换结束时为高电平。 (10) OE:输出允许控制端,用于打开三态数据输出锁存器。 (11) CLOCK:时钟信号输入引脚。 (12) ADDA、ADDB、ADDC:地址输入引脚,用于选择输入通道。 ADC0808进行模拟数字转换的操作步骤如下。 (1)清除START和OE引脚电平,对ADC0809进行初始化。 (2)设置地址通道ADDA~ADDC,选择待采集的通道数。 (3)设置START引脚,发送启动采集信号。 (4)等待转换完成,EOC引脚输出高电平。 (5)设置OE引脚为高电平,读取A/D转换数据。 4 自动换挡数字电压表的软件设计 4.1 自动换挡数字电压表的软件模块划分和工作流程 自动换挡数字电压表的软件可以划分为显示模块和A/D采集模块两个部分,其工作流程如下图所示。
,4.2 1602液晶驱动模块函数设计 1602液晶驱动模块函数主要用于对1602液晶进行相应的基础操作,包括以下操作函数,其应用代码如下所示。 (1) void delay(unsignedintz):ms级延时函数。 (2) voicl write_com(unsigned char c):向1602写命令子函数。 (3) void write_data(unsigned char d):向1602写数据子函数。 (4) voidlnltialize():LCD初始化子函数。 应用代码使用P0端口作为数据通信端口,然后使用P2.0和P2.1作为相应的控制引脚对1602进行控制。 void delay(unsignedintz) //延时子函数 z*1ms { unsigned int x,y; for(x=z;x>0x--) for(y=110;y>0;y--); } void write_com(unsigned char c) //写命令子函数 { lcdrs=0;//低电平选择为“写指令” lcden=0; LEDDATA=c;//把指令写入P0口 delay(5);//参考时序图 lcden=1; //开使能 delay(5);//读取指令 lcden=0;//关闭使能 } void write_data(unsigned char d) //写数据子函数 { lcdrs=1; //高电平选择为“写数据” LEDDATA=d; //把数据写入P0口 delay(5); //参考时序图 lcden=1; //开使能 delay(5); //读取数据 lcden=0; //关闭使能 } void initialize() //LCD初始化函数 { unsigned char num; lcden=0; write_com(0x38); //设辫16x2显示,5x7点阵显示.8位数据接口 writc_com(0x0c); //00001DCB,D(开关显示).C(是否显示光标),B(光标闪烁, //光标不显示) write_com(0x06); //000001N0,N(地址指针+-1) write_com(0x01); //清屏指令 每次显示下一屏内容时,必须清屏 write_com(0x80+0xl0); //第一行,顶格显示 tor(num=0;num<17;num++) write_data(mytable0[num]); delay(10); write_com(0x80+0x50); //第二行,从第一格开始显示 for(num=0;num<15; num++) { write_data(mytable1[num]); delay(10); } for(num=0;num<16;num++) { write_com(0x1c); //0001(S/C)(R/L)**;S/C:高电平移动字符,低电平移动光标; //R/L:高电平左移,低电平右移 delay(300); } delay(1000); write_com(0x01);∥清屏指令,每次显示下一屏内容时,必须清屏 write_com(0x80); for(num=0;num<14;num++) { write_data(line0[num]); delay(10); } write_com(0x80+0x40); for(num=0;num<15;num++) { write_data(line1[num]); delay(10); } } void value(unsigned char add,unsigned char dat) { write_com(0x80+0x47+add); if(l= =3&&add==2||l!=3&&add==1) { write_data(0x2e); } else { write_data(0x30+dat); } } 4.3 自动换挡数字电压表的软件综合 自动换挡数字电压表的软件综合如下所示,其中涉及的1602液晶的驱动模块函数代码可以参考前一节。 应用代码分别定义了v20_on,v2_on和v02_on三个宏定义,用于挡位的切换。
5 自动换挡数字电压表应用系统仿真与总结 在Proteus中绘制如图16.3所示的电路,其中涉及的Proteus电路器件参见表。 单击运行,调节RV1的电阻值,可以看到对应的测量输出,如图所示。 总结:如果设置更多的放大器放大倍率,则可以增加数字电压表的挡位。
单片机源程序如下:- #include <AT89X52.H>
- #define LEDDATA P0
- #define v20_on {s3=0;s2=0;s1=1;} //宏定义不同量程,不同的开关状态
- #define v2_on {s3=0;s2=1;s1=0;}
- #define v02_on {s3=1;s2=0;s1=0;}
- unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4~0x66,0x6d,0x7d,0x07,0x7f,0x6t0x00};
- unsigned char dispbuf[8]={0,0,0,0,0,0,0,0};
- unsigned char getdata;
- unsigned long temp;
- unsigned char i,k,l,m;
- unsigned char code mytable0[]="Welc0met0use “;
- unsigned char code mytable1[]="Auto Voltmeter!";
- unsigned char code line0[]=" Voltmeter "; //初始化显示
- unsigned char code Iine1[]=”Value: V ";
- //引脚定义
- sbit lcdrs=P2^0;
- sbit lcden=P2^1;
- sbit s3=P3^7;
- sbit s2=P3^6;
- sbit s1=P3^5;
- sbit OE=P3^0;
- sbit EOC=P3^1;
- sbit ST=P3^2;
- main()
- {
- initialize();
- while(1)
- _20v:
- {
- v20_on;
- ST=0;
- ST=1;
- ST=0;
- while(EOC==0);
- OE=1;
- getdata=P1;
- OE=0;
- if(getdata<21)
- {goto _2v; }
- l=3;
- temp=getdata;
- temp=temp*1000/51)/2;
- goto disp;
- _2v:
- v2_on;
- ST=0;
- ST=1;
- ST=0;
- while(EOC==0);
- OE=1;
- getdata=P1;
- OE=0;
- if(getdata<21)
- {
- goto _02v;
- }
- else if(getdata>204)
- {
- goto _20v;
- }
- l=2;
- temp=getdata;
- tempjtemp*1000/51)/2;
- goto disp;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
proteus仿真+源码+教程下载:
http://www.51hei.com/bbs/dpj-100242-1.html
|