Проектирование микропроцессорной системы управления электронным замком

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование



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