需要STC12C5A60S2的AD转换,汇编的

2024年11月17日 01:50
有1个网友回答
网友(1):

ADC_CONTR EQU 0C5H ;A/D转换寄存器
ADC_DATA EQU 0C6H ;A/D转换结果寄存器,为10位A/D转化结果的高8位
ADC_LOW2 EQU 0BEH ;A/D转换结果寄存器,低2位有效,为10位A/D转换结果的低2位
;如果不用ADC_LOW2的低2位,只有ADC_DATA的8位,则为8位A/D转化
P1M0 EQU 91H ;P1口模式选择寄存器0
P1M1 EQU 92H ;P1口模式选择寄存器1

ADC_POWER_ON_SPEED_CHANNEL_0 EQU 11100000B ;P1.0作为A/D输入
ADC_POWER_ON_SPEED_CHANNEL_1 EQU 11100001B ;P1.1作为A/D输入
ADC_POWER_ON_SPEED_CHANNEL_2 EQU 11100010B ;P1.2作为A/D输入
ADC_POWER_ON_SPEED_CHANNEL_3 EQU 11100011B ;P1.3作为A/D输入
ADC_POWER_ON_SPEED_CHANNEL_4 EQU 11100100B ;P1.4作为A/D输入
ADC_POWER_ON_SPEED_CHANNEL_5 EQU 11100101B ;P1.5作为A/D输入
ADC_POWER_ON_SPEED_CHANNEL_6 EQU 11100110B ;P1.6作为A/D输入
ADC_POWER_ON_SPEED_CHANNEL_7 EQU 11100110B ;P1.7作为A/D输入

;定义变量
ADC_CHANNEL_0RESULT EQU 30H ;0通道A/D转换结果
ADC_CHANNEL_1RESULT EQU 31H ;1通道A/D转换结果
ADC_CHANNEL_2RESULT EQU 32H ;2通道A/D转换结果
ADC_CHANNEL_3RESULT EQU 33H ;3通道A/D转换结果
ADC_CHANNEL_4RESULT EQU 34H ;4通道A/D转换结果
ADC_CHANNEL_5RESULT EQU 35H ;5通道A/D转换结果
ADC_CHANNEL_6RESULT EQU 36H ;6通道A/D转换结果
ADC_CHANNEL_7RESULT EQU 37H ;7通道A/D转换结果

ORG 0000H
LJMP MAIN
ORG 0050H
MAIN:
MOV SP,#40H
ACALL ADC_POWER_ON //;开ADC电源,第一次使用时要打开内部模拟电源
;开ADC电源,可适当加延时,1MS以内就足够了

ACALL SET_P12_OPEN_DRAIN //;设置P1.2位开漏

ACALL SET_ADC_CHANNEL_2 //;设置P1.2作为A/D转换通道

ACALL GET_ADC_RESULT //;测量电压并且取A/D转化结果

ADC_POWER_ON:
PUSH ACC
ORL ADC_CONTR,#80H //;开A/D转换电源

MOV A,#20H
ACALL DELAY ;开A/D转换电源后要加延时,1MS以内就足够了

POP ACC
RET

;设置P1.2,设置A/D通道所在的I/O为开漏模式

SET_P12_OPEN_DRAIN:
PUSH ACC
MOV A,#00000100B
ORL P1M0,A
ORL P1M1,A
POP ACC
RET

SET_ADC_CHANNEL_2:
MOV ADC_CONTR,#ADC_POWER_ON_SPEED_CHANNEL_2 //;选择P1.2作为A/D转换通道

MOV A,#01H //;更换A/D转换通道后要适当延时,使输入电压稳定
;以后如果不更换A/D转换通道的话,不需要加延时

ACALL DELAY //;切换A/D转换通道,加延时时20US~200US就可以了,与输入电压源的内阻有关

RET

GET_ADC_RESULT:
PUSH ACC
MOV ADC_DATA,#0
ORL ADC_CONTR,#00001000B ;启动AD转换

WAIT_AD_FINISH:
MOV A,#00010000B //;判断AD转换是否完成

ANL A,ADC_CONTR
JZ WAIT_AD_FINISH //;AD转换尚未完成,继续等待

ANL ADC_CONTR,#11100111B
MOV A,ADC_DATA //取10位AD转换数据寄存器的高八位显示到P2口
CLR C
MOV P2,A
LJMP GET_ADC_RESULT //不停的进行重复的AD采集

DELAY:
PUSH 02
PUSH 03
PUSH 04
MOV R4,A

DELAY_LOOP0:
MOV R3,#50
DELAY_LOOP:
DJNZ R3,DELAY_LOOP
DJNZ R4,DELAY_LOOP0

POP 04
POP 03
POP 02
RET

END