此汇编程序实现A/D转换功能,应用于pic单片机上,A/D采用中断方式。该程序通过单片机的RA2模拟通道送入,一直流电压,当送入的直流电压大于2.5V时,8个LED闪动,当直流电压恢复到2.5V以下时,LED停止闪动。为了防止干扰,本程序对直流电压采样10次后再作判断,中间的采样结果用间接寻址的方式存取。
LIST P=18F458
INCLUDE "P18F458.INC"
TIMES EQU 0X20
DEY EQU TIMES+1
ACCALO EQU TIMES+2 ;ACCA为双精度加数寄存器
ACCAHI EQU TIMES+3
ACCBLO EQU TIMES+4 ;ACCB为双精度加法的结果寄存器
ACCBHI EQU TIMES+5
FLAG EQU TIMES+6
DEYH EQU TIMES+7
DEYL EQU TIMES+9
BEGFSR EQU 0X30 ;间接寻址FSR的起始值(宏定义方式给出)
ORG 0X0000
GOTO MAIN
ORG 0X0008
GOTO INTSERVE ;转向中断服务子程序
ORG 0X30
;***双字节减法子程序,入口地址ACCB-ACCA,出口地址ACCB***
D_SUB
CALL NEG_A ;求ACCA的补码
;***双字节加法子程序,入口地址ACCB+ACCA,出口地址ACCB***
D_ADD
MOVF ACCALO,0 ;ACCB和ACCA低半字节相加
ADDWF ACCBLO
BTFSC STATUS,C ;有进位否?
INCF ACCBHI ;有,ACCB高字节加1,再加ACCAHI
MOVF ACCAHI,0 ;ACCA、ACCB高半字节相加
ADDWF ACCBHI
RETURN ;子程序返回
;************** ACCA取补子程序*****************
NEG_A
COMF ACCALO ;ACCALO取反加1
INCF ACCALO
BTFSC STATUS,Z ;低8位有进位吗?
DECF ACCAHI ;有,ACCAHI减1,再取反
COMF ACCAHI ;否则ACCAHI直接取反
RETURN ;子程序返回
;*********初始化子程序***************
INITIAL
CLRF INTCON ;禁止总中断和外围中断
MOVLW 0X51
MOVWF ADCON0 ;选择AD通道为RA2,且打开A/D转换器
;在工作状态,且使AD转换时钟为8Tosc
MOVLW 0X80
MOVWF ADCON1 ;转换结果右移,即ADRESH寄存器的高6
;位为"0",且把RA2口设置为模拟量输入式
;(注意后面要把RA5改成数据I/O方式,以
;输出显示琐存信号)
BCF PIR1,ADIF ;清除A/D转换标志
BSF PIE1,ADIE ;A/D转换中断允许
BSF INTCON,PEIE ;外围中断允许
BSF IPR1,ADIP ;B口变位中断高优先级
BSF RCON,7 ;使能中断优先级
BSF TRISA,2 ;设置RA2为输入方式
BCF TRISA,5 ;置RA5为输出方式,以输出锁存信号
BCF TRISC,5
BCF TRISC,3 ;设置SCK与SDO为输出方式
MOVLW 0XC0
MOVWF SSPSTAT ;设置SSPSTAT寄存器
MOVLW 0X30
MOVWF SSPCON1 ;设置SPI的控制方式,允许SSP方式,并
;且时钟下降沿发送,,与"74HC595当其
;SCLK从低到高电平跳变时,串行输入数据
;(DI)移入寄存器"的特点相应
CLRF FLAG
RETURN
(责任编辑:laiquliu)
|