找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于AT89c51密码锁设计 含源文件以及protues方正文件 完美运行

  [复制链接]
跳转到指定楼层
楼主
分享一个基于at89c51单片机的密码锁设计,含有源文件以及protues方正文件,可以完美运行.

以上所有资料包含仿真工程文件均在本帖最后下载附件。

密码锁的整体电路图:


程序流程图:





源程序:
  1. /*
  2. 课程名称:电子密码锁设计
  3. 设计任务:根据设定好的密码,采用按键实现6为的输入功能,
  4.                                         当用户输入的密码正确并且是在规定的时间(普
  5.                                         通用户要求在12s内输入正确的密码)时,锁就
  6.                                         打开,如果输入的三次密码不正确,就发出警报
  7.                                         声。如果用户的时间超过40秒,电路将报警80
  8.                                         秒,若电路连续报警三次,电路将锁定键盘5分
  9.                                         钟,防止他人的非法操作
  10. */
  11. #include"reg51.h"        
  12. #include"intrins.h"

  13. #define uint unsigned int
  14. #define uchar unsigned char
  15. #define ulong unsigned long

  16. sbit bj = P3^0;                        //定义报警
  17. sbit led_y = P3^5;         //定义黄色灯
  18. sbit led_r = P3^6;        //定义红色灯
  19. sbit led_g = P3^7;        //定义绿色灯

  20. ulong pwd = 234567;         //定义电子锁密码
  21. uint gy = 0;                      //定义管理员/用户(管理员为1)标识
  22. uint ss = 0;                                  //定义上锁标识(0时表示已上锁)
  23. uint flag = 0;                   //定义中断函数中所用到的标识
  24. uchar sd = 1;                                 //定义键盘锁定(1为未锁)标识
  25. uint pcw = 0;               //定义密码错误次数
  26. uint bjc = 0;                                  //定义报警次数
  27. uint jp = 0;                                  //定义键盘扫描值
  28. uint cnt = 0;                   //定义中断次数
  29. uint mcnt = 0;
  30. uint cs = 0;                     //定义超时标识
  31. uchar key;
  32. //uchar j;


  33. //定义共阳数码管段选数组
  34. uchar code table[11] ={0x3F,0x06,0x5B,0x4F,0x66,
  35.                                                                                          0x6D,0x7D,0x07,0x7F,0x6F,0x08};
  36. //定义按键
  37. uchar code table1[16] = {0xee,0xde,0xbe,0x7e,
  38.                                                                                                 0xed,0xdd,0xbd,0x7d,
  39.                                                                                                 0xeb,0xdb,0xbb,0x7b,
  40.                                                                                                 0xe7,0xd7,0xb7,0x77};

  41. //定义储存按键值
  42. uchar table2[6];

  43. //定义短延迟函数
  44. void delay(uint n)        
  45. {
  46.    while(n--);
  47. }

  48. //定义延迟n s函数
  49. void delayns(uint n)   
  50. {
  51.     unsigned char a,b,c,e;
  52.                 for(e=n;e>0;e--)
  53.                         for(c=167;c>0;c--)
  54.                                         for(b=171;b>0;b--)
  55.                                                         for(a=16;a>0;a--);
  56.     _nop_();  //if Keil,require use intrins.h
  57. }        


  58. //定义初始化函数
  59. void init()
  60. {
  61.         uchar i,k;
  62.         led_y = 0;
  63.         led_r = 1;
  64.         led_g = 1;
  65.         bj = 1;
  66.         EA = 1;                                                                                       //打开总中断
  67.         EX1 = 1; IT1 = 1;               //打开外部中断1,并设置触发方式为下降触发方式
  68.         TMOD = 0X01;                                                                                 //设置定时器0工作方式1
  69.         TH0 = (65536 - 50000)/256;            
  70.         TL0 = (65536 - 50000)%256;                   //给定时器0赋值为50ms
  71.         for(i = 0;i < 6; i++)
  72.         {
  73.                  table2[i] = 10;
  74.         }
  75.         for(k = 0;k<8;k++)
  76.         {
  77.                 P0=0x08;
  78.                 P2 = k;        
  79.         }
  80.                
  81. }

  82. //定义上锁中断函数
  83. void INT_0() interrupt 0
  84. {
  85.         uchar h;
  86.         ss = 0;                                                                                                //密码锁上锁
  87.         led_g = 1;
  88.         for(h = 0;h < 6; h++)                     //初始化table2[]为10
  89.         {
  90.                  table2[h] = 10;
  91.         }
  92. }

  93. //定义管理员/用户切换中断函数
  94. void INT_1() interrupt 2
  95. {
  96.         uchar h;
  97.         if(flag == 0)
  98.         {        
  99.                 gy = 1;                                                                                        //关闭管理员指示灯
  100.                 led_y = 1;                                                                        //关闭密码错误指示灯
  101.                 flag = 1;               
  102.           for(h = 0;h < 6; h++)     //初始化table2[]为10
  103.                 {
  104.                          table2[h] = 10;
  105.                 }
  106.         }
  107.         else
  108.         {
  109.                 gy = 0;                                                                                        //关闭管理员指示灯
  110.                 led_y = 0;                                                                        //关闭密码错误指示灯
  111.                 flag = 0;
  112.                 for(h = 0;h < 6; h++)             //初始化table2[]为10
  113.                 {
  114.                          table2[h] = 10;
  115.                 }
  116.         }        
  117. }
  118. //定义计时器中断函数
  119. void timer() interrupt 1
  120. {
  121.         TH0 = (65536 - 50000)/256;
  122.         TL0 = (65536 - 50000)%256;
  123.         ++cnt;                                                            //中断一次加以
  124.         if(cnt == 20)                                                     //每1秒
  125.         {
  126.                 cnt = 0;
  127.                 ++mcnt;
  128.                 if(gy)                                                                                   //管理员时
  129.                 {
  130.                          if(mcnt > 40)
  131.                          {
  132.                                         bjc++;
  133.                                         cs = 1;
  134.                                   bj = 0;
  135.                                   delayns(80);
  136.                                   bj = 1;
  137.                          }
  138.                          else if(mcnt > 5)                                //大于5秒时
  139.                          {
  140.                                  cs = 1;        
  141.                          }
  142.                          else                                                                                        //小于5秒时
  143.                          {
  144.                                  cs = 0;
  145.                          }
  146.                 }
  147.                 else                                                                                                //用户时
  148.                 {
  149.                         if(mcnt > 40)
  150.                         {
  151.                                 bjc++;
  152.                                 cs = 1;
  153.                                  bj = 0;
  154.                                 delayns(80);
  155.                                 bj = 1;
  156.                         }
  157.                         else if(mcnt > 12)                                // 大于12秒时
  158.                         {
  159.                            cs = 1;
  160.                         }
  161.                         else                                                                                        //小于1秒时
  162.                         {
  163.                                  cs = 0;
  164.                         }                                         
  165.                 }
  166.                
  167.         }
  168. }
  169. //定义显示函数
  170. void display( uint wei, uint duan)
  171. {
  172.         P2 = wei;
  173.         P0 = table[duan];
  174.         delay(50);
  175. }

  176. //定义键盘扫描函数并显示按键
  177. void scan()
  178. {
  179.         uchar i,j,h,k,m=20, e = 1;
  180.         while(j != 6)                                                         //读取六个键值
  181.         {
  182.         
  183.                 P1 = 0xf0;                                                                     //置行为0.列为1,读列值
  184.                 if(P1 != 0xf0)                                              //判断有无键盘被按下        
  185.                 {        
  186.                         delay(19000);                                                     //消振
  187.                         if(P1 != 0xf0)                                             //确实有键盘被按下
  188.                         {        
  189.                                 uchar temp = P1;                       //存储列列读入值
  190.                                 if(j==5)                                                                        //当最后一位密码输入时
  191.                                 {
  192.                                         ET0 = 0;                                                                //关闭定时/计数0中断
  193.                                 }
  194.                                 if(j == 0)                                                           //当要输入第一个密码时
  195.                                 {
  196.                                         ET0 = 1;        TR0 = 1;                        //开启定时/计数0中断
  197.                                         led_r = 1;                                       //关闭报警灯
  198.                                         led_g = 1;                                                   //关闭打开指示灯
  199.                                         for(h = 0;h < 6; h++)   //初始化table2[]为10
  200.                                         {
  201.                                                  table2[h] = 10;
  202.                                         }
  203.                                 }
  204.                                 P1 = 0x0f;                                                                //置列为0.行为1,读行值
  205.                                 key = temp|P1;                                           //将列、行综合,读取键值
  206.                                 for(i = 0; i < 10; i++)
  207.                                 {
  208.                                         if(key == table1[i])                //判断键值
  209.                                         {
  210.                                                    table2[j] = i;                        //将密码存储到table2[]中
  211.                                                         j++;
  212.                                                         break;
  213.                                         }
  214.                                 }
  215.                         }
  216.                 }
  217.                 for(k = 0;k < 6;k++)                                   //显示输入键值
  218.                 {        
  219.                         uint n=20;
  220.                         while(n--)
  221.                                 display(k,table2[k]);
  222.                 }
  223.         }
  224.         for(k = 0;k < 6;k++)                                           //显示输入键值
  225.         {        
  226.                 uint n=20;
  227.                 while(n--)
  228.                         display(k,table2[k]);
  229.         }
  230. }
  231. //定义报警函数
  232. void speaker(uint n)
  233. {                                   
  234.         uint i;
  235.         for(i = 0; i<n; i++)
  236.         {
  237.                  bj = 0;
  238.                 delayns(1);
  239.                 bj = 1;
  240.         }
  241. }
  242. //定义密码正确函数验证函数
  243. void mmyz()
  244. {
  245.         uchar mmy;
  246.         uint m1 = pwd/100000;                                                                                //取得密码的第一位
  247.         uint m2 = pwd%100000/10000;                                            //取得密码的第二位
  248.         uint m3 = pwd%100000%10000/1000;                                //取得密码的第三位
  249.         uint m4 = pwd%100000%10000%1000/100;                //取得密码的第四位
  250.         uint m5 = pwd%100000%10000%1000%100/10;        //取得密码的第五位
  251.         uint m6 = pwd%100000%10000%1000%100%10;        //取得密码的第六位
  252.         //判断密码的正确性
  253.         mmy = (m1==table2[0])&(m2==table2[1])&(m3==table2[2])
  254.                                 &(m4==table2[3])&(m5==table2[4])&(m6==table2[5]);
  255.         if(!cs)                                                                                                                           //没超过规定时间
  256.         {
  257.                  if(mmy == 1)                                                                                                        //密码正确
  258.                 {
  259.                         ss = 1;
  260.                         led_g = 0;                                                                                                         //打开密码锁。绿灯亮
  261.                         EX0 = 1; IT0 = 1;                                                                   //打开外部中断0,并设置触发方式为下降触发方式
  262.                         pcw = 0;                                                                                                    //密码错误次数清零
  263.                         bjc = 0;                                                                                                    //报警次数清零
  264.                         bj = 1;                                                                                                             //关闭报警
  265.                 }
  266.                 else                                                                                                                                        //密码错误
  267.                 {
  268.                         pcw++;                                                                                                            //密码错误加1
  269.                         led_r = 0;                                                                                                        //密码错误,红灯亮
  270.                         if(pcw >=3)
  271.                         {
  272.                            pcw = 0;
  273.                            bjc++;
  274.                                  P2 = 0xff;
  275.                            speaker(1);
  276.                            if(bjc == 3)
  277.                            {
  278.                                            bjc = 0;                                                                                        //报警
  279.                                                 led_r = 0;
  280.                                                 led_g = 0;
  281.                                                 P2 = 0xff;
  282.                                            EA = 0;                                                                                          //关闭总中断
  283.                                                 delayns(300);                                                                //锁定5分钟
  284.                                                 EA = 1;                                                                                 //开启总中断
  285.                                                 led_r = 1;
  286.                                                 led_g = 1;
  287.                            }
  288.                         }
  289.                 }
  290.         }
  291.         else                                                                                                                          //超过规定时间
  292.         {
  293.                 uchar h;
  294.           for(h = 0;h < 6; h++)                               //初始化table2[]为10
  295.                 {
  296.                          table2[h] = 10;
  297.                 }
  298.         }
  299.         
  300. }

  301. //定义主函数
  302. void main()           
  303. {         
  304.         uchar i;
  305.         init();                                                                                                                                           //初始化程序
  306.         while(1)
  307.         {
  308.                         if(!ss)                                                                                                                                
  309.                         {
  310.                                         if(gy)                                                                                                          //管理员时
  311.                                         {
  312.                                                 if(sd == 1)
  313.                                                 {
  314.                                                         scan();                                                                                          //调用键盘扫面函数,接收输入的键值
  315.                                                         mmyz();                                                                                          //验证密码
  316.                                                 }
  317.                                         }
  318.                                         else                                                                                                 //用户时
  319.                                         {
  320.                                                  if(sd == 1)
  321.                                                 {
  322.                                                         scan();                                                                                          //调用键盘扫面函数,接收输入的键值
  323.                                                         mmyz();                                                                                          //验证密码
  324.                                                 }
  325.                                         }
  326.                         }
  327.                         else
  328.                         {
  329.                                         for(i = 0;i < 6;i++)                                                   //显示输入键值
  330.                                         {        
  331.                                                         table2[i] = 10;
  332.                                         }
  333.                                         for(i = 0;i < 6;i++)                                                   //显示输入键值
  334.                                         {        
  335.                                                         uint n=20;
  336.                                                         while(n--)
  337.                                                         display(i,table2[i]);
  338.                                         }
  339.                         }
  340.         }
  341. }
