找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 313|回复: 0
收起左侧

基于51单片机的电子密码锁程序

[复制链接]
Straw 发表于 2020-10-17 21:00 | 显示全部楼层 |阅读模式

结果图:
                                  4.png

一、目的概述(收集相关资料、选设计方案、电路设计):
本设计是以STC89C52单片机为控制核心的电子密码锁,属于单片机的应用。做本设计有助于对单片机矩阵键盘,数码管以及串行通信原理的深入了解。电子锁由于其保密性高,使用灵活性好,安全系数高,受到了广大用户的青睐。
系统设计方案为:
1)系统设置6 位密码,密码通过键盘输入,若密码正确,则将锁打开。
2)密码可由用户自己设定,在开锁状态下,用户可自行修改密码。

3)具有自动报警功能,密码输入错误时,报警由扬声器发出“滴滴”报警声。而密码输入正确则是“叮咚”声。

系统设计结构图:
屏幕截图 2020-10-17 205131.png                
本设计由主控芯片51单片机,单片机时钟电路,键盘,数码管组成。单片负责控制整个系统的控制执行过程。开锁成功由数码管显示OPEN,以及蜂鸣器“叮咚”表示,开锁失败由数码管显示Err,以及蜂鸣器“滴滴”表示。

二、实验原理图
电路设计:

2.png 1.png
程序设计:(只展示核心部分)
主程序

1.  //4×4 键盘及8 位数码管显示构成的电子密码锁  
2.  void main() //主程序
3.  {  
4.      uchar key;  
5.      Timer0_Init();  
6.      while(1)  
7.      {  
8.          key = KeyScan();  
9.          password(key);  
10.     }  
11. }  

核心程序:数码管的动态扫描显示

12. void Display()  
13. {  
14.     uchar i;  
15.     Segment_sel=0x00;//消隐  
16.     switch(i)    //位选,选择点亮的数码管,  
17.     {  
18.         case(0):  
19.             LSA=0;LSB=0;LSC=0; break;  
20.         case(1):  
21.             LSA=1;LSB=0;LSC=0; break;  
22.         case(2):  
23.             LSA=0;LSB=1;LSC=0; break;  
24.         case(3):  
25.             LSA=1;LSB=1;LSC=0; break;  
26.         case(4):  
27.             LSA=0;LSB=0;LSC=1; break;  
28.         case(5):  
29.             LSA=1;LSB=0;LSC=1; break;     
30.     }  
31. }  

核心程序:矩阵键盘的扫描输入

32. uchar KeyScan()  
33. {  
34.     for(i=0;i<8;i++)  
35.     {  
36.         P1 = P1Pin[ i];  
37.         Button = P1;  
38.         if(Button != P1Pin[ i])  
39.         {  
40.             Delayms(5);  
41.             Button = P1;  
42.             if(Button != P1Pin[ i])  
43.             {  
44.                 KeyState=1;  
45.                 key8 = Button;  
46.             }  
47.             while(Button != P1Pin[ i])  
48.             { Button = P1; }  
49.         }  
50.     }  
51.     switch(key8)  
52.     {  
53.         case 0x77:{key = 1;break;}  
54.         case 0x7b:{key = 2;break;}  
55.         case 0x7d:{key = 3;break;}  
56.         case 0xb7:{key = 4;break;}  
57.         case 0xbb:{key = 5;break;}  
58.         case 0xbd:{key = 6;break;}  
59.         case 0xd7:{key = 7;break;}  
60.         case 0xdb:{key = 8;break;}  
61.         case 0xdd:{key = 9;break;}  
62.         case 0xeb:{key = 0;break;}  //0  
63.         case 0x7e:{key = 10;break;}  //÷  
64.         case 0xbe:{key = 11;break;}  //×  
65.         case 0xde:{key = 12;break;}  //+  
66.         case 0xee:{key = 13;break;}  //-  
67.         case 0xed:{key = 14;break;}  //=  
68.         case 0xe7:{key = 15;break;}  //ENTER  
69.         default:{key = 0xff;break;}  
70.     }  
71.     return key;  
72. }  

核心程序:输入密码以及校对和处理

73. void password(uchar key)//0~9 数字键,10 输入密码,11 设置密码,12 删除上一个数,13 重新输入 15 确定  
74. {  
75.     uchar i=0;  
76.     if(KeyState==1)  
77.     {  
78.         switch(state)  
79.         {  
80.             case 0:  
81.             {  
82.                 if(key == 10)  
83.                 {  
84.                     state = 1;  
85.                     LSA=1;LSB=1;LSC=1;  
86.                     Segment_sel=0xff;  //显示8  
87.                 }  
88.                 else if(key == 11)  
89.                 {  
90.                     state = 2;  
91.                     LSA=1;LSB=1;LSC=1;  
92.                     Segment_sel=0xfd;  //显示P  
93.                 }  
94.                 break;  
95.             }  
96.             case 1:  
97.             {  
98.                 if(key>=0 && key <= 9)  //输入  
99.                 {  
100.                     InPassword[5]=InPassword[4];  
101.                     InPassword[4]=InPassword[3];  
102.                     InPassword[3]=InPassword[2];  
103.                     InPassword[2]=InPassword[1];  
104.                     InPassword[1]=InPassword[0];  
105.                     InPassword[0]=smgduan[key];  
106.                     KeyState=0;  
107.                 }  
108.                 else if(key == 15)  //确定  
109.                 {  
110.                     if(Compare(InPassword))  
111.                     {  
112.                         for(i=17;i<23;i++)  
113.                             InPassword[ i]=smgduan;  
114.                         Delayms(1000);  
115.                     }//open  
116.                     else  
117.                     {   
118.                         for(i=23;i<27;i++)  
119.                             InPassword[ i]=smgduan;  
120.                         Delayms(1000);  
121.                     }//err  
122.                 state = 0;  
123.                 }  
124.                 else if(key == 13)  //重新输入  
125.                 {  
126.                     for(i=0;i<6;i++)  
127.                         InPassword[ i] = 0xff;  // 全亮  
128.                     Delayms(1000);  
129.                     state = 0;  
130.                 }  
131.                 break;  
132.             }  
133.     else//如果没有按键按下  
134.     {  
135.         if(state == 0)  
136.         {  
137.             Segment_sel= 0x00;// 不显示  
138.         }  
139.     }  
140. }  

C语言代码51hei下载地址:
电子密码锁程序.zip (1.79 KB, 下载次数: 17)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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