精华内容
下载资源
问答
  • 利用单片机AT89S51与ADC0809设计一个数字电压表,能够测量0-5V之间的直流电压值,四位数码显示,但要求使用的元器件数目最少。
  • 带有仿真和程序,用汇编语言编写的程序
  • 包含源程序和仿真文件
  • 51单片机数字电压表

    2018-05-19 13:33:04
    通过单片机技术,设计出来的数字电压表具有精度 高, 抗干扰能力强的特点。 通过网上资料显示, 目前由各种 A/D 转换器构成的数 字电压表已经广泛的应用于电工测量,工业自动化仪表等各个领域。 在电量的测量中, ...
  • 51单片机数字电压表设计程序
  • 本设计要求用AT89C51(晶体采用12 MHz)和ADC 0808(A/D转换芯片)设计一只简单的数字电压表,可以测量0~+5V的电压,并将测得的电压数值显示在4位共阳极数码管上,要求测量精度为0.01V,即保留两位小数。
  • 单片机数字电压表(带仿真图C程序)基于51单片机数字电压表本模块采用ADC0832模数转换芯片,LCD1602液晶显示,测量范围0-5V,精度误差0.01V看了很多网上的课程设计或者毕业论文,得出以下几点:1.数字电压表的方案有很...

    单片机数字电压表(带仿真图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联系邮系。邮箱: HYPERLINK "mailto:gnsywb@" 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; //取小数点后第二位

    }

    具体电路图如下:

    利用电压表与测量显示电压对比

    附录:C程序

    /********************************************

    功能 :单片机数字电压表 ADC0832+LCD1602

    1,测量范围0-5V

    2,2路输入电压,可自行设定

    3,测量精度误差0.01V,LCD液晶显示

    编写者: 小子在西藏 gnsywb@

    编写日期:2012-11-5

    *********************************************/

    #include

    #include

    #define uint unsigned int

    #define uchar unsigned char

    sbit 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_();

    展开全文
  • 以51单片机和A/D转换器为核心、以LCD1602位显示,设计一个可以自动选择档位的多档位直流电压测量电路。可测电压范围0V—500V。电压量程范围: 2V, 20V, 200V 和500V,共四个档位,可判断出电压范围并用继电器实现档位...
  • 介绍了一种基于STC89C51单片机数字电压表的设计方法。该方案根据数据采集的工作原理来实现数字电压的测量, 然后完成单片机与PC的通信, 以将所测量的电压值通过串口传送给PC, 并在PC上进行显示。   ...
  • 毕设--基于51单片机数字电压表的设计

    注:本毕设资源可在微信公众号:“Kevin的学习站” 中获取!

    基于51单片机数字电压表的设计

    1、PCB原理图

    2、Proteus 仿真图


    3、设计目标

    3.1、基本功能

    利用51单片机作为主控芯片,模拟量输入范围直流0v-5v。模拟量经A/D(ADC0809)模数转换芯片,把模拟量转换为数字量输入到单片机的P0口,再由单片机控制LCD1602液晶显示模拟量输入的电压值。

    3.2、主要技术参数

    测量电压范围:0v至5v

    A/D转换器:ADC0809(8位模数转换器)。

    显示方式: LCD1602液晶

    4、总设计框图

    此次设计的是数字电压表,要求的电压范围是0~5v。系统设计主要包括四个部分:分别是电源模块、AD模数转换部分、51单片机最小系统部分、数码管显示部分。首先由单片机初始化ADC0809模数转换芯片和共阴数码管显示,当外接被测电压后,ADC0809将模拟电压信号转换为数字信号输入到单片机的I/O口,通过单片机处理后将电压的大小显示在LCD1602液晶上面。

    以AT89C51单片机为核心,起着控制作用。系统包括LCD1602液晶显示电路、复位电路、时钟电路、模数转换电路电路。设计思路分为五个模块:复位电路、晶振电路模块、AT89C51、LCD1602液晶显示电路、模数转换器电路这五个模块。

    5、硬件设计分析

    5.1、电源的设计

    系统电源使用直流5伏。

    由电脑USB接口提供电源。

    USB是通用串行总线(Universal Serial Bus)接口的简称。它是目前使用比较广泛的电脑接口之一,主要版本有1.0、1.1和最新的2.0三种版本。根据USB总线的工业标准,它可以提供额定功率为5V/500mA的电源供USB设备使用。

    5.2、单片机最小系统

    51单片机是对目前所有兼容intel 8031指令系统的单片机的统称。该系列单片机的始祖是intel的8031单片机,后来随着技术的发展,成为目前广泛应用的8为单片机之一。单片机是在一块芯片内集成了CPU、RAM、ROM、定时器/计数器和多功能I/O口等计算机所需要的基本功能部件的大规模集成电路,又称为MCU。51系列单片机内包含以下几个部件:

    一个8位CPU;一个片内振荡器及时钟电路;

    4KB的ROM程序存储器;

    一个128B的RAM数据存储器;

    寻址64KB外部数据存储器和64KB外部程序存储空间的控制电路;

    32条可编程的I/O口线;

    两个16位定时/计数器;

    一个可编程全双工串行口;

    5个中断源、两个优先级嵌套中断结构。

    如图2-2-1所示为AT89C51单片机基本构造,其基本性能介绍如下:

    AT89C51本身内含40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中端口,3个16位可编程定时计数器,2个全双工串行通信口,AT89C51可以按照常规方法进行编程,但不可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。

    AT89C51的主要特性如下表所示:

    兼容MCS—51指令系统32个可编程I/O线
    4k字节可编程闪烁存储器可编程UARL通道
    三个16位可编程定时/计数器中断时钟频率0-24MHz
    2个外部中断源,共8个中断源256×8bit内部RAM
    2个读写中断口线可直接驱动LED
    软件设置睡眠和唤醒功能低功耗空闲和掉电模式

    单片机最小系统原理图


    单片机最小系统说明:

    时钟信号的产生:在MCS-51芯片内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,其输出端为引脚XTAL2。而在芯片的外部,XTAL1和XTAL2之间跨接晶体振荡器和微调电容,从而构成一个稳定的自激振荡器,这就是单片机的时钟振荡电路。

    时钟电路产生的振荡脉冲经过触发器进行二分频之后,才成为单片机的时钟脉冲信号。

    一般地,电容C2和C3取30pF左右,晶体的振荡频率范围是1.2-12MHz。如果晶体振荡频率高,则系统的时钟频率也高,单片机的运行速度也就快。

    单片机复位使CPU和系统中的其他功能部件都处在一个确定的初始状态下,并从这个状态开始工作。单片机复位条件:必须使9脚加上持续两个机器周期(即24个振荡周期)的高电平。

    5.3、模数转换

    ADC0809是美国国家半导体公司生产的CMOS工艺8通道,8位逐次逼近式AD转换器。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。

    (1)主要特性:

    1)8路输入通道,2位A/D转换器,即分辨率为8位。
       2)具有转换起停控制端。
       3)转换时间为100μs(时钟为640kHz时),130μs(时钟为500kHz时) 
       4)单个+5V电源供电
       5)模拟输入电压范围0~+5V,不需零点和满刻度校准。
       6)工作温度范围为-40~+85摄氏度
       7)低功耗,约15mW。

    (2)模数转换电路

    6、软件设计的组成

    该系统由延时子函数、LCD1602液晶忙检测子函数、LCD1602液晶写命令/写数据子函数、汉字显示子函数、LCD1602液晶显示字符串子函数、LCD1602液晶初始化子函数、ADC0809转换子函数、主函数和数据定义这几部分组成。


    7、元件清单

    8、程序源码

    //<程序名>:数字电压表															
    //<功能>:使用LCD显示被检测电压,精度为0.05V,范围是0~5V。							
    #include"includes.h"
    #define TIME0H 0x3C
    #define TIME0L 0xB0
    uchar uc_Clock=0;		//定时器0中断计数
    bit b_DATransform=0;
    //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<把电压显示在LCD上>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    void vShowVoltage(uint uiNumber)
    {
    	uchar ucaNumber[3],ucCount;
    	if(uiNumber>999)					
    		uiNumber=999;
    	ucaNumber[0]=uiNumber/100;								//把计算数字的每个位存入数组。
    	ucaNumber[1]=(uiNumber-100*(int)ucaNumber[0])/10;							
    	ucaNumber[2]=uiNumber-100*(int)ucaNumber[0]-10*ucaNumber[1];
    	for(ucCount=0;ucCount<3;ucCount++)
    	{
    		vShowOneChar(ucaNumber[ucCount]+48);				//从首位到末位逐一输出。
    		if(ucCount==0)
    			vShowOneChar('.');
    	}
    }
    //*************************************************************************************************
    //*																								  *
    //*			  ********************************主函数******************************				  *
    //*																								  *
    //*************************************************************************************************
    void main()
    {
    	TMOD=0x01;			//定时器0,模式1。
    	TH0=TIME0H;
    	TL0=TIME0L;
    	TR0=1;				//启动定时器。
    	ET0=1;				//开定时器中断。
    	EA=1;				//开总中断
    	vdInitialize();
    	vWriteCMD(0x84);	   //写入显示起始地址(第一行第4个位置)
    	vShowChar("voltage");
    	vWriteCMD(0xC9);     
    	vShowChar("(V)");
    	while(1)
    	{
    		if(b_DATransform==1)
    		{
    			b_DATransform=0;
    			vWriteCMD(0xC4);
    			vShowVoltage(uiADTransform());
    		}
    	}
    }
    //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定时器0中断函数>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    void t0() interrupt 1
    {
    	if(uc_Clock==0)
    	{
    		uc_Clock=5;
    		b_DATransform=1;
    	}
    	else
    		uc_Clock--;
    	TH0=TIME0H;		   //恢复定时器0。
    	TL0=TIME0L;
    }
    
    

    9、资源获取


    项目的仿真和PCB工程已经放在下面公众号里面,可以关注公众号:Kevin的学习站,输入关键字:“数字电压表”,就可以免费获取啦!创作不易,但您的点赞、关注、收藏就是对我最大的鼓励!
    在这里插入图片描述

    展开全文
  • 单片机 数字电压表(ADC0809)

    万次阅读 多人点赞 2018-06-02 11:42:44
    单片机 数字电压表(ADC0809) 一、简述 采用模数转换的芯片ADC0809实现设计数字电压表。例子中设计的数字电压表可以测量0~5V范围内的输入电压值,并且通过4位LED数码管显示采集的电压值,例子测量三个模拟值:4....

    单片机 数字电压表(ADC0809)

    一、简述

        采用模数转换的芯片ADC0809实现设计数字电压表。例子中设计的数字电压表可以测量0~5V范围内的输入电压值,并且通过4位LED数码管显示采集的电压值,例子测量三个模拟值:4.995、2.5、0.005。

        ADC0809是可以将我们要测量的模拟电压信号量转换为数字量从而可以进行存储或显示的一种转换器件。

       文件打包:链接: https://pan.baidu.com/s/1F2E135Jw7TG3EmUVx3xKGg 提取码: 5ttz

    二、效果

    三、工程文件

    1、Keil工程

    2、仿真电路图

    四、源文件

    #include<reg51.h>
    #define uint unsigned int
    #define uchar unsigned char
    uchar code led[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管显示0-9的电平码
    uint volt,vtime; //电压值测定值 
    uchar addr;//测量地址位
    sbit LW1=P2^3; //对应第4个数码管
    sbit LW2=P2^2; //对应第3个数码管
    sbit LW3=P2^1; //对应第2个数码管
    sbit LW4=P2^0; //对应第1个数码管
    sbit LW5=P1^4;//指示当前显示的是第几个转换值
    sbit CLK=P2^4; //时钟信号
    sbit START=P2^5; //转换启动开关
    sbit EOC=P2^6;	//转换结束标志
    sbit OE=P2^7;//定义ADC0809各脚
    /**********************************************************/
    //函数名:delay(uint x)
    //功能:延时程序 改变测量地址 	
    //调用函数:
    //输入参数:x
    //输出参数:
    //说明:程序的延时时间为x乘以0.5ms 每5s改变测量地址位
    /**********************************************************/
    void delay(uint x)
    {
    	uchar y,z;
    	for(y=x;y>0;y--)
    		for(z=250;z>0;z--);//该步运行时间约为0.5ms
    		vtime++;
    		if(vtime==1000)
    		{
    			vtime=0;
    			addr++;
    			if(addr==3)	 //本例子一共有3个测量输入值,轮流读取这3个值并转换显示
    				addr=0;//以上语句实现测量地址位的改变		
    		}	
    }
    /**********************************************************/
    //函数名:ADC()
    //功能:数模转换程序
    //调用函数:
    //输入参数:
    //输出参数:
    //说明:将转换好的测定值保存在变量volt中
    /**********************************************************/
    void ADC()
    {
    	EA=1;//开中断
    
    	//确保进入正常AD转换状态?
    	START=0;
    	START=1;
    
    	START=0;//ad开始转换		
    	while(EOC==0); //等待转换结束
    	OE=1; //输出数据标志为真
    	
    	EA=0;//关中断
    	volt=P3;//获取转换值保存到volt中,(P3为转换后数据)
    	volt=volt*196;//转换值处理 (例子的满量程为5V,转换分辩率为8位即最大值是255,5/255=196mV,即1代表196mV)
    	
    	OE=0;//输出转换结束 (要在获取转换值之后)
    }
    /**********************************************************/
    //函数名:display()
    //功能:4位数码管显示
    //调用函数:delay(uint x)
    //输入参数:
    //输出参数:
    //说明:将处理后的电压值显示在4位数码管上
    /**********************************************************/
    void display()
    {
    	P0=0xff;//消隐 (相当于全部灭灯,清除上次显示效果)
    	LW1=0;
    	P0=~led[volt/10000]&0x7f;//带小数点1伏显示位
    	delay(2);
    	P0=0xff;
    	LW1=1;
    	LW2=0;
    	P0=~led[(volt/1000)%10];//100毫伏显示位
    	delay(2);
    	P0=0xff;
    	LW2=1; 
    	LW3=0;
    	P0=~led[(volt/100)%10];//10毫伏显示位
    	delay(2);
    	P0=0xff;
    	LW3=1;
    	LW4=0;
    	P0=~led[(volt/10)%10];//1毫伏显示位
    	delay(2);
    	P0=0xff;
    	LW4=1;
    	LW5=0;
    	P0=~led[addr+1];//显示电压测量位
    	delay(2);
    	LW5=1;//指示当前显示的是第几个转换值								
    }
    /**********************************************************/
    //主程序
    /**********************************************************/ 
    void main()
    {
    	EA=1;//开总中断		   
        TMOD=0x01;//设定定时计数工作方式
    	//为定时器初赋值
    	TH0=0XFF;
        TL0=0XB4;
    
    	ET0=1;//开定时器0中断 
    	TR0=1;//开启定时器0
    	while(1)
    	{
    		P1=addr;//装入测量地址
    		LW5=1;
    		ADC();//调用模数转换程序
    		display();//调用显示程序
    	}
    }
    /**********************************************************/
    //函数名:timer() interrupt 1
    //功能:定时中断0响应程序
    //调用函数:
    //输入参数:
    //输出参数:
    //说明:为ADC提供时钟信号
    /**********************************************************/
    void timer() interrupt 1
    {
    	//初值重置
    	TH0=0XFF;
        TL0=0XF0;
    	CLK=~CLK;//取反 产生时钟信号
    }
    

    五、总结

        ADC0809是一种有8路模拟输入、8位并行数字输出的逐次逼近式A/D器件。

    1、主要技术指标和特性
        (1) 分辨率:8位;
        (2) 转换时间:取决于芯片的时钟频率,转换1次所需时间;
        (3) 单一电源:+5V;

        (4) 模拟输入电压范围:单级性为0~+5V。

    2、引脚介绍

    管脚功能说明:
    IN0-IN7:模拟量输入通道。就是说它可以分时地分别对八个模拟量进行测量转换。
    ADDA-C:地址线。也就是通过这三根地址线的不同编码来选择对哪个模拟量进行测量转换。
    ALE:地址锁存允许信号。在低电平时向ADDA-C写地址,当ALE跳至高电平后ADDA-C上的数据被锁存
    START:启动转换信号。当它为上升沿后,将内部寄存器清0。当它为下降沿后,开始A/D转换。
    D0-D7:数据输出口。转换后的数字数据量就是从这输出给S52的。
    OE:输出允许信号,是对D0-D7的输出控制端,OE=0,输出端呈高阻态,OE=1,输出转换得到的数据。
    CLOCK:时种信号。ADC0809内部没有时钟电路,需由外部提供时钟脉冲信号。
    EOC:转换结束状态信号。EOC=0,正在进行转换。EOC=1,转换结束,可以进行下一步输出操作

    Vref(+)、Vref(-):参考电压。参考电压用来与输入的模拟量进行比较,作为测量的基准。一般Vref(+)=5v ,Vref(-)=0V。

    3、时序图与工作过程

        时序图:

    工作过程:

     ①在IN0-IN7上可分别接上要测量转换的8路模拟量信号。可只接一路。
     ②将ADDA-ADDC端给上代表选择测量通道的代码。如000(B)则代表通道0;001(B)代表通道1;111则代表通道7。
     ③将ALE由低电平置为高电平,从而将ADDA-ADDC送进的通道代码锁存,经译码后被选中的通道的模拟量送给内部转换单元。
     ④给START一个正脉冲。当上升沿时,所有内部寄存器清零。下降沿时,开始进行A/D转换;在转换期间,START保持低电平。
     ⑤EOC为转换结束信号。在上述的A/D转换期间,可以对EOC进行不断测量,当EOC为高电平时,表明转换工作结束。否则,表明正在进行A/D转换。
     ⑥当A/D转换结束后,将OE设置为1,这时D0-D7的数据便可以读取了。OE=0,D0-D7输出端为高阻态,OE=1,D0-D7端输出转换的数据。
        说明:ADC0809的转换工作是在时钟脉冲的条件下完成的,因此首先要在CLOCK端给它一个时钟信号,说明书上给出了可以接入的脉冲信号频率是在10KHz-1280KHz,典型值是640KHz。我们这里取值50KHz。
      时序图上的teoc时长为:从START上升沿开始后的8个时钟同期再加2微秒。这一点得注意,因为当START脉冲刚结束进入转换工作时,EOC还没有立即变为低电平而是过了8个时钟周期后才进入低电平的,所以再给出START脉冲后最好延时一会再进行EOC的检测。

      一个通道的转换时间一般为64个时钟周期,如时钟频率为640KHz时,时钟周期为1.5625微秒,一个通道的转换时间则为1.5625×64=100微秒,那么1秒种就可以转换1000000÷100=10000次。

    4、计算定时器初值:

        信号频率取值50KHz,晶振频率是12MHz。

        12MHz时钟频率下,12MHz = 12000KHz = 12000000Hz,一个时钟振荡周期就是1/12000000秒,亦即1/12微秒,标准MCS51系列单片机的一个机器周期是12个时钟振荡周期,也就是12 * (1/12) = 1微秒。

    要输出50KHz的矩形方波 周期 T = (1/50K)s 等宽 也就是占空比50% 高电平时间是(0.5/50K)s = 0.01 ms = 10us

     

    然而,实际上仿真时这个频率是太快了(不知道是否是计算方法错了),编程中没有使用该初值。

    六、Proteus相关操作

          1、电压探针元件(显示电压)

               

       2、自定义电源电压

            

    -------------------------------------------------以下是回复 Rainynightsunset 这位兄弟---------------------------

    下载打包文件之后:

    ========================以下回复  木子Jasmine 这位兄弟======================

    手动复位效果 (使用轮询方式检测按键有没有按下,因为外部中断引脚被使用了)

    测试代码以及仿真文件:链接: https://pan.baidu.com/s/1zC8uhzlbIFRBOkOWuWzAWQ 提取码: wr39

     

     

    ===================以下回复 Leon. 这位兄弟=======================

    将程序中的addr最值修改为8,如下:

    在仿真上,添加5个模拟输入

    效果:(注:想要查看电压,请加上电压探针元件)

     

     

    ============== ===== 以下回复    馨心愢忞   ========================

    简单的测量20v(采用分压法:先把电压除以4再进行转换,得到转换的值后再乘以4)

    测试例子:链接: https://pan.baidu.com/s/10RzT9lFVbB8db4CO7at_0A 提取码: zwem

    测试效果:

    分压测量20V说明:

     

    =======================以下回复 yikai0511validatetoken==============================

    以下例子是:按键设置最高电压,当前电压大于等于最高电压时蜂鸣器报警以及LED亮,测试环境为Win10

    电压为20V的可以自己设置的,上下限值同时设置暂时没弄好(感觉引脚不够用,需要复用引脚)

    例子打包:链接: https://pan.baidu.com/s/1RY18AeWCCsXXqlgUBeTv_w 提取码: pdf7

    仿真截图:

     

    效果:

     

    展开全文
  • 本毕业设计利用单片机设计一个数字电压表,能够测量0-5V之间的直流电压值,四位数码显示,使用的元器件数目较少。 首先,外界电压模拟量输入到A/D转换部分的输入端,通过A/D转换变为数字信号,输送给单片机。然后...
  • 课程设计报告,基于51单片机数字电压表的课程设计
  • A/D转换器芯片ADC0832,AT89C52单片机,数码管。...外部0~5V的模拟信号输入时,首先通过ADC8032转换模块进行转换,转换成数字信号并进入通道进行选择后,将信号传入AT89C52单片机,进行数码管显示
  • 51单片机数字电压表,51单片机数字电压表视频,CC++源码.zip.zip
  • 51单片机数字电压表protues仿真 基于51数字电压表仿真设计 电压表程序设计
  • 而且随着电子技术的发展,更是经常需要测量高精度的电压,所以数字电压表就成为一种必不可少的测量仪器。数字电压表简称DVM,它是采用数字化测量技术,把连续的模拟量转换成不连续、离散的数字形式并加以显示的仪表...

    第1章 绪论1.1系统的开发背景

    在电量的测量中,电压、电流和频率是最基本的三个被测量,其中电压量的测量最为经常。而且随着电子技术的发展,更是经常需要测量高精度的电压,所以数字电压表就成为一种必不可少的测量仪器。数字电压表简称DVM,它是采用数字化测量技术,把连续的模拟量转换成不连续、离散的数字形式并加以显示的仪表。由于数字式仪器具有读数准确方便、精度高、误差小、测量速度快等特而得到广泛应用。

    传统的指针式刻度电压表功能单一,进度低,容易引起视差和视觉疲劳,因而不能满足数字化时代的需要。采用单片机的数字电压表,将连续的模拟量如直流电压转换成不连续的离散的数字形式并加以显示,从而精度高、抗干扰能力强,可扩展性强、集成方便,还可与PC实时通信。数字电压表是诸多数字化仪表的核心与基础。以数字电压表为核心,可以扩展成各种通用数字仪表、专用数字仪表及各种非电量的数字化仪表。目前,由各种单片机和A/D转换器构成的数字电压表作全面深入的了解是很有必要的。

    最近的几十年来,随着半导体技术、集成电路(IC)和微处理器技术的发展,数字电路和数字化测量技术也有了巨大的进步,从而促使了数字电压表的快速发展,并不断出现新的类型。数字电压表从1952年问世以来,经历了不断改进的过程,从最早采用继电器、电子管和形式发展到了现在的全固态化、集成化(IC化),另一方面,精度也从0.01%-0.005%。

    目前,数字电压表的内部核心部件是A/D转换器,转换的精度很大程度上影响着数字电压表的准确度,因而,以后数字电压表的发展就着眼在高精度和低成本这两个方面。1.2 本文研究对象

    本文是以简易数字直流电压表的设计为研究内容,本系统主要包括三大模块:转换模块、数据处理模块及显示模块。其中,A/D转换采用ADC0808对输入的模拟信号进行转换,控制核心AT89C51再对转换的结果进行运算处理,最后驱动输出装置LED显示数字电压信号。第2章 方案设计与论证2.1设计方案与论证

    数字电压表的设计方案很多,但采用集成电路来设计较流行。其设计主要是由模拟电路和数字电路两大部分组成,模拟部分包括A/D转换器,基准电源等;数字部分包括振荡器,数码显示,计数器等。其中,A/D转换器将输入的模拟量转换成数字量,它是数字电压表的一个核心部件,对它的选择一般三种选择方案:

    方案一、采用双积分A/D转换器MC14433,它有多路调制的BCD码输出端和超量程输出端,采用动态扫描显示,便于实现自动控制。但芯片只能完成A/D转换功能,要实现显示功能还需配合其它驱动芯片等,使得整部分硬件电路板布线复杂,加重了电路设计和实际焊接的工作。

    方案二、 A/D转换器采用ICL7107型三位半显示的芯片,输入信号,流经取样电路取样后送到ICL7107型三位半A/D转换器,只需要很少的简单外围元件,就可组成数字电流表模块,直接驱动三位半LED显示器显示,最后输入电流在显示部分显示。由于ICL7107做的LED数字表,最大的缺点就是数字乱跳不稳定,特别最后一位。接口模块:使用数字电路实现,采用译码芯片CD4543作为接口芯片,这种方案能实现功能,但稳定性不高,结构复杂。

    方案三、逐次逼近式A/D转换器。它的转换速度更快,而且精度更高,采用ADC0808转换芯片,其中A/D转换器用于实现模拟量向数字量的转换,单电源供电。它是具有8路模拟量输入、8位数字量输出功能的A/D转换器,转换时间为100μs,模拟输入电压范围为0V~5V,不需零点和满刻度校准,功耗低,约15mW。 由于模拟转换电路的种类很多,通过对转换速度,精度和价格方面考虑。

    综上所述选择方案三。采用ADC0808为本次设计的转换芯片。单片机模块采用AT89S51单片机作为系统的控制单元,通过A/D转换将被测值转换为数字量送入单片机中,再由单片机来送显。此方案各类功能易于实现,成本低、功耗低,显示稳定。

    显示部分可以采用各类数码管或用LED显示器显示。在此简化采用4位八段共阴极数码管对A/D转换变换后的结果加以显示。2.2 系统设计要求

    设计一个数字电压表,基于单片机或数字逻辑电路,设计A/D转化电路、密码校验电路和控制输出与显示电路,实现用户按键输入密码开锁功能。

    1、以单片机为控制核心设计数字电压表;

    2、可以测量0~5V的8路输入电压值;

    3、LED数码管轮流显示或单路选择显示电压值;

    4、最小分辨率为0.01V,测量误差约为±0.01V。2.3总体设计框图

    本设计采用以AT89C51单片机控制方案。 利用单片机灵活的编程设计和丰富的IO端口,及其控制的准确性。系统结构框图如图2.1所示。

    5cedeba053e2ee3dd5d81a6731fbcbcb.png

    图2.1系统结构框图

    34fc8aff8ee6b4a5183766ba9a3a26e7.png

    第3章 单元电路设计3.1最小系统设计

    623ddb8296d0fe600ae71f66eb572a73.png

    晶振模块设计采用内部时钟方式,利用单片机内部的高增益反相放大器,外部电路简,只需要一个晶振和 2个电容即可,如图3.1所示。

    图3.1 时钟电路

    电路中的器件选择可以通过计算和实验确定,也可以参考一些典型电路。参数,电路中,电容器C1和C2对震荡频率有微调作用,通常的取值范围是30±10pF,在这个系统中选择了30pF;石英晶振选择范围最高可选24MHz,它决定了单片机电路产生的时钟信号震荡频率,在本系统中选择的是12MHz,因而时钟信号的震荡频率为12MHz。

    0884d15fb72b55b4096426388b6919d2.png

    复位模块设计AT89C51单片机在启动运行时或者出现死机时需要复位,使CPU以及其他功能部件处于一个确定的初始状态,并从这个状态开始工作。复位电路产生的复位信号(高电平有效)由RST引脚送入到内部的复位电路,对AT89C51单片机进行复位,要求至少两个高电平,以便单片机做好准备工作。当上电时,由于电容的电压不能突变,会输出高电平,当电容充电到一定程度,就会输出低电平,单片机利用输出高电平的这段时间复位。电阻和电容的值选择要合适。在这要求R1

    AT89C51芯片的各引脚功能为:

    P0口:8位,漏极开路的双向I/O口。这组引脚共有8条,P0.0为最低位。这8个引脚有两种不同的功能,分别适用于不同的情况。

    P1口:8位,准双向I/O口,具有内部上拉电阻。这8个引脚和P0口的8个引脚

    类似,P1.7为最高位,P1.0为最低位,当P1口作为通用I/O口使用时,P1.0-P1.7的功能和P0口的第一功能相同,也用于传送用户的输入和输出数据。

    P2口:这组引脚的第一功能与上述两组引脚的第一功能相同即它可以作为通用I/O口使用,它的第一功能和P0口引脚的第二功能相配合,用于输出片外存储器的高8位地址,共同选中片外存储器单元,但并不是像P0口那样传送存储器的读/写数据。

    P3口:这组引脚的第一功能和其余三个端口的第一功能相同,第二功能为控制功能,每个引脚并不完全相同,如下表2所示:

    ALE/PROG:地址锁存允许信号,输出。配合P0口的第二功能使用,在访问外部存储器时,89C51的CPU在P0.0-P0.7引脚线去传送随后而来的片外存储器读/写数据。在不访问片外存储器时,89C51自动在ALE线上输出频率为1/6震荡器频率的脉冲序列。该脉冲序列可以作为外部时钟源或定时脉冲使用。

    /EA:片外存储器访问允许信号,低电平有效。可以控制89C51使用片内ROM或使用片外ROM,若/EA=1,则允许使用片内ROM,若/EA=0,则只使用片外ROM。

    /PSEN:片外ROM的选通信号低电平有效。在访问片外ROM时,89C51自动在/PSEN线上产生一个负脉冲,作为片外ROM芯片的读选通信号。

    RST:复位线,可以使89C51处于复位(即初始化)工作状态。通常89C51复位有自动上电复位和人工按键复位两种。

    XTAL1和XTAL2:片内震荡电路输入线,这两个端子用来外接石英晶体和微调电容,即用来连接89C51片内OSC(震荡器)的定时反馈回路。3.2 A/D转换设计

    6403433e98433494afeb89d2b6ed4d7d.png

    A/D转换器是模拟量输入通道中的一个环节,单片机通过A/D转换器把输入模拟量变成数字量再处理。ADC0808是采样分辨率为8位的、以逐次逼近原理进行模/数转换的器件。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。A/D转换电路如图3.4所示。

    图3.4 ADC0808 转换电路

    ADC0808芯片有28条引脚,采用双列直插式封装,各引脚功能为:

    (1) IN0~IN7:8路模拟量输入端。

    (2) D0~D7:8位数字量输出端口。

    (3) START:A/D转换启动信号输入端。

    (4) ALE:地址锁存允许信号,高电平有效。

    (5) EOC:输出允许控制信号,高电平有效。

    (6) OE: 输出允许控制信号,高电平有效。

    (7) CLK:时钟信号输入端。

    (8)ADDA、ADDB、ADDC:转换通道地址,控制8路模拟通道的切换。ADDA、ADDB、ADDC分别与地址线或数据线相连,三位编码对应8个通道地址端口,ADDA、ADDB、ADDC=000~111分别对应IN0~IN7通道的地址端口。

    使用方法:

    ADC0808采用逐次比较的方法完成A/D转换,由单一的+5V电源供电。片内带有锁存功能的8路选1的模拟开关,由ADDA、ADDB、ADDC的编码来决定所选的通道。ADC0808完成一次转换需100μs左右,它具有输出TTL三态锁存缓冲器,可直接连接到AT89C51的数据总线上。通过适当的外接电路,ADC0808可对0~5V的模拟信号进行转换。3.5 显示电路设计

    630a37638a809ad201e30486ccfab54d.png

    电压显示采用四位共阴极数码管,这种数码管可显示4位值,每位由8个发光二极管(以下简称字段)即a、b、c、d、e、f、g、dp字段构成,通过控制不同的LED的亮灭的不同组合可用来显示数字09及小数点“”。数码管又分为共阴极和共阳极两种结构。本次课程设计采用共阴极。

    图3.5 四位数码管电路

    共阴极数码管0~9的C51编码为:uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x7f,0x6f};

    uchar code table[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};

    其中1不带小数点,2带小数点。

    共阳极就是数码管的每段都接高电平,这样要是哪段亮就这段就得接地。

    通道选择显示采用7SEG-BCD,该数码管内含译码器,外部不需要再配,适用于直接加BCD码,即直接加四位二进制数,显示0到F。这个数码管用于显示ADC0808的选择输入通道。

    a7872dc72d22a5adc8a468d426bcccd6.png

    图3.6 数码管电路

    3.6 模拟输入设计

    通过可变电阻一端接电源+5v,一端接地GND,通过改变电阻的阻值,从而改变所测电压值,实现电压的模拟信号输入。分别将八个输入接入ADC0808中IN0到IN7引脚实现八路的输入电压。将通过按键选择某一路输入,实现单路选择输出电压。

    2e81a97596a40a3871e48ff30b02e7b1.png

    图3.7 模拟输入电路3.7 按键设计

    通过两个按键控制ADC0808的输入通道同时将通道数传递给通道显示的数码管。按键一的功能为加一,即每按下一次,通道数加一。按键二的功能为减一,即每按一下,通道数减一。实现单路选择显示电压。按键模型如图3.8所示。

    45085cabbdbb2fe5377a95f4996305d6.png

    图3.8 按键电路

    要实现按键的功能需要知道ADC0808的ADDA、ADDB、ADDC的功能。ADC0808一个8路模拟开关,一个地址锁存与译码器、一个8位A/D转换器和一个三态输出锁存器组成。多路开关可选通8个模拟通道IN0—IN7,允许8路模拟分量输入,共用A/D转换器 进行转换。地址输入和控制线:4条,ALE为地址锁存允许输入线,高电平有效。当ALE线为高电平时,地址锁存与译码器将A,B,C三条地址线的地址信号进行锁存,经译码后被选中的通道的模拟量进转化器进行转换。A,B,C为地址输入线,用于选通IN0—IN7上的一路模拟量输入。

    第4章 系统软件设计4.1 主程序的设计

    由于ADC0808在进行A/D转换时需要有CLK信号,而此时的ADC0808的CLK是连接在AT89C51单片机的30管脚,也就是要求从30管脚输出CLK信号供ADC0808使用。因此产生CLK信号的方法就等于从软件产生。电压表系统有主程序,A/D转换子程序、按键子程序和显示子程序。主程序框图如图4.1所示。

    2e8a43b7a007c6aed6efcbfbbaa52127.png

    图4.1 主程序流程图4.2 A/D转换程序设计

    ADC0808对模拟量输入信号进行转换通过判断EOC(P3.2来确定转换是否完成若EOC为0则继续等待若EOC为1则把OE置位,将转换完成。加入按键控制,通过按键控制ADC0808对输入电路的选择,从而实现单路选择电路电压满足设计要求。程序流程图如4.2所示。

    a637bc986d46699c7113c0eff3e50584.png

    图4.2 A/D程序流程图

    其中A/D转换子程序的C语言代码如下

    sbit START=P3^0;

    sbit OE=P3^1;

    sbit EOC=P3^2;

    uint data  tvdata;

    void main(void)

    {

    ET0=1;

    EA=1;

    TMOD=0x02;

    TH0=216;

    TL0=216;

    TR0=1;

    while(1)

    {

    START=1;

    START=0;          //启动转换

    while(EOC==0);

    OE=1;

    tvdata=P1;

    tvdata*=20-0.01;

    OE=0;

    }

    }4.3 显示程序设计

    系统上电后,配置数码管个引脚,然后对其进行初始化,再调用的读写函数,可将采集处理后的电压数值实时显示。其程序流程图如图4.3所示。

    9f4c6221af7006d1903f490dbbc22ac1.png

    图4.3 显示程序流程图

    其中显示子程序的C语言代码如下:

    uchar code  tv[]={0xfe,0xfd,0xfb,0xf7};

    uchar code  a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

    void ledxianshi(void)

    {

    uchar k,i;

    if(tvdata>5000)

    tvdata=5000;

    led[0]=tvdata%10;

    led[1]=tvdata/10%10;

    led[2]=tvdata/100%10;

    led[3]=tvdata/1000;

    for(k=0;k<4;k++)

    {

    P2=tv[k];

    i=led[k];

    P0=a[ i];

    if(k==3)

    {

    P07 =1;

    }

    delay();

    }

    }4.4 按键程序设计

    通过按键控制ADC0808选择的输入通道。开始之后,进行通道选择,一个按键使通道加1,一个减1,从而选择输入,影响输出。按键按下之后,重新进行AD转换,重新显示电压值与通道。

    ee5ee68933e824b6514ffaa7af07396f.png

    图4.3 按键程序流程图

    其中按键子程序的C语言代码如下:

    void xuan( uint a)

    {

    if(a==0)

    {

    P37=0;P36=0;P35=0;

    }

    if(a==4)

    {

    P37=0;P36=0;P35=1;

    }

    if(a==2)

    {

    P37=0;P36=1;P35=0;

    }

    if(a==6)

    {

    P37=0;P36=1;P35=1;

    }

    if(a==1)

    {

    P37=1;P36=0;P35=0;

    }

    if(a==5)

    {

    P37=1;P36=0;P35=1;

    }

    if(a==3)

    {

    P37=1;P36=1;P35=0;

    }

    if(a==7)

    {

    P37=1;P36=1;P35=1;

    }

    }

    if( KEY2==0)

    {

    b--;

    delay();

    xuan(b);

    delay();

    if(b==0)

    b=7;

    }

    if( KEY1==0)

    {

    b++;delay( );

    xuan(b);

    if(b==7)

    b=0;

    }

    第5章 系统仿真与调试

    使用Proteus绘制原理图,然后将Keil生成的hex程序文件载入到单片机中,点击运行:

    按下按键,选择IN5即通道5时,仿真与如图5.1所示。

    f3a298176e62b5eb088f8087d53a8beb.png

    图5.1 通道5仿真图

    如图所示,通过按键选择通道五实现显示单路电压,数码管显示数字5。测量电压为2.038V,实际电压为2.03V,误差小于0.01,满足设计要求。

    为确定结果的准确性,需要多次测量对比。

    5cd07164684dd856d8fed1fe574ea64b.png

    按下按键,选择IN7即通道7时,仿真与如图5.2所示。

    图5.2 通道7仿真图

    如图所示,测量电压为0.919V,实际电压为0.92V,误差小于0.01,满足设计要求,且可通过按键选择通道七实现显示单路电压,数码管显示数字7。

    仿真结果分析:输入的电压从0~5V变化时,数字电压表能够测量出并利用数码管显示出来。测量的精度与要求的一致,前两位精确,百分位不作精确。要更精确,只需修改相应的源程序代码即可。

    第6章 总结

    本系统由单片机系统、A/D转化电路、LCD显示和按键系统组成。数字电压表能完成测量0~5V的8路输入电压值并且通过按键控制可以使LED数码管单路选择显示电压值的功能。本系统利用单片机控制,LCD显示,按键配合,系统成本低廉,功能强大实用。

    本文设计的基于AT89C51的数字电压表具有简单的软硬件设计电路、低廉的开发成本、简便的操作方法,在实际应用工作应能好,测量电压准确,精度高。并通过Proteus仿真实现了预期的功能,实现八路输入电压单路选择输入显示电路电压值,且可以满足现在的误差要求最小分辨率为0.01V,测量误差约为±0.01V。。

    但是设计数字电压表需要结合实际综合考虑很多因素,因此该数字电压表设计需要在实际中进一步完善和改进。 要想在现实生活中推广,还必须针对实际应用场合的需要,进一步完善系统功能的程序具有一定的推广价值。

    b1cdf9788dd9ad7bb8670a7dfff31fce.png

    附录I:整体电路原理图

    附录II:元器件清单序号标号元器件名称元器件参数

    1U1单片机AT89C51

    2U2A/D转化器ADC0808

    3RV0-RV7滑动变阻器1K

    4R1-R10电阻10K

    5LED1四位数码管7SEG-MPX4-CC

    6LED2一位数码管7SEG-BCD

    7C1、C2电容33pF

    8C3电容1uF

    9KEY1-KEY3按键6*6*5

    以上文档下载(word格式 可编辑):

    7269ff8fd7142ea0f1528660ab33985d.gif

    数字电压表的设计.doc

    (736.36 KB, 下载次数: 111)

    2017-7-1 17:39 上传

    点击文件名下载附件

    展开全文
  • 单片机数字电压表的毕业课程设计,论文格式,详细的电路图及流程
  • 51单片机数字电压表_数字电压_数字电压表51_电压表_数字电压表_biggestjn8_源码.zip
  • 单片机数字电压表设计.rar
  • 单片机 数字电压表(TLC2543)

    万次阅读 多人点赞 2018-06-04 16:33:35
    单片机 数字电压表(TLC2543) 一、简述 使用并行ADC会限制系统I/O口的功能扩展,采用串行ADC比较适合那些低速采样而控制管脚又比较多的系统。 TLC2543是TI公司的12位串行模数转换器,由于是串行输入结构,能够节省...
  • 5换成数字形式, 并显示出来。
  • 基于51单片机宽量程自动切换电压表
  • 单片机为核心,设计一个数字电压表。采用中断方式,对2路0~5V的模拟电压进行循环采集,采集的数据送LED显示,并存入内存。超过界限时指示灯闪烁。 2. 实验原理 本题目本质上是以单片机为控制器,ADC0809为ADC...
  • 单片机 数字 电压表

    2012-12-10 22:51:40
    单片机 数字 电压表
  • 项目17 单片机数字电压表的设计.zip。这是单片机数字电压表的设计,下载附件包含对应c语言代码及项目工程资料。
  • 51单片机做的数字电压表仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)51单片机做的数字电压表仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)51单片机做的数字电压表仿真原理图如下(proteus...
  • 单片机数字电压表

    2018-07-10 22:39:12
    单片机数字电压表为何只能测直流,不能测交流,并且电压也只能是0-5v?
  • 5换成数字形式, 并显示出来。
  • 单片机数字电压表课程设计;1.数字电压表简介;1.数字电压表简介;2.设计要求;3.ADC0809简介;3.ADC0809简介;4.程序设计及仿真;4.程序设计及仿真;4.程序设计及仿真;4.程序设计及仿真;4.程序设计及仿真;4.程序设计及仿真;...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,972
精华内容 2,788
关键字:

单片机数字电压表

友情链接: 定位程序.zip