本帖最后由 51黑黑黑 于 2016-3-3 00:51 編輯
(一)STC12C2052 系列單片機簡介
STC12C2052 系列單片機是單時鐘/機器周期(1T)的兼容8051內(nèi)核的單片機,是高速/低功耗的新一代8051單片機,全新的流水線/精簡指令集結(jié)構(gòu),其特點是: 1.增強型 1T流水線/ 精簡指令集結(jié)構(gòu) 8051 CPU 2.工作電壓:2.4V -3.8V / 3.4V - 5.5V 3.工作頻率范圍:0 - 35MHz,相當(dāng)于普通8051 的0~420MHz 4.用戶應(yīng)用程序空間512 /1K / 2K / 3K / 4K / 5K 字節(jié) 5.片上集成 256字節(jié)RAM 6.15 個通用I/O 口,復(fù)位后為:準雙向口/ 弱上拉 可設(shè)置成四種模式:準雙向口/弱上拉,推挽/強上拉,僅為輸入/高阻,開漏 7.EEPROM 功能 8.共2個16 位定時器/ 計數(shù)器 9.PWM(2 路)/PCA(可編程計數(shù)器陣列) 10.ADC, 8 路8位精度 11. 通用異步串行口(UART) 12. SPI 同步通信口, 主模式/ 從模式 13.看門狗 14.內(nèi)部集成 R/C振蕩器,精度要求不高時可省外部晶體 15.ISP/IAP 16.工作溫度范圍: 0 -75℃ / -40 -+85℃ 17.封裝: PDIP-20,SOP-20(寬體),TSSOP-20 STC12C2052AD 系列帶A/D轉(zhuǎn)換的單片機在P1 口,有8 路8 位高精度的高速A/D 轉(zhuǎn)換器,速度可達100KHz。P1.7 - P1.0 共8 路電壓輸入型A/D,可做溫度檢測、電池電壓檢測、按鍵掃描、頻譜檢測等。上電復(fù)位后P1 口為弱上拉型I/O 口,用戶可以通過軟件設(shè)置將8 路中的任何一路設(shè)置為A/D 轉(zhuǎn)換,不需作為A/D 使用的口可繼續(xù)作為I/O 口使用。需作為A/D使用的口需先將其設(shè)置為高阻輸入或開漏模式。在P1M0、P1M1 中對相應(yīng)的位進行設(shè)置。 ADC_START: 模數(shù)轉(zhuǎn)換器(ADC)轉(zhuǎn)換啟動控制位,設(shè)置為“1”時,開始轉(zhuǎn)換 ADC_FLAG: 模數(shù)轉(zhuǎn)換器轉(zhuǎn)換結(jié)束標志位,當(dāng)A/D轉(zhuǎn)換完成后,ADC_FLAG =1。 STC12C2052AD 系列單片機內(nèi)部有256 字節(jié)常規(guī)的RAM。器件的內(nèi)部常規(guī)數(shù)據(jù)存儲器由3 部分組成: 1.低128字節(jié)RAM(00H~7FH),可直接和間接尋址, 用“MOV”和“MOV@Ri” 2.高128字節(jié)RAM(80H~FFH),間接尋址,用“MOV@Ri” 3.特殊功能寄存器(80H~FFH),只可直接尋址, 用“MOV” 由于高128字節(jié)RAM 和SFR(特殊功能寄存器)占用相同的地址,因此高128 字節(jié)RAM 空間必須用間接尋址(MOV @Ri)來區(qū)分。特殊功能寄存器(80H ~FFH),只可直接尋址(用“MOV”)來區(qū)分。盡管R AM和SFR的地址相同,但它們在物理上是獨立的。 (一)STC12C2052 系列單片機應(yīng)用實例 ;下面是利用STC12C4052AD單片機A/D轉(zhuǎn)換器采集數(shù)據(jù),通過串口收到的TPH值決定是幾個通道采集數(shù)據(jù),"AA"雙通道,"CC"三通道,默認一個通道,每采集完128個數(shù)據(jù)后,通過串口發(fā)送到主機,主機收到數(shù)據(jù)后顯示波形,STC12C4052AD單片機比STC12C2052AD單片機FLASH程序存儲器大,其它相同。
ORG0000H
AJMP MAIN;轉(zhuǎn)入主程序
ORG 0003H ;外部中斷P3.2腳INT0入口地址
RETI
ORG000BH;
RETI
ORG 0013H;
RETI
ORG 0023H
LJMP S
WDT_CONTR EQU0C1H
ADC_CONTR EQU 0C5H ;A/D轉(zhuǎn)換寄存器
ADC_DATA EQU 0C6H ;8位A/D轉(zhuǎn)換結(jié)果寄存器
P1M0 DATA 91H
P1M1 DATA 92H
TPHDATA 30H ;根據(jù)TPH值決定是幾個通道采集數(shù)據(jù),"AA"雙通道
ADC_Channel_1_Result EQU 33H ;1通道A/D轉(zhuǎn)換結(jié)果
ADC_Power_On_Speed_Channel_0 EQU11100000B ;;B7=power,B6B5=speed,B4=flag,B3=start;B2B1B0=ch0-ch7, 000是P1.0作為A/D輸入,000是P1.0輸入
ADC_Power_On_Speed_Channel_1 EQU 11100001B ;001是P1.1作為A/D輸入
ADC_Power_On_Speed_Channel_2 EQU 11100010B ;010是P1.2作為A/D輸入
MAIN: MOV ADC_CONTR, #ADC_Power_On_Speed_Channel_0
; SETB IT0 ;設(shè)定INT0de觸發(fā)方式為脈沖負邊沿觸發(fā)
MOV SCon,#50h; 方式1,REN=1.SM0,SM1,SM2,REN,TB8,RB8,TI,RI
MOV TMOD,#21H;波特率發(fā)生器T1工作在模式2上
MOV TH1,#0FFH;0E6H;預(yù)置初值(按照波特率1200BPS預(yù)置初值)24.576=12800
MOV TL1,TH1;預(yù)置初值(按照波特率1200BPS預(yù)置初值)
MOV PCON,#80H ;SMOD=1倍頻
MOV TH0, #10H ;3.6864M最大定時213.3ms,1000h定時200ms
MOV TL0, #00H
SETB TR1;啟動定時器T1
; MOV WDT_CONTR ,#25H;;;;;;看門狗設(shè)置使能
MOVP1M0,#10000111b ; P1M0=0 P1M1=0雙向口 P1M0=1 P1M1=0輸入口 P1M0=0 P1M1=1推挽輸出20ma
MOV P1M1,#01111000b
MOV A,#0H
MOV R0,#80H
MOV R2,#128
CLEAR: MOV @R0,A
INC R0
INC A
DJNZ R2,CLEAR
CALL YSC
CALL YSC
MOVTPH,#22D ;4個正弦波=11
SETB EA
SETBES
DS18B10: MOV A,TPH
XRLA,#0AAH ;根據(jù)TPH值決定是幾個通道采集數(shù)據(jù),"AA"雙通道
JZ DS18B2
MOV A,TPH
XRLA,#0CCH ;根據(jù)TPH值決定是幾個通道采集數(shù)據(jù),"CC"三通道
JZ DS18B3
DS18B20: JBP3.7,DS18B10 ;單通道采集數(shù)據(jù)
CLR EA
MOV R0,#80h;CLR EA
MOV R2,#128
;ACALLADC_Power_On ;開ADC電源,第一次使用時要打開內(nèi)部模擬電源
JB P1.7,DS17 ;根據(jù)p1.7 選擇AD通道
ACALLSet_ADC_Channel_1 ;設(shè)置 P1.1 作為A/D轉(zhuǎn)換通道 MOV ADC_CONTR,#ADC_Power_On_Speed_Channel_1
AJMP DS18B
DS17: MOV ADC_CONTR,#ADC_Power_On_Speed_Channel_0
ACALL CH0
DS18B: ACALLGet_AD_Result ;測量電壓并且取A/D轉(zhuǎn)換結(jié)果
MOV A,ADC_Channel_1_Result ;取 AD 轉(zhuǎn)換結(jié)果
MOV @R0,A;
INC R0
; JNB P1.7 ,DS18
ACALL YS
DS18: DJNZ R2,DS18B
CALL FXL1
; MOV ADC_CONTR,#10000000B
CALL YSC
CALL YSC
CALL YSC
CALL YSC
SETB EA
SJMP DS18B20
DS18B2: JBP3.7,$ ;雙通道采集數(shù)據(jù)
CLR EA
MOV R0,#80h;80H--0FFH128個RAM
MOV R2,#128
DS2: MOV A, ADC_CONTR
JB ACC.0, DS1
ACALLSet_ADC_Channel_1 ;設(shè)置 P1.1 作為A/D轉(zhuǎn)換通道 MOV ADC_CONTR,#ADC_Power_On_Speed_Channel_1
AJMP DS18B1
DS1: MOV ADC_CONTR,#ADC_Power_On_Speed_Channel_0
ACALL CH0
DS18B1: ACALLGet_AD_Result ;測量電壓并且取A/D轉(zhuǎn)換結(jié)果
MOV A,ADC_Channel_1_Result ;取 AD 轉(zhuǎn)換結(jié)果
MOV @R0,A;
INC R0
; ACALL YS
DJNZ R2,DS2
CALL FXL1
CALL YSC
CALL YSC
CALL YSC
CALL YSC
SETB EA
SJMP DS18B10;DS2
DS18B3: JBP3.7,$ ;三通道采集數(shù)據(jù)
CLR EA
MOV R0,#80h;CLR EA
MOV R2,#128
MOV ADC_CONTR,#ADC_Power_On_Speed_Channel_2
ACALL CH0
DS18B4: ACALLGet_AD_Result ;測量電壓并且取A/D轉(zhuǎn)換結(jié)果
MOV A,ADC_Channel_1_Result ;取 AD 轉(zhuǎn)換結(jié)果
JZ DS18B5
SUBB A,#64H
DS18B5: ADD A,#32H
MOV @R0,A;
INC R0
ACALLYS ;TPH=CCH
DJNZ R2,DS18B4
CALL FXL1
CALL YSC
CALL YSC
CALL YSC
CALL YSC
SETB EA
LJMP DS18B10;
S: PUSH ACC
PUSHPSW
PUSH04H
PUSHDPH
PUSHDPL
CLR ES
S1: SETB REN
JNBRI,$ ;判斷特征字
CLR RI
MOV A,SBUF
MOV TPH,A
POP DPL
POPDPH
POP04H
POPPSW
POPACC
SOVER: SETB ES
RETI
FXL1: MOV R0,#80H
MOV R2,#128D
FXL1B: MOVSBUF,@R0
JNB TI,$
CLR TI
INC R0
JB P3.7,$
DJNZ R2,FXL1B
RET
;--------------------------------------------------------------
ADC_Power_On:
PUSH ACC
ORL ADC_CONTR,#80H ;開A/D轉(zhuǎn)換電源
MOV A, #20H
ACALLDelay8 ;開A/D轉(zhuǎn)換電源后要加延時,1mS以內(nèi)就足夠了
POP ACC
RET
;-------------------------------------------------------------
Set_ADC_Channel_1:
MOV ADC_CONTR,#ADC_Power_On_Speed_Channel_1 ;選擇P1.1作為A/D轉(zhuǎn)換通道
CH0: MOV A,#05H ;更換 A/D 轉(zhuǎn)換通道后要適當(dāng)延時, 使輸入電壓穩(wěn)定 ;以后如果不更換 A/D 轉(zhuǎn)換通道的話, 不需要加延時
ACALLDelay8 ;切換 A/D 轉(zhuǎn)換通道,加延時20uS~200uS就可以了,與輸入電壓源的內(nèi)阻有關(guān) ;如果輸入電壓信號源的內(nèi)阻在10K以下,可不加延時
;ACALL DELAY20US
RET
;----------------------------------------------------------
Get_AD_Result:
PUSH ACC ;入棧保護
MOV ADC_DATA, #0
ORL ADC_CONTR,#00001000B ;啟動 AD 轉(zhuǎn)換
NOP ;在對ADC_CONTR寄存器進行寫操作后,要加4個空操作延時,才能夠正確讀到ADC_CONTR的值
NOP ;
NOP ;
NOP ;
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_DATA
MOV ADC_Channel_1_Result,A ;保存 AD 轉(zhuǎn)換結(jié)果
POP ACC
RET
;---------------------------------------------------------------
Delay8:
PUSH 02 ;將寄存器組0 的 R2入棧
PUSH 03 ;將寄存器組0 的 R3入棧
PUSH 04 ;將寄存器組0 的 R4入棧
MOV R4, A
Delay_Loop0:
MOV R3,#100;200 ;2 CLOCK ---------------------+
Delay_Loop1: ; |
MOV R2,#249 ;2 CLOCK ------+ |
Delay_Loop: ; | 1002 CLOCK |200406CLOCK
DJNZ R2,Delay_Loop ;4CLOCK | |
DJNZ R3,Delay_Loop1 ;4 CLOCK ------+ |
DJNZ R4,Delay_Loop0 ;4 CLOCK ---------------------+
POP 04
POP 03
POP 02
RET
;----------------------------------------------------------------
YS: MOV 7EH, TPH;#64H
YS1: MOV 7FH, #40D;0FFH
YS2: DJNZ 7FH, YS2
DJNZ 7EH, YS1
RET
YSC: MOV 7EH, #0FFH
YSC1: MOV 7FH, #0FFH
YSC2: DJNZ 7FH, YSC2
DJNZ 7EH, YSC1
RET
end
|