;此为STC提供的AD测试源程序。但是实验结果是程序一直跑在串口子程序中。
;AD转换子程序没有运行
LED_MCU_START EQU P3.7
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 P1.0 ;11100000B ;0x0E0 ;P1.0作为A/D输入
ADC_Power_On_Speed_Channel_1 EQU P1.1 ;11100001B ;0x0E1 ;P1.1作为A/D输入
ADC_Power_On_Speed_Channel_2 EQU P1.2 ;11100010B ;0x0E2 ;P1.2作为A/D输入
ADC_Power_On_Speed_Channel_3 EQU P1.3 ;11100011B ;0x0E3 ;P1.3作为A/D输入
ADC_Power_On_Speed_Channel_4 EQU P1.4 ;11100100B ;0x0E4 ;P1.4作为A/D输入
ADC_Power_On_Speed_Channel_5 EQU P1.5 ;11100101B ;0x0E5 ;P1.5作为A/D输入
ADC_Power_On_Speed_Channel_6 EQU P1.6 ;11100110B ;0x0E6 ;P1.6作为A/D输入
ADC_Power_On_Speed_Channel_7 EQU P1.7 ;11100111B ;0x0E7 ;P1.7作为A/D输入
;-----------------------------------------------------------------------
;定义变量
ADC_Channel_0_Result EQU 30H ;0通道A/D转换结果
ADC_Channel_1_Result EQU 31H ;1通道A/D转换结果
ADC_Channel_2_Result EQU 32H ;2通道A/D转换结果
ADC_Channel_3_Result EQU 33H ;3通道A/D转换结果
ADC_Channel_4_Result EQU 34H ;4通道A/D转换结果
ADC_Channel_5_Result EQU 35H ;5通道A/D转换结果
ADC_Channel_6_Result EQU 36H ;6通道A/D转换结果
ADC_Channel_7_Result EQu 37H ;7通道A/D转换结果
ORG 0000H
LJMP MAIN
ORG 0050H
MAIN:
CLR LED_MCU_START ;MCU工作指示灯 LED_MCU_START EQU P3.7
MOV SP,#7FH ;设置堆栈
ACALL Initiate_RS232 ;初始化串口
ACALL ADC_Power_On ;开ADC电源,第一次使用时要打开内部模拟电源
;开ADC电源,可适当加延时,1mA以内就足够了
ACALL Set_P12_Open_Drain ;设置P1.2为开漏
ACALL Set_ADC_Channel_2 ;设置P1.2作为A/D转换通道
ACALL Get_AD_Result ;测量电压并且取A/D转换结果
ACALL Send_AD_Result ;发送转换结果到PC机
ACALL Set_P12_Normal_IO ;设置P1.2为普通IO
MOV A,ADC_Channel_2_Result ;用P1口显示A/D转换结果
CPL A
MOV P1,A
Wait_Loop:
SJMP Wait_Loop ;停机
;-----------------------------------------------------------------
;-----------------------------------------------------------------
Initiate_RS232:
CLR ES ;串口初始化
MOV TMOD,#20H ;设置%1为波特率发生器
MOV SCON,#50H ;0101,0000 8位数据位,无奇偶检验
MOV TH1,#0FBH ;18.432MHz晶振,波特率=9600
MOV TL1,#0FBH
SETB TR1 ;启动T1
RET
;----------------------------------------------------------------
Send_Byte:
CLR TI
MOV SBUF,A
Send_Byte_Wait_Finish:
JNB TI,Send_Byte_Wait_Finish
CLR TI
; RET
;------------------------------------------------------------
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/0为开漏模式
Set_P12_Open_Drain:
PUSH ACC
MOV A,#0x04
ORL P1M0,A
ORL P1M1,A
POP ACC
; RET
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
;设置P1.2为普通IO
Set_P12_Normal_IO:
PUSH ACC
MOV A,#0xFA
ANL P1M0,A
ANL P1M1,A
POP ACC
; RET
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
Set_ADC_Channel_2:
MOV ADC_CONTR,#ADC_Power_On_Speed_Channel_2 ;选择P1.2作为A/D转换通道
MOV A,#05H ;更换A/D转换通道后要适当延时,使输入电压稳定,
;如果不更换A/D转换通道时,则不需要加延时
ACALL Delay ;切换A/D转换通道,加延时20uS~200uS,与输入电压源的内阻有关,如果输入电压信号源的内阻在10K以下.则不需要
; RET
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
Send_AD_Result:
PUSH ACC
MOV A,ADC_Channel_2_Result ;取A/D转换结果
ACALL Send_Byte ;发送转换结果到PC机
POP ACC
; RET
;------------------------------------------------------------------------------
;-----------------------------------------------------------------------------
Get_AD_Result:
PUSH ACC
MOV ADC_DATA,#0
ORL ADC_CONTR,#0x8 ;启动A/D转换
Wait_AD_Finishe:
MOV A,#0x10 ;判断AD转换是否完成
ANL A,ADC_CONTR
JZ Wait_AD_Finishe ;AD转换尚未完成,继续等待
ANL ADC_CONTR,#0xE7 ;清0 ADC_FLAG,ADC_START位,停止A/D转换
MOV A,ADC_DATA
MOV ADC_Channel_2_Result,A ;保存AD转换结果
POP ACC
; RET
;------------------------------------------------------------------------------
Delay:
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 2,#249 ;2 CLOCK
Delay_Loop:
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
END |