您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 国内外标准规范 > 45单片机原理与应用
版权所有单片机原理及应用主讲:陈桂友博士E-mail:chenguiyou@sdu.edu.cnchenguiyou@126.com网址:模块应用举例MSC1211单片机ADC模块的使用编程要点如下:1)打开ADC(设置PDCON)2)设置基准电压、缓冲器(设置ADCON0)3)设置模拟采样频率(设置ACLK)4)选择输入端(设置ADMUX)5)设置抽取因子(设置ADCON2、ADCON3)6)设置极性、数字滤波模式、校准模式(设置ADCON1)7)如果采用中断方式,还需进行中断设置(设置AIE、EAI)版权所有【例10-1】编程实现利用MSC1211单片机集成的温度传感器测量芯片温度。解:MSC1211中集成有温度传感器,可以用来测量温度。其温度测量基于第289页中的公式。利用公式可以把电压转化成摄氏温度。首先配置ADC,允许ADC进行自校验,然后进入温度的循环采样。程序代码如下:#includeREG1211.H//包含相关头文件#includestdio.h#includestdlib.h#includemath.h#defineLSB298.0232e-9//LSB=5.0/2^24,定义满量程为5V的最小分辨率externvoidautobaud(void);//定义自动波特率,该函数存在于启动ROM中externlongbipolar(void);//定义结果的双极性输入函数voidmain(void){floatvolts,temp,resistance,ratio,lr,ave;//定义临时变量inti,k,decimation,samples;decimation=1728;//抽取因子设为1728CKCON=0;//外部存储器访问不扩展autobaud();//在计算机上按回车时,设置串口通信波特率USEC=10;//确定flash的写入时钟=系统时钟/(USEC+1)版权所有=9;//fACLK=1,105,920Hz,fMOD=fACLK/64=17,280HzADMUX=0xff;//温度测试模式PDCON&=0xf7;//启动ADCADCON0=0x30;//内部基准2.5V,缓冲器关,BOD关,PGA=1ADCON2=decimation&0xff;//写入抽取因子低字节ADCON3=(decimation8)&0x07;//写入抽取因子高字节ADCON1=0x01;//双极性,自动稳定模式,偏移增益自校准printf(“Cailbrating...\n”);for(k=0;k4;k++){//校准后等待4个转换周期,直到滤波器稳定while(!(AIE&0x20));//数据准备好?lr=bipolar();//读取无用结果,抛弃并清除中断}samples=10;//被测电压采样个数版权所有(1)//进入主循环{ave=0;//被测电压值清零for(i=0;isamples;i++){while(!(AIE&0x20));//等待下一个新的结果ave+=bipolar()*LSB;//读取结果并转换为电压,进行累加//并清除中断标志}volts=ave/samples;//求取电压的平均值temp=ALPHA*volts-282.14;//由芯片电压温度曲线求取温度printf(V=%f,resistance=%f,Temp=%fC\n,//打印结果volts,resistance,temp);}}版权所有其中,bipolar函数是外部函数,包含在utilities.a51中。utilities.a51是TI公司提供的一个文件,其内容如下:;Filename:utilities.a51;Copyright2003TexasInstrumentsIncasanunpublishedwork.;AllRightsReserved.;RevisionHistory;Version1.1;AssemblerVersion(KeilV2.38),(RaisonanceV6.10.13);ModuleDescription:;ADCroutinestoread24−bitADCand;returnthevalueasalonginteger.;************************************************************$include(legal.a51)$include(reg1210.inc);***********************************************************PUBLICunipolar,bipolar,read_sum_regsadc_subSEGMENTCODERSEGadc_sub;;;;;;;;;;;;;;;;;;;;;;unsignedlongunipolar(void);returnthe3byteadrestoR4567(MSB~LSB);unsignedlongintwithR4=0unipolar:movr4,#0movr5,adreshmovr6,adresmmovr7,adreslret版权所有(void);returnthe3byteadrestoR4567(MSB~LSB);returnsignedlongintwithsignextendsiononR4bipolar:movr4,#0mova,adreshmovr5,amovr6,adresmmovr7,adresljnbacc.7,positivemovr4,#0ffhpositive:ret;;;;;;;;;;;;;;;;;;;;;;signedlongread_sum_regs(void);returnthe4bytesumrtoR4567(MSB~LSB);returnsignedlongint,signextensiondonebyhardwareread_sum_regs:movr4,SUMR3;movr5,SUMR2;movr6,SUMR1;movr7,SUMR0;retend版权所有【例10-2】编程实现利用模拟输入通道测试电流源判断传感器的模拟信号是否正确接入到ADC中。解:程序代码如下:#includeREG1211.H//包含相关头文件#includestdio.h#includestdlib.h#includemath.h#defineLSB298.0232e-9//LSB=5.0/2^24,定义满量程为5V的最小分辨率externvoidautobaud(void);//定义自动波特率externlongbipolar(void);//定义结果的双极性输入函数voidmain(void){floatsample;intdecimation;decimation=1728;//抽取因子为1728CKCON=0;//外部存储器访问不扩展autobaud();//在PC上按回车时,设置串口通信波特率printf(“brown-OutDetection\n”);USEC=10;//确定Flash的写入时钟=系统时钟/(USEC+1)ACLK=9;//求fACLK=1,105,920Hz,fMOD=fACLK/64=17,280HzPDCON&=0xf7;//启动ADCADMUX=0x01;//通道AIN0和AIN1版权所有=0x70;//内部基准2.5V,缓冲器关,BOD开,PGA=1ADCON2=decimation&0xff;//写入抽取因子低字节ADCON3=(decimation8)&0x07;//写入抽取因子高字节ADCON1=0x01;//双极性,自动稳定模式,偏移增益自校准while(1){while(!(AIE&0x20));//数据准备好?sample=bipolar()*LSB;//读取结果并转换为电压,清除中断printf(“sample=%f”,sample);//打印结果if(sample0.01)printf(“ShortCircuit\n”);//短路elseif(sample2.4)printf(“OpenCircuit\n”);//开路elseprintf(“NormalSensorRange\n”);//正常while(!RI);//检测接收中断}}版权所有【例10-3】编程实现中断方式的ADC转换。具体要求是,在进行ADC转换时,让CPU在转换请求后,进入掉电模式。当ADC转换完毕后触发一个中断,CPU退出掉电模式,这样可以降低功耗。假设晶振频率为1.8432MHz。解:程序代码如下:#includeREG1211.H//包含相关头文件#includestdio.h#defineLSB298e-9externlongbipolar(void);//声明外部函数externvoidautobaud(void);floatresult;//定义变量charAD_done;voidAUXinterrupts(void)interrupt6using1//中断服务程序{switch(PAI){case6://处理AD中断result=bipolar();break;case8://处理秒中断AD_done=SECINT;break;default:AD_done=0;break;}AI=0;//清除辅助中断}版权所有(void){chari,j=0;floatdummy;intdecimation;decimation=1440;//抽取因子1440PDCON=0x75;//启动ADC和系统定时器ACLK=1;//模拟信号采样频率fMOD=(1.8432MHz/2)/64=14400HzADMUX=0x76;//AIN7同相输入通道,AIN6反相输入通道ADCON0=0x30;//内部电压基准2.5V,关闭输入缓冲器,PGA=1ADCON1=0x01;//双极性,自动稳定模式,偏移增益自校准ADCON2=demication&0xff;//写入抽取因子低字节ADCON3=(decimation8)&0x07;//写入抽取因子高字节AIE=0xA0;//ADC中断使能MSEC=1842;//设置毫秒定时计数值HMSEC=99;SECINT=9;//设置秒定时计数autobaud();版权所有(“ADCInterruptLab.\n”);for(i=0;i4;i++)//等待校准{while(!(AIE&0x20));dummy=ADRESL;}EAI=1;//使能辅助中断while(1){while(!(AD_done));//转换等待printf(“%6.4f\t”,result*LSB);AD_done=0;if(!(j++%4))printf(“\n”);//每行显示4个数据}}版权所有【例10-4】编程实现MSC1211的同步采样。解:在实际应用中,有时需要多个器件同步进行数据转换。为了使多个MSC1211同步转换,首先要关闭每个器件的ADC,也就是停止其转换时钟
本文标题:45单片机原理与应用
链接地址:https://www.777doc.com/doc-3248287 .html