|
楼主 |
发表于 2008-10-23 10:10:31
|
显示全部楼层
ADCSUM: DS 2
SAMPCNT: DS 1
ADCMIN: DS 1
ADCMAX: DS 1
ADVAL: DS 1
T1: DS 1
T2_adval: DS 1
SAMP_TIME: DS 1
ADSAMPLE:
CMP SAMP_TIME,#30 ;60ms
BNC $ADSTART ;2ms一次
RET
ADSTART:
MOV SAMP_TIME,#0
SET1 ADCS ;置1开始AD转换
ADLOOP:
BF ADIF,$ADLOOP ;ADIF=0(无中断信号)死循环
CLR1 ADIF
CLR1 ADCS ;
MOV A,ADCRH ;ADCRH 8位AD转换结果寄存器
INC SAMPCNT ;采样次数
CMP SAMPCNT,#2
BNC $AD0 ;取第二次采样结果
MOV ADCMIN,A ;第1次采样结果作为ADCMIN
MOVW AX,#0
MOVW ADCSUM,AX
RET
AD0:
CMP SAMPCNT,#3
BNC $MINCHK ;第3次采样执行MINCHK
CMP A,ADCMIN ;
BNC $AD1 ;第2次采样A大于ADCMIN执行AD1
XCH A,ADCMIN ;A小于ADCMIN将A结果作为MIN
AD1:
MOV ADCMAX,A
RET
MINCHK:
CMP A,ADCMIN
BNC $MAXCHK ;A大于等于最小值转到MAXCHK,与最大值比较
XCH A,ADCMIN ;A小于最小值,将A作为最小值
BR ADSUM
MAXCHK:
CMP A,ADCMAX ;
BC $ADSUM ;A小于ADCMAX大于ADCMIN时执行ADSUM
XCH A,ADCMAX ;A大于ADCMAX将A值作为ADCMAX
ADSUM: ;累加
ADD A,ADCSUM ;ADCSUM初值0
MOV ADCSUM,A
ADDC ADCSUM+1,#0
MOV A,ADCSUM+1
CMP SAMPCNT,#6
BNC $AVERAGE ;采样结果6次累加,大于6次后转到平均
RET
AVERAGE: ;去掉最大值后采样值平均
MOV SAMPCNT,#0
CLR1 CY
RORC A,1
MOV ADCSUM+1,A
MOV A,ADCSUM
RORC A,1
MOV ADCSUM,A
MOV A,ADCSUM+1 ;/2
CLR1 CY
RORC A,1
MOV ADCSUM+1,A
MOV A,ADCSUM
RORC A,1
MOV ADCSUM,A ;/4 第1次采样和采样最大值不要
MOV ADVAL,A ;
;---------------------------------
T1CHANNEL:
MOV A,ADS
CMP A,#0
BNZ $T2CHANNEL ;ADS不为0转到2通道,两通道互换T1,T2
MOV A,ADVAL
MOV T1_adval,A
CMP A,#5
BC $SETT1ERR
CMP A,#250
BNC $SETT1ERR ;A小于5大于250出错SETT1ERR
CLR1 T1err_f
T1_LOOKUP:
CMP A,#151+1
BC $T1_LOOKUP1 ;小于152跳转
MOV T1,#35 ;大于152给35,结束
BR $T1_RET
T1_LOOKUP1:
CMP A,#97
BNC $T1_LOOKUP2 ;大于97,跳
MOV T1,#13 ;根据表,小于97给13,结束
BR $T1_RET
T1_LOOKUP2:
SUB A,#97
MOV X,A
MOV A,#0
ADDW AX,#TEMP_TAB
MOVW HL,AX
MOV A,[HL]
MOV T1,A
BR $T1_RET
SETT1ERR: ;错误提示,大于250,小于5时
; SET1 T1err_f
MOV T1,#13
T1_RET:
MOV ADS,#1
RET
;==================
T2CHANNEL:
MOV A,ADVAL
MOV T2_adval,A
CMP A,#5
BC $SETT2ERR
CMP A,#250
BNC $SETT2ERR
CLR1 T2err_f
BR $T2_RET
SETT2ERR:
; SET1 T2err_f
T2_RET:
MOV ADS,#0
RET
=================================
这个是两通道采样的程序,老大上次说好像第一次采样的结果不要,采样最高值不要,一共六次温度采样,然后两个AD通道轮流运转。 |
|