精华内容
下载资源
问答
  • 单片机数字电压表(带仿真图C程序).docx
    2021-05-20 09:57:07

    单片机数字电压表(带仿真图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单片机数字电压表设计程序
  • C51简易电压表的课程设计,单片机电压表程序源代码 基于ADC0809 资源中包含proteus仿真图、C语言程序代码以及编译好的hex文件,测试可用。 1. 设计要求 以单片机为核心,设计一个数字电压表。采用中断方式,对2路0...
  • 基于51单片机数字电流表电压表设计 包含源程序原理图
  • 实现本数字电压表的主要元件之一是单片机89C51.89C51是ATMEL公司推出的高性能CMOS 8位微控制器,指令和管脚与MCS一51产品兼容,片内带有4 KB闪烁可编程存储器。所以不须在外围电路设置程序存储器_1]. 图1 硬件...
  • 而且随着电子技术的发展,更是经常需要测量高精度的电压,所以数字电压表就成为一种必不可少的测量仪器。数字电压表简称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单片机数字电压表protues仿真 基于51数字电压表仿真设计 电压表程序设计
  • 单片机制作数字电压表程序+仿真
  • 利用单片机AT89S51与ADC0809设计一个数字电压表,能够测量0-5V之间的直流电压值,四位数码显示,但要求使用的元器件数目最少。 2. 电路原理图 图1.28.1 3. 系统板上硬件连线 a) 把“单片机系统”区域中的...

    28. 数字电压表

    1. 实验任务

    利用单片机AT89S51与ADC0809设计一个数字电压表,能够测量0-5V之间的直流电压值,四位数码显示,但要求使用的元器件数目最少。

    2. 电路原理图

    3. 系统板上硬件连线

    a) 把“单片机系统”区域中的P1.0-P1.7与“动态数码显示”区域中的ABCDEFGH端口用8芯排线连接。

    b) 把“单片机系统”区域中的P2.0-P2.7与“动态数码显示”区域中的S1S2S3S4S5S6S7S8端口用8芯排线连接。

    c) 把“单片机系统”区域中的P3.0与“模数转换模块”区域中的ST端子用导线相连接。

    d) 把“单片机系统”区域中的P3.1与“模数转换模块”区域中的OE端子用导线相连接。

    e) 把“单片机系统”区域中的P3.2与“模数转换模块”区域中的EOC端子用导线相连接。

    f) 把“单片机系统”区域中的P3.3与“模数转换模块”区域中的CLK端子用导线相连接。

    g) 把“模数转换模块”区域中的A2A1A0端子用导线连接到“电源模块”区域中的GND端子上。

    h) 把“模数转换模块”区域中的IN0端子用导线连接到“三路可调电压模块”区域中的VR1端子上。

    i) 把“单片机系统”区域中的P0.0-P0.7用8芯排线连接到“模数转换模块”区域中的D0D1D2D3D4D5D6D7端子上。

    4. 程序设计内容

    i. 由于ADC0809在进行A/D转换时需要有CLK信号,而此时的ADC0809的CLK是接在AT89S51单片机的P3.3端口上,也就是要求从P3.3输出CLK信号供ADC0809使用。因此产生CLK信号的方法就得用软件来产生了。

    ii. 由于ADC0809的参考电压VREF=VCC,所以转换之后的数据要经过数据处理,在数码管上显示出电压值。实际显示的电压值 (D/256*VREF)

    5. 汇编源程序
    (略)
    6. C语言源程序

    #include <AT89X52.H>
    
    unsigned char code dispbitcode[]={0xfe,0xfd,0xfb,0xf7,
    0xef,0xdf,0xbf,0x7f};
    unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,
    0x6d,0x7d,0x07,0x7f,0x6f,0x00};
    unsigned char dispbuf[8]={10,10,10,10,0,0,0,0};
    unsigned char dispcount;
    unsigned char getdata;
    unsigned int temp;
    unsigned char i;
    
    sbit ST=P3^0;
    sbit OE=P3^1;
    sbit EOC=P3^2;
    sbit CLK=P3^3;
    
    
    void main(void)
    {
    	ST=0;
    	OE=0;
    	ET0=1;
    	ET1=1;
    	EA=1;
    	TMOD=0x12;
    	TH0=216;
    	TL0=216;
    	TH1=(65536-4000)/256;
    	TL1=(65536-4000)%256;
    	TR1=1;
    	TR0=1;
    	ST=1;
    	ST=0;
    	while(1)
    	{
    		if(EOC==1)
    		{
    			OE=1;
    			getdata=P0;
    			OE=0;
    			temp=getdata*235;
    			temp=temp/128;
    			i=5;
    			dispbuf[0]=10;
    			dispbuf[1]=10;
    			dispbuf[2]=10;
    			dispbuf[3]=10;
    			dispbuf[4]=10;
    			dispbuf[5]=0;
    			dispbuf[6]=0;
    			dispbuf[7]=0;
    			while(temp/10)
    			{
    				dispbuf[i]=temp%10;
    				temp=temp/10;
    				i++;
    			}
    			dispbuf[i]=temp;
    			ST=1;
    			ST=0;
    		}
    	}
    }
    
    void t0(void) interrupt 1 using 0
    {
    	CLK=~CLK;
    }
    
    void t1(void) interrupt 3 using 0
    {
    	TH1=(65536-4000)/256;
    	TL1=(65536-4000)%256;
    	P1=dispcode[dispbuf[dispcount]];
    	P2=dispbitcode[dispcount];
    	if(dispcount==7)
    	{
    		P1=P1 | 0x80;
    	}
    	dispcount++;
    	if(dispcount==8)
    	{
    		dispcount=0;
    	}
    }

    展开全文
  • 基于c51单片机程序设计,扩展板为adc0809芯片,对采集的电压进行模数转换后,由单片机进行数字处理,最后由数码管显示
  • } /************************************ * 函数名称:TLC2543_GetVoltage(uchar V) * 函数功能:获取ADC0804的采集的电压 * 输入参数:参考电压 * 返回参数:电压值*10 ************************************/ ...
    #include"TLC2543.H"
    unsigned char TLC2543_DATA[7];
    void TLC2543_Delay10us(void)   
    {
        unsigned char a,b;
        for(b=1;b>0;b--)
            for(a=10;a>0;a--);
    }
    /************************************
    * 函数名称:TLC2543_ReadData()
    * 函数功能:读取ADC0804数据
    * 输入参数:无
    * 返回参数:电压原始数据值
    ************************************/
    uint16 TLC2543_ReadData(uint8 AX)
    {
      
      uint32 Vol=0;
      uint8 i=0;
      TLC2543_CS_L;
      TLC2543_Delay;
      AX=AX<<4;
      for(i=0;i<8;i++)
      { 
      
        TLC2543_CLK_L;
        TLC2543_DIN=AX&0x80;
        AX=AX<<1;
        TLC2543_CLK_H;
        TLC2543_Delay;
        Vol=Vol<<1;
      	Vol=Vol|TLC2543_DOUT;	
      }
      for(i=0;i<4;i++)
      {
        TLC2543_CLK_L;
        TLC2543_Delay;
        TLC2543_CLK_H;
        TLC2543_Delay;   
        Vol=Vol<<1;
      	Vol=Vol|TLC2543_DOUT; 
      }
      TLC2543_CLK_L;
      TLC2543_CS_H; 
      return(Vol);
    }
    /************************************
    * 函数名称:TLC2543_GetVoltage(uchar V)
    * 函数功能:获取ADC0804的采集的电压
    * 输入参数:参考电压
    * 返回参数:电压值*10
    ************************************/
    uint32 TLC2543_GetVoltage(uint8 AX,uint8 Vref)
    {
      uint8 i=0;
      uint16 dat=0;
      uint32 temp_V=0,temp_Data;
      dat=TLC2543_ReadData(AX);
      dat=TLC2543_ReadData(AX);
      dat=dat&0x0fff;
    
      temp_V=((dat*100000)/4096)*Vref;
      temp_Data=temp_V;
      TLC2543_DATA[0]=(unsigned char)(temp_V/100000);
      temp_V=temp_V%100000;
      TLC2543_DATA[1]=(unsigned char)(temp_V/10000);
      temp_V=temp_V%10000;
      TLC2543_DATA[2]=(unsigned char)(temp_V/1000);
      temp_V=temp_V%1000;
      TLC2543_DATA[3]=(unsigned char)(temp_V/100);
      temp_V=temp_V%100;
      TLC2543_DATA[4]=(unsigned char)(temp_V/10);
      temp_V=temp_V%10;
      TLC2543_DATA[5]=(unsigned char)(temp_V);
      return(temp_Data);	
    
    }
    
    
    
    
    
    
     #include<reg52.h>
     sbit TLC2543_DIN=P1^2;
     sbit TLC2543_DOUT=P1^3;
     sbit TLC2543_CS=P1^4;
     sbit TLC2543_CLK=P1^1;
     sbit TLC2543_EOC=P1^0;
     extern unsigned char TLC2543_DATA[7];
     #define TLC2543_Delay TLC2543_Delay10us()
     #define uint8 unsigned char
     #define uint16 unsigned int
     #define uint32 unsigned long
     #define TLC2543_CS_L   TLC2543_CS=0
     #define TLC2543_CS_H   TLC2543_CS=1
     #define TLC2543_CLK_H  TLC2543_CLK=1
     #define TLC2543_CLK_L  TLC2543_CLK=0
     #define TLC2543_DOUT_H TLC2543_DOUT=1
     #define TLC2543_DOUT_L TLC2543_DOUT=0
     #define TLC2543_EOC_H  TLC2543_EOC=1
     #define TLC2543_A0     0X00
     #define TLC2543_A1     0X10
     #define TLC2543_A2     0X20
     #define TLC2543_A3     0X30
     #define TLC2543_A4     0X40
     #define TLC2543_A5     0X50
     #define TLC2543_A6     0X60
     #define TLC2543_A7     0X70
     #define TLC2543_A8     0X80
     #define TLC2543_A9     0X90
     #define TLC2543_A10    0XA0
     #define TLC2543_TEST1   0XB0
     #define TLC2543_TEST2   0XC0
     #define TLC2543_TEST3   0XD0
     #define TLC2543_SLEEP   0XE0
     #define TLC2543_8BIT    0x04
     #define TLC2543_12BIT   0x08
     #define TLC2543_16BIT   0x0C
     #define TLC2543_SinPolar   0x00
     #define TLC2543_DouPolar   0x01
     uint16 TLC2543_ReadData(uint8 AX);
     uint32 TLC2543_GetVoltage(uint8 AX,uint8 Vref);
    
    
    展开全文
  • 对于单片机初学者来说,数字电压表是一个不错的练习项目。在本文中,单片机开发工程师们分享了一个使用PIC单片机开发的简易数字电压表。该数字电压表的范围是0-20V,当然你也可以自己增加或减少输入电压的范围。 在...
  • C51简易电压表的课程设计,单片机电压表程序源代码 基于ADC0809 资源中包含proteus仿真图、C语言程序代码以及编译好的hex文件,测试可用。 1. 设计要求 以单片机为核心,设计一个数字电压表。采用中断方式,对2路0...
  • ADC08098位逐次逼近式A/D模数转换器。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换相...本设计采用单路信号输入,将所测的电压值通过4联数码管显示出来。
  • 基于单片机数字电压表.pdf
  • 数字电压表基于51单片机设计,通过A/D转换芯片ADC0832,以及单片机的控制作用,将测量的电压值显示在液晶屏上。 为了便于需要的人学习或者参考,该源程序有详细的中文注释。 基于ADC0832的数字电压表部分截图:
  • 包含源程序和仿真文件
  • A/D转换器芯片ADC0832,AT89C52单片机,数码管。...外部0~5V的模拟信号输入时,首先通过ADC8032转换模块进行转换,转换成数字信号并进入通道进行选择后,将信号传入AT89C52单片机,进行数码管显示
  • #include #define uchar unsigned charuchar code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};uchar count,getdata;unsigned int voltage;sbit ST_A=P3^0;sbit EOC=P3^1;...
  • 以51单片机和A/D转换器为核心、以LCD1602位显示,设计一个可以自动选择档位的多档位直流电压测量电路。可测电压范围0V—500V。电压量程范围: 2V, 20V, 200V 和500V,共四个档位,可判断出电压范围并用继电器实现档位...
  • 毕设--基于51单片机数字电压表的设计
  • ATMEGA8数字电压表介绍: 该数字电压表采用atmel公司的MEGA8T32作为主控制芯片,采用7133-H控制该数字电压表的稳压输出32V,同时电路采用0.56寸三位数码管用于显示该数字...该数字电压表程序; 该数字电压表材料清单;
  • 【C51单片机数字电压表设计

    千次阅读 2018-11-15 13:33:24
    数字电压表要求:在AT89C52系统中采用PCF8591芯片,测量0-5V范围内的直流电压,并在2位数码管上显示电压值。 问题咨询请联系-》群名:IT项目交流群 群号:245022761 PROTEUS仿真电路: 在KEIL中编写的源程序: ...
  • 基于51单片机+ADC0808的八路数字电压表仿真设计资料 包含程序、PCB原理图、仿真文件
  • 基于51单片机+ADC0809数字电压表Proteus8.6仿真设计,具有8路测量电路,测量范围0---5V,数码管显示,8路可以通过独立按键切换显示
  • 本文中数字电压表的控制系统采用AT89c51单片机,A/D转换器采用ADC0809为主要硬件,实现数字电压表的硬件电路与软件设计。该系统的数字电压表电路简单,所用的元件较少,成本低,调节工作可实现自动化。还可以方便地进行8...
  • 该3位显示数字电压表基于ATMEGA8设计,此电压表提供的源程序可以制作成3位显示精度的3.2-30V带反接保护的电压表。 改进意见: 1、制作三线0-100V电压表,去掉R4 将R1换成390K,程序自己根据原来程序简单修改就可以了...
  • //定义四个显示数据单元和一个数据存储单元 //dis[4,3,2,1,5] 显示:12.34 5为存储单元 /*******************************************************************/ /* 延时子程序 */ /* */ /* */ /************...
  • 《基于单片机数字电压表.doc》由会员分享,可免费在线阅读全文,更多与《基于单片机数字电压表》相关文档资源请在帮帮文库(www.woc88.com)数亿文档库存里搜索。1、。图键盘接口电路仿真图第章系统软件设计多路...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,004
精华内容 2,001
热门标签
关键字:

单片机数字电压表程序