复制代码

报警电路.png (2.88 KB, 下载次数: 194)

报警电路.png

管理员状态下开始.png (16.58 KB, 下载次数: 175)

管理员状态下开始.png

管理员状态下密码错误.png (16.85 KB, 下载次数: 168)

管理员状态下密码错误.png

管理员状态下密码正确.png (16.6 KB, 下载次数: 163)

管理员状态下密码正确.png

扫描按键电路.png (4.84 KB, 下载次数: 162)

扫描按键电路.png

数码管显示电路.png (5.13 KB, 下载次数: 154)

数码管显示电路.png

用户状态下开始.png (16.58 KB, 下载次数: 172)

用户状态下开始.png

用户状态下密码错误.png (16.65 KB, 下载次数: 163)

用户状态下密码错误.png

用户状态下密码正确.png (16.73 KB, 下载次数: 147)

用户状态下密码正确.png

整个电路.png (23.68 KB, 下载次数: 187)

整个电路.png

指示灯电路.png (4.75 KB, 下载次数: 171)

指示灯电路.png

主电路部分按键选择电路.png (13.91 KB, 下载次数: 172)

主电路部分按键选择电路.png

基于at89c51的电子密码锁设计.7z

296.25 KB, 下载次数: 334, 下载积分: 黑币 -5

