找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2650|回复: 1
收起左侧

一个汇编语言单片机电子密码锁程序+Proteus仿真

[复制链接]
ID:614734 发表于 2021-4-18 20:03 | 显示全部楼层 |阅读模式
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.png

单片机汇编语言源程序如下:
  1. ;===================================================
  2. ;

  3.         RS BIT P2.7
  4.         RW BIT P2.6
  5.         E BIT P2.5
  6.         ENTER BIT 22H.0
  7.         OPEN BIT P3.6
  8.         SPEAK BIT P3.7
  9.         PASSBUF EQU 40H
  10.         KEYNUMBER EQU 41H       ;存放识别后的按键号
  11.         ORG 0000H
  12.         AJMP MAIN
  13.         ORG 0003H
  14.         JMP KEY_INT
  15.         ORG 000BH
  16.         AJMP INTT0
  17.         ORG 001BH
  18.         AJMP INTT1
  19.         ORG 0030H
  20. ;========== 主程序开始 ==============
  21. MAIN:   MOV 30H,#07H          ;输入密码为7位  最高只可设15位
  22.         MOV 42H,#200         ;设定报警的时间,42H单元里的数*50MS
  23.         MOV 43H,#250          ;设定开门时间     14的倍数(实际上液晶显示器执行指令占用了时间,开门时间会比14*250MS大)
  24.         ;44H号单元存放输入错误的次数
  25.         ;45H为定时器0中断次数
  26.         ;46H为定时器1中断次数
  27.         MOV 47H,#250          ;输入密码时间设定,50MS倍数
  28.         MOV SP,#60H
  29.         CLR OPEN
  30.         CLR SPEAK              ;初始化输出设备
  31.         CLR ENTER              ;标志位初始化
  32.         
  33.         MOV TMOD,#11H          ;定时器工作方式2
  34.         MOV TH0,#3CH           ;初值50MS
  35.         MOV TL0,#0BH
  36.         MOV TH1,#3CH           
  37.         MOV TL1,#0BH
  38.         SETB EA
  39.         SETB ET0
  40.         SETB ET1
  41.         
  42.         MOV TCON,#00000000B     ;电平触发
  43. START:  MOV R0,30H
  44.         MOV R1,#31H
  45. SS1:        MOV @R1,#00H
  46.         INC R1
  47.         DJNZ R0,SS1            ;将输入密码缓冲单元清零
  48.         MOV P1,#0FH            ;初始化按键口
  49.         MOV R1,#31H             ;从31号单元开始存放按建输入的密码         
  50.         CLR 20H                 ;报警标志清零
  51.         CLR 21H                 ;密码超时标志
  52.         MOV 46H,#00H           ;超时后对定时器中断次数清零,便于下一轮重新计时
  53. INIT:   ACALL SELLCD            ;设定液晶工作方式
  54.         ACALL LINE1             ;在第一行显示
  55.         MOV DPTR,#MES_P         ;显示请输入密码
  56.         ACALL DISPLAY
  57.         setb EX0               ;开中断,允许键盘输入
  58. KEYIN:  JB  21H,ERR             ;超时转到错误程序
  59.         JNB ENTER,KEYIN         ;等待ENTER按下
  60.         CLR ENTER
  61.         clr EX0                ;密码输入完后锁定键盘
  62. ;当使用边沿触发时用上面的指令为什么禁止不了中断???
  63. ;========== 密码判断程序 ============
  64. COMP:            
  65.         MOV DPTR,#PASS
  66.         MOV R4,30H             ;密码的长度
  67.         MOV A,#0
  68.         MOV R1,#31H            
  69. LOOP:   MOV R5,A
  70.         MOVC A,@A+DPTR
  71.         MOV PASSBUF,A          ;取出系统设定的密码
  72.         MOV A,@R1              ;从31号单元开始取出输入的密码
  73.         CJNE A,PASSBUF,ERR     ;比较
  74.         MOV A,R5
  75.         INC A
  76.         INC R1                 ;取下一位
  77.         DJNZ R4,LOOP

  78. ;正确
  79. MATCH:  MOV A,#01H
  80.         ACALL ENABLE           ;清屏,光标复位
  81.         ACALL LINE1            ;从第一行开始显示
  82.         MOV DPTR,#MES_C
  83.         ACALL DISPLAY          ;显示"请进"
  84.         ACALL LINE2
  85.         MOV DPTR,#TAB_1
  86.         ACALL DISPLAY
  87.         SETB OPEN              ;开门
  88.         MOV 44H,#00H           ;输入错误次数清零
  89.         MOV R6,43H               
  90.         ACALL DELAY
  91.         CLR OPEN               ;复位
  92.         JMP START            
  93. ;错误
  94. ERR:    ACALL BACK
  95.         MOV R6,#03H
  96.         ACALL DELAY
  97.         ACALL BACK           ;输错提示音,鸣两下
  98.         MOV A,#01H
  99.         ACALL ENABLE
  100.         ACALL LINE1
  101.         MOV DPTR,#MES_E
  102.         ACALL DISPLAY       ;显示错误
  103.         MOV R6,#40H
  104.         ACALL DELAY         
  105.         INC  44H
  106.         MOV A,44H
  107.         CJNE A,#03H,EE0
  108. EE0:    JC  ERROUT        ;输错不到三次返回
  109.         MOV 44H,#00H        ;清零
  110.         ACALL WRANING       ;报警
  111. ERROUT: JMP START

  112. ;=========== 按键中断服务程序 ==========
  113. KEY_INT:push acc
  114.         push psw
  115.         clr ex0
  116.         acall delay10ms     ;延时消抖
  117.         SETB TR1            ;启动定时器
  118.         ACALL SMKEY         ;按键识别
  119.         MOV A,KEYNUMBER     ;返回按键号
  120.         ACALL BACK          ;按键发声
  121.         MOV R3,A
  122.         CJNE R3,#0BH,K1     ;ENTER是否按下
  123.         SETB ENTER
  124.         clr tr1             ;按下确认后关毕定时器
  125.         mov 46h,#00h        ;对中断次数清零
  126.         AJMP KEY_RTN
  127. K1:     ADD A,#30H          ;将按键号转换为ASCⅡ码
  128.         MOV @R1,A           ;将输入的密码存入缓冲单元
  129.         INC R1              ;修改地址
  130.         
  131.         ACALL WRDATA        ;输入一位显示一个"*"
  132.         
  133. KEY_RTN:pop psw
  134.         pop acc
  135.         setb ex0
  136.         RETI


  137. ;=========== 按键识别程序 ==========
  138. SMKEY:   
  139.          MOV A,P1
  140.          ANL A,#0FH
  141. WKEY:    MOV B,A               ;反转法查询  
  142.          MOV P1,#0F0H
  143.          NOP
  144.          MOV A,P1
  145.          ANL A,#0F0H
  146.          ORL A,B
  147.          MOV P1,#0FH         ;还原P1口初态
  148.          CJNE A,#0EEH,WKEY1
  149.          MOV KEYNUMBER,#00H      
  150.          AJMP RETURN
  151. WKEY1:   CJNE A,#0EDH,WKEY2
  152.          MOV KEYNUMBER,#01H
  153.          AJMP RETURN
  154. WKEY2:   CJNE A,#0EBH,WKEY3
  155.          MOV KEYNUMBER,#02H
  156.          AJMP RETURN
  157. WKEY3:   CJNE A,#0E7H,WKEY4
  158.          MOV KEYNUMBER,#03H
  159.          AJMP RETURN
  160. WKEY4:   CJNE A,#0DEH,WKEY5
  161.          MOV KEYNUMBER,#04H
  162.          AJMP RETURN
  163. WKEY5:   CJNE A,#0DDH,WKEY6
  164.          MOV KEYNUMBER,#05H
  165.          AJMP RETURN
  166. WKEY6:   CJNE A,#0DBH,WKEY7
  167.          MOV KEYNUMBER,#06H
  168.          AJMP RETURN
  169. WKEY7:   CJNE A,#0D7H,WKEY8
  170.          MOV KEYNUMBER,#07H
  171.          AJMP RETURN
  172. WKEY8:   CJNE A,#0BEH,WKEY9
  173.          MOV KEYNUMBER,#08H
  174.          AJMP RETURN
  175. WKEY9:   CJNE A,#0BdH,WKEY10
  176.          MOV KEYNUMBER,#09H
  177.          AJMP RETURN
  178. WKEY10:  CJNE A,#0BbH,WKEY11
  179.          MOV KEYNUMBER,#0AH
  180.          AJMP RETURN
  181. WKEY11:  CJNE A,#0B7H,RETURN
  182.          MOV KEYNUMBER,#0BH       ;判断哪个键按下,返回相应按键号码
  183. RETURN:  MOV P1,#0FH
  184.          NOP
  185.          NOP
  186.          MOV A,P1
  187.          CPL A
  188.          ANL A,#0FH
  189.          JNZ RETURN              ;等待按键松开
  190.          RET



  191. ;========== 液晶工作方式设置 ============
  192. SELLCD: MOV A,#01H          ;清屏,光标复位   
  193.         ACALL ENABLE
  194.         MOV A,#38H          ;设置显示模式,8位两行,5*7点阵
  195.         ACALL ENABLE
  196.         MOV A,#0DH          ;显示器开,允许内烁
  197.         ACALL ENABLE      
  198.         MOV A,#06H          ;文字不动,光标右移
  199.         ACALL ENABLE
  200.         RET

  201. ;========== 液晶执行指令 ============
  202. ENABLE: CLR RS
  203.         CLR RW              ;RS,RW同为低电平时写入指令
  204.         MOV P0,A
  205.         CLR E               ;E由高变低时执行指令
  206.         ACALL WAIT
  207.         SETB E
  208.         RET

  209. ;========== WAIT ============
  210. ;判断液晶是否忙的子程序
  211. WAIT:   MOV P0,#0FFH
  212.         CLR RS
  213.         SETB RW             ;RW为高,RS为低时可读忙信号
  214.         CLR E
  215.         NOP
  216.         SETB E
  217.         JB P0.7,WAIT
  218.         RET


  219.         
  220. ;========== 显示的起始地址 ============
  221. ;在第一行
  222. LINE1:  MOV A,#80H
  223.         ACALL ENABLE
  224.         RET
  225. ;在第二行
  226. LINE2:  MOV A,#0C0H
  227.         ACALL ENABLE
  228.         RET


  229. ;=========== 显示程序 ============
  230. DISPLAY:MOV R7,#00H
  231. NEXT:   MOV A,R7
  232.         MOVC A,@A+DPTR
  233.         CJNE A,#10H,DSP
  234.         RET
  235. DSP:    ACALL WRDATA
  236.         INC R7
  237.         AJMP NEXT

  238. ;========== 将A里面的数据写入液晶 ============
  239. WRDATA: SETB RS
  240.         CLR RW
  241.         MOV P0,A
  242.         CLR E
  243.         ACALL WAIT
  244.         SETB E
  245.         RET

  246. ;=========== 报警程序 ============
  247. WRANING: SETB TR0
  248.          ACALL BACK
  249.          MOV R4,#00H
  250.          ACALL D2
  251.          JNB 20H, WRANING
  252.          RET
  253. ;=========== 发声程序 ============
  254. BACK:    MOV R0,#100
  255. KK1:     CPL  SPEAK
  256.          LCALL DELAY2MS
  257.          DJNZ  R0,KK1             ;不断取反P2.0使其产生一定频率的方波推动扬声器
  258.          RET                      ;延时的长短可以改变输出的频率

  259. ;=========== INTT0 ============
  260. ;报警时间设定
  261. INTT0:   PUSH ACC
  262.          PUSH PSW                  
  263.          MOV TH0,#3CH           
  264.          MOV TL0,#0BH
  265.          INC 45H
  266. ……………………

  267. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
电子密码锁.rar (121.75 KB, 下载次数: 50)
回复

使用道具 举报

ID:1029758 发表于 2022-5-27 09:01 | 显示全部楼层
请问原本设定好的密码是什么呢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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