-
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 }
更多相关内容 -
51单片机ADC0808电压采集.zip
2020-02-27 16:39:45课程设计,数字电压表设计,protues仿真,有C语言代码,可以在程序里面调整精确度,采用四位数码管 -
51单片机结合ADC0808电压采集
2018-01-17 15:30:00使用51单片机结合ADC0808模数转换器采集多路模拟电压,并通过数码管显示,包含仿真 -
ADC电压采集程序
2018-10-24 15:25:18压缩包中是基于stm32平台,里面有多种ADC的C语言代码。 -
51单片机,ADC0832电压采集,数码管显示,proteus仿真
2021-07-09 17:56:11主控为51单片机,基于ADC0832芯片进行电压采集,数码管显示电压数据,proteus仿真,电路和代码可调,代码有注释 -
C51单片机简易电压表的课程设计 程序源代码,基于ADC0809
2021-08-07 11:04:44本题目本质上是以单片机为控制器,ADC0809为ADC器件的AD转换电路,设计要求的电压显示,是对ADC采集所得信号的进一步处理。 为得到可读的电压值,需根据ADC的原理,对采集所得的 信号进行计算,并显示在LED上。本... -
ADC0809做的51单片机8路电压采集
2020-07-25 21:50:06本文给大家分享了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在采集电压的时候,采集端点允许通过的电流不能太小???但是电压表可以测量出来,奇了怪了,但问题解决就是减小分压电路的电阻,让通过测量端点的电流大一点。
-
51单片机电压采集系统/电压表TLC549
2021-10-26 21:09:211.采集电压: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; } }
。
-
基于 51单片机、74HC154/595的液晶显示、ADC驱动以及电压采集。
2017-03-04 17:28:07要求:右下角的电位器模拟电压传感器,电压值变化,由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模块采集模拟信号
2020-07-13 17:11:59单片机的ADC接口属于模数转换接口,将外部的模拟量信号转化为数字信号,单片机属于数字器件,需将模拟信号转化为数字信号才能够为单片机处理。目前市场的很多单片机都自带ADC转换接口,若无ADC...该单片机ADC为12位的 -
51单片机ADC0831采样程序
2018-05-18 18:42:2351单片机通过ADC0831采样程序,通过4位共阳数码管动态显示采样的电压值 -
基于51单片机的多通道数据采集范围控制系统
2020-07-14 09:08:55C8051Fxxx系列单片机自2000年推出以来,其强大的内部功能和丰富的片内资源,使之能用最简单的硬件结构实现多通道数据范围的检测。本文设计的控制系统只要配置合适的电量传感器,就可方便地用于各类电力变电系统对... -
基于ADC0809和51单片机的多路数据采集系统设计
2020-07-14 10:46:56本文给出了一个基于AD0809和单片机的多路数据采集系统的硬件实现方法,该方法在终端采用8051单片机为核心来控制数据采集及数据上传工作,并通过A/D转换器将0~5V的直流电压转换为计算机可以进行处理的数字信号,... -
基于51单片机的电压温度采集&ADC采集&LCD12864显示Proteus仿真设计资料(包含源程序及仿真文件)
2022-04-16 22:48:17基于51单片机的电压温度采集&ADC采集&LCD12864显示Proteus仿真设计资料(包含源程序及仿真文件) -
51单片机ADC0832电压测量液晶1602显示的C程序与proteus仿真
2021-05-21 03:29:30今天通过搜索,整理了proteus 7可以仿真通过的基于51单片机+ADC0832电压采集并通过液晶1602显示电压的C程序及电路连接图,希望对大家有所帮助。程序是谁写的谁修改的并不主要,主要的是学会并使用单片机AD转换,这才... -
51单片机ad电压采集实验_基于单片机的心率体温检测系统设计
2021-02-02 09:17:36本文介绍了一种基于单片机的心率体温检测系统。此次设计的电路部分主要包括:传感测量电路、放大电路、滤波整形电路、AD转换电路、控制电路、电源供电电路等。上位机为通过VC编程界面。通过上位机按键控制, -
Protues仿真51单片机使用adc0832采集滑变电压数码管显示
2022-04-01 17:39:32改变滑变大小,数码管显示输出电压值,Protues8.7以下版本可打开 -
ADC0832读取,1602显示,51单片机
2021-07-09 18:02:28使用51单片机采集ADC0832芯片的电压采集数据,LCD显示,proteus仿真,代码有注释 -
51单片机+ADC0808电压采集proteus仿真及源程序
2021-05-20 16:08:38a_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采集电压源程序
2021-05-23 09:23:12/***********************************************************程序功能:STC12C5A60S2自带ADC采集电压信号+DS18B20温度传感器+LCD1602液晶显示MCU型号: STC12C5A60S2晶振频率:11.0892MHz整理时间:2012年4月25号... -
51单片机Protues,通过ADC0809芯片仿真8路电压表,并且在数码管显示电压值。
2017-06-04 15:44:5051单片机Protues,通过ADC0809芯片仿真8路电压表,并且在数码管显示电压值。程序和protues仿真原理图。 -
【STC12C5A6S2】ADC采集电压信号并串口打印(0-5V或3.3V)
2022-04-10 13:33:04【STC12C5A6S2】ADC采集电压信号并串口打印(0-5V或3.3V -
基于ADC0832的数字电压表源程序(详细中文注释)-电路方案
2021-04-22 19:09:53该数字电压表基于51单片机设计,通过A/D转换芯片ADC0832,以及单片机的控制作用,将测量的电压值显示在液晶屏上。 为了便于需要的人学习或者参考,该源程序有详细的中文注释。 基于ADC0832的数字电压表部分截图: -
基于12位adc tlc2543adc电压测量(keil 51代码+protues仿真)
2018-10-04 21:31:42本实例是用protues7.8仿真12位adc的tlc2543的电压测量功能,文件包括仿真的keilc51程序和protues仿真文件,在实践中亲测可行,供大家学习和参考 -
基于ADC0809和51单片机的多路数据采集系统设计方案
2020-08-05 13:17:49本文给出了一个基于AD0809和单片机的多路数据采集系统的硬件实现方法,该方法在终端采用8051单片机为核心来控制数据采集及数据上传工作,并通过A/D转换器将0~5V的直流电压转换为计算机可以进行处理的数字信号,...