pic单片机ad转换c程序是AD转换吗

51单片机综合学习系统之 AD模数转换实验篇
51单片机综合学习系统之 AD模数转换实验篇 《电子制作》2008年8月 站长原创,如需引用请注明出处
&&&&大家好,通过以前的学习,我们已经对51单片机综合学习系统的使用方法及学习方式有所了解与熟悉,学会了使用SPI总线的基本知识,体会到了综合学习系统的易用性与易学性,这一期我们将一起学习AD模数转换的基本原理与应用实例。
&&&&先看一下我们将要使用的51单片机综合学习系统能完成哪些实验与产品开发工作:分别有流水灯,数码管显示,液晶显示,按键开关,蜂鸣器奏乐,继电器控制,IIC总线,SPI总线,PS/2实验,AD模数转换,光耦实验,串口通信,红外线遥控,无线遥控,温度传感,步进电机控制等等。主体系统如图1所示,其配套书本教程《单片机快速入门》如图2所示。
图1 51单片机综合学习系统主机部分图片
图2 51单片机综合学习系统配套书本教程――《单片机快速入门》
&&&&上图是我们将要使用的51单片机综合学习系统硬件平台,如图1所示,本期实验我们用到了综合系统主机、板载的ADC0832 模数转换芯片,综合系统其它功能模块原理与使用详见前几期《电子制作》杂志及后期连载教程介绍。
&&&&在工业控制和智能化仪表中,通常由微型计算机进行实时控制及实时数据处理。计算机所加工的信息总是数字量,而被控制或被测量的有关参量往往是连续变化的模拟量,如温度、速度、压力等等,与此对应的电信号是模拟信号。模拟量的存储和处理比较困难,不适合作为远距离传输且易受干扰。在一般的工业应用系统中传感器把非电量的模拟信号变成与之对应的模拟信号,然后经模拟(Analog)到数字(Digital)转换电路将模拟信号转成对应的数字信号送微机处理。这就是一个完整的信号链,模拟到数字的转换过程就是我们经常接触到的ADC(Analog to Digital Convert)电路。
模-数转换(ADC)简介
模-数转换原理
&&&&ADC的转换原理根据ADC的电路形式有所不同。&&ADC电路通常由两部分组成,它们是:采样、保持电路和量化、编码电路。其中量化、编码电路是最核心的部件,任何ADC转换电路都必须包含这种电路。&ADC电路的形式很多,通常可以并为两类:
&&&&间接法:它是将采样-保持的模拟信号先转换成与模拟量成正比的时间或频率,然后再把它转换为数字量。这种通常是采用时钟脉冲计数器,它又被称为计数器式。它的工作特点是:工作速度低,转换精度高,抗干扰能力强。
&&&&直接法:通过基准电压与采样-保持信号进行比较,从而转换为数字量。它的工作特点是:工作速度高,转换精度容易保证。&
&&&&模―数转换的过程有四个阶段,即采样、保持、量化和编码。
&&&&采样是将连续时间信号变成离散时间信号的过程。经过采样,时间连续、数值连续的模拟信号就变成了时间离散、数值连续的信号,称为采样信号。采样电路相当于一个模拟开关,模拟开关周期性地工作。理论上,每个周期内,模拟开关的闭合时间趋近于0。在模拟开关闭合的时刻(采样时刻),我们就“采”到模拟信号的一个“样本”。
&&&&量化是将连续数值信号变成离散数值信号的过程。理论上,经过量化,我们就可以将时间离散、数值连续的采样信号变成时间离散、数值离散的数字信号。
&&&&我们知道,在电路中,数字量通常用二进制代码表示。因此,量化电路的后面有一个编码电路,将数字信号的数值转换成二进制代码。
&&&&然而,量化和编码总是需要一定时间才能完成,所以,量化电路的前面还要有一个保持电路。保持是将时间离散、数值连续的信号变成时间连续、数值离散信号的过程。在量化和编码期间,保持电路相当于一个恒压源,它将采样时刻的信号电压“保持”在量化器的输入端。虽然逻辑上保持器是一个独立的单元,但是,工程上保持器总是与采样器做在一起。两者合称采样保持器。
八位串行A/D转换器ADC0832简介
&&&&ADC0832 是美国国家半导体公司生产的一种8 位分辨率、双通道A/D转换芯片。由于它体积小,兼容性强,性价比高而深受单片机爱好者及企业欢迎,其目前已经有很高的普及率。ADC083X是市面上常见的串行模―数转换器件系列。ADC0831、ADC0832、ADC0834、ADC0838是具有多路转换开关的8位串行I/O模―数转换器,转换速度较高(转换时间32uS),单电源供电,功耗低(15mW),适用于各种便携式智能仪表。本章以ADC0832为例,介绍其使用方法。
&&&&ADC0832是8脚双列直插式双通道A/D转换器,能分别对两路模拟信号实现模―数转换,可以用在单端输入方式和差分方式下工作。ADC0832采用串行通信方式,通过DI 数据输入端进行通道选择、数据采集及数据传送。8位的分辨率(最高分辨可达256级),可以适应一般的模拟量转换要求。其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在0~5V之间。具有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。独立的芯片使能输入,使多器件挂接和处理器控制变的更加方便。
&&&&ADC0832 具有以下特点:
? 8位分辨率;
? 双通道A/D转换;
? 输入输出电平与TTL/CMOS相兼容;
? 5V电源供电时输入电压在0~5V之间;
? 工作频率为250KHZ,转换时间为32μS;
? 一般功耗仅为15mW;
? 8P、14P―DIP(双列直插)、PICC 多种封装;
? 商用级芯片温宽为0°C to +70°C,工业级芯片温宽为-40°C to +85°C;
图3 ADC0832引脚图
芯片接口说明:
? CS_ 片选使能,低电平芯片使能。
? CH0 模拟输入通道0,或作为IN+/-使用。
? CH1 模拟输入通道1,或作为IN+/-使用。
? GND 芯片参考零电位(地)。
? DI 数据信号输入,选择通道控制。
? DO 数据信号输出,转换数据输出。
? CLK 芯片时钟输入。
? Vcc/REF 电源输入及参考电压输入(复用)
ADC0832的工作原理:
&&&&正常情况下ADC0832 与单片机的接口应为4条数据线,分别是CS、CLK、DO、DI。但由于DO端与DI端在通信时并未同时使用并与单片机的接口是双向的,所以在I/O口资源紧张时可以将DO和DI并联在一根数据线上使用。当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用,CLK 和DO/DI 的电平可任意。当要进行A/D转换时,须先将CS使能端置于低电平并且保持低电平直到转换完全结束。此时芯片开始转换工作,同时由处理器向芯片时钟(CLK)输入端输入时钟脉冲,DO/DI端则使用DI端输入通道功能选择的数据信号。在第一个时钟脉冲的下沉之前DI端必须是高电平,表示启始信号。在第二、三个脉冲下沉之前DI端应输入两位数据用于选择通道功能。
工作方式说明
单端输入方式
表1:通道地址设置表
&&&&如表1所示,当此两位数据为“1”、“0”时,只对CH0 进行单通道转换。当2位数据为“1”、“1”时,只对CH1进行单通道转换。当两位数据为“0”、“0”时,将CH0作为正输入端IN+,CH1作为负输入端IN-进行输入。当两位数据为“0”、“1”时,将CH0作为负输入端IN-,CH1 作为正输入端IN+进行输入。到第三个脉冲的下降之后DI端的输入电平就失去输入作用,此后DO/DI端则开始利用数据输出DO进行转换数据的读取。从第4个脉冲下降沿开始由DO端输出转换数据最高位Data7,随后每一个脉冲的下降沿DO端输出下一位数据。直到第11个脉冲时发出最低位数据Data0,一个字节的数据输出完成。也正是从此位开始输出下一个相反字节的数据,即从第11个字节的下降沿输出Data0。随后输出8位数据,到第19 个脉冲时数据输出完成,也标志着一次A/D转换的结束。最后将CS置高电平禁用芯片,直接将转换后的数据进行处理就可以了。时序说明请参照图4。
&&&&作为单通道模拟信号输入时ADC0832的输入电压是0―5V且8位分辨率时的电压精度为19.53mV,即(5/256)V。如果作为由IN+与IN-输入的输入时,可是将电压值设定在某一个较大范围之内,从而提高转换的宽度。但值得注意的是,在进行IN+与IN-的输入时,如果IN-的电压大于IN+的电压则转换后的数据结果始终为00H。
ADC0832的工作时序
图4 ADC0832工作时序
ADC0832软硬件设计实例
&&&&通过以上的理论学习之后,对模―数转换应该有了一定的了解,接下来就根据上文的指导,对ADC0832进行实际应用,以加深印象。本实例功能是将通道1上采样到的电压显示在LED数码管上,通过改变通道1的输入电压变化,观察输出读数。本实例调试前要先将功能选择开关调到ADC0832位置上,如图5,图6所示。
图5 ADC0832实验演示图
图6 ADC0832实验演示图
硬件原理图
图7 硬件原理图
程序流程图
图8 软件流程图
????????????&&&&相信看到这里,你应该可以理解我们是如何利用单片机来进行模数转换的处理了,你也可以根据自己的需要来写些AD模数转换相关的应用程序,如数字温度计,湿度传感应用,压力传感应用等等。由于篇幅有限,读者朋友可以通过网站或电子邮件一起交流与学习。在下几期中,我们将陆续介绍51单片机综合学习系统的其它功能原理与应用。
以上部分内容转载于网上,如有涉及到版权问题,请即通知本人删除 浙ICP备号
联系地址:浙江省杭州市北部软件园区乐富智汇园12栋6层
邮政编码:310011&Email:
电话总机:0 &&产品咨询:转分机1 &&技术支持:转分机2 &&传真:转分机3 &&手机:
技术QQ熊工:
技术QQ徐工:
杭州晶控电子有限公司 版权所有
COPYRIGHT2003――2011 HANGZHOU KinCony ELECTRONICS CO.,LTD All
rights reserved温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(7033)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_080',
blogTitle:'STC单片机AD转换程序',
blogAbstract:'注:此为转帖,供学习参考用\r\n#include &STC12C2052AD.h&&&& //定义的 系统头文件和全局变量#include &intrins.h&\r\n#define uchar unsigned char#define uint unsigned int#define DogReset() &&&WDT_CONTR=0x35\r\n// T1 定时 0.1ms.作为系统计时用,#define&vT01ms&&&&2#define&vT10ms&&&&10#define&vT100ms&&&&10',
blogTag:'ad转换程序',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:9,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}STC12C5A60S2单片机的10位AD转换程序
单片机&嵌入式
单片机应用
嵌入式操作系统
学习工具&教程
学习和开发单片机的必备工具
(有问必答)
(带你轻松入门)
电子元件&电路模块
当前位置: >>
>> 浏览文章
STC12C5A60S2单片机的10位AD转换程序
//****************************************STC12C5A60S2 AD转换***********************************************//
#include&stc12c5a.h& //头文件在STC公司主页上下载
#include&stdio.h&
#include&intrins.h&
//------------------------------------------------------------------------------
void AD_init();
void serial_init();
void delay(unsigned int a);
float AD_work(unsigned char channel);
unsigned int AD_get(unsigned char channel);
//------------------------------------------------------------------------------
void main()
AD_init();&&& //A/D转换初始化
serial_init();&& //串口初始化
&& for(i=0;i&8;i++) //循环发送P1.0-P1.7的转换数值
&&& TI=1;&&& //使用printf函数前须先将发送标志位TI置1
&&& printf(&The P1.%bd voltage is %f\n&,i,AD_work(i));
&&& delay(1000); //延时约1s
//------------------------------------------------------------------------------
unsigned int AD_get(unsigned char channel)
ADC_CONTR=0x88|&&& //开启AD转换 即POWER SPEED1 SPEED0 ADC_FLAG&& ADC_START CHS2 CHS1 CHS0
_nop_(); _nop_(); _nop_(); _nop_();//要经过4个CPU时钟的延时,其值才能够保证被设置进ADC_CONTR 寄存器
while(!(ADC_CONTR&0x10));&&& //等待转换完成
ADC_CONTR&=0xe7;&&&&& //关闭AD转换,ADC_FLAG位由软件清0
return(ADC_RES*4+ADC_RESL);&& //返回AD转换完成的10位数据(16进制)
//------------------------------------------------------------------------------
float AD_work(unsigned char channel)
float AD_&&&& //定义处理后的数值AD_val为浮点数
for(i=0;i&100;i++)
AD_val+=AD_get(channel); //转换100次求平均值(提高精度)
AD_val/=100;
AD_val=(AD_val*5)/1024; //AD的参考电压是单片机上的5v,所以乘5即为实际电压值
return AD_
//------------------------------------------------------------------------------
void delay(unsigned int a) //延时约1ms
while (--a!=0)
for(i=600;i&0;i--);&& //1T单片机i=600,若是12T单片机i=125
//------------------------------------------------------------------------------
void serial_init()
TMOD=0x20;
TL1=0 //设置9600波特率
SCON=0x50; //串口方式1,允许接收
//------------------------------------------------------------------------------
void AD_init()
P1ASF=0 //P1口全部作为模拟功能AD使用
ADC_RES=0;&& //清零转换结果寄存器高8位
ADC_RESL=0; //清零转换结果寄存器低2位
ADC_CONTR=0x80;//开启AD电源
delay(2);&& //等待1ms,让AD电源稳定
【】【】【】【】
上一篇:下一篇:
CopyRight @
单片机教程网
, All Rights Reserved单片机(15)
&&&& 一个设计,要求显示电池电量,电源是充电电池,工作电压在4.4~5.4V中间,想做出和手机那样的效果,有4格的电量显示,用AD实现,AD转换的参考电压是随着电源电压的变化而变化的(Vref=VDD),如何检测成本最低?
&&&& 用反算法,AD参考基准设为电源VDD,测二极管正向压降,倒算出电源电压,最低成本。
&&&& VDD/VF=1024/AD
&&&& VDD=1024*VF/AD
&&&& 上式中:&
&&&& VF&=二极管正向压降基本不变视作常数
&&&& VDD=电源电压
&&&& AD----AD采样值
&&&& 一般测电源电压的方法是用PIC的一个引脚作参考电压输入,外接TL431之类的基准源,用另一个引脚测分压后的电源电压,这当然是最容易实现的方法。
&&&& 这里说的是只用一个AD引脚来实现测单片机电源VDD的方法:
&&&& PIC单片机的AD可以设成以Vdd为参考电压,这样在Vdd是稳定的情况下,AD采样值*Vdd/1024即为被测电压。即:
&&&& Vi=AD*Vdd/1024
&&&& 但电池供电的系统电源Vdd是不稳的,正是我们的测量对象,那么我们是不是可以让Vi不变,作为参考电压,倒算出电源Vdd呢?事实上是可行的。我们用一个引脚测一个固定的电压Vi这样可以推算出:
&&&& Vdd=Vi*1024/AD
我们可以找到各种固定电压的器件,稳压管、基准电源等。在只要显示4格电源变化的情况下用一个二极管也是可以保证精度的。列如采用的二极管的正向压降为0.7V,上式就可以写成:
&&&& Vdd=717/AD
&&&& 这就实现在用一个引脚测电源的方法。
&&&& 上述方法只对直接用电池供电的PIC单片机有效,对经稳压后供单片机的不可以用上述方法。对其它单片机没试过。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:178476次
积分:2270
积分:2270
排名:第12382名
原创:28篇
转载:166篇
评论:20条
(1)(1)(1)(3)(2)(1)(1)(23)(7)(1)(4)(7)(8)(2)(6)(25)(24)(9)(10)(12)(10)(27)(2)(2)(1)(2)(2)单片机之AD学习笔记
最近调试了几个单片机的AD转换模块,碰到了一些问题,总结了一下
AD转换就是选通道、比较电压、要采集电压的端口设置为模拟端口&
1、选择参考电压源
2、选择AD转换时钟
3、要采集电压的端口设置为模拟端口
4、选择要采样的模拟通道
5、使能AD模块
开始看此部分是调试电池电量的时候,是由于电池电量显示不准确,debug模式下,看ad采集到的电压被转换成的数据,发现寄存器ADC1BUF中的数据只有关开机是正确的,以后的值都是不对的好像大多数的值是零,后来发现是由于在主循环中的某个模块又把原来配置为模拟输入端口引脚还原成了普通的I/O口了(就是AD1PCFGbits.PCFG0先被配置为0后又被置1,我用的是通道0)。
A/D代码初始化实例&
AD1PCFG = 0; // 配置ad端口,配置所有端口为模拟端口,要是作为普通io使用必须置1
AD1CON1 = 0x2208; // 配置采样时钟源
AD1CON2 = 0; // 配置A/D 比较电压,转换在每个采样结束后开始
AD1CON3 = 0; // 配置 A/D 转换时钟 是&Tcy/2
AD1CHS = 0; // 配置输入通道,CH0+&输入
AN0,CH0-&输入 Vr- (AVss).
AD1CSSL = 0; // 输入扫描被禁止
IFS0bits.AD1IF = 0; // 清中断
IPC3bits.AD1IP2 =&1;
IPC3bits.AD1IP1 =&1;
IPC3bits.AD1IP0 =&0; //&配置 A/D
中断优先级
IEC0bits.AD1IE = 1; //&使能 A/D 中断
AD1CON1bits.ADON = 1; //&打开 A/D
AD1CON1bits.SAMP = 1; // 开始采样输入
Delay(); //延时,确保开始转换时,采样的时间已结束
AD1CON1bits.SAMP = 0; // A/D采样结束,开始转换
void __attribute__ ((__interrupt__)) _ADC1Interrupt(void)
IFS0bits.AD1IF = 0;
在pic的数据手册中有比较详细的例程,值得参考
这个单片机的比较电压可以选择内部或外部的
问题:AD转换,单通道单次转化和单通道多次转换有什么区别
单次转换是指进行一次转换前需要你给一次指令。
连续转换的话开启后自动连续进行转换,转换的数据连续进行更新。
如果你采用单次转换,就需要不断发送转换的命令,读取结果,再发转换命令,再读。就是循环啦。
如果连续转换开启的话,就在程序中循环读就可以了。
在采集电池电压时遇到了问题,3.9v到4.2v的电压得到的ad转换的电压值的寄存器存储的电压值正常,3.9v以下的值不正确,发现是Vref+输入的比较电压不稳定造成的。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 stc单片机ad转换程序 的文章

 

随机推荐