📄 ad.asm
字号:
;程序名: AD转化实验小程序(练习)
;创建人: 魏鸿林
;创建时间:2003/11/18
;修改人:
;描 述: 使用实验板上PORTD上的八个LED 表示数据采集输入端的电压值,电压值越大,显示的LED数越多,且按顺序递增.
; AD参考电压为单片机工作电源
; 光线越强,点亮的LED数越多
LIST P=16F877
#INCLUDE<P16F877.INC>
;;;;;;;;;;;;;;;;;;;;;;;;;变量定义;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ADH EQU 20H ;保存AD转化高字节数据
ADL EQU 21H ;保存AD转化低字节数据
W_TEMP EQU 22H ;中断暂存W
STATUS_TEMP EQU 23H ;中断暂存STATUS
COUNT EQU 24H ;记录中断次数
;;;;;;;;;;;;;;;;;;;;;;;;;程序体;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 00H
NOP
GOTO MAIN
ORG 04H
GOTO INTSVR
ORG 10
MAIN:
LCALL SYSCONFIG_FOR_PORT ;调用I/O口设置配置
LCALL SYSCONFIG_FOR_AD ;调用AD模块配置
MOVLW 64 ;初始化滤波参数
MOVWF COUNT ;64意味着对AD转化得到的连继的64个数据取平均值
CLRF ADL ;初始化AD转化数据的高低字节
CLRF ADH
LOOP_M ;等待中断
NOP
GOTO LOOP_M
;;;;;;;;;;;;;;;;;;;;;;;中断服务程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INTSVR:
BCF INTCON,GIE
MOVWF W_TEMP
SWAPF STATUS,W
MOVWF STATUS_TEMP
LCALL ADSVR ;因为在本练习中只可能产生一种中断,,故不作判断,直接进入中断数据处理序
SWAPF STATUS_TEMP,W
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W
BSF ADCON0,GO
BSF INTCON,GIE
RETFIE
;AD转化模块配置
SYSCONFIG_FOR_AD:
BCF ADCON0,ADCS1 ;选择时钟源的频率(一般是越快越好)
BCF ADCON0,ADCS0
BCF ADCON0,CHS2 ;通道选择(选择通道 2)
BSF ADCON0,CHS1 ;(RA0是滑变输出端,RA1是温度传感器输出端,RA2是光传感器输出端)
BCF ADCON0,CHS0 ;这里选用光传感器
BSF ADCON0,ADON ;打开AD模块
BSF STATUS,RP0
MOVLW 80H ;AD转化的结果靠左存放,所有PORTA通道都设置为模拟信号通道
MOVWF ADCON1 ;参考电压使用Vdd Vss
BCF STATUS,RP0
BCF PIR1,ADIF ;清除AD中断标志位,,
BSF STATUS,RP0
BSF PIE1,ADIE ;AD中断使能打开
BSF INTCON,PEIE ;外围总中断使能打开
BSF INTCON,GIE ;总中断使能打开
BCF STATUS,RP0
BSF ADCON0,GO ;发出转化指令(当转化完成时,会被硬件自动清零,在查询法中可用)
RETURN
;I/O口配置
SYSCONFIG_FOR_PORT:
BSF STATUS,RP0 ;在设置端口时注意选择BANK1
CLRF TRISD ;D口作为输出端口
MOVLW 0FFH ;A口作为输出口
MOVWF TRISA
BCF STATUS,RP0
RETURN
;;;;;;;;;;;;;;;;;;AD数据处理子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ADSVR:
BCF PIR1,ADIF ;如果总是出现堆栈溢出,,,这里可能是原因之一哦,,,
BSF STATUS,RP0 ;AD低字节保存在BANK1
MOVF ADRESL,0 ;把AD转化结果 低位数据累加
BCF STATUS,RP0
ADDWF ADL,F
BTFSC STATUS,C ;如果有出现进位,向高字节加1
INCF ADH,F
MOVF ADRESH,0 ;把AD转化结果 高位数据累加
ADDWF ADH,F
DECFSZ COUNT ;这里使用了 软件平均值滤波
GOTO AD_EXIT ;在没有达到采样次数时,不把转化结果反映到LED输出
;只是简单地进行数据堆积
NOP
;SWAPF ADH,F ;AD转化结果数据处理 (这段代码具体解释,请见说明)
RRF ADH,F
;RRF ADH,F
MOVLW B'00000111'
ANDWF ADH,F
MOVF ADH,0
LCALL TAB
MOVWF PORTD
;存储区复原,准备下一次AD数据处理
CLRF ADH
CLRF ADL
MOVLW 64
MOVWF COUNT
AD_EXIT:
RETURN
;LED显示表
TAB:
ADDWF PCL,F
;RETLW 00H
RETLW 01H
RETLW 03H
RETLW 07H
RETLW 0FH
RETLW 1FH
RETLW 3FH
RETLW 7FH
RETLW 0FFH
RETLW 0FFH ;表中共有九行,,,多余的行,,,是为了防止程序跑到意料之外的地方去
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -