您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > PIC单片机AD转换汇编程序
PIC单片机AD转换汇编程序作者:来源:本站原创点击数:589更新时间:2008年08月18日;此汇编程序实现A/D转换功能,应用于pic单片机上,A/D采用中断方式。该程序通过单片机的RA2模拟通道送入;一直流电压,当送入的直流电压大于2.5V时,8个LED闪动,当直流电压恢复到2.5V以下;时,LED停止闪动。为了防止干扰,本程序对直流电压采样10次后再作判断,中间的采样结;果用间接寻址的方式存取。LISTP=18F458INCLUDEP18F458.INCTIMESEQU0X20DEYEQUTIMES+1ACCALOEQUTIMES+2;ACCA为双精度加数寄存器ACCAHIEQUTIMES+3ACCBLOEQUTIMES+4;ACCB为双精度加法的结果寄存器ACCBHIEQUTIMES+5FLAGEQUTIMES+6DEYHEQUTIMES+7DEYLEQUTIMES+9BEGFSREQU0X30;间接寻址FSR的起始值(宏定义方式给出)ORG0X0000GOTOMAINORG0X0008GOTOINTSERVE;转向中断服务子程序ORG0X30;***双字节减法子程序,入口地址ACCB-ACCA,出口地址ACCB***D_SUBCALLNEG_A;求ACCA的补码;***双字节加法子程序,入口地址ACCB+ACCA,出口地址ACCB***D_ADDMOVFACCALO,0;ACCB和ACCA低半字节相加ADDWFACCBLOBTFSCSTATUS,C;有进位否?INCFACCBHI;有,ACCB高字节加1,再加ACCAHIMOVFACCAHI,0;ACCA、ACCB高半字节相加ADDWFACCBHIRETURN;子程序返回;**************ACCA取补子程序*****************NEG_ACOMFACCALO;ACCALO取反加1INCFACCALOBTFSCSTATUS,Z;低8位有进位吗?DECFACCAHI;有,ACCAHI减1,再取反COMFACCAHI;否则ACCAHI直接取反RETURN;子程序返回;*********初始化子程序***************INITIALCLRFINTCON;禁止总中断和外围中断MOVLW0X51MOVWFADCON0;选择AD通道为RA2,且打开A/D转换器;在工作状态,且使AD转换时钟为8ToscMOVLW0X80MOVWFADCON1;转换结果右移,即ADRESH寄存器的高6;位为0,且把RA2口设置为模拟量输入式;(注意后面要把RA5改成数据I/O方式,以;输出显示琐存信号)BCFPIR1,ADIF;清除A/D转换标志BSFPIE1,ADIE;A/D转换中断允许BSFINTCON,PEIE;外围中断允许BSFIPR1,ADIP;B口变位中断高优先级BSFRCON,7;使能中断优先级BSFTRISA,2;设置RA2为输入方式BCFTRISA,5;置RA5为输出方式,以输出锁存信号BCFTRISC,5BCFTRISC,3;设置SCK与SDO为输出方式MOVLW0XC0MOVWFSSPSTAT;设置SSPSTAT寄存器MOVLW0X30MOVWFSSPCON1;设置SPI的控制方式,允许SSP方式,并;且时钟下降沿发送,与74HC595当其;SCLK从低到高电平跳变时,串行输入数据;(DI)移入寄存器的特点相应CLRFFLAGRETURN;*********软件延时子程序****************DELAYMOVLW0XFFMOVWFDEYHAGAIN1MOVLW0XFFMOVWFDEYLAGAIN2NOPDECFSZDEYLGOTOAGAIN2DECFSZDEYHGOTOAGAIN1RETURN;***************A/D中断服务子程序*****************INTSERVEBCFPIR1,ADIF;清除A/D转换标志MOVFADRESH,WMOVWFINDF0;读取并存储A/D转换结果的高两位INCFFSR0LMOVFADRESL,WMOVWFINDF0INCFFSR0L;读取并存储A/D转换结果的低8位DECFTIMES,1;A/D转换次数减1MOVLW0X02MOVWFDEYLOOP13DECFSZDEY,1GOTOLOOP13;给予一定的延时,保证两次A/D转换期间;2Tad的间隔时间和电容的采样时间BSFADCON0,2;启动下一次A/D转换RETFIE;中断返回;**********LED闪烁报警子程序*************ALARMMOVLW0X01XORWFFLAG,1BTFSSFLAG,0CALLDISPLAY0;调用显“0”子程序NOPBTFSCFLAG,0CALLDISPDARK;调用显“DARK”子程序RETURN;**********显全0子程序*************DISPLAY0TRANSMIT;SPI发送显示子模块CLRFPORTA;LACK送低电平,为锁存做准备MOVLW0X08MOVWFTIMESLOOP80MOVLW0XC0;显示值为0,C0H为0的段码MOVWFSSPBUF;启动发送WAITBTFSSPIR1,SSPIFGOTOWAIT;等待发送结束BCFPIR1,SSPIF;清除中断标志DECFSZTIMESGOTOLOOP80;一次要发送完8个数据BSFPORTA,5;最后给一个锁存信号,代表一次显示任务完成RETURN;**********显示全DARK子程序*************DISPDARKTRANSMIT1;SPI发送显示子模块CLRFPORTA;LACK送低电平,为锁存做准备MOVLW0X08MOVWFTIMESLOOP8DMOVLW0XFF;显示值为0,FFH为DARK的段码MOVWFSSPBUF;启动发送WAIT1BTFSSPIR1,SSPIFGOTOWAIT1;等待发送结束BCFPIR1,SSPIF;清除中断标志DECFSZTIMESGOTOLOOP8D;一次要发送完8个数据BSFPORTA,5;最后给一个锁存信号,代表一次显示任务完成RETURN;*********PIC单片机A/D转换汇编程序主程序************;转载请保留文章原始出处初始化LOOPMOVLW0X80;转换结果右移,及ADRESH寄存器的高6位为0;且把RA2口设置为模拟量输入式(注意后面要把;RA5改成数据I/O方式,以输出显示琐存信号)MOVWFADCON1MOVLWBEGFSRMOVWFFSR0L;给出间接寻址时FSR的初值MOVLW0X0AMOVWFTIMES;每一轮A/D连续采样10次BSFINTCON,GIE;总中断打开,及可以进行A/D转换中断BSFADCON0,2;启动A/D转换LOOP1MOVFTIMES,WBTFSSSTATUS,ZGOTOLOOP1;等待A/D转换中断BCFINTCON,GIE;A/D转换次数到10次,关闭中断NOPCLRFACCBHICLRFACCBLO;双精度加法的结果寄存器清0,为后面准备MOVLW0X0AMOVWFTIMESMOVLWBEGFSRMOVWFFSR0LLOOP15MOVFINDF0,WMOVWFACCAHIINCFFSR0LMOVFINDF0,WMOVWFACCALOINCFFSR0LCALLD_ADDDECFSZTIMESGOTOLOOP15NOP;计算得到10次A/D转换的和MOVLW0X84MOVWFADCON1;把RA5设成数字I/O,以输出显示锁存信号MOVLW0X14MOVWFACCAHICLRFACCALOCALLD_SUB;通过双精度减判断模拟量是否达到报警限;度(1400H=200H*0AH,200H与2.5V对应)BTFSSACCBHI,7CALLALARM;若ACCBHI的最高位为1,则证明减法结;果为负,即直流电压值超过2.5V,则报警NOPBTFSCACCBHI,7CALLDISPLAY0;若没有超过2.5V,则不报警,8个LED;同时显示0CALLDELAY;软件延时,使电压检测不要过于频繁GOTOLOOP;重复检测输入的直流电压值END
本文标题:PIC单片机AD转换汇编程序
链接地址:https://www.777doc.com/doc-2850686 .html