ADC单次adc转换器ADC复位是干什么用的

STM32之ADC+步骤小技巧(英文) - Alvis靖 - 推酷
STM32之ADC+步骤小技巧(英文) - Alvis靖
& & & &神通广大的各位互联网的网友们、大家早上中午晚上好好好、今早起来很准时的收到了两条10086的扣月租的信息、心痛不已、怀着这心情、又开始了STM32的研究、早上做了计算机控制的PID实验,又让我想起了飞思卡尔的电磁小车、、曾经的电感电压采集让我心碎的多少次、又让我开心了多少次、但已经成为过去、(软件和硬件都会影响),呵呵、估计有人已经猜到我接下来要介绍什么了、在你们面前、我已无秘密、额、其实标题也直接“表白”了、看到标题,别吓到哈、并不是要用英文写、至于原因是什么、请往下看:
& & & &好吧、言归正传:STM32的ADC模块,请允许我用如此通俗的语言:
&来介绍STM32ADC模块的特色
& & & 1、1MHz转换速率、
位转换结果(
12位、记住这个12位哈、因为2^12=4096 ,也请记住4096哈
& & & & & &STM32F103系列:在56MHz时转换时间为:1μs
& & & & & & & & & & & & & & & & & & 在72MHz时转换时间为:1.17μs
& & & 2、转换范围:0~3.6V &(
3.6v----&当你需要将采集的数据用电压来显示的话:设你采集的数据为:x[0~4095],此时的计算公式就为:(x / 4096) * 3.6)
& & & 3、ADC供电要求:2.4V~3.6 V(
可千万别接到 5V 的石榴裙子底下呀
& & & 4、ADC输入范围:VREF-≤ VIN ≤VREF+ (VREF+和VREF-只有LQFP100封装才有)
& & & 5、双重模式(带2个ADC的设备): 8种转换模式
& & & 6、最多有18个通道:16个外部通道
& & & & & & & & & & & & & & & & & &2个内部通道:连接到温度传感器和内部参考电压(VREFINT = 1.2V)
& & & ......(略,请看参考手册哈,由于篇幅,就不过多的列出来了、、说到略、让我想起了月光宝盒诸葛亮的:略懂略懂、、其实我也是略懂略懂而已、、)
& & & 12、
DMA功能(仅ADC1有)
本博客里,由于篇幅、所以就以
为例哈、打开参考手册可以看到这段话:
& & & &单次转换模式下,ADC只执行一次转换。
& & & &该模式既可通过设置
位(只适用于规则通道)启动也可通过外部触发启动(适用于规则通道或注入通道),这时
& & & &一旦选择通道的转换完成:
& & & &● 如果一个规则通道被转换: ─ 转换数据被储存在16位
寄存器中 ─
(转换结束)标志被设置 ─ 如果设置了
,则产生中断。
& & & &● 如果一个注入通道被转换: ─ 转换数据被储存在16位的
寄存器中 ─
(注入转换结束)标志被设置 ─ 如果设置了
位,则产生中断。
& & & &然后ADC停止。
此图形象的表明了其背后那不为人知的秘密转换关系。。虽然单凭看文字就能想象出来、但是、有图片是不是更加形象呢???
& & &对于以上的寄存器、在此我稍微提提:免得寄存器大神们产生怨气:好不容易等到你讲我老大ADC,却不把我这些背后的勤劳者给导出来
& & &好了,那就恕小弟容禀:
ADC状态寄存器(ADC_SR)&
ADC控制寄存器1(ADC_CR1)
、ADC控制寄存器2(ADC_CR2)
EXTSEL[2:0]:选择启动规则通道组转换的外部事件 (External event select for regular group)
& & & &ALIGN:数据对齐 (Data alignment)
& & & &RSTCAL:复位校准 (Reset calibration)
& & & &CAL:A/D校准 (A/D Calibration)
& & & &CONT:连续转换 (Continuous conversion)
& & & &ADON:开/关A/D转换器 (A/D converter ON / OFF)
ADC采样时间寄存器1(ADC_SMPR1)
&SMPx[2:0]:选择通道x的采样时间 (Channel x Sample time selection)
、ADC规则序列寄存器1(ADC_SQR1)
&L[3:0]:规则通道序列长度 (Regular channel sequence length)
& & & &SQ1[4:0]:规则序列中的第1个转换 (1st conversion in regular sequence)(
ADC规则序列寄存器3(ADC_SQR3)
、ADC规则数据寄存器(ADC_DR) & &
DATA[15:0]:规则转换的数据 (Regular data)&
&(由于寄存器过于多,我们就不在这一一列举了哈、、因为我主要是用库,所以寄存器相关的位都不具体介绍了哈、请大家参照中文手册)
&在这里,向大家介绍下:数据对齐:
& & & & & & & & & & & & & & & & & & & & & & & ALIGN位用于设置对齐方式:右或左;
& & & & & & & & & & & & & & & & & & & & & & &&对于注入通道,转换结果是减去偏移量的值,可以为一个负数,在右对齐时扩展位位符号位。
& & 那我们现在要怎么来实现呢??这个问题、相信大家在看了那么多的寄存器之后急迫想要知道的吧、、前面的只是个热身、、接下来步骤如下:
、开启ADC1的时钟,由于ADC1是在PA1上,所以同时也要打开PA的时钟,并进行相关的配置、对于这个配置,要把PA1设置成模拟输入,为什么呢??大家打开中文参考手册可以看到
啊哈、、这下子清楚了吧、
、复位ADC1,(
本人觉得没必要、为什么,待会我会跟你说,留下悬念先)
,设置ADC1的分频因子,(记住,这里的ADC的时钟不能超过14MHZ),而且其采样周期长点会好点,
& & & &&ADCCLK---
最快可达14MHz
, 时钟来自经过分频器的PCLK2(2、4、6、8分频)
整个转换时间 = 采样时间 + 12.5个周期(固定时间)
& & & &在14MHz和采样时间位1.5周期时 ? 转换时间:1μs (14个周期 cycles)
当ADCCLK=14MHz和1.5周期的采样时间:
& & & & TCONV = 1.5 + 12.5 = 14周期 = 14&(1 / (14 & 1000000)) = 1μs
& & & &其采样周期一览表:
& & 涉及到采样周期、这里来看看转换序列:
& & 最多达16个转换通道且可以采样不同的顺序排列,不同的采样时间和过采样的可能性。
例如:- 转换通道:1、2、8、4、7、3、11
& & & & & & & & & & & & & & - 不同的采样时间;
& & & & & & & & & & & & & & - Oversampling of channel 7。
、初始化ADC1的参数、设置ADC1的工作模式和规则序列的相关信息;
& & & &大家通过打开&stm32f10.adc.h&可以看到:
typedef struct
uint32_t ADC_M
//设置ADC模式--&独立模式
FunctionalState ADC_ScanConvM
//设置是否开启扫描模式 ---&否
FunctionalState ADC_ContinuousConvM //设置是否开启连续转换模式 ----&否
uint32_t ADC_ExternalTrigC
//设置启动规则转换组转换模式----&软件触发
uint32_t ADC_DataA
//设置数据对齐方式-----&右对齐
uint8_t ADC_NbrOfC
//设置规则序列的长度----&顺序进行规则转换的ADC通道数目1
}ADC_InitTypeD
、使能ADC并校准
注:在设置完了以上信息后,使能AD转换器,执行复位校准和AD校准(这两步校准一定要,否则数据将不准)
还有记住,每次进行校准之后都要等待校准结束,但是通过什么方式知道校准结束呢?
这里是通过获取校准状态来判断是否校准结束,相关的库函数请看代码
& & & 分别的库函数请看待会的代码。(
请用比较老外的方式去看,也就是用英语啦,为什么呢?请看下文
、读取AD的值
& & 当然,这里说读取AD值并不是那么的简单,以上我们只是准备好了AD,还没有设置相关的规则序列通道,采样顺序,以及采样周期,设置完之后启动AD转换就行了、然后才直接读取哈、、
& & & 相关的库函数请看代码、
void Adc_Init(void)
ADC_InitTypeDef ADC_InitS
GPIO_InitTypeDef GPIO_InitS
/* Enable ADC1 and GPIOA clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);//12MHZ
/* Configure PA.1 (ADC Channel) as analog input -------------------------*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//ADC_DeInit(ADC1);//在这里复位被我注释掉了、至于为什么,我待会会说
/* ADC1 configuration ------------------------------------------------------*/
ADC_InitStructure.ADC_Mode = ADC_Mode_I//这里对应上面所讲的配置,在这里就不给出注释了
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_N
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_R
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
/* Enable ADC1 *///知道我为啥要在上面提醒大家要用老外的方式来看了吧、因为这里的注释都是用英文的
//请不要以为我装逼,我这样做是有原因的、、原因我待会会说、你也会明白我最初的标题为何那样写
ADC_Cmd(ADC1, ENABLE);
/* Enable ADC1 reset calibration register */
ADC_ResetCalibration(ADC1);
/* Check the end of ADC1 reset calibration register */
while(ADC_GetResetCalibrationStatus(ADC1));
/* Start ADC1 calibration */
ADC_StartCalibration(ADC1);
/* Check the end of ADC1 calibration */
while(ADC_GetCalibrationStatus(ADC1));
u16 Get_val(u8 ch)
u16 DataV //又是英文注释、、啊哈
/* ADC1 regular channel14 configuration */
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5);
/* Start ADC1 Software Conversion */
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
/* Test if the ADC1 EOC flag is set or not */
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
//FlagStatus S
//Status = ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC);
//while(!Status);----&这样做实现不了、请注意
/*Returns the ADC1 Master data value of the last converted channel*/ DataValue = ADC_GetConversionValue(ADC1); return DataV } u16 ADC_Get_aveg(u8 ch,u8 n) { u32 ad_sum = 0; u8 for(i=0;i&n;i++) { ad_sum += Get_val(ch); delay_ms(5); } return (ad_sum / n); }adcx=ADC_Get_aveg(ADC_Channel_1,10);//获取AD数值(0~4095)temp=(float)adcx*(3.3/4096);//获取相应的电压值
& & &到了这一步,我们已经完成了AD采集数据的任务、接下来,有人可能有时候会觉得很纳闷,为什么有些人知道要完成特定的功能,它的步骤是怎么样的、为什么我就不知道??这个问题嘛、、接下来我讲的希望能稍微帮你,也希望你能好好的借鉴、
& & &步骤小技巧:其实也没啥的、大家知道下载库的文件的时候,里面都有包含每个模块的例子和一个模版、拿ADC这个模块来举例:
点击main.c可以看到神奇的一幕:
& &大家仔细看看,可以发现在官方给的历程中的步骤里并没有复位ADC的函数,个人觉得所以没有必要去复位当然复位也不是什么坏事哈、看你个人、、看到这、应该明白了我前面的说法了吧、还有、大家应该也注意到了、都是英文的注释、、所以看到这大家也清楚了,前面不是我装逼、、所以呢、其实英语对于我们来说还是很重要的、、那有人问,时钟的分频因子呢?怎么没有设置??不急哈、、请看:
对于分频因子的设置,也在这个函数里:而这个RCC_Configuration()在最开始已经使用 了、、
& 所以大家要好好利用官方给的历程、说到这、你猜我词穷了吗?
& 答案是否定的、、我还有话要说:
& 做一件事要有一个目的、、才不会显得自己做的很空泛、、我写博客也一样、、我想让我自己理清思路、也希望自己在写的过程中能领悟到自己在学的时候没领悟到的知识点、、也希望能帮到跟我有一样困惑的人、、我把我不懂的理解后写下来、我也知道会有人跟我一样遇到同样不懂的地方、、所以这就是我的目的哈、、希望能帮到你们、、尽管不认识你们、、啊哈、、初学者、难免有出错、、所以、写错或理解错的请帮我指出来、臣不甚感激,今当远离,零表涕零,不知所言、、
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致<p class="lanlink">本文话题:adc0809中文资料
一、ADC0809引脚结构功能说明图:1~5、26~28,IN0~IN7:8路模拟量输入端。 14~15、8、17~21,D0~D7:8位数字量输出端。23~25,ADDA、ADDB、ADDC:3位地址输入线,用于选通8路模拟输入中的一路 22,ALE:地址锁存允许信号,输入,高电平有效,对应ALE上跳沿,A、B、C地址状态送入地址锁存器中。6,START:A/D转换启动信号,输入高电平有效,START上升沿时,复位ADC0809;START下降沿时启动芯片,开始进行A/D转换;在A/D转换期间,START应保持 低电平。本信号有时简写为ST.7,EOC:A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。9,OE:数据输出允许信号,输入,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量,用于控制三态输出锁存器向单片机输出转换得到的数据。OE=0,输出数据线呈高阻;OE=1,输出转换得到的数据。10,CLK:时钟脉冲输入端。要求时钟频率不高于640KHZ,EOC=0,正在进行转换;EOC=1,转换结束。使用中该状态信号即可作为查询的状态标志,又可作为中断请求信号使用。12、16,REF(+)、REF(-):基准电压。 11,Vcc:电源,单一+5V。 13,GND:地。二、ADC0809与51单片机的接口电路1、说明: D0~D7接51单片机的P2口(P2.0~P2.7)ADIN1和ADIN2为通道IN0和IN1的电压模拟量输入(0~5V)应用程序如下:#include&reg52.h&#define uchar unsigned char sbit ST=P1^0; sbit EOC=P1^1; sbit OE=P1^2; sbit CLK=P1^3; sbit ADDCS=P1^4;uchar AD_DATA[2];//保存IN0和IN1经AD转换后的数据 void delay(uchar i) { while(i--) {for(j=125;j&0;j--) ; } } void init() {EA = 1; //开总中断TMOD = 002; //设定定时器T0工作方式 TH0=216; //利用T0中断产生CLK信号 TL0=216;TR0=1; //启动定时器T0 ET0=1; ST=0; OE=0; }void t0(void) interrupt 1 using 0 {CLK=~CLK; } void AD() {ST=0;ADDCS=0; //选择通道IN0 delay(10);ST=1; //启动AD转换 delay(10); ST=0;while(0==EOC); OE=1;AD_DATA[0]=P2; } OE=0;
ST=0; void main() ADDCS=1; //选择通道IN1 { delay(10); init(); ST=1; //启动AD转换 while(1) delay(10); { ST=0; AD(); while(0==EOC); } OE=1; } AD_DATA[1]=P2; OE=0;注: 由于ADC0809内部不带时钟电路,因此用51单片机的定时器T0来产生时钟信号。在通道选择时,由于B,C接地,当A(ADDCS)为低电平时选择IN0,A为高电平时选择IN12、利用单片机AT89S51与ADC0809设计一个数字电压表,实验任务利用单片机AT89S51与ADC0809设计一个数字电压表,能够测量0-5V之间的直流电压值,四位数码显示,但要求使用的元器件数目最少。3. 系统板上硬件连线(1).把“单片机系统”区域中的P1.0-P1.7与“动态数码显示”区域中的ABCDEFGH端口用8芯排线连接,数码管段码控制。(2).把“单片机系统”区域中的P2.0-P2.3与“动态数码显示”区域中的S1S2S3S4端口用8芯排线连接,数码管位码控制。(3).把“单片机系统”区域中的P3.0与“模数转换模块”区域中的ST端子用导线相连接,转换启动控制。 (4).把“单片机系统”区域中的P3.1与“模数转换模块”区域中的OE端子用导线相连接,数据输出控制。 (5).把“单片机系统”区域中的P3.2与“模数转换模块”区域中的EOC端子用导线相连接,转换结束标志。 (6).把“单片机系统”区域中的P3.3与“模数转换模块”区域中的CLK端子用导线相连接,为转换器提供脉冲。 (7).把“模数转换模块”区域中的A2A1A0端子用导线连接到“电源模块”区域中的GND端子上,始终选择IN0单通道(8).把“模数转换模块”区域中的IN0端子用导线连接到“三路可调电压模块”区域中的VR1端子上,调节电压变化。(9).把“单片机系统”区域中的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. C语言源程序#include &AT89X52.H&unsigned char code dispbitcode[]={0fe,0fd,0fb,0f7,0ef,0df,0bf,07f}; unsigned char codedispcode[]={03f,006,05b,04f,066,06d,07d,007,07f,06f,000}; unsigned char dispbuf[8]={10,10,10,10,10,0,0,0}; uns u 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=012; TH0=216; TL0=216;TH1=()/256; TL1=()%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]= ST=1; ST=0; } } }void t0(void) interrupt 1 using 0 {CLK=~CLK; }void t1(void) interrupt 3 using 0 {TH1=()/256; TL1=()%256;P1=dispcode[dispbuf[dispcount]];//显示电压值 P2=dispbitcode[dispcount];//位码控制 if(dispcount==7) {P1=P1 | 080; }dispcount++;if(dispcount==8) {dispcount=0; } }三、ADC0809应用说明1、(1). ADC0809内部带有输出锁存器,可以与AT89S51单片机直接相连。(2). 初始化时,使ST和OE信号全为低电平。(3). 送要转换的哪一通道的地址到A,B,C端口上。 (4). 在ST端给出一个至少有100ns宽的正脉冲信号。 (5). 是否转换完毕,我们根据EOC信号来判断。(6). 当EOC变为高电平时,这时给OE为高电平,转换的数据就输出给单片机了。2、ST为转换启动信号。当ST上跳沿时,所有内部寄存器清零;下跳沿时,开始进行A/D转换;在转换期间,ST应保持低电平。EOC为转换结束信号。当EOC为高电平时,表明转换结束;否则,表明正在进行A/D转换。OE为输出允许信号,用于控制三条输出锁存器向单片机输出转换得到的数据。OE=1,ADC0809重点总结资料 86_adc0809中文资料输出转换得到的数据;OE=0,输出数据线呈高阻状态。D7-D0为数字量输出线。 CLK为时钟输入信号线。因ADC0809的内部没有时钟电路,所需时钟信号必须由外界提供,通常使用频率为500KHZ, VREF(+),VREF(-)为参考电压输入。(1). 进行A/D转换时,采用查询EOC的标志信号来检测A/D转换是否完毕,若完毕则把数据通过P0端口读入,经过数据处理之后在数码管上显示。(2). 进行A/D转换之前,要启动转换的方法: ABC=110选择第三通道 ST=0,ST=1,ST=0产生启动转换的正脉冲信号 .3、ADC0809的工作过程是:首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。此地址经译码选通8路模拟输入之一到比较器。START上升沿将逐次逼近寄存器复位。下降沿启动 A/D转换,之后EOC输出信号变低,指示转换正在进行。直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。当OE输入高电平 时,输出三态门打开,转换结果的数字量输出到数据总线上。4、C语言源程序#include &AT89X52.H&unsigned char code dispbitcode[]={0fe,0fd,0fb,0f7,0ef,0df,0bf,07f};//位码数组unsigned char codedispcode[]={03f,006,05b,04f,066,06d,07d,007,07f,06f,000};//段码数组unsigned char dispbuf[8]={10,10,10,10,10,0,0,0};unssbit ST=P3^0;sbit OE=P3^1;sbit EOC=P3^2;unsigned char channel=0//IN3uvoid main(void){TMOD=001;TH0=()/256;TL0=()%256;TR0=1;ET0=1;EA=1;P3=while(1){ST=0;ST=1;ST=0;while(EOC==0);OE=1;getdata=P0;OE=0;dispbuf[2]=getdata/100;//分离百位getdata=getdata%100;//除去百位dispbuf[1]=getdata/10;//分离10位dispbuf[0]=getdata%10;//分离各位}}void t0(void) interrupt 1 using 0{TH0=()/256;TL0=()%256;P1=dispcode[dispbuf[dispcount]];//采样数据P2=dispbitcode[dispcount];//打开所要显示数据的位码dispcount++;if(dispcount==8){dispcount=0; }}四、ADC0809的内部结构1、ADC0809的内部逻辑结构图如图9-7所示。????????????????????????????????表2. 转换数据的传送A/D转换后得到的数据应及时传送给单片机进行处理。数据传送的关键问题是如何确认A/D转换的完成,因为只有确认完成后,才能进行传送。为此可采用下述三种方式。(1)定时传送方式对于一种A/D转换其来说,转换时间作为一项技术指标是已知的和固定的。例如ADC0809转换时间为128μs,相当于6MHz的MCS-51单片机共64个机器周期。可据此设计一个延时子程序,A/D转换启动后即调用此子程序,延迟时间一到,转换肯定已经完成了,接着就可进行数据传送。(2)查询方式A/D转换芯片由表明转换完成的状态信号,例如ADC0809的EOC端。因此可以用查询方式,测试EOC的状态,即可却只转换是否完成,并接着进行数据传送。(3)中断方式把表明转换完成的状态信号(EOC)作为中断请求信号,以中断方式进行数据传送。不管使用上述那种方式,只要一旦确定转换完成,即可通过指令进行数据传送。首先送出口地址并以信号有效时,OE信号即有效,把转换数据送上数据总线,供单片机接受。不管使用上述那种方式,只要一旦确认转换结束,便可通过指令进行数据传送。所用的指令为MOVX 读指令,仍以图9-17所示为例,则有MOV DPTR , #FE00HMOVX A , @DPTR该指令在送出有效口地址的同时,发出有效信号,使0809的输出允许信号OE有 效,从而打开三态门输出,是转换后的数据通过数据总线送入A累加器中。这里需要说明的是,ADC0809的三个地址端A、B、C即可如前所述与地址线相连,也可与数据线相连,例如与D0~D2相连。这是启动A/D转换的指令与上述类似,只不过A的内容不能为任意数,而必须和所选输入通道号IN0~IN7相一致。表9-1 通道选择我为了这个ADC0809已经痛苦了好几天了,今天终于成功了。算是一个里程碑了。 为了纪念它,把东西发上来。电路图PCB图实物图程序ADC0809重点总结资料 86_adc0809中文资料#include&reg51.h&#include&intrins.h&sbit CLOCK=P2^7;sbit OE=P2^6;sbit START=P2^5;unsigned char _void init(){SM0=0; //SM01组合代表8位uart方式,波特率可变SM1=1;REN=1; //允许串行接受TH1=0F3; //波特率2400,误差0.12%TL1=0F3;TMOD=020; //定时器1工作于8位自动重载模式, 用于产生波特率 EA=1; //总开关中断方式ET1=0; //定时器1 不允许中断ES=1; //允许串口中断TR1=1; //计时器启动控制位START=0;OE=0;}void wait(unsigned char time) //产生时钟{unsigned char i,j;for(i=0;i&i++)for(j=0;j&125;j++){CLOCK=0;_nop_();_nop_();_nop_();_nop_();_nop_();CLOCK=1;_nop_();_nop_();_nop_();_nop_();_nop_();}}void get()//获取数据{START=1;wait(10);START=0;wait(10);wait(10);OE=1;_data=P0;OE=0;START=0;}void show()//发送到串口与led灯{P1=_TI=0;SBUF=_while(!TI);TI=0;}void main(){int j=0;init();//初始化while(1){P2=0;j=0;for(i=0;i&10;i++)//测10次后显示 {get();//获得数据j+=_}_data=j/10;show();//发送数据<p class="lanlink">
相关阅读:
下一篇:暂无
相关推荐:
“如果发现本网站发布的资讯影响到您的版权,可以联系本站!同时欢迎来本站投稿!
本周热门资讯排行在电子工程世界为您找到如下关于“ADC12”的新闻
ADC12资料下载
使用单通进行ADC转换,电压参考源来自外部。ADC12的Vr+=VeREF+,Vr-=Avss; Vr+、Vr-是ADC12模块的最大值和最小值的参考电压源。当输入模拟电压信号等于或高于Vr+时,ADC12转换满幅输出,此时输出值为0x0FFF。而当输入模拟电压信号等于或小于Vr-时,ADC12转换输出为0,此时输出值为0x0000。
ADC12模拟电压的转换公式为: Nadc=4095 x...
msp430f149 ADC12电压测量1602显示,电压外界输入数字量显示。...
MSP430单片机的ADC12模块是一个12位精度的A/D转换模块,他具有高速度,通用性等特点。大部分都内置了ADC模块.而有些不带ADC模块的片子,也可通过利用内置的模拟比较器来实现AD的转换。在系列产品中,我们可以通过以下列表来简单地认识他们的ADC功能实现。...
ADC12提供4种转换模式: 单通道单次转换 对选定的通道进行单次转换要进行如下设置:x=CSStartAdd,指向转换开始地址ADC12MEMx存放转换结果 ADC12IFG.x为对应的中断标志 ADC12MCTLx寄存器中定义了通道和参考电压 转换完成时必须使ENC再次复位并置位(上升沿),以准备下一次转换。在ENC复位并再次置位之前的输入信号将被忽略。...
对TI MSP430单片机ADC12模块的基本介绍...
MSP430x14x的有关ADC12开发源代码...
MSP430x14x的有关ADC12开发源代码...
MSP430 ADC12模块...
MSP430功能模块详解系列之——ADC12...
MSP430教程14:MSP430单片机ADC12模块....
ADC12相关帖子
UART_Send((0x1&&6)|(data&&6)&0x3f);
UART_Send(data&0x3f);
data是ADC12转换得到的。
这两句串口代码是什么意思?
是分别取高六位和低六位么?
串口通信 高六位前面还置了一个1,具体啥意义要参考通信协议,光看代码的意义不大。...
1、首先我觉得你不熟悉的话,就一句一句去添加注释,把每条语句吃透。。。。别拿个官网的例程在那里一步步的debug直到恶心,这样没什么用,非但解决不了问题还浪费时间;
2、我记得手册中有对LMP的几种模式做对比。那个对比里面写了在该模式下,时钟等等的一些关闭、打开的情况(多看手册哦 ,抱着例程啃是不出效果的哦。)
3、你的ADC12的中断里...
Fahrenheit
& & 2.// ((A10/mV) - 829mV)*(1/2.033mV) = (A10/) - 408&&同理,此处的829mv和2.033mv是表示什么,等号右边的738和408是什么意思
MSP430f5系列,使用ADC12模块测芯片内部温度 【MSP430趣谈】MSP430第十二讲之ADC(下...
各位前辈,想问一个问题很久了~~
就是我最近在学MSP430f5529
但是板子上的IO不足,不知道你们是怎么处理的?
比如f5529的P1-P2带有外部中断功能,但是板子上不足16个IO,会不会有时候不够用呢?
还有,比如AD采集通道复用的IO,看了手册,应该有12路外部输入,4路内部输入,那么就应该有12路与IO复用了
上面2个图是手册ADC12采样通道的截图,右下角标明了IO...
; & & & & & // Disable ADC12 and Timer_A0
& & & & & & & & & & & & ADC12_B_disable(ADC12_B_BASE);
& &nbsp...
在看msp430的ADC程序时 产生了疑问ADC12CTL0 = ADC12ON + SHT0_8 + MSC + REFON + REF2_5V;& &//使用内部电压,打开ADC12内核,8分频,内部参考电压2.5V&&& && && && &ADC12MCTL0...
& && && & REFCTL0 &= ~REFMSTR;
& && && & ADC12CTL0 = ADC12ON+ADC12MSC+ADC12SHT0_4+ADC12REFON;//+ADC12REF2_5V; // Turn on ADC12, extend...
;& && && &// Enable A/D channel inputs
& &ADC12CTL0 |= ADC12ON+MSC+SHT0_2;& && && & // Turn on ADC12, extend sampling time采样时间?&nbsp...
用户手册。还有一点TA本身有PWM输出功能,无须借用中断功能。在这个问题上经常出现应用弯路的是如何结合TA和AD实行定时采样的问题,很多人都是在TA中断里打开AD这样来做。这是不适宜的,因为430 的ADC10,ADC12(SD16不熟悉,没发言权)模块均有脉冲采样模式和扩展采样模式。只要选择AD是由TA触发采样,然后把TA设置成PWM输出模式,当然输出PWM波的都是特殊功能脚,但是在这里它是不需要...
初学者我写了一个利用430内部的ADC12做的电压显示
结果什么都不接就有1.2v-1.3v的显示。利用电压表测了也的确那I/O口也有这么高的电压。
但是这样外接其他东西检测电压根本检测不准。求各位大大告诉我怎么解决这个问题呀!
这个是ADC12的部分程序
void adc12_init()
P6SEL|=BIT0;
ADC12CTL0...
本周热门资源推荐

我要回帖

更多关于 adc转换原理 的文章

 

随机推荐