评分

参与人数 5黑币 +31 收起 理由
@不死鸟 + 8 很给力!
stkh + 8 赞一个!
TimeBandits + 5 很给力!
taylen16 + 5 很给力!
q1210765138 + 5

查看全部评分

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

使用道具 举报

沙发
ID:171085 发表于 2017-3-16 22:13 | 只看该作者
这个不可以改密码吗。
回复

使用道具 举报

板凳
ID:196490 发表于 2017-5-4 14:28 | 只看该作者
谢谢楼主  下载下来 学习一下
回复

使用道具 举报

地板
ID:206113 发表于 2017-5-30 18:00 | 只看该作者
可以改密码吗老铁
回复

使用道具 举报

5#
ID:207196 发表于 2017-6-2 20:16 | 只看该作者
请问楼主这个能不能改密码
回复

使用道具 举报

6#
ID:205480 发表于 2017-6-2 22:52 | 只看该作者
来看看楼主的大作,学习学习
回复

使用道具 举报

7#
ID:268577 发表于 2017-12-28 20:34 | 只看该作者
不能改密码啊老铁
回复

使用道具 举报

8#
ID:268577 发表于 2017-12-28 20:52 | 只看该作者
没有设置改密码或者管理密码呢,感觉不是很完善。
回复

使用道具 举报

