|
9#
楼主 |
发表于 2012-7-6 18:39:04
|
只看该作者
三个子程序:
;===================================
; ADC数据发送子程序
;===================================
ADC_send
;Bank0
;**********************
banksel STATUS
movf tx_count,w
skpz ;数据是否发送完
return ;还有数据未发送完返回
;装载新数据
movf ad_result_L,w
movwf tx_buff+0
;movlw '2'
movwf tx_buff+1
;movlw '3'
movwf tx_buff+2
;movlw '4'
movwf tx_buff+3
movlw 0x0B
movwf tx_buff+4
movlw 0x0A
movwf tx_buff+5 ;完成数据装载
movlw .6
movwf tx_count ;设定发送数据的数量
clrf tx_point ;复位偏移指针
;Bank1
;***********************
banksel PIE1
bsf TX_IE ;开启发送中断,立即发送数据
;Bank0
;***********************
banksel STATUS
return
;=====================================
;===================================
; ADC转换子程序
;===================================
ADC_doing
;Bank0
;**********************
banksel STATUS
movlw 0x08
movwf ad_data_point ;设置位移指针
;开始采样
bsf ADCON0,GO ;开始ADC
btfsc ADCON0,GO ;ADC转换是否结束
goto $-1 ;等待ADC结束
;保存ADC结果
movlw ad_data_buff-1 ;取ADC数据缓冲区首地址
movwf FSR ;FSR相对寻址
movf ad_data_point,w ;取相对位移指针
addwf FSR,f ;相对地址+位移指针
movf ADRESH,w ;取ADC转换结果
movwf INDF ;放入ADC转换结果
decfsz ad_data_point,f ;指针位移-1指向下一个缓冲单元
goto $-.9 ;ad_data_point不等于0则继续转换
return
;=====================================
;===================================
; ADC数据平滑处理
;===================================
ADC_average
;Bank0
;**********************
banksel STATUS
movlw 0x08
movwf ad_data_point ;设置位移指针
clrf ad_data_L ;累加单元清空
clrf ad_data_H
;开始累加
movlw ad_data_buff-1 ;取ADC数据缓冲区首地址
movwf FSR ;FSR相对寻址
movf ad_data_point,w ;取相对位移指针
addwf FSR,f ;相对地址+位移指针
movf INDF,w ;取数据到w
addwf ad_data_L,f ;进行累加
skpnc ;是否有进位
incf ad_data_H,f ;有进位高位加1
decfsz ad_data_point,f ;指针位移-1指向下一个缓冲单元
goto $-.9 ;ad_data_point不等于0则继续累加
;累加完成求平均/除8右移3次
bcf STATUS,C
rrf ad_data_H,f
rrf ad_data_L,f
bcf STATUS,C
rrf ad_data_H,f
rrf ad_data_L,f
bcf STATUS,C
rrf ad_data_H,f
rrf ad_data_L,f
;关中断送最终结果
bcf G_IE ;关中断
movf ad_data_L,w
movwf ad_result_L
movf ad_data_H,w
movwf ad_result_H
bsf G_IE ;开中断
return
;=====================================
END ; directive 'end of program' |
|