第9章 模数转换器_第1页
第9章 模数转换器_第2页
第9章 模数转换器_第3页
第9章 模数转换器_第4页
第9章 模数转换器_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第第页第9章模数转换器中国石油高校成功学院

1/16

第9章

模数转换器

9.1模数转换器的结构及相关寄存器

9.2模数转换器的应用

中国石油高校成功学院

2/16

STC12C5A60S2单片机集成有8路10位高速模数转换器(ADC),速度可达到250KHz(25万次/秒,可做温度检测、压力检测、电池电压检测、按键扫描、频谱检测等。

中国石油高校成功学院

3/16

9.1模数转换器的结构及相关寄存器STC12C5A60S2单片机片内集成8通道10位模数转换器(ADC)。ADC输入通道与P1口复用,上电复位后P1口为弱上拉型I/O口,用户可以通过软件设置将8路中的任何一路设置为A/D转换,不需作为A/D运用的口可继续作为I/O口运用。

中国石油高校成功学院

4/16

9.1.1模数转换器的结构ADC掌握寄存器ADC_CONTRADC_POWERSPEED1SPEED0ADC_FLAGADC_STARTCHS2CHS1CHS0

模拟输入信号通道选择开关CHS2/CHS1/CHS0A/D转换结果寄存器ADC_RES和ADC_RESLADC7/P1.7ADC6/P1.6ADC5/P1.5ADC4/P1.4ADC3/P1.3ADC2/P1.2ADC1/P1.1比较器ADC0/P1.0逐次比较寄存器

10-bitDAC

STC12C5A60S2单片机的模数转换器由多路选择开关、比较器、逐次比较寄存器、10位ADC、转换结果寄存器(ADC_RES和ADC_RESL)以及ADC掌握寄存器ADC_CONTR构成。

中国石油高校成功学院

5/16

9.1.2参考电压源STC12C5A60S2单片机A/D转换模块的参考电压源是输入工作电压Vcc,所以一般不用外接参考电压源。如三端稳压电路7805的输出电压是5V,但实际电压可能是4.88V到4.96V,假如用户需要的精度比较高,可在应用产品出厂前将实际测出的工作电压值记录在单片机内部的EEPROM里面,以供程序校正运用。假如Vcc不稳定(例如电池供电的系统中,电池电压经常在5.3V-4.2V之间漂移),那么需要在8路A/D转换的一个通道外接一个稳定的参考电压源,来计算出此时的工作电压Vcc,再计算出其他几路A/D转换通道的电压。例如,可在ADC转换通道的第七通道外接一个1.25V的基准参考电压源,由此求出此时的工作电压Vcc,再计算出其它几路A/D转换通道的电压。

中国石油高校成功学院

6/16

9.1.3与ADC有关的非常功能寄存器1.P1口模拟功能掌握寄存器P1ASF(地址为9DH,复位值为00H)位号位名称D7P17ASFD6P16ASFD5P15ASFD4P14ASFD3P13ASFD2P12ASFD1P11ASFD0P10ASF

假如要运用相应口的模拟功能,需将P1ASF非常功能寄存器中的相应位置为‘1’。如,假设要使用P1.6的模拟量功能,那么需要将P16ASF设置为1。(留意,P1ASF寄存器不能位寻址,可以使用汇编语言指令ORLP1ASF,#40H,也可以运用C语言语句P1ASF|=0*40;)

2.ADC掌握寄存器ADC_CONTR(地址为BCH,复位值为00H)位号D7D6SPEED1D5SPEED0D4ADC_FLAGD3ADC_STARTD2CHS2D1CHS1D0CHS0

位名称ADC_PO

WER

1)ADC_POWER:ADC电源掌握位。0:关闭ADC电源。1:打开ADC电源。2)SPEED1、SPEED0:ADC转换速度掌握位。各种设置如表9-1所示。3)ADC_FLAG:A/D转换结束标识位。A/D转换完成后,ADC_FLAG=1,要由软件清0。不管A/D转换完成后由该位申请产生中断,还是由软件查询该标识位判断A/D转换是否结束,当A/D转换完成后,ADC_FLAG=1,肯定要软件清0。4)ADC_START:A/D转换启动掌握位,ADC_START=1,开始转换;ADC_START=0,停止转换。5)CHS2、CHS1、CHS0:模拟输入通道选择,如表9-2所示。

中国石油高校成功学院

7/16

3.A/D转换结果寄存器ADC_RES、ADC_RESL非常功能寄存器ADC_RES(地址为BDH,复位值为00H)和ADC_RESL(地址为BEH,复位值为00H)用于保存A/D转换结果。A/D转换结果存储格式由帮助寄存器AU*R1(地址为A2H,复位值为00H)中的ADRJ掌握,ADRJ是AU*R1中的D2位。(1)当ADRJ=0时,10位A/D转换结果的高8位放在ADC_RES寄存器,低2位放在ADC_RESL寄存器。存储格式如下:D7ADC_RESADC_RESLAU*R1ADRJ=0ADC_RES9D6ADC_RES8D5ADC_RES7D4ADC_RES6D3ADC_RES5D2ADC_RES4D1ADC_RES3ADC_RES1D0ADC_RES2ADC_RES0

