PIC单片机AD转换汇编程序.docx
《PIC单片机AD转换汇编程序.docx》由会员分享,可在线阅读,更多相关《PIC单片机AD转换汇编程序.docx(7页珍藏版)》请在冰豆网上搜索。
![PIC单片机AD转换汇编程序.docx](https://file1.bdocx.com/fileroot1/2022-10/24/b8707463-6b33-4fa9-988f-4756e3f29c09/b8707463-6b33-4fa9-988f-4756e3f29c091.gif)
PIC单片机AD转换汇编程序
PIC单片机AD转换汇编程序
;此汇编程序实现A/D转换功能,应用于pic单片机上,A/D采用中断方式。
该程序通过单片机的RA2模拟通道送入
;一直流电压,当送入的直流电压大于2.5V时,8个LED闪动,当直流电压恢复到2.5V以下
;时,LED停止闪动。
为了防止干扰,本程序对直流电压采样10次后再作判断,中间的采样结
;果用间接寻址的方式存取。
LISTP二18F458
INCLUDE"P18F458.INC"
TIMESEQU0X20
DEYEQUTIMES+1
ACCALOEQUTIMES+2;ACCA为双精度加数寄存器
ACCAHIEQUTIMES+3
ACCBLOEQUTIMES+4;ACCB为双精度加法的结果寄存器
ACCBHIEQUTIMES+5
FLAGEQUTIMES+6
DEYHEQUTIMES+7
DEYLEQUTIMES+9
BEGFSREQU0X30;间接寻址FSR的起始值(宏定义方式给出)
0RG0X0000
GOTONfAIX
ORG0X0008
GOTOINTSERVE;转向中断服务子程序
;***双字节减法子程序,入口地址ACCB-ACCA,出口地址ACCB***D_SUB
CALLNEG_A;求人“人的补码
;*衬双字节加法子程序,入口地址ACCB+ACCA,出口地址ACCB***D_ADD
MOVFACCALO,0;ACCB和ACCA低半字节相加
ADDWFACCBLO
BTFSCSTATUS,C;有进位否?
INCFACCBHI;有,ACCB高字节加I1,再加ACCAHI
MOVFACCAHI,0;ACCA、ACCB高半字节相加
ADDWFACCBHI
RETURN;子程序返回
f**************
NEG_A
COMFACCALO;ACCALO取反加1
INCFACCALO
BTFSCSTATUS,Z;低8位有进位吗?
DECFACCAHI;有,ACCAHI减1,再取反
COMFACCAHI;否则ACCAHI直接取反
RETURN;子程序返回
;*********初女台化子程序***************
CLRFINTCON;禁止总中断和外围中断
MOVLW0X51
MOVWFADCONO;选择AD通道为RA2,且打开A/D转换器;在工作状态,且使AD转换时钟为STosc
MOVLW0X80
MOVWFADC0N1;转换结果右移,即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;置RA3为输出方式,以输出锁存信号
BCFTRISC,5
BCFTRISC,3;设置SCK与SDO为输出方式
MOVLWOXCO
MOVWFSSPSTAT;设置SSPSTAT寄存器
MOVLW0X30
MOVWFSSPCON1;设置SPI的控制方式,允许SSP方式,并;且时钟下降沿发送,与"74HC595当其
;SCLK从低到高电平跳变时,串行输入数据
;(DI)移入寄存器"的特点相应
CLRFFLAG
RETURN
;*********软件延时子程序****************
DELAY
MOVLWOXFF
MOVWFDEYH
AGAIN1MOVLWOXFF
MOVWFDEYL
AGAIX2NOP
DECFSZDEYL
GOTOAGAIN2
DECFSZDEYH
GOTOAGAIN1
RETURN
;***************a/D中断服务子程序*****************INTSERVE
BCFPIR1,ADIF;清除A/D转换标志
MOVFADRESH,W
MOVWFINDFO;读取并存储A/D转换结果的高两位
INCFFSROL
MOVFADRESL,W
MOVWFINDFO
INCFFSROL;读取并存储A/D转换结果的低8位
DECFTIMES,1;A/D转换次数减1
MOVLW0X02
MOVWFDEY
LOOP13DECFSZDEY,1
GOTOL00P13;给予一定的延时,保证两次A/D转换期间;2Tad的间隔时间和
电容的采样时间
BSFADCONO,2;启动下一次A/D转换
RETFIE;中断返回
;**********led闪烁报警子程序*♦*♦*♦♦*♦♦*♦*
ALARM
MOVLW0X01
XORWFFLAG,1
BTFSSFLAG,0
CALLDISPLAYO;调用显“0”子程序
NOP
BTFSCFLAG,0
CALLDISPDARK;调用显“DARK”子程序
RETURN
;**********显全o•F■程序*************
DISPLAYO
TRANSMIT;SPI发送显示子模块
CLRFPORTA;LACK送低电平,为锁存做准备
MOVLW0X08
MOVWFTIMES
L00P80MOVLWOXCO;显示值为0,COH为0的段码MOVWFSSPBUF;启动发送
WAIT
BTFSSPIR1,SSPIF
GOTOWAIT;等待发送结束
BCFPIR1,SSPIF;清除中断标志
DECFSZTIMES
GOTOL00P80;一次要发送完8个数据
BSFPORTA,5;最后给一个锁存信号,代表一次显示任务完成RETURN
;**********显示全DARK『程序*************
DISPDARK
TRANSMIT1;SPI发送显示子模块
CLRFPORTA;LACK送低电平,为锁存做准备
MOVLW0X08
L00P8DMOVLWOXFF;显示值为0,FFH为DARK的段码MOVWFSSPBUF;启动发
WAIT1
BTFSSPIR1,SSPIF
GOTOWAIT1;等待发送结束
BCFPIR1,SSPIF;清除中断标志
DECFSZTIMES
GOTOL00P8D;一次要发送完8个数据
BSFPORTA,5;最后给一个锁存信号,代表一次显示任务完成RETURN
;*********PIC单片机A/D转换汇编程序主程丿了;************
;转载www.olhei.com单片机网
MAINNOP
CALLINITIAL;初始化
LOOP
MOVLW0X80;转换结果右移,及ADRESH寄存器的高6位为"0";且把RA2口设置为模拟量输入式(注意后面要把
;RA5改成数据I/O方式,以输出显示琐存信号)
MOVWFADC0N1
MOVLWBEGFSR
MOVWFFSROL;给出间接寻址时FSR的初值
MOVWFTIMES;每一轮A/D连续采样10次
BSFIXTCON,GIE;总中断打开,及可以进行A/D转换中断BSFADC0N0,2;启动A/D转换
L00P1MOVFTIMES,W
BTFSSSTATUS,Z
GOTOL00P1;等待A/D转换中断
BCFINTCON,GIE;A/D转换次数到10次,关闭中断NOP
CLRFACCBHI
CLRFACCBLO;双精度加法的结果寄存器清0,为后面准备MOVLWOXOA
MOVWFTIMES
MOVLWBEGFSR
MOVWFFSROL
LOOP15MOVFINDFO,W
MOVWFACCAHI
INCFFSROL
MOVFINDFO,W
MOVWFACCALO
INCFFSROL
CALLD_ADD
DECFSZTIMES
GOTOLOOP15
NOP;计算得到10次A/D转换的和
MOVLW0X84
MOVWFADC0N1;把RA3设成数字I/O,以输出显示锁存信号MOVLW0X14
MOVWFACCAHI
CLRFACCALO
CALLD_SUB;通过双精度减判断模拟量是否达到报警限
;度(1400H=200H*0AH,200H与2.5V对应)
BTFSSACCBHI,7
CALLALARM;若ACCBHI的最高位为1,则证明减法结
;果为负,即直流电压值超过2.5V,则报警
NOP
BTFSCACCBHI,7
CALLDISPLAYO;若没有超过2.5V,则不报警,8个LED
;同时显示0
CALLDELAY;软件延时,使电压检测不要过于频繁
GOTOLOOP;重复检测输入的直流电压值
END