AD转换部分调试成功,以下是AD部分程序,已验证过,绝对可用,同大家分享喽,也使大家少走点弯路,这可是我花费好几天调出来的哦
AD定义部分:
;--------------------------AD转换
ADC_CONTR EQU 0BCH ;A/D转换寄存器
ADC_RES EQU 0BDH ;8位A/D转换结果寄存器
P1ASF EQU 9DH ;P1口中的相应位作为模拟功能使用时的控制寄存器,如做A/D用,相应位要置1
ADC_ON_P10 EQU 11100000B ;P1.0作为ADC输入
ADC_ON_P11 EQU 11100001B ;P1.1作为ADC输入
ADC_ON_P12 EQU 11100010B ;P1.2作为ADC输入
ADC_ON_P13 EQU 11100011B ;P1.3作为ADC输入
ADC_ON_P14 EQU 11100100B ;P1.4作为ADC输入
ADC_ON_P15 EQU 11100101B ;P1.5作为ADC输入
ADC_ON_P16 EQU 11100110B ;P1.6作为ADC输入
ADC_ON_P17 EQU 11100111B ;P1.7作为ADC输入
;----------------------------------------------------
ADC_RESULT EQU 30H ;通道A/D转换结果
;--------------------------
;-----------------------------------
;以下为p1.2口AD转换子程序,若需要其他口作为AD口,可相应的改
;-----------------------------------
AD12:
MOV A,#00000100B ;设置P1.2为模拟功能,
;此处可改为P1的另外7个口,要用哪一位就把那位改为1就OK了
ORL P1ASF,A
MOV ADC_CONTR,#ADC_ON_P12 ;设置通道P1.2做A/D转换,
;此处可改为其他7个口
LCALL DELAY200US
LCALL GET_AD_RESULT
MOV A,#11111011B ;设置P1.2为普通IO口
ANL P1ASF,A ;设置P1.2为普通IO口
;改其他口时,将相应位改为0即可
RET
;=========================================================
GET_AD_RESULT: ;以下为固定子程序,不用改变
PUSH ACC
MOV ADC_RES,#00H
ORL ADC_CONTR,#00001000B ;开始A/D转换
NOP
NOP
NOP
NOP
WAIT_AD_FINISHE:
MOV A,#00010000B ;判断A/D转换是否完成
ANL A,ADC_CONTR
JZ WAIT_AD_FINISHE ;A/D没有转换完成,等待
ANL ADC_CONTR,#11100111B ;清零ADC_FLAG,ADC_START位,停止A/D转换
MOV A,ADC_RES
MOV ADC_RESULT,A ;保存A/D转换结果
POP ACC
RET
;=================================== |