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

📄 dallas.asm

📁 pic系列单片机得控制程序 主要进行温度采集和转换控制
💻 ASM
字号:
; Lecteur DALLAS avec liaison RS232 9600 bauds
; 14 janvier 2001


	list P=16F876
	include <C:\progra~1\MPLAB2\P16F876.INC>

; configuration du processeur

	__CONFIG _CP_OFF&_DEBUG_OFF&_WRT_ENABLE_ON&_CPD_OFF&_LVP_OFF&_BODEN_ON&_PWRTE_ON&_WDT_ON&_HS_OSC

;____________________________________________________________________________________________________________________
; variables
;____________________________________________________________________________________________________________________

serie		equ 20
part1		equ 21
part2		equ 22
part3		equ 23
part4		equ 24
part5		equ 25
part6		equ 26
dallasCRC	equ 27
tmp		equ 28
compteur	equ 29
valeur		equ 2A
temp		equ 2B
rotation	equ 2C
nboctet		equ 2D
crc		equ 2F
adresse		equ 30
dataee		equ 31
saveW		equ 32
savesta		equ 33
saveFSR		equ 34
flag		equ 35
caractere	equ 36
adresseH	equ 37
adresseL	equ 38	
dataF		equ 39
nbkey		equ 3A
temp1		equ 3B
temp2		equ 3C
timer		equ 3D		; timer pour tempo 1 seconde
seconde		equ 3E		; compteur de secondes
key		equ 3F		; indice de la clef trouv閑
decompte	equ 40		; decompte pour tempo relais
adlow		equ 41		; poids faible adresse R/W pour protocole
adhigh		equ 42		; poids fort   adresse R/W pour protocole

;____________________________________________________________________________________________________________________
; constantes
;____________________________________________________________________________________________________________________

skiprom		equ 0CC		; commande DALLAS 
readscratch	equ 0BE		;     "           "
convert		equ 44		;     "           "
readrom		equ 33		;     "           "
readram		equ 0F0		;     "           "
Ladress		equ 0
Hadress		equ 0
ahigh		equ 08
alow		equ 00
nbclef		equ 05		; nb maximum de clef
ACK		equ 06		; acknowledge liaison serie

;____________________________________________________________________________________________________________________
; etiquettes bits
;____________________________________________________________________________________________________________________

#define _data		PORTA,0
#define _rouge		PORTB,7
#define _verte		PORTB,6
#define _relais		PORTB,5
masque		equ b'10000000'		; masque de la led qui clignote
					; la led qui clignote doit 阾re sur le PORTB
#define zero		STATUS,Z
#define _receivedcar	flag,0
#define idem		flag,1
#define _clignote	flag,2

;____________________________________________________________________________________________________________________
; macro commandes
;____________________________________________________________________________________________________________________

bank0	macro
	bcf STATUS,RP0
	bcf STATUS,RP1
	endm

bank1 	macro	
	bsf STATUS,RP0
	endm

bank2	macro
	bcf STATUS,RP0
	bsf STATUS,RP1
	endm

bank3	macro
	bsf STATUS,RP0
	bsf STATUS,RP1
	endm

;____________________________________________________________________________________________________________________
; ent阾e programme
;____________________________________________________________________________________________________________________

	org 2100			; initialisation de l'EEPROM
	de 00,05

	org 0
	goto debut
	org 4
	goto interrupt

;____________________________________________________________________________________________________________________
; programme
;____________________________________________________________________________________________________________________

debut:
	clrwdt
	clrf flag
	movlw 5
	movwf timer
	call initwdt			; initialisation du watchdog
	call initportA			; initialisation PORT A
	call initportB
	call initportC			; initialisation PORT C
	call initV24			; initialisation RS232
	call inittmr1			; initialisation timer 1
	call initint			; initialisation des interruptions
	movlw 0
	movwf adresse
	clrwdt
	call readEE			; va lire l'adresse 0 de l'EEPROM
	xorlw 0
	btfsc zero
	goto firstaccess
	bsf _rouge

main:
	clrwdt
	call litcode
	btfsc STATUS,C
	goto access
	btfss _receivedcar
	goto main
	bcf _receivedcar
	movf caractere,w
	xorlw 'M'			; set mem ?
	btfsc zero
	goto setmem
	xorlw 'M'
	xorlw 'R'			; read mem ?
	btfsc zero
	goto readmem
	xorlw 'R'
	xorlw 'W'			; write mem
	btfsc zero
	goto writemem
	goto main

setmem:
	movlw d'255'
	movwf seconde
sm1:
	clrwdt
	movf seconde,w			; time out liaison serie une seconde
	btfsc zero
	goto main
	btfss _receivedcar		; attent adresse basse
	goto sm1
	bcf _receivedcar
	movf caractere,w	
	movwf adlow			; dans le registre
	movlw d'255'
	movwf seconde