9#
ID:274930 发表于 2018-1-11 19:46 | 只看该作者
没有设置改密码或者管理密码呢,感觉不是很完善。
回复

使用道具 举报

10#
ID:265553 发表于 2018-1-14 07:40 来自手机 | 只看该作者
正好需要下载了,感谢
回复

使用道具 举报

11#
ID:362171 发表于 2018-6-30 10:38 | 只看该作者
很棒,谢谢大佬!!!
回复

使用道具 举报

12#
ID:362172 发表于 2018-6-30 10:42 | 只看该作者
大佬能不能改密码
回复

使用道具 举报

13#
ID:362673 发表于 2018-7-1 20:28 | 只看该作者
大佬能不能给个分 让我下载OAO
回复

使用道具 举报

14#
ID:363457 发表于 2018-7-2 19:31 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

15#
ID:363386 发表于 2018-7-2 21:08 | 只看该作者
谢谢分享,单片机小萌新希望多多见识大神
回复

使用道具 举报

16#
ID:363386 发表于 2018-7-2 21:13 | 只看该作者
求下载还有更多扩展程序吗
回复

使用道具 举报

17#
ID:360567 发表于 2018-7-3 10:02 | 只看该作者
仿真不行
回复

使用道具 举报

18#
ID:362788 发表于 2018-7-3 15:06 | 只看该作者
厉害啊老哥!
回复

