精华内容
下载资源
问答
  • 单片机 ADC采集电压
    千次阅读
    2020-04-10 16:55:33

    单片机:N76E003

    /*********************************************
    函数名:Adc_Configuration
    功  能:ADC初始化配置
    形  参:
    返回值:
    备  注:
    作  者:薛建强
    时  间:2019/06/06
    **********************************************/
    void Adc_Configuration(void)
    {
    #if Config_ADC_Inti
    #if (Config_ADC_Inti_CH & 0x01) == 1
        Enable_ADC_AIN0;    // P1.7
    #endif
    #if ((Config_ADC_Inti_CH >> 1) & 0x01) == 1
        Enable_ADC_AIN1;    // P3.0
    #endif
    #if ((Config_ADC_Inti_CH >> 2) & 0x01) == 1
        Enable_ADC_AIN2;    // P0.7
    #endif
    #if ((Config_ADC_Inti_CH >> 3) & 0x01) == 1
        Enable_ADC_AIN3;    // P0.6
    #endif
    #if ((Config_ADC_Inti_CH >> 4) & 0x01) == 1
        Enable_ADC_AIN4;    // P0.5
    #endif
    #if ((Config_ADC_Inti_CH >> 5) & 0x01) == 1
        Enable_ADC_AIN5;    // P0.4
    #endif
    #if ((Config_ADC_Inti_CH >> 6) & 0x01) == 1
        Enable_ADC_AIN6;    // P0.3
    #endif
    #if ((Config_ADC_Inti_CH >> 7) & 0x01) == 1
        Enable_ADC_AIN7;    // P1.1
    #endif
    #if Config_ADC_Inti_CH != 0
        ADCCON1 |= 0x01;   //ADC 使能位  0 = ADC 转换电路关闭  1 = ADC 转换电路打开
        ADCF = 0;          //ADC标志位 1转换完毕 0空闲
    #endif
    #endif
    }
    /*********************************************
    函数名:AdValue
    功  能:选择指定ADC的通道,并采集10次,得出AD平均值
    形  参:ch--通道
    返回值:AD值
    备  注:
    作  者:薛建强
    时  间:2019/06/06
    **********************************************/
    uint16_t AdValue(const uint8_t ch)
    {
    #if Config_ADC_Inti
        xdata uint16_t AdTemp1 = 0; //   通道CH电压值 10次和
        uint8_t i = 0;
        /*选择通道*/
        ADCCON0 &= 0XF0;                //清除
        ADCCON0 |= ch;                  //选择通道
        ADCS = 1;                       //A/D 转换软件启动位   0 = 无动作.  1 = 开始AD转换
        while (ADCF == 0);              //等待转换完毕  ADC标志位 1转换完毕 0空闲
        ADCF = 0;                       //手动清零ADC标志位,否则下次无法采集
    
        /*开始采集AD*/
        for (i = 0; i < 10; i++)
        {
            ADCS = 1;                   //A/D 转换软件启动位   0 = 无动作.  1 = 开始AD转换
            while (ADCF == 0);          //等待转换完毕  ADC标志位 1转换完毕 0空闲
            ADCF = 0;                   //手动清零ADC标志位,否则下次无法采集
            /*【12位ADC采集模式】
            ADC低八位(0-3bit有效)+ADC高8位
            ******* + xxxxoooo = *******oooo  */
            AdTemp1 += ((ADCRH << 4) + ADCRL);
        }
        return AdTemp1 / 10;
    #else
        return 0;
    #endif
    }
    /*********************************************
    函数名:AD_to_VCC
    功  能:得到当前电压
    形  参:
    返回值:
    备  注:需要根据原理图的上下拉电阻填写本代码端部的宏定义
    作  者:薛建强
    时  间:2019/06/06
    **********************************************/
    uint16_t AD_to_VCC(void)
    {
    #if Config_ADC_Inti && Config_GMVCC_Inti
        xdata uint16_t VCC_out = 0;
        VCC_out = (((AdValue(Config_GMVCC_ADC_CH) * BSP_AD_Vcc / 4095) * (BSP_VCC_pull_up + BSP_VCC_pull_down) / BSP_VCC_pull_down) * 100); //采集到的电压
        /*此处因为电压不稳定,所以采取措施*/
        return VCC_out;
    #else
        return 0;
    #endif
    }
    
    /*********************************************
    函数名:VCC_percentage
    功  能:得到电压剩余电量百分比
    形  参:
    返回值:
    备  注:该函数核心是[AD_to_VCC()],其中必填宏定义BSP_Cell_Vcc。
    作  者:薛建强
    时  间:2019/06/06
    **********************************************/
    uint8_t VCC_percentage(void)
    {
    #if Config_ADC_Inti && Config_GMVCC_Inti
        return (1.00 - ((BSP_Cell_Vcc - AD_to_VCC()) / (BSP_Cell_Vcc - BSP_LOW_Vcc))) * 100; //换算成百分比
    #else
        return 0;
    #endif
    }
    
    更多相关内容
  • 课程设计,数字电压表设计,protues仿真,有C语言代码,可以在程序里面调整精确度,采用四位数码管
  • 使用51单片机结合ADC0808模数转换器采集多路模拟电压,并通过数码管显示,包含仿真
  • ADC电压采集程序

    2018-10-24 15:25:18
    压缩包中是基于stm32平台,里面有多种ADC的C语言代码。
  • 主控为51单片机,基于ADC0832芯片进行电压采集,数码管显示电压数据,proteus仿真,电路和代码可调,代码有注释
  • 本题目本质上是以单片机为控制器,ADC0809为ADC器件的AD转换电路,设计要求的电压显示,是对ADC采集所得信号的进一步处理。 为得到可读的电压值,需根据ADC的原理,对采集所得的 信号进行计算,并显示在LED上。本...
  • 本文给大家分享了ADC0809做的51单片机8路电压采集代码。
  • 51 单片机AD采集电压值的坑

    千次阅读 多人点赞 2021-09-03 17:20:34
    最近又在忙低功耗相关项目,需要对设备电池进行电压进行检测,ad采集的例程原厂都有给到,相关的文件说明都有,但是理想和现实还是比较骨感的,采集电压总是不对,调了两天,赶在周末前终于发现了问题。...

    1.引言

    最近又在忙低功耗相关项目,需要对设备电池进行电压进行检测,ad采集的例程原厂都有给到,相关的文件说明都有,但是理想和现实还是比较骨感的,采集的电压总是不对,调了两天,赶在周末前终于发现了问题。完美!!可能稍微不完美的就是原厂的技术支持,根本就不支持,发了微信都不回复,态度不太行。。。。。不过最后还是自己发现了问题,真解气!

    2.现象

    电压检测使用的是单片机的引脚,但电池电压一般为4.2v,大于GPIO的承受电压3.3v,所以需要一个分压电路,分压电路原理图如下图所示。

     上图中R7和R8是分压电阻,使用的阻值都是1M的电阻,通过理论分析,测量端点应该是2.5V,但是ad采集出来的内容却不是,甚至是0.几V,真是瞎了,跟所学的理论知识完全对不上,然后问原厂的人,原厂的人说肯定是分压电阻有问题,让我们看看,然后。。。。。就没有然后了,都不知道看什么,他们啥都不说,真的气人。

    然后我们拿开发板用同样的代码去测试,直接将测量点接到一个较高电压值得端点,比如:3.3v的位置,然后是正常的。但是接到上图的测量端点,却是不行,但问题在于:我用电压表去测量上图的测量端点是正常的2.5V

    所以真的...无语.....

    3.发现问题

    在测试的过程中,使用了一个小的电阻进行分压测试,然后突然就真的可以了,显示了测量端点理论的电压值,经分析。一开始我们用的是1M+1M的电阻,通过测量端点的电流只有大约0.5ua,真的太小了,导致无法测量出端点的电压值,换了小电阻5K+5K之后,经过测量端点的电流0.5mA,这时AD就可以正常采集电压值了。

    总结:ad在采集电压的时候,采集端点允许通过的电流不能太小???但是电压表可以测量出来,奇了怪了,但问题解决就是减小分压电路的电阻,让通过测量端点的电流大一点。

    展开全文
  • 1.采集电压:0-5V。 2.精度:10mV。 3.LCD1602显示 4.能实时保存要求时间内的数据,并查看。 电路原理图: 完整代码: #include<reg52.h> #define uchar unsigned char #define uint unsigned...

    实现功能:

    1.采集电压:0-5V。     

    2.精度:10mV。

    3.LCD1602显示

    4.能实时保存要求时间内的数据,并查看。

    电路原理图:

    完整代码:

    #include<reg52.h>
    #define uchar unsigned char
    #define uint unsigned int	
    uint temp;
    
    
    sbit RS=P2^0;
    sbit RW=P2^1;
    sbit E =P2^2;
    sbit TLC549_CLK=P2^3;
    sbit TLC549_DO=P2^4;
    sbit TLC549_CS=P2^5;
    void delayms(uchar ms)  		
    {
    		uchar i;
    		while(ms--)
    		for(i=0;i<123;i++);
    }
    void delayus(uchar us)  		
    {while(us--);}
    
    
    void w_com(uchar com)
    {RS=0;RW=0;E=1;P0=com;E=0;delayms(1);}
    void w_dat(uchar dat)
    {RS=1;RW=0;E=1;P0=dat;E=0;delayms(1);}
    void lcd_ini(void)
    {
    		delayms(10);  w_com(0x38);
    		delayms(10);  w_com(0x0c);
    		delayms(10);  w_com(0x06);
    		delayms(10);  w_com(0x01);
    		delayms(10);  w_com(0x38);
    		delayms(10);
    }
    
    
    uchar TLC549_ADC(void)
    {
    		uchar i, temp;	        
    		TLC549_CLK = 0;
    		TLC549_CS  = 0;
    		for(i = 0; i < 8; i++) 
    		{ 
    	  	    temp<<=1; 
    	  	    temp|= TLC549_DO;
    	  	    TLC549_CLK = 1;		      	       
    	  	    TLC549_CLK = 0;
    		}
    	  	TLC549_CS = 1;    delayus(20);
    	  	return  temp;		
    }
    
    
    
    
    void main(void)
    {
    	uint temp;
    	lcd_ini();
    
    	EA=1;			
    	EX0=1;		
    	IT0=1;
    
    
    
    
    	while(1)
    	{
    	
    
    
           temp=TLC549_ADC();
    
    		w_com(0x82);
    		w_dat('V');
    	//	w_com(0x83);
    		w_dat('=');
    
    	    w_com(0x84);      		
    		w_dat(temp*197/100000+0x30);//*****
    	    w_dat(temp*197/10000+0x30);   
    		delayms(100000);
    	    w_dat('.');     			
    	    w_dat(temp*197%10000/1000+0x30);	
    	    w_dat(temp*197%1000/100+0x30);  	
    	    w_dat('V');	
    
    
    	/*	w_com(0xc6);      		
    		w_dat('*');//*****
    		w_dat('*');//*****
    		w_dat('*');//*****
    		w_dat('*');//*****					   
    		w_dat('*');//*****
    		w_dat('*');//*****
    		w_dat('*');//*****
    		w_dat('*');//*****
    		w_dat('*');//*****
    		w_dat('*');//*****
    				w_dat('*');//*****
    				w_dat('*');//*****		*/
    	
    			}
    }
    
    
    
     void int0( )  interrupt 0  using 0	
    {
    		
     // while(1)
      {		
    		EX0=0;					
    		temp=TLC549_ADC();
    	    w_com(0xca);      		
    		w_dat(temp*197/100000+0x30);//*****
    
    	    w_dat(temp*197/10000+0x30);   
    	    w_dat('.');     			
    	    w_dat(temp*197%10000/1000+0x30);	
    	    w_dat(temp*197%1000/100+0x30);  	
    	    w_dat('V');	
    		
    
    				
    		delayms(800); 			
    		EX0=1;			
    }
    }
    
    
    
    

    展开全文
  • 要求:右下角的电位器模拟电压传感器,电压值变化,由ADC采集转换成数字量,给单片机单片机根据电压值的大小在两个8*8的点阵上显示三种不同的表情。 代码如下: #include #include #define uch

    最近帮同学做同学做一个51单片机的仿真,好久没碰单片机和硬件了,以前也没怎么用过proteus软件,花了接近一天时间弄出来了,代码和仿真的电路图如下:

    仿真图:

    要求:右下角的电位器模拟电压传感器,电压值变化,由ADC采集转换成数字量,给单片机,单片机根据电压值的大小在两个8*8的点阵上显示三种不同的表情。

    代码如下:

    #include<reg52.h>
    #include<intrins.h>
    
    #define uchar unsigned char
    #define uint unsigned int
    
    //管脚声明
    //154引脚
    sbit pinA = P3^0;
    sbit pinB = P3^1;
    sbit pinC = P3^2;
    sbit pinD = P3^3;
    //AD相关的引脚定义
    sbit wr = P3^5;
    sbit rd = P3^6;
    sbit cs = P3^7;
    //第一块595的控制引脚
    sbit SHCP1=P2^0;
    sbit DS1=P2^1;
    sbit STCP1=P2^2;
    
    //第二块595的控制引脚
    sbit SHCP2=P2^3;
    sbit DS2=P2^4;
    sbit STCP2=P2^5;
    
    
    
    //函数声明
    void delay(int i);
    void HC_595_SET1(uchar temp);
    void HC_595_SET2(uchar temp);
    void HC_595_Init();
    void HC154_Set(uchar i);
    uchar read_adc0804();
    
    uchar dis1[] = {0x00, 0x18, 0x24, 0x5A, 0x24, 0x24, 0x18, 0x00,
    				0x00, 0x18, 0x24, 0x5A, 0x24, 0x24, 0x18, 0x00};
    
    				
    uchar dis2[] = {0x00, 0x18, 0x24, 0x42, 0x81, 0x24, 0x18, 0x00,
    				0x00, 0x18, 0x24, 0x42, 0x81, 0x24, 0x18, 0x00};
    
    uchar dis3[] = {0x18, 0x24, 0x42, 0x3C, 0x18, 0x18, 0x18, 0x18,
    				0x18, 0x24, 0x42, 0x3C, 0x18, 0x18, 0x18, 0x18};
    
    void display1()
    {
     	int i=0;
    	uchar temp=0;
    	for(i=0;i<16;i++)
    	{
    		temp = dis1[i];
    		HC_595_SET1(temp);
    		HC_595_SET2(temp);
    		HC154_Set(i);
    		delay(1);
    	}
    }
    
    void display2()
    {
     	int i=0;
    	uchar temp=0;
    	for(i=0;i<16;i++)
    	{
    		temp = dis2[i];
    		HC_595_SET1(temp);
    		HC_595_SET2(temp);
    		HC154_Set(i);
    		delay(1);
    	}
    }
    
    void display3()
    {
     	int i=0;
    	uchar temp=0;
    	for(i=0;i<16;i++)
    	{
    		temp = dis3[i];
    		HC_595_SET1(temp);
    		HC_595_SET2(temp);
    		HC154_Set(i);
    		delay(1);
    	}
    }
    
    
    
    void main()
    {
    	HC_595_Init();
    	while(1)
    	{
    		uchar adcdata = read_adc0804();
    		if(adcdata < 85)	
    			display1();
    		else if((adcdata>=85)&&(adcdata<170))
    			display2();
    		else
    			display3();
    	}
    }
    
    //延时函数
    void delay(int i)
    {
    	int j;
    	while(i--)
    		for(j=110;j>0;j--);
    }
    
    //第一块595设置函数
    void HC_595_SET1(uchar temp)
    {
    	uchar j=0;
    	for(j=0;j<8;j++)
    	{
    		temp = temp<<1;
    		DS1 = CY;
    		SHCP1 = 1;//上升沿发生移位
    		_nop_();
    		_nop_();
    		SHCP1 = 0;
    	}
    	STCP1 = 0;
    	//	delay(1);
    	_nop_();
    	_nop_();
    	STCP1 = 1;
    }
    
    //第二块595设置函数
    void HC_595_SET2(uchar temp)
    {
    	uchar j=0;
    	for(j=0;j<8;j++)
    	{
    		temp = temp<<1;
    		DS2 = CY;
    		SHCP2 = 1;//上升沿发生移位
    		_nop_();
    		_nop_();
    		SHCP2 = 0;
    	}
    	STCP2 = 0;	//下降沿输出数据
    	//delay(1);
    	_nop_();
    	_nop_();
    	STCP2 = 1;	
    }
    
    //两块595芯片的初始化函数
    void HC_595_Init()
    {
    	//595芯片引脚的初始化电平
    	SHCP1 =0;
    	STCP1 =1;
    	SHCP2 =0;
    	STCP2 =1;
    	//......
    }
    
    
    
    //AD读取数据函数
    uchar read_adc0804()
    {
    	uchar udata=0;
    	cs =1;
    	wr =1;
    	cs =0;
    	wr =0;
    	_nop_();
    	wr =1;
    
    	P1 =0xff;
    	rd=1;
    	rd=0;
    	_nop_();
    	udata = P1;
    	rd=1;
    	cs=1;
    
    	return udata;
    }
    
    
    //设置74HC154的函数
    void HC154_Set(uchar i)
    {
    	uchar a, b, c ,d;
    	d = i/8;
    	c = (i-8*d)/4;
    	b = (i-8*d-4*c)/2;
    	if((i%2)==1)
    		a = 1;
    	else
    		a=0;
    
    	pinA=a;
    	pinB=b;
    	pinC=c;
    	pinD=d;
    		
    }
    
    
    仿真结果如下:

    展开全文
  • 单片机的ADC接口属于模数转换接口,将外部的模拟量信号转化为数字信号,单片机属于数字器件,需将模拟信号转化为数字信号才能够为单片机处理。目前市场的很多单片机都自带ADC转换接口,若无ADC...该单片机ADC为12位的
  • 51单片机通过ADC0831采样程序,通过4位共阳数码管动态显示采样的电压
  • C8051Fxxx系列单片机自2000年推出以来,其强大的内部功能和丰富的片内资源,使之能用最简单的硬件结构实现多通道数据范围的检测。本文设计的控制系统只要配置合适的电量传感器,就可方便地用于各类电力变电系统对...
  • 本文给出了一个基于AD0809和单片机的多路数据采集系统的硬件实现方法,该方法在终端采用8051单片机为核心来控制数据采集及数据上传工作,并通过A/D转换器将0~5V的直流电压转换为计算机可以进行处理的数字信号,...
  • 基于51单片机电压温度采集&ADC采集&LCD12864显示Proteus仿真设计资料(包含源程序及仿真文件)
  • 今天通过搜索,整理了proteus 7可以仿真通过的基于51单片机+ADC0832电压采集并通过液晶1602显示电压的C程序及电路连接图,希望对大家有所帮助。程序是谁写的谁修改的并不主要,主要的是学会并使用单片机AD转换,这才...
  • 本文介绍了一种基于单片机的心率体温检测系统。此次设计的电路部分主要包括:传感测量电路、放大电路、滤波整形电路、AD转换电路、控制电路、电源供电电路等。上位机为通过VC编程界面。通过上位机按键控制,
  • 改变滑变大小,数码管显示输出电压值,Protues8.7以下版本可打开
  • 使用51单片机采集ADC0832芯片的电压采集数据,LCD显示,proteus仿真,代码有注释
  • a_100=a_100/51; j=a_100/100; bai=j+48; j=a_100%100/10; shi=j+48; j=a_100%10; ge= j+48; } uchar BCD () { uchar ad; OE=1; start=1; start=0; start=1; while(EOC); OE=0; ad=P0; OE=1; delay (); return ad; ...
  • /***********************************************************程序功能:STC12C5A60S2自带ADC采集电压信号+DS18B20温度传感器+LCD1602液晶显示MCU型号: STC12C5A60S2晶振频率:11.0892MHz整理时间:2012年4月25号...
  • 51单片机Protues,通过ADC0809芯片仿真8路电压表,并且在数码管显示电压值。程序和protues仿真原理图。
  • 【STC12C5A6S2】ADC采集电压信号并串口打印(0-5V或3.3V
  • 该数字电压表基于51单片机设计,通过A/D转换芯片ADC0832,以及单片机的控制作用,将测量的电压值显示在液晶屏上。 为了便于需要的人学习或者参考,该源程序有详细的中文注释。 基于ADC0832的数字电压表部分截图:
  • 本实例是用protues7.8仿真12位adc的tlc2543的电压测量功能,文件包括仿真的keilc51程序和protues仿真文件,在实践中亲测可行,供大家学习和参考
  • 本文给出了一个基于AD0809和单片机的多路数据采集系统的硬件实现方法,该方法在终端采用8051单片机为核心来控制数据采集及数据上传工作,并通过A/D转换器将0~5V的直流电压转换为计算机可以进行处理的数字信号,...

空空如也

空空如也

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

51单片机adc采集电压