sm2:
	clrwdt
	movf seconde,w			; time out liaison serie
	btfsc zero
	goto main
	btfss _receivedcar		; attend adresse haute
	goto sm2
	bcf _receivedcar
	movf caractere,w
	movwf adhigh			; dans le registre
	movlw ACK
	call transmit			; puis transmettre un ACK
	goto main

readmem:
	movlw d'255'
	movwf seconde
rm1:
	clrwdt
	movf seconde,w
	btfsc zero
	goto main
	btfss _receivedcar
	goto rm1
	bcf _receivedcar
	movf caractere,w
	xorlw 'E'
	btfsc zero
	goto rEEPROM
	xorlw 'E'
	xorlw 'F'
	btfsc zero
	goto rflash
	xorlw'F'
	xorlw 'R'
	btfss zero
	goto main
rram:					; lecture dans la ram
	movlw 8
	movwf compteur
	movlw serie
	movwf FSR
rr1:
	movf INDF,w
	call transmit
	incf FSR,f
	decfsz compteur,f
	goto rr1
	movlw ACK
	call transmit
	goto main

rflash:					; lecture dans la flash
	clrwdt
	movf adlow,w
	movwf adresseL
	movf adhigh,w
	movwf adresseH
	call readF
	call transmit			; envoi de l'octet
	movlw ACK
	call transmit
	movf adlow,w
	addlw 1
	btfsc zero
	incf adhigh,f
	movf adlow,w
	goto main
rEEPROM:
	clrwdt
	movf adlow,w
	movwf adresse
	call readEE			; va lire l'EEPROM
	call transmit
	movlw ACK
	call transmit
	incf adlow,f
	goto main

writemem:
	movlw d'255'
	movwf seconde
wm1:
	clrwdt
	movf seconde,w
	btfsc zero
	goto main
	btfss _receivedcar
	goto wm1
	bcf _receivedcar
	movf caractere,w
	xorlw 'E'
	btfsc zero
	goto wEEPROM
	xorlw 'E'
	xorlw 'F'
	btfsc zero
	goto wFLASH
	xorlw 'F'
	xorlw 'R'
	btfss zero
	goto main
wRAM:					; RAZ des 8 octets du code DALLAS en RAM
	clrwdt
	movlw 8
	movwf compteur
	movlw serie
	movwf FSR
wr1:
	movlw 0
	movwf INDF
	incf FSR,f
	decfsz compteur,f
	goto wr1
	movlw ACK
	call transmit
	goto main
wFLASH:					; ecriture dans la FLASH
	clrwdt
	movf adlow,w
	movwf adresseL
	movf adhigh,w
	movwf adresseH
	movlw d'255'
	movwf seconde
wf1:
	clrwdt
	movf seconde,w
	btfsc zero
	btfss _receivedcar
	goto wf1
	bcf _receivedcar
	movf caractere,w
	movwf dataF
	call writeF
	movlw ACK
	call transmit		
	movf adlow,w
	addlw 1
	btfsc zero
	incf adhigh,f
	movf adlow,w
	goto main
wEEPROM:				; ecriture dans l'EEPROM
	movf adlow,w
	movwf adresse
	movlw d'255'
	movwf seconde
we1:
	clrwdt
	movf seconde,w
	btfsc zero
	goto main
	btfss _receivedcar
	goto we1
	bcf _receivedcar
	movf caractere,w
	movwf dataee
	call writeEE
	movlw ACK
	call transmit
	incf adlow,f
	goto main


firstaccess:				; aucune clef dans la flash
	bsf _clignote
fa1:
	clrwdt
	call litcode
	btfss STATUS,C
	goto fa1
	bcf _clignote
	bcf _rouge
	call entercode	
	bsf _verte
	call setrelais
	bcf _verte
	bsf _rouge
	goto main

newaccess:				; adjonction d'une clef
	movlw 0				; verifier 
	movwf adresse			; si
	call readEE			; le nombre maxi de clef 
	addlw 1				; n'est pas atteint
	sublw nbclef 
	btfss STATUS,C
	goto endna
	bcf _verte
	bcf _rouge
	bsf _clignote
	clrf seconde
na0:
	clrwdt
	movf seconde,w
	xorlw 5
	btfss zero
	goto na0
	clrf seconde
na1:
	clrwdt
	movf seconde,w
	xorlw 0A			; time out = 10 secondes	
	btfsc zero
	goto endna
	call litcode
	btfss STATUS,C
	goto na1
	call entercode	
	bcf _clignote
	bcf _rouge
	bsf _verte
	call setrelais
endna:
	bcf _clignote
	bcf _verte
	bsf _rouge
	goto main

access:					; une clef a 閠

⌨️ 快捷键说明

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