找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6031|回復: 0
打印 上一主題 下一主題
收起左側

用PIC單片機設計電子密碼鎖 含論文 源程序 電路圖

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:140725 發(fā)表于 2016-10-18 14:32 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
|
所有資料下載:
用PIC單片機設計電子密碼鎖.rar (39.89 KB, 下載次數(shù): 39)

微芯公司生產(chǎn)的PIC8位COMS單片機,采用類RISC指令集和哈弗總線結構,以及先進的流水線時序,與傳統(tǒng)51單片機相比其在速度和性能方面更具優(yōu)越性和先進性。
PIC單片機的另一個優(yōu)點是片上硬件資源豐富,集成常見的EPROM、DAC、PWM以及看門狗電路。這使得硬件電路的設計更加簡單,節(jié)約設計成本,提高整機性能。因此PIC單片機已成為產(chǎn)品開發(fā),尤其是產(chǎn)品設計和研制階段的首選控制器。
本文介紹用PIC16F84單片機制作的電子密碼鎖。PIC16F84單片機共18個引腳,13個可用I/O接口。芯片內(nèi)有1K×14的FLASHROM程序存儲器,36×8的靜態(tài)RAM的通用寄存器,64×8的EEPROM的數(shù)據(jù)存儲器,8級深度的硬堆棧。

硬件設計  電路原理見圖1。Xx8位數(shù)據(jù)線接4x4鍵盤矩陣電路,面板布局見表1,A、B、C、D為備用功能鍵。RA0、RA7輸出4組編碼二進制數(shù)據(jù),經(jīng)74LS139譯碼后輸出逐行掃描信號,送RB4-RB7列信號輸入端。余下半個139譯碼器動揚聲器。RB2接中功率三極管基極,驅(qū)動繼電器動作。有效密碼長度為4位,根據(jù)實際情況,可通過修改源程序增加密碼位數(shù)。產(chǎn)品初始密碼為3345,這是一隨機數(shù),無特殊意義,目的是為防止被套解。用戶可按*號鍵修改密碼,按#號鍵結束。輸入密碼并按#號確認之后,腳輸出RB2腳輸出高電平,繼電器閉合,執(zhí)行一次開鎖動作。
若用戶輸入的密碼正確,揚聲器發(fā)出一聲稍長的“滴”提示聲,若輸入的密碼與上次修改的不符,則發(fā)出短促的“滴”聲。連續(xù)3次輸入密碼錯誤之后,程序鎖死,揚聲器報警。直到CPU被復位或從新上電。
軟件設計  軟件流程圖見圖3。CPU上電或復位之后將最近一次修改并保存到EEPROM的密碼讀出,最為參照密匙。然后等待用戶輸入開鎖密碼。若5分鐘以內(nèi)沒有接受到用戶的任何輸入,CPU自動轉(zhuǎn)入掉電模式,用戶輸入任意值可喚醒CPU。
每次修改密碼之后,CPU將新的密碼存入內(nèi)部4個連續(xù)的EEPROM單元,掉電后該數(shù)據(jù)任有效。每執(zhí)行一次開鎖指令,CPU將當前輸入密碼與該值比較,看是否真確,并給出相應的提示和控制。
布     局  所有元件均使用SMD表貼封裝,縮小體積,便于產(chǎn)品安裝,60X60雙面PCB板,頂層是一體化輸入鍵盤,底層是元件層。成型后的產(chǎn)品體積小巧,能很方便的嵌入防盜鐵門、保險箱柜。
  
  
  
COL0
  
  
COL1
  
  
COL2
  
  
COL3
  
  
ROW0
  
  
1
  
  
2
  
  
3
  
  
A
  
  
ROW1
  
  
4
  
  
5
  
  
6
  
  
B
  
  
ROW2
  
  
7
  
  
8
  
  
9
  
  
C
  
  
ROW3
  
  
*
  
  
0
  
  
#
  
  
D
  

表1




