;/* --- STC International Limited --------------------------------------------------- */
;/* --- 宏晶科技 姚永平 設(shè)計(jì) 2009/1/10 V1.0 ---------------------------------------- */
;/* --- 演示 STC12C5201AD 系列 MCU 的 A/D 轉(zhuǎn)換功能------------------------------------ */
;/* --- Mobile: 13922805190 --------------------------------------------------------- */
;/* --- Fax: 0755-82944243 ---------------------------------------------------------- */
;/* --- Tel: 0755-82948409 ---------------------------------------------------------- */
;/* --- Web: www.mcu-memory.com ----------------------------------------------------- */
;如果要在程序中使用或在文章中引用該程序,請?jiān)诔绦蛑谢蛭恼轮凶⒚魇褂昧撕昃Э萍嫉馁Y料及程序
;本程序用宏晶的STC-ISP Ver 3.0A.PCB的下載編程工具測試通過,相關(guān)的A/D轉(zhuǎn)換結(jié)果在P1口上顯示
;轉(zhuǎn)換結(jié)果也以 16 進(jìn)制形式輸出到串行口,可以用串行口調(diào)試程序觀察輸出結(jié)果。
;時(shí)鐘 18.432MHz, 波特率 = 9600。
;轉(zhuǎn)換結(jié)果也在 P1 口利用 LED 顯示出來, 方便觀察。
LED_MCU_START EQU P3.7
ADC_CONTR EQU 0BCH ;A/D轉(zhuǎn)換寄存器
ADC_RES EQU 0BDH ;8位A/D轉(zhuǎn)換結(jié)果寄存器
P1ASF EQU 9DH ;P1口中的相應(yīng)位作為模擬功能使用時(shí)的控制寄存器,如做A/D用,相應(yīng)位要置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 11100111B ;P1.7作為A/D輸入
;-------------------------------------------------
;定義變量
ADC_Channel_0_Result EQU 30H ;0通道A/D轉(zhuǎn)換結(jié)果
ADC_Channel_1_Result EQU 31H ;1通道A/D轉(zhuǎn)換結(jié)果
ADC_Channel_2_Result EQU 32H ;2通道A/D轉(zhuǎn)換結(jié)果
ADC_Channel_3_Result EQU 33H ;3通道A/D轉(zhuǎn)換結(jié)果
ADC_Channel_4_Result EQU 34H ;4通道A/D轉(zhuǎn)換結(jié)果
ADC_Channel_5_Result EQU 35H ;5通道A/D轉(zhuǎn)換結(jié)果
ADC_Channel_6_Result EQU 36H ;6通道A/D轉(zhuǎn)換結(jié)果
ADC_Channel_7_Result EQU 37H ;7通道A/D轉(zhuǎn)換結(jié)果
;--------------------------------------------------
ORG 0000H
LJMP MAIN
ORG 0050H
MAIN:
CLR LED_MCU_START ;MCU工作指示燈 LED_MCU_START EQU P3.7
MOV SP, #7FH ;設(shè)置堆棧
ACALL Initiate_RS232 ;初始化串口
ACALL ADC_Power_On ;開ADC電源, 第一次使用時(shí)要打開內(nèi)部模擬電源
;開ADC電源, 可適當(dāng)加延時(shí),1mS以內(nèi)就足夠了
ACALL Set_P12_ASF ;設(shè)置 P1.2 為模擬功能口
ACALL Set_ADC_Channel_2 ;設(shè)置 P1.2 作為A/D轉(zhuǎn)換通道
ACALL Get_AD_Result ;測量電壓并且取A/D轉(zhuǎn)換結(jié)果
ACALL Send_AD_Result ;發(fā)送轉(zhuǎn)換結(jié)果到 PC 機(jī)
ACALL Set_P12_Normal_IO ;設(shè)置 P1.2 為普通IO
MOV A, ADC_Channel_2_Result ;用 P1 口顯示A/D轉(zhuǎn)換結(jié)果
CPL A
MOV P1, A
Wait_Loop:
SJMP Wait_Loop ;停機(jī)
;-------------------------------------------------------------
;-------------------------------------------------------------
;-------------------------------------------------------------
;-------------------------------------------------------------
Initiate_RS232: ;串口初始化
CLR ES ;禁止串口中斷
MOV TMOD, #20H ;設(shè)置 T1 為波特率發(fā)生器
MOV SCON, #50H ;0101,0000 8位數(shù)據(jù)位, 無奇偶校驗(yàn)
MOV TH1, #0FBH ;18.432MHz 晶振, 波特率 = 9600
MOV TL1, #0FBH
SETB TR1 ;啟動(dòng) 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轉(zhuǎn)換電源
MOV A, #20H
ACALL Delay ;開A/D轉(zhuǎn)換電源后要加延時(shí),1mS以內(nèi)就足夠了
POP ACC
RET
;-------------------------------------------------------------
;設(shè)置P1.2為模擬功能
Set_P12_ASF:
PUSH ACC
MOV A, #00000100B
ORL P1ASF, A
POP ACC
RET
;-------------------------------------------------------------
;設(shè)置 P1.2 為普通IO
Set_P12_Normal_IO:
PUSH ACC
MOV A, #11111011B
ANL P1ASF, A
POP ACC
RET
;-------------------------------------------------------------
Set_ADC_Channel_2:
MOV ADC_CONTR, #ADC_Power_On_Speed_Channel_2
;選擇P1.2作為A/D轉(zhuǎn)換通道
MOV A, #05H ;更換 A/D 轉(zhuǎn)換通道后要適當(dāng)延時(shí), 使輸入電壓穩(wěn)定
;以后如果不更換 A/D 轉(zhuǎn)換通道的話, 不需要加延時(shí)
ACALL Delay ;切換 A/D 轉(zhuǎn)換通道,加延時(shí)20uS~200uS就可以了,與輸入電壓源的內(nèi)阻有關(guān)
;如果輸入電壓信號源的內(nèi)阻在10K以下,可不加延時(shí)
RET
;-------------------------------------------------------------
Send_AD_Result:
PUSH ACC
MOV A, ADC_Channel_2_Result ;取 AD 轉(zhuǎn)換結(jié)果
ACALL Send_Byte ;發(fā)送轉(zhuǎn)換結(jié)果到 PC 機(jī)
POP ACC
RET
;----------------------------------------------------------
Get_AD_Result:
PUSH ACC ;入棧保護(hù)
MOV ADC_RES, #0
ORL ADC_CONTR, #00001000B ;啟動(dòng) AD 轉(zhuǎn)換
NOP ;在對ADC_CONTR寄存器進(jìn)行寫操作后,要加4個(gè)空操作延時(shí),才能夠正確讀到ADC_CONTR的值
NOP ;在對ADC_CONTR寄存器進(jìn)行寫操作后,要加4個(gè)空操作延時(shí),才能夠正確讀到ADC_CONTR的值
NOP ;在對ADC_CONTR寄存器進(jìn)行寫操作后,要加4個(gè)空操作延時(shí),才能夠正確讀到ADC_CONTR的值
NOP ;在對ADC_CONTR寄存器進(jìn)行寫操作后,要加4個(gè)空操作延時(shí),才能夠正確讀到ADC_CONTR的值
Wait_AD_Finishe:
MOV A, #00010000B ;判斷 AD 轉(zhuǎn)換是否完成
ANL A, ADC_CONTR
JZ Wait_AD_Finishe ;AD 轉(zhuǎn)換尚未完成, 繼續(xù)等待
ANL ADC_CONTR, #11100111B ;清0 ADC_FLAG, ADC_START 位, 停止A/D轉(zhuǎn)換
MOV A, ADC_RES
MOV ADC_Channel_2_Result, A ;保存 AD 轉(zhuǎn)換結(jié)果
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 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
;----------------------------------------------------------------
END