中国石油高校成功学院

8/16

3.A/D转换结果寄存器ADC_RES、ADC_RESL(2)当ADRJ=1时,10位A/D转换结果的最高2位放在ADC_RES寄存器的低2位,低8位放在ADC_RESL寄存器。存储格式如下:D7ADC_RESADC_RESLAU*R1ADC_RES7ADC_RES6ADC_RES5ADC_RES4ADC_RES3ADC_RES2ADRJ=1D6D5D4D3D2D1ADC_RES9ADC_RES1D0ADC_RES8ADC_RES0

模/数转换结果计算公式如下:ADRJ=0时,取10位结果(ADC_RES[7:0],ADC_RESL[1:0])=1024Vin/VccADRJ=0时,取8位结果ADC_RES[7:0]=256Vin/VccADRJ=1时,取10位结果(ADC_RES[1:0],ADC_RESL[7:0])=1024Vin/VccVin为模拟输入通道输入电压,Vcc为单片机实际工作电压,用单片机工作电压作为模拟参考电压。

4.与A/D转换中断有关的寄存器中断允许掌握寄存器IE中的EADC位(D5位)用于开放ADC中断,EA位(D7位)用于开放CPU中断;中断优先级寄存器IP中的PADC位(D5位)和IPH中的PADCH位(D5位)用于设置A/D中断的优先级。在中断服务程序中,要运用软件将A/D中断标识位ADC_FLAG(也是A/D转换结束标识位)清0。

中国石油高校成功学院

9.2

模数转换器的应用

9/16

STC12C5A60S2单片机ADC模块的运用编程要点如下:1)打开ADC电源,第一次运用时要打开内部模拟电源(设置ADC_CONTR)。2)适当延时,等内部模拟电源稳定。一般延时1ms以内即可。3)设置P1口中的相应口线作为A/D转换通道(设置P1ASF寄存器)。4)选择ADC通道(设置ADC_CONTR中的CHS2~CHS0)。5)依据需要设置转换结果存储格式(设置AU*R1中的ADRJ位)。6)查询A/D转换结束标识ADC_FLAG,判断A/D转

换是否完成,假设完成,那么读出结果(结果保存在ADC_RES和ADC_RESL寄存器中),并进行数据处理。假如是多通道模拟量进行转换,那么更换A/D转换通道后要适当延时,使输入电压稳定,延时量取20μs~200μs即可,与输入电压源的内阻有关,假如输入电压信号源的内阻在10K以下,可不加延时;假如是单通道模拟量转换,那么不需要更换A/D转换通道,也就不需要加延时。

8)假设采纳中断方式,还需进行中断设置(EADC置1,EA置1)。9)在中断服务程序中读取ADC转换结果,并将ADC中断恳求标识ADC_FLAG清零。

中国石油高校成功学院

【例9-1】编程实现利用STC12C5A60S2单片机ADC通道2采集外部模拟电压信号,8位精度,采纳查询方式循环进行转换,并将转换结果保存于30H单元中。假设时钟频率为18.432MHz。解:取8位精度时,可设置ADRJ=0,径直运用转换结果寄存器ADC_RES的值。由于复位后,ADRJ=0,因此,根据ADC的编程要点进行初始化后,径直判断ADC_FLAG标识是否为1,假设为1,那么读出ADC_RES寄存器的值,并存入30H即可;假设为0,那么继续等待。汇编语言程序代码如下:$INCLUDE(STC12C5A.INC);包含STC12C5A60S2单片机寄存器定义文件ADC_DATEQU30H;A/D转换结果ORG0000HLJMPMAINORG0050HMAIN:MOVSP,#70H;设置堆栈ORLADC_CONTR,#80H;开A/D转换电源,第一次运用时要打开内部模拟电源MOVA,#20HLCALLDELAY;开A/D转换电源后要加适当延时,1ms以内即可MOVP1ASF,#04H;设置P1.2的模拟量功能MOVADC_CONTR,#11100010B;选择P1.2作为A/D转换通道MOVA,#05HLCALLDELAY;假如切换A/D转换通道,那么需要加延时

10/16

中国石油高校成功学院

