精华内容
下载资源
问答
  • 而且随着电子技术的发展,更是经常需要测量高精度的电压,所以数字电压表就成为一种必不可少的测量仪器。数字电压表简称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 上传

    点击文件名下载附件

    展开全文
  • 单片机数字电压表设计

    万次阅读 多人点赞 2018-07-11 17:22:56
    摘要:本设计中利用STC89C52单片机制作了一个简单的数字电压表,主要通过A/D转换器XPT2046把输入的模拟信号即电位器的电压值转换成数字信号,送到1602液晶进行数据显示,并预设了一个警报值,当超过警报值时,报警...

    摘要:

    本设计中利用STC89C52单片机制作了一个简单的数字电压表,主要通过A/D转换器XPT2046把输入的模拟信号即电位器的电压值转换成数字信号,送到1602液晶进行数据显示,并预设了一个警报值,当超过警报值时,报警电路发出警报。

    硬件电路主要包括单片机最小系统、显示模块、按键模块、报警模块和AD转换模块、数据存储模块六部分。软件采用了模块化的设计方法,主要分为主程序A/D转换子程序、按键检测子程序、液晶显示子程序E2PROM存储程序和中断程序

     

     

    关键字:单片机、A/D、1602液晶、E2PROM


    目录:

    1. 概述.............................................................1

    1.1课题研究背景与意义...........................................1

    1.2课题设计内容.................................................1

    2. 设计方案........................................................1

    3. 硬件电路设计....................................................2

    3.1 器件选择....................................................2

    A. STC89C52..................................................2

    B. XPT2046...................................................3

    C. AT24C02...................................................4

    D. LCD1602...................................................5

    3.2 单片机最小系统..............................................6

    3.3 A/D转换模块.................................................7

    3.4 数据显示模块................................................7

    3.5 数据存储....................................................8

    3.6 按键模块....................................................8

    3.7 报警模块....................................................9

    3.8 电路原理图..................................................9

    4.软件设计.........................................................10

    4.1 主程序.....................................................10

    4.2 AD转换程序.................................................11

    4.3 数据存储程序...............................................11

    4.4 1602液晶显示程序...........................................12

    4.5 按键驱动程序...............................................12

    4.6 中断程序...................................................13

    4.7 部分程序代码...............................................13

    5.仿真与调试.......................................................14

    5.1软件仿真....................................................14

    5.2硬件调试....................................................16

    结束语.............................................................17

    附录1.............................................................18

    附录2.............................................................19

     

     

     

     

    1. 概述

    1.1课题研究的背景与意义

    随着电子技术的发展,老式通过人眼估读的电压值不能满足工业甚至是科技的要求,那这就需要我们去追求准确度高,分辨率高,测量速度快的数字电压表,然后通过LED或者是LCD显示出来。

    在电量的测量中,电压、电流和频率是最基本的3个被测量,其中电压量的测量最为常见,经常需要测量出精度高的多点电压值,因此多点数字电压表变得越来越重要。数字电压表(Digital Voltmeter)简称DVM,是采用数字化测量技术,把连续的模拟量(直流或交流输入电压)转换成不连续、离散的数字形式并加以显示的仪表。由于数字仪器具有读数准确、精度高、误差小、灵敏度高、分辨率高、测量速度快等特点而备受青睐。

     

    1.2课题设计的内容

    以单片机为控制器,对05V的模拟电压进行循环采集,采集的数据送LEDLCD显示,并存入内存24WC04。超过界限时指示灯闪烁并报警。

    编写下列控制程序

    1.05V模拟信号输入实行循环采集,连续采集16次,取平均值并显示。

    2.设定采集的上限值,若采集的平均值超过该界限值,则对应的指示灯闪烁10次后一直亮,指示灯闪烁时喇叭发声,以示警告。

    3可按键查看以往的电压采集值并显示。

     

    2. 设计方案

    本设计选用A/D芯片XPT2046接收电位器上的电压信号,转换后的数字信号输送到单片机STC89C52,数据经过单片机处理之后通过LCD1602进行数据显示,同时,将数据写入AT24C02进行数据存储,通过按键控制可进行数据回显。按键还可以设置报警值,当测得数据大于报警值时,蜂鸣器会发出警报。总体框图如图2.1所示。

     2.1. 总体框图

     

    3. 硬件电路设计

    3.1 器件选择

    A.STC89C52

    本设计选用单片机STC89C52,是宏晶科技推出的新一代超强抗干扰、高速、低功耗的单片机,基于Intel 标准的8052,指令代码完全兼容传统的8051 系列单片机,12 时钟/机器周期和6 时钟/机器周期可任意选择,最新的D 版本内集成MAX810 专用复位电路。

    主要特性:

    1). 增强型8051单片机,6 时钟/机器周期和12 时钟/机器周期可以任意 选择,指令代码完全兼容传统8051.[1]

    2). 工作电压:5.5V~3.3V(5V单片机)/3.8V~2.0V(3V 单片机)

    3).工作频率范围:0~40MHz,相当于普通8051 的0~80MHz,实际工作 频率可达48MHz

    4). 用户应用程序空间为8K字节

    5). 片上集成512 字节RAM

    6). 通用I/O 口(32 个),复位后为:P1/P2/P3 是准双向口/弱上拉, P0 口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为 I/O 口用时,需加上拉电阻。

    7). ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无 需专用仿真器,可通过串口直接下载用户程 序,数秒即可完成一片

    8). 具有EEPROM 功能

    9). 共3 个16 位定时器/计数器。即定时器T0、T1、T2

    10).外部中断4 路,下降沿中断或低电平触发电路,Power Down 模式可 由外部中断低电平触发中断方式唤醒

    11). 通用异步串行口(UART),还可用定时器软件实现多个UART

    12). 工作温度范围:-40~+85℃(工业级)/0~75℃(商业级)

    B. XPT2046

    XPT2046是一种典型的逐次逼近型模数转换器(SARADC),包含了采样/保持、模数转换、串口数据输出等功能。同时芯片集成有一个2.5V的内部参考电压源、温度检测电路,工作时使用外部时钟。XPT2046可以单电源供电,电源电压范围为2.7V~5.5V。参考电压值直接决定ADC的输入范围,参考电压可以使用内部参考电压,也可以从外部直接输入1V~VCC范围内的参考电压(要求外部参考电压源输出阻抗低)。X、Y、Z、VBAT、Temp和AUX模拟信号经过片内的控制寄存器选择后进入ADC,ADC可以配置为单端或差分模式。引脚分布如图3.1所示。


     3.1. XPT2046引脚分布

    XPT2046通过SPI接口与主控制器进行通信,其与主控制器的接口包括以下信号:PENIRQ_N:笔触中断信号,当设置了笔触中断信号有效时,每当触摸屏被按下,该引脚被拉为低电平。当主控检测到该信号后,可以通过发控制信号来禁止笔触中断,从而避免在转换过程中误触发控制器中断。该引脚内部连接了一个50K的上拉电阻。

    CS_N:芯片选中信号,当CS_N被拉低时,用来控制转换时序并使能串行输入/输出寄存器以移出或移入数据。当该引脚为高电平时,芯片(ADC)进入掉电模式。

    DCLK:外部时钟输入,该时钟用来驱动SARADC的转换进程并驱动数字IO上的串行数据传输。

    DIN:芯片的数据串行输入脚,当CS为低电平时,数据在串行时钟DCLK的上升沿被锁存到片上的寄存器。

    DOUT:串行数据输出,在串行时钟DCLK的下降沿数据从此引脚上移出,当CS_N引脚为高电平时,该引脚为高阻态。

    BUSY:忙输出信号,当芯片接收完命令并开始转换时,该引脚产生一个DCLK周期的高电平。当该引脚由高点平变为低电平的时刻,转换结果的最高位数据呈现在DOUT引脚上,主控可以读取DOUT的值。当CS_N引脚为高电平时,BUSY引脚为高阻态。

     

    C. AT24C02

    AT24C02支持I2C,总线数据传送协议I2C,总线协议规定任何将数据传送到总线的器件作为发送器。任何从总线接收数据的器件为接收器。数据传送是由产生串行时钟和所有起始停止信号的主器件控制的。主器件和从器件都可以作为发送器或接收器,但由主器件控制传送数据(发送或接收)的模式,由于A0、A1和A2可以组成000~111八种情况,即通过器件地址输入端A0、A1和A2可以实现将最多8个AT24C02器件连接到总线上,通过进行不同的配置进行选择器件。引脚分布如图3.2所示。

     

    3.2. AT24C02引脚分布

    器件操作:

    时钟及数据传输:SDA 引脚通常被外围器件拉高。SDA 引脚的数据应在 SCL 为低时变化;当数据在 SCL 为高时变化,将视为下文所述一个起始或停止命令。

    起始命令:当 SCL 为高,SDA 由高到低的变化被视为起始命令,必须以起始命令作为任何一次读/写操作命令的开始

    停止命令:当 SCL 为高,SDA 由低到高的变化被视为停止命令,在一个读操作后,停止命令会使 EEPROM 进入等待态低功耗模式。

    应答:所有的地址和数据字节都是以 8 位为一组串行输入和输出的。每收到一组 8 位的数据后,EEPROM 都会在第 9 个时钟周期时返回应答信号。每当主控器件接收到一组 8 位的数据后,应当在第 9 个时钟周期向EEPROM 返回一个应答信号。收到该应答信号后,EEPROM 会继续输出下一组 8 位的数据。若此时没有得到主控器件的应答信号,EEPROM 会停止读出数据,直到主控器件返回一个停止命令来结束读周期。

    等待模式:24C01/02/04/08/16 特有一个低功耗的等待模式。可以通过以下方法进入该模式:(a)上电 (2)收到停止位并且结束所有的内部操作后。

    器件复位:在协议中断、下电或系统复位后,器件可通过以下步骤复位:(1)连续输入 9 个时钟;(2)在每个时钟周期中确保当 SCL 为高时 SDA 也为高3)建立一个起始条件。

     

    D. LCD1602

    1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用

     

    1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表3.1所示:

     

    编号

    符号

    引脚说明

    编号

    符号

    引脚说明

    1

    VSS

    电源地

    9

    D2

    数据

    2

    VDD

    电源正极

    10

    D3

    数据

    3

    VL

    液晶显示偏压

    11

    D4

    数据

    4

    RS

    数据/命令选择

    12

    D5

    数据

    5

    R/W

    读/写选择

    13

    D6

    数据

    6

    E

    使能信号

    14

    D7

    数据

    7

    D0

    数据

    15

    BLA

    背光源正极

    8

    D1

    数据

    16

    BLK

    背光源负极

    3.1. 1602引脚说明

     

    3.2 单片机最小系统

    单片机最小系统,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统.对51系列单片机来说,最小系统一般应该包括:单片机、晶振电路、复位电路.电路图如图3.3所示。

     

    图3.3. 单片机最小系统

     

    复位电路:由电容串联电阻构成,由图并结合"电容电压不能突变"的性质,可以知道,当系统一上电,RST脚将会出现高电平,并且,这个高电平持续的时间由电路的RC值来决定.典型的51单片机当RST脚的高电平持续两个机器周期以上就将复位,所以,适当组合RC的取值就可以保证可靠的复位.

    晶振电路:典型的晶振取11.0592MHz(因为可以准确地得到9600波特率和19200波特率,用于有串口通讯的场合)/12MHz(产生精确的uS级时歇,方便定时操作)

     

    3.3 A/D转换模块

    利用XPT2046来采集电位器的得电压信号,经转换之后输送给单片机。电路图如图3.4所示。

     

    图3.4. A/D转换电路

     

    3.4 数据显示模块

    1602液晶接收单片机P0口输出的数据直接进行显示,在1602的V0引脚接上一个电位器来调整液晶显示的对比度。由于单片机的P0口进行数据传输需接上拉电阻。电路图如图3.5所示。

     

    图3.5. 数据显示模块

     

    3.5 数据存储

    将芯片 A2、A1、A0 都是接的 GND,也就是说都是 0,因此 24C02的 7 位地址实际上是二进制的 0b1010000,也就是 0x50。我们用 I 2 C 的协议来寻址 0x50,利用IIC通信来读写数据。电路图如图3.6所示。

     

    图3.6. 数据存储电路

    3.6 按键模块

    利用独立按键来进行控制,S0进行数据回显,S1、S2是对警告值进行加

    减,每次加减0.5V。电路图如图3.7所示。

     

    图3.7. 独立按键

     

    3.7 报警模块

    当测得的电压值大于设定的报警值时,会从P2^3引脚输出一个1HZ脉冲是小灯闪烁10次,然后输出一个低电平,小灯常亮。蜂鸣器采用了有源蜂鸣器,需给端口一定频率的脉冲,蜂鸣器才会发出声音。电路图如图3.8所示。

     

    图3.8. 报警电路

     

    3.8 电路原理图

    见附录1。

    4. 软件设计

    4.1 主程序

    主程序主要调用A/D转换程序、按键驱动程序、1602液晶显示程序、数据存储程序和警报程序。首先对系统进行初始化,当被测电压输入后,调用A/D转换子程序,转换出来的数值经数据存储程序写入AT24C02,并通过1602液晶显示程序进行数据显示,同时,与报警值进行比较,当大于报警值时,启用报警程序。主程序流程图如图4.1所示。

      

    图4.1. 主程序流程图

     

    4.2 A/D转换程序

    A/D转换程序主要是对电位器产生的模拟信号进行数据转换,首先启动AD芯片,输入指令后,等待数据处理完后,输出结果,本次转换完成。子程序流程图如图4.2所示。

                                                                

    图4.2. A/D转换程序流程图

     

    4.3数据存储程序

     数据存储程序主要是对A/D转换后的数值进行数据存储,当按键控制的时候可以数据回显。AT24C02用IIC进行数据通信,首先选择芯片地址,然后进行数据读取,待完成后输出结果。程序流程图如图11所示。

                                                                          

    图4.3. 数据存储程序流程图

     

    4.4 1602液晶显示程序

    本设计使用1602液晶进行数据显示,接收从单片机传输的字符型数据直接进行显示。首先初始化液晶,输入数据显示的地址,即在液晶屏上显示的行与列。再输入字符型的数据,液晶即可进行数据显示。程序流程图如图4.4所示。

    4.4.1602液晶显示流程图

    4.5按键驱动程序

    本设计使用3个独立按键,一个按键用来控制读取E2PROM中存储的数据,然后通过液晶1602进行数据显示。另外两个按键来进行报警值的调整S1对报警值加5,S2对数据减5,报警值在1602上立即刷新。按键每次按下会有抖动,所以进行按键消抖,这样按键使用更加精准。程序流程图如图4.5所示。

                                                        

    4.5.按键驱动程序流程图

    4.6中断程序

    本程序使用定时器中断0,中断优先级为1,定时2ms,中断中主要产生一个1s和200ms的时间标志位、进行按键的扫描和产生蜂鸣器需要的脉冲。

     

    4.7 部分程序代码

    见附录2.

     

    5.仿真与调试

    1).软件仿真

    仿真运行的时候,液晶显示如图5.1所示。

                                     

    5.1

    S0按下并调整电位器的值得时候,液晶显示如图5.2所示。

                                     

    5.2 

    2).硬件调试

    当接通电源的时候,液晶显示如图5.3所示。

                                     

    5.3 

    S0按下,并调整电位器,液晶如图5.4所示。

                                     

    5.4 

    当按下S2的时候,报警值减掉0.5V,并调整电位器,使其电压大于报警值,电路发出警报,蜂鸣器器报警,小灯闪烁。如图5.5所示。

                                     

    5.5

    6.结束语

    通过这次课程设计有很多收获,把所学到的知识得到了应用,对所学的知识有了更深的了解,有了新的体会。对于制图软件AltiumDesigner、编程软件keil5掌握的更加熟悉,也发现了不少的问题,经过一系列的努力得以解决,充实了自己。


    附录1:


    附录2:

    主程序:

    void main()

    {

    EA = 1;

    AUXR &= 0x7F;

    TMOD &= 0xF0;

    TL0 = 0xCD;

    TH0 = 0xF8;

    TF0 = 0;

    TR0 = 1;

    ET0 = 1;

    LcdInit();

    while(1)

    {

    KeyDriver();

    if (flag_200ms)

    {

    flag_200ms = 1;

    if (flag_s1)

    {

    Get_AD_buf();

    AD_Display();

    }

    if (flag_s1 == 0)

    {

    sdat = E2Read(0x00);

    buf[0] = sdat/10+'0';

    buf[1] = '.';

    buf[2] = sdat%10+'0';

    buf[3] = '\0';

    LcdWriteCom(0x80+0x40);

    LcdWriteData(buf[0]);

    LcdWriteData(buf[1]);  

    LcdWriteData(buf[2]);

    }

    }

    if (pdat > warn)

    {

    BUZZ = buz;

    if (n<10)

     

    Led_1s();

    else

    LED = 0;

    }else

    {

    n = 0;

    LED = 1;

    BUZZ = 0;

    }

    }

    }

     

    A/D转换程序:

    void SPI_Write(uchar dat)

    {

    uchar i;

    CLK = 0;

    for(i=0; i<8; i++)

    {

    DIN = dat >> 7;  

    dat <<= 1;

    CLK = 0;

    CLK = 1;

    }

    }

    uint SPI_Read(void)

    {

    uint i, dat=0;

    CLK = 0;

    for(i=0; i<12; i++)

    {

    dat <<= 1;

    CLK = 1;

    CLK = 0;

    dat |= DOUT;

    }

    return dat;

    }

    uint Read_AD_Data(uchar cmd)

    {

    uchar i;

    uint AD_Value;

    CLK = 0;

    CS  = 0;

    SPI_Write(cmd);

    for(i=6; i>0; i--);

    CLK = 1;

    _nop_();_nop_();

    CLK = 0;

    _nop_();_nop_();

    AD_Value=SPI_Read();

    CS = 1;

    return AD_Value;

    }

     

    1602液晶显示程序:

    void LcdWriteCom(uchar com)  

    {

    LCD1602_E = 0;     

    LCD1602_RS = 0;    

    LCD1602_RW = 0;   

    LCD1602_DATAPINS = com;     

    Lcd1602_Delay1ms(1);

    LCD1602_E = 1;          

    Lcd1602_Delay1ms(5);   

    LCD1602_E = 0;

    }

      

    void LcdWriteData(uchar dat)

    {

    LCD1602_E = 0;

    LCD1602_RS = 1;

    LCD1602_RW = 0;

    LCD1602_DATAPINS = dat;

    Lcd1602_Delay1ms(1);

    LCD1602_E = 1;   

    Lcd1602_Delay1ms(5);   

    LCD1602_E = 0;

    }

    void LcdInit()   

    {

      LcdWriteCom(0x38);

    LcdWriteCom(0x0c);  

    LcdWriteCom(0x06);  

    LcdWriteCom(0x01);  

    LcdWriteCom(0x80);  

    }

     

    E2PROM存储程序:

    void IIC_Start(void)

    {

    SDA = 1;

    SCL = 1;

    somenop;

    SDA = 0;

    somenop;

    SCL = 0;

    }

    void IIC_Stop(void)

    {

    SDA = 0;

    SCL = 1;

    somenop;

    SDA = 1;

    }

    void IIC_Ack(unsigned char ackbit)

    {

    if(ackbit)

    SDA = 0;

    else

    SDA = 1;

    somenop;

    SCL = 1;

    somenop;

    SCL = 0;

    SDA = 1;

    somenop;

    }

    bit IIC_WaitAck(void)

    {

    SDA = 1;

    somenop;

    SCL = 1;

    somenop;

    if(SDA)    

    {   

    SCL = 0;

    IIC_Stop();

    return 0;

    }

    else  

    {

    SCL = 0;

    return 1;

    }

    }

    void IIC_SendByte(unsigned char byt)

    {

    unsigned char i;

    for(i=0;i<8;i++)

    {   

    if(byt&0x80)

    {

    SDA = 1;

    }

    else

    {

    SDA = 0;

    }

    somenop;

    SCL = 1;

    byt <<= 1;

    somenop;

    SCL = 0;

    }

    }

    unsigned char IIC_RecByte(void)

    {

    unsigned char da;

    unsigned char i;

    for(i=0;i<8;i++)

    {   

    SCL = 1;

    somenop;

    da <<= 1;

    if(SDA)

    da |= 0x01;

    SCL = 0;

    somenop;

    }

    return da;

    }

    unsigned char E2Read(unsigned char addr)

    {

    unsigned char str;

    IIC_Start();

    IIC_SendByte(0xa0);

    IIC_WaitAck();

    IIC_SendByte(addr);

    IIC_WaitAck();

    IIC_Start();

    IIC_SendByte(0xa1);

    IIC_WaitAck();

    str = IIC_RecByte();

    IIC_WaitAck();

    IIC_Stop();

    return str;

    }

    void E2Write(unsigned char str,unsigned char addr)

    {

    IIC_Start();

    IIC_SendByte(0xa0);

    IIC_WaitAck();

    IIC_SendByte(addr);

    IIC_WaitAck();

    IIC_SendByte(str);

    IIC_WaitAck();

    IIC_Stop();

    展开全文
  • 8051单片机数字电压表设计,模块完整,程序详细。
  • 基于51单片机数字电流电压表

    万次阅读 多人点赞 2019-05-11 00:09:46
    1.简述 本文介绍了基于STC89C52单片机为核心,分别以ACS712-05芯片和串联分压电路为为电流检测...本设计的硬件主要分为5部分,分别为:单片机最小系统、电流信号采样电路、电压信号采集电路、ADC转换电路、LCD1602显...

    1.简述
    本文介绍了基于STC89C52单片机为核心,分别以ACS712-05芯片和串联分压电路为为电流检测和电压检测电路,并通过AD0809数模转换芯片对电压信号进行采集和转换,传输给单片机进行处理,最后将处理后的电压值和电流值通过LCD1602显示屏显示出来。

    2.硬件设计
    本设计的硬件主要分为5部分,分别为:单片机最小系统、电流信号采样电路、电压信号采集电路、ADC转换电路、LCD1602显示屏电路。硬件框图如图:
    在这里插入图片描述
    (1)电流信号采集电路
    电流信号采集电路采用了ACS712-05芯片,该芯完全基于霍尔感应的原理设计,由一个精确的低偏移线性霍尔传感器电路与位于接近IC表面的铜箔组成、,电流流过铜箔时,产生一个磁场, 霍尔元件根据磁场感应出一个线性的电压信号,经过内部的放大、滤波、斩波与修正电路,输出一个电压信号,该信号从芯片的第七脚输出,直接反应出流经铜箔电流的大小。具体电路如图:
    在这里插入图片描述
    ACS712根据尾缀的不一样,量程分为三个规格:±5A、±20A、±30A,此次使用的量程为 ±5A,由于ADC转换芯片只能识别正压信号,所以电流的量程为0~5A。ACS712-05电流电压对应关系如下图,Ip=0A即没有输入电流的时候,对应输出电压为2.5V.精确度为185mV/A即为图中斜线的斜率。取VCC=5V,计算公式为:
    Vout = 2.5 + 0.185*Ip
    在这里插入图片描述
    (2)电压信号采集电路
    电压信号采集电路相对简单,主要使用了两个电阻作为串联分压电路,分压比为3。比如当检测表笔检测15V的电压时,由于分压比为3,R3端的电压为5V。如果需要提高测试电压的量测,可以更改分压比。(注意:在选用分压电阻时,尽量选择阻值大一点的电阻,不然电阻过小会导致输入电流过大;此电路也只适用于测试输入阻抗较大的电路上的电压,不然测试出来的误差较大);电路如图:
    在这里插入图片描述
    (3)ADC转换电路
    本次ADC转换电路采用了PCF8591芯片,该芯片是一个单电源低功耗的8位CMOS数据采集器件,即分辨率为256,具有4路模拟输入,1路模拟输出和一个串行I2C总线接口用来与单片机通信。此电路将电流信号和电压信号进行转换后传送给单片机。电路如图:
    在这里插入图片描述
    (4)总体电路
    在这里插入图片描述
    3.软件设计
    软件流程相对简单,当单片机上电后,程序对各个模块进行初始化后,进入循环,定时检测电流及电压值,并将最新的数据显示在显示屏上。程序流程如图:
    (1)主函数

    void main (void)
    {     
    	unsigned char midvolt,midcur;  //电压电流中间变量值
    
    	Init_Timer0();        //定时器0初始化
    	UART_Init();		  //串口初始化
    	             
    	LCD_Init();           //初始化液晶
    	DelayMs(20);          //延时有助于稳定
    	LCD_Clear(); 
    	sprintf(dis0,"My Designer!!  ");//打印
    	LCD_Write_String(0,0,dis0);//显示第一行
    	sprintf(dis0,"V:%3.2fv A:%3.2fA",Volt,Acurrent);//打印电压电流值
    	LCD_Write_String(0,1,dis0);//显示第二行
    	uartSendStr("reday ok!!",10);
    	while (1)         //主循环
    	{
    		midvolt=ReadADC(1);				//读取AD检测到的 电压值
    		DelayMs(50);          //延时有助于稳定
    		midcur=ReadADC(0);		//读取电流转化后的电压值
    
    		Volt=(float)midvolt*5.13/255*3;		//计算出电压 *3表示分压值
    		Acurrent=(float)midcur*5.13/255;		//计算出电流
    												
    		if(Acurrent>2.62)			 //如果电流转换后的电压值超过2.62
    		{
    			Acurrent=(Acurrent-2.62)/0.185;	 //电流模块 电压转换计算
    		}
    		else
    		{
    			Acurrent=0;
    		}	
    
    		sprintf(dis0,"V:%3.2fv A:%3.2fA",Volt,Acurrent);//打印电压电流值
    		LCD_Write_String(0,1,dis0);//显示第二行
    //		uartSendStr(dis0,16);	  //串口上报
    //		uartSendStr("\n",1);			   //换行
    		DelayMs(500);          //延时有助于稳定
    	}
    }
    

    详细完整的程序,可下载源码。

    源码+AD原理图 下载:关注公众号,首页回复“电压电流表”获取资料
    在这里插入图片描述

    展开全文
  • 传统的指针式电压功能单一、精度低,不能满足数字化时代的需求,采用单片机数字电压表,由精度高、抗干扰能力强,可扩展性强、集成方便。目前,由各种单片A/D 转换器构成的数字电压表,已被广泛用于电子及电工...
  • 51单片机数字电压表

    2018-05-19 13:33:04
    通过单片机技术,设计出来的数字电压表具有精度 高, 抗干扰能力强的特点。 通过网上资料显示, 目前由各种 A/D 转换器构成的数 字电压已经广泛的应用于电工测量,工业自动化仪表等各个领域。 在电量的测量中, ...
  • 基于51单片机+ACS712电流检测模块+AD采集芯片实现数字电流表电压表设计(包含源程序原理图等)
  • 单片机 数字电压表(TLC2543)

    万次阅读 多人点赞 2018-06-04 16:33:35
    单片机 数字电压表(TLC2543) 一、简述 使用并行ADC会限制系统I/O口的功能扩展,采用串行ADC比较适合那些低速采样而控制管脚又比较多的系统。 TLC2543是TI公司的12位串行模数转换器,由于是串行输入结构,能够节省...

    单片机 数字电压表(TLC2543)

    一、简述

            使用并行ADC会限制系统I/O口的功能扩展,采用串行ADC比较适合那些低速采样而控制管脚又比较多的系统。

            TLC2543是TI公司的12位串行模数转换器,由于是串行输入结构,能够节省51系列单片机I/O资源;

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

        文件打包:链接: https://pan.baidu.com/s/1aSJJhWNiqYUJCk9VmpHd5A 提取码: epg6

        蓝奏云:https://www.lanzous.com/i41fhtg         (不用注册,不用登录,可以直接下载)

    二、效果

    三、工程结构

    1、Keil工程

    2、仿真电路图

    四、源文件

    TLC2453.c文件

    #include<reg51.h>
    #define uint unsigned int
    #define uchar unsigned char
    #define ulong unsigned long
    ulong volt;//测量的电压值 
    uchar code led[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//7段数码管显示0-9的对应电平码
    uint vtime;	// 用来控制测量地址位的改变
    uchar addr;//测量地址位,指示测量的是哪一个模拟值 (其实就是TLC2543的控制字)
    sbit LW1=P2^3;//数码管电压显示值的第1个		比如四个数码管显示4.885值中,对应显示4这个数码管
    sbit LW2=P2^2;//数码管电压显示值的第2个
    sbit LW3=P2^1;//数码管电压显示值的第3个
    sbit LW4=P2^0;//数码管电压显示值的第4个
    sbit LW5=P2^4;//定义数码管位选脚
    sbit CLK=P1^7;//定义时钟信号口
    sbit DIN=P1^6;//定义2543数据写入口
    sbit DOUT=P1^5;//定义2543数据读取口
    sbit CS=P1^4;//定义2543片选信号口
    /**********************************************************/
    //函数名:delay(uint x)
    //功能:延时程序 改变测量地址 	
    //调用函数:
    //输入参数:x
    //输出参数:
    //说明:
    /**********************************************************/
    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)
    				addr=0;//以上语句实现测量地址位的改变		
    		}	
    }
    /**********************************************************/
    //函数名:read2543(uchar addr)
    //功能:2543驱动程序
    //调用函数:
    //输入参数:addr
    //输出参数:
    //说明:进行ad转换将结果存于volt变量中 addr为测量位地址
    /**********************************************************/
    void read2543(uchar addr)
    {
    	uint ad=0;
    	uchar i;
    	CLK=0;
    	CS=0;//片选段,启动2543
    	addr<<=4;//对地址位预处理
    	for(i=0;i<12;i++) //12个时钟走完,完成一次读取测量
    	{
    		if(DOUT==1)
    			ad=ad|0x01;//单片机读取ad数据
    		DIN=addr&0x80;//2543读取测量地址位
    		CLK=1;
    		;;;//很短的延时
    		CLK=0;//产生下降沿,产生时钟信号
    		;;;
    		addr<<=1;
    		ad<<=1;//将数据移位准备下一位的读写
    	}
    	CS=1;//关2543
    	ad>>=1;
    	volt=ad;//取走转换结果
    	volt=volt*1221;//例子的满量程为5V,转换分辩率为12位(2的12次方=4096) 。即最大值是255,5/4096=1221mV,即例子中的1V代表实际1221mV        
    }
    /**********************************************************/
    //函数名:display()
    //功能:5位数码管显示
    //调用函数:delay(uint x)
    //输入参数:
    //输出参数:
    //说明:将处理后的电压值与测量位值显示在5位数码管上 
    /**********************************************************/
    void display()
    {
    	P0=0xff;//消隐,因为不断进行循环显示,以防上次显示有残留电平的影响
    	LW1=0;	//选中第1个数码管进行显示
    	P0=~led[volt/1000000]&0x7f;//带小数点1伏显示位
    	delay(2);  //延时
    	P0=0xff;  //消隐
    	LW1=1;	//取消选中第1个数码管进行显示
    	LW2=0;	//选中第2个数码管进行显示
    	P0=~led[(volt/100000)%10];//100毫伏显示位
    	delay(2);
    	P0=0xff;
    	LW2=1; 
    	LW3=0;
    	P0=~led[(volt/10000)%10];//10毫伏显示位
    	delay(2);
    	P0=0xff;
    	LW3=1;
    	LW4=0;
    	P0=~led[(volt/1000)%10];//1毫伏显示位
    	delay(2);
    	P0=0xff;
    	LW4=1;
    	LW5=0;
    	P0=~led[addr+1];//显示电压测量位
    	delay(2);
    	LW5=1;				
    }
    /**********************************************************/
    //主程序
    /**********************************************************/
    void main()
    {
    	while(1)
    	{
    		read2543(addr);//调用2543驱动程序测量地址为0
    		display();//调用显示程序	
    	}
    }
    

     

    五、总结

     

     

        1、TLC2543芯片介绍

               TLC2543是12位串行A/D转换器,使用开关电容逐次逼近技术完成A/D转换过程。

        2、引脚

              

    AIN0~AIN10为模拟输入通道。

    为片选端,低电平有效。

    DATA INPUT为串行数据输入端,
    DATA OUT为A/D转换结果的三态串行输出端
    EOC为转换结束端,
    I/O CLK为I/O时钟端,
    REF+为正基准电压端,
    REF-为负基准电压端,
    VCC为电源端,
    GND为地。

    3、TLC2543控制字

            控制字为从DATA INPUT端串行输入端8位数据,规定了TLC2543要转换的模拟量通道、转换后的输出数据长度以及输出数据端格式。

          高4位(D7~D4)决定通道号,对于模拟输入通道0至模拟输入通道10。其值为0000~1010,对应通道为通道0~通道10。

          低4位(D3~D0)决定输出数据长度及格式。

          其中D3、D2决定输出数据长度,01表示输出数据长度为8位,11表示输出数据长度为16位,其他为12位。

          D1决定输出数据是高位先送出,还是低位先送出,为0表示高位先送出。

          D0决定输出数据是纯正数还是有负数,若为纯正数,该位为0,否则为1。

    4、工作过程

     

    ==================以下回复 qq_42216469 这位兄弟=============

    通过简单修改代码,只显示一个电压值。

    展开全文
  • 在电量的测量中,电压、电流和频率是最基本的三个被测量,...本设计从各个角度分析了由单片机组成的数字电压表设计过程及各部分电路的组成及其原理,并且分析了程序如何驱动单片机进而使系统运行起来的原理及方法。
  • 数字电流表是建立在数字电压表的基础上,让电压表与电阻串联,其显示的是电流,数字电压表是把连续的模拟量(直流输入电压)转换成不连续、离散的数字形式,并加以显示的仪表。数字电流表把电子技术、计算技术、自动...
  • 《基于单片机数字电压表.doc》由会员分享,可免费在线阅读全文,更多与《基于单片机数字电压表》相关文档资源请在帮帮文库(www.woc88.com)数亿文档库存里搜索。1、。图键盘接口电路仿真图第章系统软件设计多路...
  • 请点上面蓝色字 即可免费订阅!1.简述本文介绍了基于STC89C52单片机为核心,分别以ACS712-05芯片和串联分压电路为为...2.硬件设计设计的硬件主要分为5部分,分别为:单片机最小系统、电流信号采样电路、电压信号...
  • 万用表,可测电压电流电阻,实时的显示在液晶显示屏上。 #include<reg51.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int /***************引脚声明**************...
  • 51单片机电压表设计

    2014-05-04 08:52:17
    51单片机为核心控制芯片,AD7705的AD转换模块。 功能:数字万用表 说明:电压五档、电流五档、电阻七档
  • 大家好,之前讲过几篇数字表都是电压表,而且都是直流电压,今天讲一下交流的电压电流表。本次设计的主要难度在于硬件电路设计,需要实现交流转直流,然后用ADC采集回去之后再换算。本次采用的核心处理芯片仍然是51...
  • 这块简单易制作的0-30VSTC单片机数字电压表,被测电压经限流电阻接到AD检测端并由分流电阻分流,读出8位(256)的AD数据,由AD值计算出AD端电压,即分流点电压,由此电压计算出分流电流,再由此电流计算出输入电压。...
  • 直流数字电压表设计

    千次阅读 2018-12-18 23:52:44
    摘 要 本设计利用STC15F2K60S2单片机的A/D转换功能设计一个直流数字电压表,由A/D转换、数据处理及显示控制等组成,测量0-5V范围内的输入电压值,并...二、数字电压表设计方案论证及选择 5 1.主控芯片 5 2.显示部...
  •  本文中采用运算放大器和集成多路模拟开关电路设计电压表量程自动切换技术,通过单片机检测可实现电压表量程的自动转换。它具有体积小,驱动电流小,动作快,结构简单,操作方便的优点,可用于实验教学中。  1 ...
  • 摘要:本文介绍一种基于51单片机的简易数字电压表设计制作,该设计主要由三个模块组成:a/d转换模块,数据处理模块及显示模块。a/d转换主要由芯片adc0808来完成,它负责把采集到的模拟量转换为相应的数字量在传送...
  • 单片计算机即单片微型计算机。(Single-Chip ...在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构,以及针对具体应用对象.
  • ICL7135是采用CMOS工艺制作的单片4位半A/D转换器,其所转换的数字值以多工扫描的方式输出,只要附加译码器,数码显示器,驱动器及电阻电容等元件,就可组成一个满量程为2V的数字电压表。 7135主要特点如下: ①双积型...
  • 电压电流表资料.zip

    2019-05-11 00:11:35
    本文介绍了基于STC89C52单片机为核心,分别以ACS712-05芯片和串联分压电路为为电流检测和电压检测电路,并通过AD0809数模转换芯片对电压信号进行采集和转换,传输给单片机进行处理,最后将处理后的电压值和电流值...
  • 摘要:本文介绍一种基于51单片机的简易数字电压表设计制作,该设计主要由三个模块组成:a/d转换模块,数据处理模块及显示模块。a/d转换主要由芯片adc0808来完成,它负责把采集到的模拟量转换为相应的数字量在传送...
  •  本文中采用运算放大器和集成多路模拟开关电路设计电压表量程自动切换技术,通过单片机检测可实现电压表量程的自动转换。它具有体积小,驱动电流小,动作快,结构简单,操作方便的优点,可用于实验教学中。  1 ...
  • 单片机应用于数字万用表,实现电压测量、电流测量、及电阻的测量,给出了软件及硬件设计
  • 单片机芯片AT89s52设计一个数字万用表,能够测量交、直流电压值、直流电流、直流电阻以及电容,四位数码显示。
  • 基于51单片机的直流数字电压表(0-5V)

    千次阅读 多人点赞 2016-06-22 17:21:55
    基于51单片机的直流数字电压表(0-5V) 利用串行A/D转换器TLC549对输入信号电压源进行采集转换成数字信号给51单片机,经单片机进行数据处理后给1602液晶显示。 误差小于1%. #include #include #define uint ...
  • 使用STM8S003F3P6单片机设计电压电流表,带12864显示屏显示,具有校准功能,包含原理图,程序源码
  • 单片机的时钟电路与复位电路设计 本系统采用STC系统列单片机,相比其他系列单片机具有很多优点。一般STC单片机资源比其他单片机要多,而且执行速度快;STC系列单片机使用串口对单片机进行烧写,下载程序较为方便;...
  • 可以准确的测量出电压电流,电阻,非常好用。。。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,095
精华内容 1,238
关键字:

单片机数字电压电流表设计