精华内容
下载资源
问答
  • 单片机 数字 电压表

    2012-12-10 22:51:40
    单片机 数字 电压表
  • 单片机数字电压表

    2012-07-26 19:24:04
    单片机数字电压表,利用单片机实验小范围的电压测试,程序很简单,但是精确度不够
  • 51单片机数字电压表protues仿真 基于51数字电压表仿真设计 电压表程序设计
  • 单片机 数字电压表(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

    仿真截图:

     

    效果:

     

    展开全文
  • 单片机数字电压表设计.rar
  • 51单片机数字电压表设计程序
  • 项目17 单片机数字电压表的设计.zip。这是单片机数字电压表的设计,下载附件包含对应c语言代码及项目工程资料。
  • 51单片机数字电压表

    2013-11-11 17:27:35
    51单片机数字电压表,自己再稍微处理下可以扩展测量范围
  • 课程设计报告,基于51单片机数字电压表的课程设计
  • 单片机数字电压表说明书,简单的编程,说明书
  • 基于pic单片机数字电压表仿真设计
  • 单片机 数字电压表(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 这位兄弟=============

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

    展开全文
  • 51单片机数字电压表设计 汇编语言 8051实现数字带你哑巴基本功能
  • 利用单片机AT89S51与ADC0809设计一个数字电压表,能够测量0-5V之间的直流电压值,四位数码显示,但要求使用的元器件数目最少。
  • 单片机数字电压表ad转换器设计,用keil软件编写的c语言工程,有助于学习单片机!
  • 本设计要求用AT89C51(晶体采用12 MHz)和ADC 0808(A/D转换芯片)设计一只简单的数字电压表,可以测量0~+5V的电压,并将测得的电压数值显示在4位共阳极数码管上,要求测量精度为0.01V,即保留两位小数。
  • 基于51单片机数字电压表。电压表是测量电压的一种仪器。传统的指针式电压表和电流表都是根据一个原理就是电流的磁效应。电流越大,所产生的磁力越大,表现出的就是电压表上的指针的摆幅越大,电压表内有一个磁铁和...

    昨天查看公众号私信,发现有小伙伴想要数字电压表的仿真,今天就分享一个之前在网络上搜集到的仿真。基于51单片机的数字电压表。

    4547892b7dbc3544e90ba895a68d9f97.png

    电压表是测量电压的一种仪器。传统的指针式电压表和电流表都是根据一个原理就是电流的磁效应。电流越大,所产生的磁力越大,表现出的就是电压表上的指针的摆幅越大,电压表内有一个磁铁和一个导线线圈,通过电流后,会使线圈产生磁场,线圈通电后在磁铁的作用下会发生偏转,这就是电流表、电压表的表头部分;现在我们使用较多的是数字电压表,数字电压表的主要工作原理是利用模数转换器,将待测的模拟电压信号转换成为数字信号,然后对数字信号进行处理并通过数码管或LCD等显示装置显示出来。数字式电压表显示的测量结果更加直观。

    82e61df4d3ba4b8f6f71deebbb9082e1.png

    简单的介绍了一下电压表以后,接下来直接上仿真图。

    d49afe5181b26858a43c41950a6ebc3c.png

    单片机依旧是AT89C51。该仿真制作的数字电压表的量程为0到5v,由于用到的模数转换芯片是ADC0809,设计系统给的供电电压为+5v。同时设计的精度为小数点后两位,满足要求的两位小数的精度。显示部分使用的是LCD1602。

    ADC0809是8位逐次逼近型模数转换器。转换时间为100微秒。具有8个模拟量输入端口,可以通过数字控制引脚对8个输入端口进行选择。

    下面说明各引脚功能:

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

    2-1~2-8:8位数字量输出端。

    ADDA、ADDB、ADDC:3位地址输入线,用于选通8路模拟输入中的一路。

    ALE:地址锁存允许信号,输入端,产生一个正脉冲以锁存地址。

    START:A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。

    EOC:A/D转换结束信号,输出端,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。

    OE:数据输出允许信号,输入端,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。

    CLK:时钟脉冲输入端。要求时钟频率不高于640KHz。

    REF(+)、REF(-):基准电压。

    Vcc:电源,单一+5V。

    GND:地。

    下面运行仿真,看一下仿真的动态效果。

    21636a97589ced6064b625eb01436827.png

    运行仿真后,可以看到LCD上显示除了当前测量的电压值。第一行显示的是电压的英文单词,第二行显示的是测量的电压值。通过调节左侧的RP2电位器的参数就可以改变待测电压。

    b52e0ce648f34c7a184e92068f9135a0.png

    8f2af762c078ef7a761fef0df5a75479.png

    测量范围为0-5V,显示的测量结果还是比较准确的。

    这个仿真如果要进行实际制作需要对ADC0809的输入时钟进行修改,在仿真中采用的是仿真内部的时钟发生器,而在进行实物制作时,这个时钟可以使用单片机的IO产生或者是对单片机的ALE引脚输出的时钟信号进行分频得到。

    2d5ab017d9bb18a7c38affb15ea414a8.png

    惯例贴一张程序图。程序较为简单而且也有部分注释,这里就不作介绍了。

    b1fecb839c4cbeb2fa4f98af12899bf0.png

    今天的资源内容还是比较丰富的,源程序、仿真图、原理图及论文都有的。有需要的小伙伴,私信发送“51单片机数字电压表”就可以获取相应的下载链接。

    328891ae12d42e58d10853911a64b958.png

    展开全文
  • 单片机 数字电压表 源程序 论文 原理图,都是好东西
  • 单片机数字电压表设计

    万次阅读 多人点赞 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();

    展开全文
  • 单片机数字电压表 包含电路图 ,源程序,仿真DSN
  • 带有仿真和程序,用汇编语言编写的程序
  • 包含源程序和仿真文件
  • 单片机 89c51 数字电压表 课程实践 论文 程序

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 727
精华内容 290
关键字:

单片机数字电压表