WAIT_AD:11/16ORLADC_CONTR,#00001000B;启动A/D转换MOVA,#00010000B;判断A/D转换是否完成ANLA,ADC_CONTRJZWAIT_AD;A/D转换尚未完成,继续等待ANLADC_CONTR,#11100111B;将ADC_FLAG清零MOVA,ADC_RES;读取A/D转换结果MOVADC_DAT,A;保存A/D转换结果LJMPWAIT_AD;等待下一次转换完成DELAY:;延时子程序PUSH02;将寄存器组0的R2入栈PUSH03;将寄存器组0的R3入栈PUSH04;将寄存器组0的R4入栈MOVR4,ADELAY_LOOP0:;DELAY_LOOP0循环延时202206个时钟周期MOVR3,#200;2个时钟周期Delay_LOOP1:;DELAY_LOOP1循环延时1002个时钟周期MOVR2,#249;2个时钟周期DELAY_LOOP:DJNZR2,DELAY_LOOP;4个时钟周期DJNZR3,DELAY_LOOP1;4个时钟周期DJNZR4,DELAY_LOOP0;4个时钟周期POP04POP03POP02RETEND

中国石油高校成功学院

12/16

C语言程序代码如下:#include“stc12c5a.h”//包含STC12C5A60S2单片机寄存器定义文件unsignedchardataadc_dat_at_0*30;//A/D转换结果变量voidmain(void){unsignedlongi;unsignedcharstatus;ADC_CONTR|=0*80;//开A/D转换电源,第一次运用时要打开内部模拟电源for(i=0;i1000

0;i++);//适当延时P1ASF=0*04;//选择P1.2作为A/D转换通道ADC_CONTR=0*E2;for(i=0;i10000;i++);//适当延时while(1)//循环进行A/D转换{ADC_CONTR|=0*08;//重新启动A/D转换status=0;while(status==0)//等待A/D转换结束{status=ADC_CONTR0*10;}ADC_CONTR=0*E7;//将ADC_FLAG清零adc_dat=ADC_RES;//保存A/D转换结果}}

中国石油高校成功学院

13/16【例9-2】编程实现利用STC12C5A60S2单片机ADC通道2采集外部模拟电压信号,10位精度,采纳中断方式进行转换,并将转换结果保存于30H和31H单元中。假设时钟频率为18.432MHz。解:根据编程要点进行初始化时,可设置ADRJ=1。在中断服务程序中读出ADC_RES寄存器的值,屏蔽高6位后存入31H单元,读出ADC_RESL寄存器的值,存入30H单元。汇编语言程序代码如下:$INCLUDE(STC12C5A.INC);包含STC12C5A60S2单片机寄存器定义文件ADC_HIEQU31H;A/D转换结果高2位ADC_LOWEQU30H;A/D转换结果低8位ORG0000HLJMPMAINORG002BHLJMPADC_ISR;ADC中断服务程序入口ORG0050HMAIN:MOVSP,#70H;设置堆栈ORLADC_CONTR,#80H;开A/D转换电源,第一次运用时要打开内部模拟电源MOVA,#20HLCALLDELAY;开A/D转换电源后要加适当延时,1ms以内即可MOVP1ASF,#04H;设置P1.2的模拟量功能MOVADC_CONTR,#11100010B;选择P1.2作为A/D转换通道MOVA,#05HLCALLDELAY;假如切换A/D转换通道,那么需要加延时ORLAU*R1,#04H;设置ADC转换结果存储格式(ADRJ=1)ORLADC_CONTR,#00001000B;启动A/D转换SETBEADC;EADC=1,开放ADC的中断掌握位

中国石油高校成功学院

SETBEA;开放CPU总中断SJMP$;循环等待中断ADC_ISR:;ADC中断服务程序入口ANLADC_CONTR,#11100111B;将ADC_FLAG清零MOVA,ADC_RES;读取A/D转换结果高2位ANLA,#03H;屏蔽高6位MOVADC_HI,A;保存A/D转换结果高2位MOVA,ADC_RESL;读取A/D转换结果低8位MOVADC_LOW,A;保存A/D转换结果低8位ORLADC_CONTR,#00001000B;重新启动A/D转换RETIDELAY:;延时子程序PUSH02;将寄存器组0的R2入栈PUSH03;将寄存器组0的R3入栈PUSH04;将寄存器组0的R4入栈MOVR4,ADELAY_LOOP0:;DELAY_LOOP0循环延时202206个时钟周期MOVR3,#200;2个时钟周期Delay_LOOP1:;DELAY_LOOP1循环延时1002个时钟周期MOVR2,#249;2个时钟周期DELAY_LOOP:DJNZR2,DELAY_LOOP;4个时钟周期DJNZR3,DELAY_LOOP1;4个时钟周期DJNZR4,DELAY_LOOP0;4个时钟周期POP04POP03POP02RETEND

14/16

中国石油高校成功学院

15/16

C语言程序代码如下:#include“stc12c5a.h”//包含STC12C5A60S2单片机寄存器定义文件unsignedchardataadc_hi_at_0*31;//A/D转换结果变量高2位unsignedchardataadc_low_at_0*30;//A/D转换结果变量低8位voidmain(void){unsignedlon

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论