《实验5 STC单片机ADC转换实验.docx》由会员分享,可在线阅读,更多相关《实验5 STC单片机ADC转换实验.docx(10页珍藏版)》请在三一办公上搜索。
1、实验5 STC单片机ADC转换实验-V201703171. 实验目的学习STC12C5A单片机ADC知识;2. 实验设备硬件:12号节点,串口线;软件:Keil u Vision4编译软件,STC下载软件STC_ISP;芯片手册:配套光盘附件芯片手册STC单片机手册源码路径:配套光盘源代码单片机原理与技术实验5 STC单片机ADC转换实验 -V20170317hex路径:配套光盘源代码单片机原理与技术实验5 STC单片机ADC转换实验 -V20170317outADC.hex3. 实验原理3.1 A/D相关寄存器介绍与A/D转换有关的寄存器如表3.1所示:表3.1 A/D相关寄存器符号描述地址
2、位地址长其符号MSBLSB复位值P1ASFPl Analof Functioni ConGgure rcgislci9DHP17ASFF】姬FPI5A5FP13呼P1IA5FOOOOOOOOBADC.COMItADC Ccntitjl Rt新血BCH加皿 5PE丑J 5F5EDQADCJMCrCJE2 Cffil CEiSC000Q0000BADC RESADC ResuJi higliBDHOOOOOOOOBADC_RLSLADC Result lowBE11OOOOOOOOBAUXR1Auziha register 1A2H-FSPI_F44 GF2ADRJ -BPSsDDOOthOBIE
3、Interrupt EnableA8I1EAE1ATEADCISETIESIEKdOOOOOOOOBIPLnteucpt Priori LowBSHPPCAPLVDPADC涔PT1PXlproPXQ000Q0000BIPHInternet Priority HighB7HFPCAHEAIXIIPSHPT1HPX1HPTCHPXOH000Q0000BP1ASF: P1 口的模拟功能控制器。STC12C5A16S2系列单片机的A/D转换口,在P1 口(P1.7-P1.0),上电复位后P1 口默认为弱上拉型I/O 口,用户可以通过软件设置将8路中的 任何一路设置为A/D转换,不需作为A/D使用的P1
4、 口可继续作为I/O 口使用(建议只作为 输入)。需作为A/D使用的口需先将P1ASF特殊功能寄存器中的相应位置为1将相应的 口设置为模拟功能。P1ASF寄存器的定义如表3.2所示:表3.2 P1ASF寄存器定义SFR mineAddressbitB7B6B5B4B3B2BJBOP1ASF9DnamePPASFP16ASFFl 5 ASFF14ASFP13ASFP12ASFPHASEP10ASFADC_CONTR:ADC控制寄存器。该寄存器的描述如表3.3所示:表3.3 ADC_CONTR寄存器定义SFR. nameAddictbitB7B6B5B4B3B2BlBOADC_CONTRBCHLi
5、atneSPEED 1SPEEDSADC_FLAGADC_SIARTCHS2CHS1CHSO对ADC_CONTR寄存器的操作建议使用直接赋值语句,不要使用“与”和“或”语句。ADC_POWER: ADC电源控制位。0:关闭A/D转换器电源1:打开A/D转换器电源建议进入空闲模式时,将ADC电源关闭,即ADC_POWER =0。启动A/D转换前一定 要确认A/D电源已打开,A/D转换结束后关闭A/D电源可降低功耗,也可不关闭。初次打 开内部A/D转换模拟电源,需适当延时,等内部模拟电源稳定后,再启动A/D转换。建议启动A/D转换后,在A/D转换结束之前,不改变任何I/O 口的状态,有利于高精 度
6、A/D转换,若能将定时器/串行口/中断系统关闭更好。SPEED1,SPEED0:模数转换器转换速度控制位,其描述如表3.4所示:表 3.4 SPEED1、SPEED0 描述SPEED 1SPEEDO转换所需时间119。个时钟周期转换一次,CPU工作频率NlMHz:时, &/D转换速度约250KHz10如0个时钟周期转换一次0136。个肘钟周期转换一次005的个时钟周期转换一次ADC_FLAG:模数转换器转换结束标志位,当A/D转换完成后,ADC_FLAG=1,要由 软件清0。不管是A/D转换完成后由该位申请产生中断,还是由软件查询该标志位A/D转 换是否结束,当A/D转换完成后,ADC_FLA
7、G = 1,一定要软件清0。ADC_START:模数转换器(ADC)转换启动控制位,设置为“1”时,开始转换,转换结 束后为0。CHS2/CHS /CHS0:模拟输入通道选择,CHS2/CHS1/CH0描述如表3.5所示:图 3.5 CHS2/CHS1/CH0 定义CHS2CHS1CHSOAnalog Cliaimel Select (模拟输入通道选择)000选择0作为;VD输入来月1D01选择Pl, 1作为A/D输入来用010选择P1.2作为A/D输入来用011选样P1.3作为常D输入来用100选择Pl. 1作为*D输入来用101选择Pl. b作为#0输入来月110选择PL 6作为A/D输入
8、来用111选择P1. 7作为A/D输入来用ADC_RES、ADC_RESL:ADC结果寄存器。该寄存器用于存A/D转换结果,其定义如 表3.6所示:表 3.6 ADC_RES、ADC_RESL 寄存器定义MuemomcAddB7B&BdB4B3B2BlBOAUC_RE5EDIID转操始 更寄存器高BEh抑转换结 果寄存器低AUXR1.VHAusiliary register 1-PCA_P4SPI_P4S2_P4GF2ADRJ-DPSAUXR1寄存器的ADRJ位是A/D转换结果寄存器(ADC_RES,ADC_RESL)的数据格式 调整控制位。当ADRJ=0时,10位A/D转换结果的高8位存放在
9、ADC_RES中,低2位存 放在ADC_RESL的低2位中,如表3.7所示:表3.7 ADRJ=0时AD结果MjiETKinicAddKameB7B6B5R4田R1B0ADC_RES玖g换结果 寄存器高8位ADCKES8ADC EE第ADC RE56ADCRE55ADC 旺 54颈孩3ADC_RSL3ELi槌转换结果 寄存器施发-ADC_EES1AUXR1AwdliaiyJCgLStCTlADRJ=O此时,如果用户需需取完整10位结果,按下面公式计算:Vin10-bitA/D Conversion Result:(ADC_RES7:0, ADC_RESL1:0) = 1024 xVcc如果用户
10、只需要8位结果,按下面公式计算:V1118-bit A/D Conversion Result: (ADC_RES7:0 )= 256 x-Vcc式中,Vin为模拟输入通道输入电压,Vcc为单片机实际工作电压,用单片机工作电压 作为模拟参考电压。当ADRJ=1时,10位A/D转换结果的高2位存放在ADC_RES的低2位中,低8位存 放在ADC_RESL中。MnfmoDBCAddNeiaieB7B6B5B4B3B2BlBDAD_RESBDhA/D转换结果寄存器高,位-ADCJtEi贷.XE_RE5B.DC RESLBBhA/D转换站果 寄存器值$位AECRESTADC RESSADC更E弱ADC
11、 RES41ADC BESSADC RES2ADC EES1AIX REMAUXR1A2HAuxiliary registerADRJ -1此时,如果用户需要完整10位结果,按下面公式计算:Viii10-bit AD Conveision Result:(ADC_RES1:O. ADC_RESL7:0) - 1024 x 式中,Vin为模拟输入通道输入电压,Vcc为单片机实际工作电压,用单片机工作电压 作为模拟参考电压。IE:中断允许控制寄存器。该寄存器的描述如表3.8所示:表3.8 IE寄存器定义SFR nameAddressbitB7B6B5B4B3B2BlBOI】:ASHnameEAEL
12、VDEADCHSliTlEXIItTOEXOEA: CPU的中断开放标志,EA=1,CPU开放中断,EA=0,CPU屏蔽所有的中断申请。 EA的作用是使中断允许形成多级控制。即各中断源首先受EA控制;其次还受各中断源自己 的中断允许控制位控制。EADC: A/D转换中断允许位EADC=1,允许A/D转换中断EADC=0,禁止A/D转换中断如果要允许A/D转换中断则需要将相应的控制位置1:1、将EADC置1,允许ADC中断,这是ADC中断的中断控制位。2、将EA置1,打开单片机总中断控制位,此位不打开,也是无法产生ADC中断的 A/D中断服务程序中要用软件清A/D中断请求标志位ADC_FLAG(
13、也是A/D转换结束标志 位)。IPH、IP:中断优先级控制寄存器,该寄存器的定义如表3.9所示:表3.9 IPH、IP寄存器定义SFR nameAddressbitB7B6B5BlB3B2BlBOIPBB7HnamePPCAHPLVDHPADCHPSEPT1HPX1HPT()HPXOHSFR nameAddressbnB7B6B5B4B3B2BlBOIPBSHnamePPCAPLVDPADCPSPT1PX1PTOPXOPADCH,PADC,A/D转换中断优先级控制位。当PADCH=0且PADC=0时,A/D转换中断为最低优先级中断(优先级0)当PADCH=0且PADC=1时,A/D转换中断为较
14、低优先级中断(优先级1)当PADCH=1且PADC=0时,A/D转换中断为较高优先级中断(优先级2)当PADCH=1且PADC=1时,A/D转换中断为最高优先级中断(优先级3)4.实验步骤4.1编写实验源代码文件4.1.1打开Keil集成开发环境,打开配套光盘源代码单片机原理与技术实验5 STC 单片机ADC转换实验-V20170317下的工程文件,编译源码,生成ADC.hex可执行文件,该 可执行文件自动保存在配套光盘源代码单片机原理与技术实验5 STC单片机ADC转换实 验-V20170317out目录下。(注意:请根据该目录下ADC.hex文件的生成时间,判断该文件 是否是自己刚刚编译完
15、成的)4.1.2将12号节点的开关S1拨打到左边,让STC单片机与DB9相连。4.1.3根据配套光盘第三方应用软件STC_ISPSTC-ISP软件使用说.明书,使用 STC-ISP软件将4.1.1步中生成的可执行ADC.hex文件通过STC_ISP串口下载软件,下载到 12号节点的STC单片机中。4.2实验源代码解析ADC.c源代码/*晶振频率:选取用RC 11.0592MHz*文件名:ADC.c*功能说明:STC12C5A16S2单片机的A/D转换演示实验*制作:*变更记录:2013.05.5*变更内容:新建造*/* 用户系统配置 */#define MAIN_Fosc 11059200L
16、/定义主时钟 模拟串口和和延时会自动适 应。535MHZ/*以下宏定义用户请勿修改*/#include reg51.H#define uchar unsigned char#define uint unsigned int/* 特殊寄存器声明*/sfr P1ASF = 0x9D; /12C5A60AD/S2系 列模拟输入(AD或 LVD)选择sfr ADC_CONTR = 0xBC; 带 AD 系列sfr ADC_RES= 0xBD; 带 AD系列sfr ADC_RESL = 0xBE; 带 AD 系列#define#define#define#define#define#define#def
17、ine#define#define#define#define#define#define#define#define#defineADC_OFF()ADC_CONTR =0 /AD转换关ADC_ON(17)/ADC转换开ADC_90T(35)/90个时钟周期转换一次ADC_180T(25)/18 0个时钟周期转换一次ADC_360T(15)/360个时钟周期转换一次ADC_540T0/540个时钟周期转换一次ADC_FLAG(14)/软件清0ADC_START(13)/开始ADC转换ADC_CH00/P1_0作为AD转换通道ADC_CH11/P1_1作为AD转换通道ADC_CH22/P1_2
18、作为AD转换通道ADC_CH33/P1_3作为AD转换通道ADC_CH44/P1_4作为AD转换通道ADC_CH55/P1_5作为AD转换通道ADC_CH66/P1_6作为AD转换通道ADC_CH77/P1 7作为AD转换通道/* 本地变量声明 */ sbit P_TXD1 = P3;/* 本地函数声明 */void Tx1Send(uchar dat);void PrintString(unsigned char code *puts);voiddelay_ms(unsigned char ms);uintadc10_start(uchar channel); /channel = 07*
19、函数名:main( void )*输入:无*输出:无*功能描述:串口初始化参数为600 8 N 1.* 程序一开始执行输出然后将A/D转换的* 值通过串口输出*void main(void)(uint j;PrintString(*rn)上7电后串口发送一条提示信 息P1ASF = (1 ADC_CH0);/STC12C5A16S2的 模拟输 A(AD 转换通道选择ADC_CONTR = ADC_360T | ADC_ON;while(1)(delay_ms(250);delay_ms(250);delay_ms(250);delay_ms(250);j = adc10_start(0); /
20、 P1_0 开启 AD 转换Tx1Send(A);Tx1Send(D);Tx1Send(0);Tx1Send(=);Tx1Send(j/1000 + 0);Tx1Send(j%1000/100 + 0);Tx1Send(j%100/10 + 0);Tx1Send(j%10 + 0);Tx1Send(0x0d);Tx1Send(0x0a);* 函数名:adc10_start(uchar channel)*输入:需要转换的ADC通道* 输出:无*功能描述:串口初始化参数为600 8 N 1.* 程序一开始执行输出然后将A/D转换的* 值通过串口输出*uint adc10_start(uchar c
21、hannel)(uint adc;uchar i;ADC_RES = 0;/AD转换结果高位寄存器清零ADC_RESL = 0;/AD转换结果低位寄存器清零ADC_CONTR = (ADC_CONTR & 0xe0) | ADC_START | channel;/A D转换控制寄 存器设置i = 250;do(if(ADC_CONTR & ADC_FLAG)/如果入。转换结束(ADC_CONTR &= ADC_FLAG;/软件清0 AD转换结束标志位adc = (uint)ADC_RES;/获取 AD 转换的高位adc = (adc 2) | (ADC_RESL & 3);/获取 AD转换的低
22、位return adc;/返回AD转换值while(i);return 1024;/* 函数名:delay_ms(unsigned char ms)*输入:延时数*输出:无*功能描述:产生毫秒级别延时* void delay_ms(unsigned char ms)(unsigned int i;do(i = MAIN_Fosc / 14000;while(i);/14T per loopwhile(ms);* 函数名:BitTime(void)* 输入:无* 输出:无*功能描述:位操作时间函数*void BitTime(void) 位时间函数(uint i;i = (MAIN_Fosc /
23、100) * 104) / 140000L - 1;根据主时钟来计算 位时间 while(i);/* 函数名:Tx1Send(uchar dat)*输入:发送字符*输出:无*功能描述:串口初始化参数为600 8 N 1.* 通过串口发送一个字符*void Tx1Send(uchar dat)(uchar i;EA = 0;P_TXD1 = 0;BitTime();for(i=0; i= 1;BitTime();P_TXD1 = 1;EA = 1;BitTime();BitTime();* 函数名:PrintString(unsigned char code *puts)* 输入:无* 输出:无* 功能描述:通过串口输出字符串*void PrintString(unsigned char code *puts)(for (; *puts != 0; puts+) Tx1Send(*puts); /遇到停止符0 结束 4.3程序执行效果第一步:关闭STC-ISP软件,S1开关拨打至左边,让DB9与STC单片机相连,打开 串口调试助手软件,配置串口参数,如图4.1所示:图4.1串口参数配置第二步:给12号节点上电,可以看到串口助手返回的AD值信息,如图4.2所示:图4.2 ADC运行结果