使用道具 举报

19#
ID:264029 发表于 2018-7-3 17:12 | 只看该作者
大神厉害了
回复

使用道具 举报

20#
ID:362316 发表于 2018-7-4 08:58 | 只看该作者
昨天试了一下,按键程序有bug。按下 和松开会有多个数码管显示对应的数字
回复

使用道具 举报

21#
ID:363212 发表于 2018-7-4 17:25 | 只看该作者
给个分数,求下载,
回复

使用道具 举报

22#
ID:363212 发表于 2018-7-4 17:30 | 只看该作者
按键功能不太好用,应该如何修改程序,让程序更完善?!
回复

使用道具 举报

23#
ID:378204 发表于 2018-7-31 15:01 | 只看该作者
这个还是很不错的
回复

使用道具 举报

24#
ID:403340 发表于 2018-9-27 20:09 来自手机 | 只看该作者
技术求助 发表于 2018-1-14 07:40
正好需要下载了,感谢

能分享下不
回复

使用道具 举报

25#
ID:424204 发表于 2018-11-15 21:14 | 只看该作者
好像不太行啊 ,按键没有消抖
回复

使用道具 举报

26#
ID:456531 发表于 2018-12-27 16:13 | 只看该作者
ini0 发表于 2018-7-4 08:58
昨天试了一下,按键程序有bug。按下 和松开会有多个数码管显示对应的数字

同样有这样的问题,求解决
回复

使用道具 举报

27#
ID:446113 发表于 2018-12-27 17:13 | 只看该作者
昨天试了一下,按键程序有bug。按下 和松开会有多个数码管显示对应的数字
回复

使用道具 举报

28#
ID:396940 发表于 2019-3-22 20:35 | 只看该作者
感谢分享,来参考看看
回复

使用道具 举报

29#
ID:634378 发表于 2019-11-2 15:24 | 只看该作者
请问可以改密码吗?
回复

使用道具 举报

30#
ID:539658 发表于 2019-11-2 20:42 | 只看该作者
谢谢分享
回复

使用道具 举报

31#
ID:634666 发表于 2019-11-3 10:20 来自手机 | 只看该作者
多谢楼主,学习了
回复

使用道具 举报

32#
ID:634898 发表于 2019-11-3 20:19 | 只看该作者
感谢楼主分享  大佬
回复

使用道具 举报

33#
ID:650534 发表于 2019-12-2 08:33 | 只看该作者
很好用
回复

使用道具 举报

34#
ID:676084 发表于 2019-12-28 15:26 | 只看该作者
很有帮助
回复

使用道具 举报

35#
ID:679270 发表于 2020-1-2 00:13 来自手机 | 只看该作者
这个怎么样
回复

使用道具 举报

36#
ID:681391 发表于 2020-1-5 08:13 | 只看该作者
大神就是厉害啊
回复

使用道具 举报

37#
ID:963884 发表于 2023-6-2 23:14 | 只看该作者
可以呀,程序杠杠的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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