源程序:
  1. ;鑒于某些原因,本程序僅僅供參考,如有不便請諒解!


  2. ; HISTORY
  3. ;
  4. ; 002 - 2000     - original codelock source
  5. ; 003 - 2000     - serial terminal version
  6. ; 004 - 20010103 - cleaned up version without the serial junk, doesn't use EEPROM
  7. ;**********************************************************************
  8. ;
  9. ;    Notes:
  10. ;
  11. ;PORTA<1:0>        out row select (1-4) to MPX
  12. ;PORTA2                out LED control
  13. ;PORTB3                beeper control output
  14. ;PORTB<7:4>        in  keyboard column status
  15. ;PORTB2                relay output

  16.         list      p=16F84             ; list directive to define processor
  17.         #include <p16F84.inc>         ; processor specific variable definitions

  18.         __CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC ;WDT=watchdog, PWRTE=power on timer, HS=high speed osc


  19.           CBLOCK 0x0C
  20. ;***** VARIABLE DEFINITIONS
  21. row_cnt                ;row counter
  22. column                ;keyboard column status

  23. count1                ;column counter for the keyboard handler
  24. count2                ;row counter timing
  25. count3                ;row counter timing
  26. keycode               
  27. prevcode       

  28. led_ctl                ; LED control bits <3:0>
  29. led_tmp                ; working register for setting multiplexed LED control pin

  30. keybuf                ; keyboard buffer, empty after reading out
  31. key_tmp                ; keycode temporary storage

  32. bufptr                ; buffer pointer
  33. buffer                ; keyboard buffer
  34. buffer2
  35. buffer3
  36. buffer4
  37. buffer5
  38. beeper                ; beep time countdown
  39. beepct                ; beep
  40. beepcnt                ; beep cnt

  41. count10
  42. count20
  43. count30

  44. pass1                ; password
  45. pass2
  46. pass3
  47. pass4
  48. pass5
  49. ;**********************************************************************
  50.            ENDC
  51. ;****************************************************************************

  52.            ORG 0                        ;RESET
  53. Reset      goto main

  54. ;****************************************************************************
  55.            ORG 4                       ;INT

  56. Interrupt  retfie
  57. ;
  58. keytable        ;determine pressed key's real code from scancode
  59.                 addwf PCL
  60.                 retlw 60
  61.                 retlw 31
  62.                 retlw 32
  63.                 retlw 33
  64.                 retlw 61
  65.                 retlw 34
  66.                 retlw 35
  67.                 retlw 36
  68.                 retlw 62
  69.                 retlw 37
  70.                 retlw 38
  71.                 retlw 39
  72.                 retlw 63
  73.                 retlw 90
  74.                 retlw 30
  75.                 retlw 91
  76.                 retlw 64


  77. ;
  78. main                MOVLW 0c
  79.                 MOVWF PORTA
  80.                 MOVLW 0xe8 ; B?1101000?;SET PORT A 0-2,4 out
  81.                 TRIS PORTA

  82.                 MOVLW 0
  83.                 MOVWF PORTB
  84.                 MOVLW 0xf3 ;B11110011 ;SET PORT B4-7 AS INPUTS
  85.                 TRIS PORTB
  86.                 ;
  87.                 BSF STATUS, RP0 ;bank 1
  88.                 BCF OPTION_REG, NOT_RBPU ;internal pullups on port B enabled
  89.                 BCF STATUS, RP0 ;bank 0

  90.                 clrf row_cnt      ;row counter ;clrf?
  91.                 clrf prevcode
  92.                 clrf keycode
  93.                 clrf beepct
  94.                 MOVLW 0xff
  95.                 MOVWF led_ctl
  96.                 MOVWF led_tmp
  97.                 movlw 1
  98.                 movwf count2
  99.                 movwf count3
  100.                 movlw 0xf0
  101.                 movwf beeper;generate beep on powerup

  102.                 movlw 0x33        ;inital password
  103.                 movwf pass1
  104.                 movwf pass2
  105.                 movlw 0x34
  106.                 movwf pass3
  107.                 movlw 0x35
  108.                 movwf pass4
  109.                 ;
  110. resetbuf        movlw buffer
  111.                 movwf bufptr

  112. loop                clrf keybuf
  113.                 CALL scantimer
  114.                 call beepgen;generate beepct if needed

  115.                 movf keybuf,W
  116.                 bz loopb
  117.                 movlw 20
  118.                 movwf beeper ;turn on soundgen

  119. loopb                movf keybuf,W
  120.                 sublw 90
  121.                 btfsc STATUS,Z;if Z=0, skip

  122. ;                goto resetbuf
  123. ;old function of key was reset, new function is change code

  124.                 goto chk0

  125.                 movf keybuf,W
  126.                 bz loop2 ;no key was pressed, skip

  127.                 sublw 91
  128.                 bnz loop5
  129.                 ;pressed enter, check code


  130. chk0                movf bufptr,W
  131.                 sublw buffer5
  132.                 bnz incorrect
  133.                 movf buffer,W
  134.                 subwf pass1,W
  135.                 bnz incorrect
  136.                 movf buffer2,W
  137.                 subwf pass2,W
  138.                 bnz incorrect
  139.                 movf buffer3,W
  140.                 subwf pass3,W
  141.                 bnz incorrect
  142.                 movf buffer4,W
  143.                 subwf pass4,W
  144.                 bnz incorrect

  145. ;
  146. ;check for the key pressed:enter=generate pulse, otherwise get new passwd
  147. ;
  148.                 movf keybuf,W
  149.                 sublw 0x90 ;new passwd?
  150.                 bz setpasswd

  151.                 movlw 4
  152.                 movwf PORTB

  153.                 movlw .30
  154.                 movwf count30
  155. ;
  156. delay21                movlw .250 ;decimal
  157.                 movwf count10

  158. delay0                movlw .250
  159.                 movwf count20

  160. delay1                decfsz count20, F
  161.                 goto delay1
  162.                 decfsz count10
  163.                 goto delay0
  164.                 decfsz count30
  165.                 goto delay21
  166. ;
  167.                 movlw 0
  168.                 movwf PORTB
  169. incorrect        goto resetbuf

  170. loop5                movf bufptr,W  ;store a char in buffer
  171.                 sublw buffer5  ;is there space for more characters?
  172.                 bnz loop7;yes
  173.                 ;no, shift all chars by one
  174.                 movf buffer2,W
  175.                 movwf buffer
  176.                 movf buffer3,W
  177.                 movwf buffer2
  178.                 movf buffer4,W
  179.                 movwf buffer3
  180.                 movf keybuf,W
  181.                 movwf buffer4
  182.                 goto loop2

  183. ;store character in the buffer
  184. loop7                movf bufptr,W
  185.                 movwf FSR
  186.                 movf keybuf,W
  187.                 movwf INDF
  188.                 incf bufptr,F
  189.                
  190. loop2               
  191. ;                clrf keybuf ;loop will clear keybuf
  192.                 GOTO loop

  193. setpasswd        ;set a new code
  194.                 ;
  195.                 movlw pass1
  196.                 movwf FSR
  197. setp0                clrf keybuf
  198.                 call scantimer
  199.                 call beepgen
  200.                 movf keybuf,W
  201.                 bz setp0
  202.                 sublw 0x90
  203.                 bz setp0
  204.                 movf keybuf,W
  205.                 sublw 0x91
  206.                 bz setp0
  207.                 movlw 99
  208.                 movwf beeper
  209.                 movf keybuf,W
  210.                 movwf INDF
  211.                 incf FSR,f
  212.                 movf FSR,W
  213.                 sublw pass5
  214.                 bnz setp0
  215.                 ;
  216.                 goto resetbuf
  217.                 ;

  218. scantimer        decfsz count2,F ;if count2=0, skip next instr
  219.                 return
  220.                 movlw .20
  221.                 movwf count2;reload count2
  222.                 decfsz count3,F
  223.                 return
  224.                 movlw .50;could be commented
  225.                 movwf count3
  226.                 ;time to scan again...


  227. ;set column on port, set LED status
  228. ;                movlw 4 ;LED status, ON

  229.                 movlw 0
  230.                 rrf led_tmp,F
  231.                 btfsc STATUS,C ;if C=0, skip
  232.                 movlw 4;ON

  233.                 iorwf row_cnt,W
  234.                 iorlw 08 ;serial TX bit latch should be 1!!!
  235.                 iorwf beepct,W ;beeper register
  236.                 MOVWF PORTA ;output row select, LED status and beeper control
  237.                 return

  238. ;get key status
  239. scanx                MOVF PORTB,W ;get column status
  240.                 MOVWF column

  241.                 SWAPF column,W;swap nibbles
  242.                 ANDLW 0x0f ;lower 4 bits
  243.                 MOVWF column

  244.                 xorlw 0x0f ;check for pressed key
  245.                 btfsc STATUS,Z ;skip if Z = 0
  246.                 goto scan0

  247.                 movf row_cnt,W ; row_cnt->W
  248.                 movwf key_tmp  ;W->key_tmp
  249.                 bcf STATUS,C
  250.                 rlf key_tmp, F
  251.                 rlf key_tmp, F ;row * 4->key_tmp
  252.                 incf key_tmp ;increase +1

  253.                 movlw .4 ;scan for 4 bits in the column file register
  254.                 movwf count1

  255. scan1                rrf column, F ;get the right bit & shift right
  256.                 btfss STATUS, C   ;if 1, skip
  257.                 goto scan2;found a key pressed
  258.                
  259.                 incf key_tmp
  260.                 decfsz count1, F
  261.                 goto scan1

  262. scan0                return;no key pressed in this row, code unchanged (init'd zero before first cycle)

  263. scan2                ;found a key pressed
  264.                 movf key_tmp,W;set keycode
  265.                 movwf keycode
  266.                 return;a key was pressed, code=keycode 1-16


  267. scany                movf row_cnt,W
  268.                 sublw .3
  269.                 btfss STATUS,Z ;if Z=1 , skip (row_cnt=3)
  270.                 return
  271.                 ;a scan cycle is completed, test for keycode
  272.                 movf keycode,W
  273.                 btfsc STATUS,Z ;if Z=0, some key is pressed, skip
  274.                 ;Z=1, keycode=0, no key pressed
  275.                 goto keyb1

  276.                 ;W=keycode, not zero
  277.                 subwf prevcode,W;was this key pressed in the previous cycle?
  278.                 btfsc STATUS,Z ;if Z=0, previous cycle was other code, skip
  279.                 goto keyb3;same key, no action --but zero keycode for next cycle!!!

  280.                 ;a new key was pressed in the actual cycle

  281.                 ;should check if keybuf is empty, and zero prevkey if buffer full
  282.                 movf keycode,W
  283.                 call keytable
  284.                 movwf keybuf
  285.                
  286. keyb1                movf keycode,W ;store previous keycode
  287.                 movwf prevcode
  288. keyb3                movlw 0
  289.                 movwf keycode ;zero actual keycode for next cycle

  290. ;                swapf led_ctl,W
  291. ;                movwf led_tmp ;led control shift register

  292.                 return               
  293. ;
  294. beepgen                movf beeper,W
  295.                 bz beepgen0
  296.                 decfsz beepcnt
  297.                 return
  298.                 movlw .40
  299.                 movwf beepcnt
  300.                 decf beeper,F
  301.                 movlw 08
  302.                 btfsc beeper,0
  303.                 movlw 0
  304. beepgen0        movwf beepct
  305.                 movwf PORTB
  306.                 return

  307.                 end                       ; directive 'end of program'


復制代碼


0.png (49.88 KB, 下載次數(shù): 184)

0.png
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表