⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mcs51_list_10_6.asm

📁 source code from Starcki book
💻 ASM
字号:
; =======================================================================
;
;           Tomasz Starecki: "Mikrokontrolery 8051 w praktyce"
;              Wydawnictwo BTC  -  http://www.btc.pl
;
; =======================================================================
; przykladowe procedury obslugi sprzetowego interfejsu SPI 
; w mikrokontrolerze 89S8252, sterujace przetwornikiem A/C i C/A
; udostepniane sa procedury jak w deklaracji PUBLIC
; wymagane zdefiniowanie (typowo w module glownym) parametr體 jak w EXTERN
; UWAGA: W przypadku programowej implementacji interfejsu SPI, 
; obie procedury obslugi przetwornika pozostaja niezmienione,
; jedyna zmiana jest nieco inna implementacja procedury SPI_transfer
; (patrz na koniec listingu)
;    niszczy ACC, PSW 
; =======================================================================

PUBLIC _get_adc, _set_dac

adc_cs 	equ p1.2
dac_cs	equ p1.3
sclk	equ p1.7
miso	equ p1.6
mosi	equ p1.5

; ================================================================
; procedura sterujaca przetwornikiem A/C (wyzwolenie pomiaru
; na zadanym wejsciu przetwornika i odczyt wyniku)
; na wejsciu do procedury w R7 numer wejscia analogowego, 
; na kt髍ym nalezy dokonac pomiaru napiecia
; przy wyjsciu  procedury starszy bajt wyniku w R6, mlodszy w R7
;    niszczy ACC, PSW
; ================================================================

_get_adc:
CLR adc_cs		; zezwolenie na komunikacja z przetwornikiem A/C
MOV SPCR, #01010001B	; ustawienie trybu pracy interfejsu SPI
MOV A, #6		; tryb pracy przetwornika: single-ended
CALL SPI_transfer		; wyslanie pierwszego bajtu (sterujacego)
MOV A, R7
RR A			; numer wejscia analogowego 
RR A			; na dw骳h najbardziej znaczacych bitach
CALL SPI_transfer		; wyslanie drugiego bajtu (numeru wejscia analogowego)
ANL A, #0FH		; maskowanie nieznaczacych bit體 wyniku
MOV R6, A		; starszy bajt wyniku do R6
CALL SPI_transfer		; odczyt mlodszego bajtu
MOV R7, A		; mlodszy bajt wyniku do R6
SETB adc_cs		; zablokowanie dalszej komunikacji
RET

; ================================================================
; procedura sterujaca przetwornikiem C/A 
; na wejsciu do procedury w R7 numer wyjscia analogowego, 
; w R5 warto滄 binarna napiecia wyjsciowego
;    niszczy ACC, PSW
; ================================================================

_set_dac:
CLR dac_cs		; zezwolenie na komunikacje z przetwornikiem
MOV SPCR, #01010001B	; ustawienie trybu pracy interfejsu SPI
MOV A, R7
RL A			; wstepna obr骲ka dopasowywujaca dane wejsciowe
ADD A, R7		; do formatu wymaganego przez przetwornik
XRL A, #00100001B		; slowo sterujace przetwornikiem C/A (numer wyjscia)
CALL SPI_transfer		; i jego wyslanie
MOV A, R5
CALL SPI_transfer		; wyslanie wlasciwych danych (napiecia)
SETB dac_cs
RET

; ==============================================
; procedura odpowiedzialna za obsluge sprzetowej
; wersji interfejsu SPI
; ==============================================

SPI_transfer:
MOV SPDR, A		; wysylana jest zawartosc ACC
MOV A, SPSR		; sprawdzanie w petli bitu stanu SPI
JNB ACC.7, $-2		; w oczekiwaniu na koniec transmisji
MOV A, SPDR		; odebrany bajt bedzie w ACC
RET
; ==============================================
; i analogiczna procedura dla implementacji
; programowej, z tym ze przystosowana wylacznie
; do wysylania danych (czyli do sterowania
; przetwornikiem C/A)
; ==============================================

np. DOUT EQU P1.4
    SCLK EQU P1.5

out_spi:
MOV R7, #8		; do wyslania jest 8 bit體
loop1:
MOV C, ACC.7		; kolejny bit do CY
MOV DOUT, C		; i na wyprowadzenie DOUT mikrokontrolera
; sluzace jako linia MOSI
SETB SCLK
CLR SCLK			; machniecie impulsem zegara na linii SCLK
RL A			; nastepny bit do wyslania na ACC.7
DJNZ R7, loop1		; jesli nie wszystkie bity, to skok
RET			; a jesli wszystkie - powr髏 z procedury

END				; koniec modulu

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -