Проектирование микропроцессорной системы управления электронным замком
Дипломная работа - Компьютеры, программирование
Другие дипломы по предмету Компьютеры, программирование
tM.EQU O20H.2;160mS period bitM.EQU O20H.3;320mS period bitM.EQU O20H.4;640mS period bitS28.EQU O20H.5;1.28S period bitS56.EQU O20H.6;2.56S period bitS12.EQU O20H.7;5.12S period bit.EQU 021H;Real time program counter (100mS part).EQU 022H.EQU O22H.0;program mode flag.EQU O22H.1;set number flag.EQU O22H.2;display blink bit.EQU O22H.3;SELECT press flag.EQU O22H.4;OPEN press flag
;Internal Data Memory:
.ORG 0030H;data memory segment
.DS 8;touch memory ROM data.DS 1;temporary byte (used in ACCESS90).DS 1;touch memory access timer.DS 1;TM access enable timer.DS 1;open timer.DS 1;return timer.DS 1;current PRG number (1..9)
;Debugger variables:
1).DS1;debuggervariableaddressininternalmemory.DS1;debuggervariablevalueininternalmemory.EQU0FFFFH;debuggeraddressinexternalmemory">#IF (DEBUG>1).DS 1;debugger variable address in internal memory.DS 1;debugger variable value in internal memory.EQU 0FFFFH;debugger address in external memory
#ENDIF:;stack location
; ------ Vectors Area ------
.ORG 0000H;reset vectorINIT
.ORG 000BH;INT TIMER 0 vectorRTC
; ------ Main Program ------:MOV SP,#STACK;stack init
#IF (DEBUG>1);debug init
#ENDIF
;Variables init:AFLAGS1,A;clear flags 1TMATM,A;touch memory access timer clearAENTM,A;touch memory access delay timer clearOPNTM,A;open timer clearRETTM,A;return timer clear
;Periferal setup:TR0;timer 0 stopTR1;timer 1 stopTMOD,#11H ;timer 0 and timer 1 initTL0,#LO(RTCV) ;timer 0 loadTH0,#HI(RTCV)TR0;timer 0 startPT0 ;int. timer 0 low priorityET0;int. timer 0 enableEA;interrupts enable
; ------ Main Loop ------
;Read touch memory::LCALL ACCESS90;read touch memoryNOTCH;no touchPROG,PRG;jump to process PROG modeCHKMAS;check for master codeOPNCHKMEM;check for member codeOPNNOTCH:LCALL PROGT;process PROG mode when touchNOTCH:LCALL OPEN;open door
;Check open key::LCALL CHKOPK;check open keyNOOPNOPEN;open door
;Check select key::LCALL CHKSLK;check select keyNOSELPROGS;process PROG mode when select
;Open timer check::MOV A,OPNTMNOCLSCLOSE;solenoid off
;Return timer check::MOV A,RETTMNORETRETMD;return to normal mode
;Display, watchdog wakeup::LCALL DISP;displayWAKEUP;watchdog wakeupMAIN
; ------ Subroutines Area ------
;Process PROG mode when touch:: JB SNUM,PRGT1;SNUM = 1 ?CHKMAS;check for masterPRGT3:SETB SNUM;set "set number" flagBLINK;clear blink flagNUM,#1;clear numberRETTM,#RETTMV;load return delay:JB BLINK,PRGT2;PROG = 1, BLINK = 0 ?BLINK;set blink flagRETTM,#RETTMV;load return delay:LCALL SAVE;NVM[NUM] <- new keyBLINK;clear blink flagRETTM,#RETTMV;load return delay
;Process PROG mode when select:: JB PROG,PRGS1;PROG = 1 ?PROG;set program mode flagSNUM;clear "set number" flagBLINK;clear blink flagRETTM,#RETTMV;load return delay: JNB SNUM,PRGS2;SNUM = 0 ?BLINK;clear blink flagNUM;NUM + 1A,NUMA,#MAXK+1,PRGS2NUM,#1:MOV RETTM,#RETTMV;load return delay
;Return to normal mode::CLR BLINK;clear blink flagPROG;clear program mode flagSNUM;clear "set number" flag
;Open door::CLR SOLENOPNTM,#OPNTMV;load open pulse duration
;Solenoid off::SETB SOLEN
;Check open key:
;Returns C=1 if pressed: JNB KEYOP,OP1;jump if key OPEN pressedOPNPR;clear OPEN pressed flag:CLR C:JB OPNPR,OP2DEL15;delay 15 mSKEYOP,OP3OPNPR;set OPEN pressed flag:SETB C;C <- 1 if key OPEN pressed
;Check select key:
;Returns C=1 if pressed: JNB KEYSL,SL1;jump if key SELECT pressedSLKPR;clear SELECT pressed flag:CLR C:JB SLKPR,SL2DEL15;delay 15 mSKEYSL,SL2SLKPR;set SELECT pressed flagC;C <- 1 if key SELECT pressed
;Watchdog wakeup::MOV C,T040MWD,C
; ------ 1-Wire bus support ------
;Send reset pulse to OWP and receive presence pulse
;Out: C = 1 if OK: PUSH BOWP;OWP <- 0B,#CLK_KHZ/48B,$;delay 500 uSEA;interrupt disableOWP;OWP <- 1 (0uS)B,#CLK_KHZ/2000B,$;delayC,OWP;read OWP (14 uS)FAIL;fail if OWP = 0B,#CLK_KHZ/500B,$;delayC,OWP;read OWP (66 uS)FAIL;fail if OWP = 1EA;interrupts enableB,#CLK_KHZ/100B,$;delayC,OWP;read OWP (312 uS or more)RESOK;OK if OWP = 1:CLR CEA;interrupts enable (if fail):POP B
;Read/Write byte via 1-Wire bus
;Input: A - input byte
; R4 - CRC
;Out: A - output byte
; R4 - updated CRC: PUSH BB,#8;perform to read 8 bit:RRC A;C <- bitTBIT;transmit bitB,TBYTE1;next bitA;A <- last bitB
;Read/Write bit via 1-Wire bus
;Input: C - input bit.
; R4 - CRC
;Out: C - output bit
; R4 - updated CRC: PUSH ACCEA;interrupts disableOWP;OWP <- 0 (begin of time slot);delay to be sure...;that thermometr...;looks low levelTB_1TB_0;if data bit = 0 then OWP <- 0_1:SETB OWP;if data bit = 1 then OWP <- 1;delay for data setup_0:NOP
;NOP;10 MHz !
;NOPC,OWP;read port 15 uS laterB ;save register BB,#CLK_KHZ/706B,$ ;delay to complete 60 uS slotB ;restore register BOWP;OWP CA,R4;A <- CRCBCRC0A,#18H;update CRC:RRC A;shift CRCR4,A;CRC <- new valuePSW;restore CACC
; Accesses to DALLAS DS1990A touch memory.
; Returns C=1 in case of valid code, else C=0.
; Out: ROMD (8 bytes): CLR C;indicate failureA,AENTM;check access enable timerRET90;exit if AENTM > 0AENTM,#AENTMV;reload access enable timerTRESET;issue reset pulseRET90;leave if no parts on busC;indicate failureA,TMATM;check TM access timerDIS90;exit if TMATM > 0A,#033H;read ROM commandTBYTE;send command byteR0,#ROMD;init pointerR1,#8;init counterR4,#0;initialize CRC variable:MOV A,#0FFH;prepare to read a byteTBYTE;read byte@R0,A;save byteR0;next addressR1,RDMORE;repeat until finishedA,R4;get CRC value in ACCCRC_OK;jump if successfulC;indicate failureRET90_OK:LCALL CHKZ;check code for zeroRET90;invalid code:MOV TMATM,#TMATMV:RET;return to caller
;Check TM code for zero::MOV R0,#ROMD;init pointerR1,#8;init counter:MOV A,@R0A,#0FFH;C = 1 if A>0OKZR0;next addressR1,NEXTZ:RET
; I2C NVM memory 24C02 support:
;
; I2C - bus supported subroutines:
;
; I2C_WR - Write byte from A via I2C bus
; I2C_RD - Read byte to A via I2C bus
; I2C_LRD - Read last byte to A via I2C bus (no ASK)
; I2C_SUB - Send subaddress from R1 to I2C device
; I2C_SUBR - Send subaddress from R1 and perform read.
; I2C_STOP - Stop condition generation on I2C bus
;
; I2C slave address I2C_ADDR (0A0H for 24C02 A0,A1,A2=0)
; I2C data line SDA
; I2C clock line SCL
;Send subaddress to I2C device.
;Input: R1 - subaddress.C_SUB: MOV A,#I2C_ADDR;I2C device address, write modeI2C_WR;send device addressA,R1;subaddressI2C_WR;send subaddress
;Send subaddress and perform read.
;Input: R1 - subaddress.C_SUBR:LCALL I2C_SUB;send subaddressI2C_STOP;stopA,#I2C_ADDR+1;I2C device address, read modeI2C_WR;send device address
;Send byte from A via I2C bus.C_WR: PUSH BB,#9H;bit counter loadC;set C, for bit 9 = 1 (when ACK)SDA0;SDA 1 -> 0 - startCWR1:LCALL SCL0;SCL 1 -> 0AOUTP1;jump if bit = 1SDA0;else SDA=0OUTP0:LCALL SDA1;SDA=1, if bit = 1:LCALL SCL1;SCL 0 -> 1B,I2CWR1;loopB
;Read byte via I2C to A.C_RD:MOV A,#1H;A init to receive 8 bitCRD1:LCALL SCL0;SCL 1 -> 0SDA1;SDA=1 - SDA line releaseSCL1;SCL 0 -> 1C,SDA;move bit from SDA line to CA;shift bit C into AI2CRD1;loop until C = 1SCL0;SCL 1 -> 0SDA0;SDA=0 - ACK generationSCL1;SCL 0 -> 1
;Read byte via I2C to A without ASK
;(receive last byte).C_LRD:MOV A,#1H;A init to receive 8 bitCLRD1:LCALL SCL0;SCL 1 -> 0SDA1;SDA=1 - SDA line releaseSCL1;SCL 0 -> 1C,SDA;move bit from SDA line to CA;shift bit C into AI2CLRD1;loop until C = 1SCL0;SCL 1 -> 0SCL1;SCL 0 -> 1 when SDA=1: no ACK
;STOP condition generation:C_STOP:LCALL SCL0SDA0SCL1SDA1
;SDA and SCL lines control::CLR SDA;SDA 1/0:SETB SDA;SDA 0/1:CLR SCL;SCL 1/0:SETB SCL;SCL 0/1
;EEPROM address map:
;00H - page not used
;08H - touch memory code 1
;10H - touch memory code 2
;...
;Save new key:
;NUM - key number (1..9): MOV A,NUMB,#8AB;NUM x 8R1,A;R1 <- subaddressI2C_SUB;send subaddressR1,#8;init counterR0,#ROMD;init pointer:MOV A,@R0I2C_WR;send dataR0R1,DOWRI2C_STOP;stopDEL15;delay 15mS to page write
;Check for member:
;Returns C=1 if code O.K.:MOV R2,#1;init key counter:MOV A,R2B,#8AB;NUM x 8R1,A;R1 <- subaddressI2C_SUBR;send subaddress and read modeR1,#8;init counterR0,#ROMD;init pointer:LCALL I2C_RD;read dataA,@R0INVAL;jump if invalid codeR0;next addressR1,DORDI2C_LRD;stop readI2C_STOPC;valid code, C <- 1: LCALL I2C_LRD;stop readI2C_STOPR2;next keyA,R2A,#MAXK+1,NEXTC;invalid code, C <- 0
;Check for master:: MOV R1,#8;init counterDPTR,#MK;init pointer to ROMR0,#ROMD+7;init pointer to RAM:CLR AA,@A+DPTR;read ROMA,@R0;ROM[DPTR] = RAM[R0] ?INVM;jump if invalid codeDPTR;next ROM addressR0;next RAM addressR1,DOCMC;valid master code, C <- 1:CLR C;invalid master code, C <- 0
;Display support:
;Input: NUM = value
;if PROG = 0 display is blanked
;if PROG = 1 and BLINK = 1 display is blinking: MOV A,#BLANK;blank display if PROG = 0PROG,INDA,#CH_P;display "P" if SNUM = 0SNUM,INDA,NUM;display NUM if PROG = 1 and SNUM = 1:MOV C,T320M;load blink period bitC,/BLINK;check blink enable bitIND1A,#BLANK:MOV DPTR,#FONT;font table pointerA,@A+DPTR;read fontDDATA,A;indicator control
;Delay 15mS::PUSH BACCB,#30:MOV A,#CLK_KHZ/48ACC,$WAKEUP;watchdog wakeupB,DEL05ACCB
; ------ Interrupt Holders ------
; TIMER 0 Interrupt
; Syst