找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5208|回复: 0
打印 上一主题 下一主题
收起左侧

用PIC单片机设计电子密码锁 含论文 源程序 电路图

[复制链接]
跳转到指定楼层
楼主
|
所有资料下载:
用PIC单片机设计电子密码锁.rar (39.89 KB, 下载次数: 39)

微芯公司生产的PIC8位COMS单片机,采用类RISC指令集和哈弗总线结构,以及先进的流水线时序,与传统51单片机相比其在速度和性能方面更具优越性和先进性。
PIC单片机的另一个优点是片上硬件资源丰富,集成常见的EPROM、DAC、PWM以及看门狗电路。这使得硬件电路的设计更加简单,节约设计成本,提高整机性能。因此PIC单片机已成为产品开发,尤其是产品设计和研制阶段的首选控制器。
本文介绍用PIC16F84单片机制作的电子密码锁。PIC16F84单片机共18个引脚,13个可用I/O接口。芯片内有1K×14的FLASHROM程序存储器,36×8的静态RAM的通用寄存器,64×8的EEPROM的数据存储器,8级深度的硬堆栈。

硬件设计  电路原理见图1。Xx8位数据线接4x4键盘矩阵电路,面板布局见表1,A、B、C、D为备用功能键。RA0、RA7输出4组编码二进制数据,经74LS139译码后输出逐行扫描信号,送RB4-RB7列信号输入端。余下半个139译码器动扬声器。RB2接中功率三极管基极,驱动继电器动作。有效密码长度为4位,根据实际情况,可通过修改源程序增加密码位数。产品初始密码为3345,这是一随机数,无特殊意义,目的是为防止被套解。用户可按*号键修改密码,按#号键结束。输入密码并按#号确认之后,脚输出RB2脚输出高电平,继电器闭合,执行一次开锁动作。
若用户输入的密码正确,扬声器发出一声稍长的“滴”提示声,若输入的密码与上次修改的不符,则发出短促的“滴”声。连续3次输入密码错误之后,程序锁死,扬声器报警。直到CPU被复位或从新上电。
软件设计  软件流程图见图3。CPU上电或复位之后将最近一次修改并保存到EEPROM的密码读出,最为参照密匙。然后等待用户输入开锁密码。若5分钟以内没有接受到用户的任何输入,CPU自动转入掉电模式,用户输入任意值可唤醒CPU。
每次修改密码之后,CPU将新的密码存入内部4个连续的EEPROM单元,掉电后该数据任有效。每执行一次开锁指令,CPU将当前输入密码与该值比较,看是否真确,并给出相应的提示和控制。
布     局  所有元件均使用SMD表贴封装,缩小体积,便于产品安装,60X60双面PCB板,顶层是一体化输入键盘,底层是元件层。成型后的产品体积小巧,能很方便的嵌入防盗铁门、保险箱柜。
  
  
  
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, 下载次数: 152)

0.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表