|
发表于 2013-4-11 18:01:06
|
显示全部楼层
汇编的程序供参考
ADC模块初始化:
BANK 2
MOVI 0x1F ;设置AN0,AN1,AN2,AN3,AN4为模拟I/O口,AN5为数字I/O口
MOVA ADCC2 ;
CLR ADCC0 ;参考电压VDD,转换结果格式左对齐
MOVI 0X80 ;AD中断禁止,ADC时钟FOSC/16
MOVA ADCC1
;AD采样子程序
;***********************************************************
AD_SAMPLE
BANK 2 ;取按键采集值,连续采6次,去掉最大最小,除以4
CLR ad_acc_l ;清采样值累加寄存器
CLR ad_acc_h
CLR ad_count ;清采样次数
FIRST_SAMPLE
BSS ADCC0,GO_DONE ;启动第一次AD转换
JBC ADCC0,GO_DONE ;检测启动位,转换完成该位自动清零,跳过下条指令
JUMP $-1 ;转换没有完成返回上一条继续检测
MOV ADCRH,0 ;第一次采样把结果赋给ad_max、ad_min和ad_acc_l
MOVA ad_max
MOVA ad_min
MOVA ad_acc_l
LATTER_SAMPLE
BSS ADCC0,GO_DONE ;启动第2~6次AD转换
JBC ADCC0,GO_DONE ;检测启动位,转换完成该位自动清零,跳过下条指令
JUMP $-1 ;转换没有完成返回上一条继续检测
MOV ADCRH,0 ;第二次采样把结果累加到ad_acc_l
ADD ad_acc_l,1
JBC PSW,C
INC ad_acc_h,1
COMPARE_MAX
MOV ad_max,0 ;如果此次采样值大于原来的ad_max,则取代原来的ad_max
SUB ADCRH,0
JBS PSW,C
JUMP COMPARE_MIN
MOV ADCRH,0
MOVA ad_max
COMPARE_MIN
MOV ADCRH,0 ;如果此次采样值小于原来的ad_min,则取代原来的ad_min
SUB ad_min,0
JBS PSW,C
JUMP AD_RESULT
MOV ADCRH,0
MOVA ad_min
AD_RESULT
INC ad_count,1 ;记录AD采样的次数
MOVI .5
SUB ad_count,0 ;ad_count=9时结束AD采样
JBS PSW,Z
JUMP LATTER_SAMPLE ;没到6次,继续采
;到6次,计算采样结果
MOV ad_max,0 ;从累加的结果中减去最大值和最小值
SUB ad_acc_l,1
JBS PSW,C
DEC ad_acc_h
MOV ad_min,0
SUB ad_acc_l,1
JBS PSW,C
DEC ad_acc_h
;<ad_acc_h:ad_acc_l>右移2次,即除以4
BCC PSW,C
RR ad_acc_h,1
RR ad_acc_l,1
BCC PSW,C
RR ad_acc_h,1
RR ad_acc_l,1
MOV ad_acc_l,0
BANK 0
MOVA ad_resultbuf ;最后采样的结果保存在ad_resultbuf里
BANK 1
MOVA ad_resultbuf1 ;最后采样的结果保存在ad_resultbuf1里
RETIA 0X00 |
|