呵呵,我自己就对AD很糊涂,所以表述不太明白,
我要实现将P1.7口的模拟信号,转换成图中P1.7口那样的数字信号(图中使用的是LM339比较器得到的数字信号),要求大于1.5V电压的信号为1,低于1.5V电压的信号为0,图中P1.2口信号为同步信号,每格表示10MS,我写了一下程序不知对不,大家帮我看看
MOV A,#00H
MOV 40H,#00H ;第一个8位存于40H单元中
MOV R2,#8
CPL C
AAAA:LCALL AD17
MOV A,ADC_Channel_7_Result
SUBB A,#4DH ;1.5V对应16进制数
JC DIA ;小于1.5V时,此时进位标志位C为1,故转移至DI子程序
SETB C ;大于1.5V时,此时进位标志位C为0,故不转移
MOV P1.0,C ;取出数据以后同时给出同步信号,此处使用P1.0口
MOV A,40H
RLC A
MOV 40H,A
CLR C ;将高电平1存入40H单元后,将进位标志位C清0
AJMP NEXTA ;取下一个数据
DIA: CLR C
MOV P1.0,C
MOV A,40H
RLC A
MOV 40H,A
CLR C
NEXTA:LCALL DELAY10MS
DJNZ R2,AAAA ;40H单元中取满8位数据,换到41H单元取下8位数据
这是我看STC资料改的程序,实验时AD转换不了
;===================================
;-----------------------------------
;以下为p1.7口AD转换子程序
;-----------------------------------
AD17:
MOV SP, #7FH ;设置堆栈
ACALL ADC_Power_On ;开ADC电源, 第一次使用时要打开内部模拟电源
ACALL Set_P17_ASF ;设置 P1.7 为模拟功能口
ACALL Set_ADC_Channel_7 ;设置 P1.7 作为A/D转换通道
ACALL Get_AD_Result ;测量电压并且数据存于ADC_Channel_7_Result
ACALL Set_P17_Normal_IO ;设置 P1.7为普通IO
RET
;---------------------------------------------------
ADC_Power_On:
PUSH ACC
ORL ADC_CONTR, #80H ;开A/D转换电源
MOV A, #20H
ACALL Delay ;开A/D转换电源后要加延时,1mS以内就足够了
POP ACC
RET
;---------------------------------------------------
;设置P1.7为模拟功能
Set_P17_ASF:
PUSH ACC
MOV A, #10000000B
ORL P1ASF, A
POP ACC
RET
;---------------------------------------------------
;设置P1.7为普通IO
Set_P17_Normal_IO:
PUSH ACC
MOV A, #01111111B
ORL P1ASF, A
POP ACC
RET
;---------------------------------------------------
Set_ADC_Channel_7:
MOV ADC_CONTR, #ADC_Power_On_Speed_Channel_7
;选择P1.7作为A/D转换通道
; MOV A, #05H ;更换 A/D 转换通道后要适当延时, 使输入电压稳定
; ;以后如果不更换 A/D 转换通道的话, 不需要加延时
; ACALL Delay ;切换 A/D 转换通道,加延时20uS~200uS就可以了,与输入电压源的内阻有关
; ;如果输入电压信号源的内阻在10K以下,可不加延时
RET
;---------------------------------------------------
Get_AD_Result:
PUSH ACC ;入栈保护
MOV ADC_RES, #0
ORL ADC_CONTR, #00001000B ;启动 AD 转换
NOP ;在对ADC_CONTR寄存器进行写操作后,要加4个空操作延时,才能够正确读到ADC_CONTR的值
NOP ;在对ADC_CONTR寄存器进行写操作后,要加4个空操作延时,才能够正确读到ADC_CONTR的值
NOP ;在对ADC_CONTR寄存器进行写操作后,要加4个空操作延时,才能够正确读到ADC_CONTR的值
NOP ;在对ADC_CONTR寄存器进行写操作后,要加4个空操作延时,才能够正确读到ADC_CONTR的值
Wait_AD_Finishe:
MOV A, #00010000B ;判断AD转换是否完成
ANL A, ADC_CONTR
JZ Wait_AD_Finishe ;AD 转换尚未完成, 继续等待
ANL ADC_CONTR, #11100111B ;清0 ADC_FLAG, ADC_START 位, 停止A/D转换
MOV A, ADC_RES
MOV ADC_Channel_7_Result, A ;保存 AD转换结果
POP ACC
RET
;---------------------------------------------------
Delayad: ;暂时没用到
PUSH 02 ;将寄存器组0 的 R2 入栈
PUSH 03 ;将寄存器组0 的 R3 入栈
PUSH 04 ;将寄存器组0 的 R4 入栈
MOV R4, A
Delay_Loop0:
MOV R3, #200 ;2 CLOCK ---------------------+
Delay_Loop1: ; |
MOV R2, #249 ;2 CLOCK ------+ |
Delay_Loop: ; | 1002 CLOCK |200406 CLOCK
DJNZ R2, Delay_Loop ;4 CLOCK | |
DJNZ R3, Delay_Loop1 ;4 CLOCK ------+ |
DJNZ R4, Delay_Loop0 ;4 CLOCK ---------------------+
POP 04
POP 03
POP 02
RET
;=================================== |