久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 13681|回復: 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, 下載次數: 219)

報警電路.png

管理員狀態下開始.png (16.58 KB, 下載次數: 194)

管理員狀態下開始.png

管理員狀態下密碼錯誤.png (16.85 KB, 下載次數: 190)

管理員狀態下密碼錯誤.png

管理員狀態下密碼正確.png (16.6 KB, 下載次數: 190)

管理員狀態下密碼正確.png

掃描按鍵電路.png (4.84 KB, 下載次數: 188)

掃描按鍵電路.png

數碼管顯示電路.png (5.13 KB, 下載次數: 183)

數碼管顯示電路.png

用戶狀態下開始.png (16.58 KB, 下載次數: 199)

用戶狀態下開始.png

用戶狀態下密碼錯誤.png (16.65 KB, 下載次數: 186)

用戶狀態下密碼錯誤.png

用戶狀態下密碼正確.png (16.73 KB, 下載次數: 171)

用戶狀態下密碼正確.png

整個電路.png (23.68 KB, 下載次數: 207)

整個電路.png

指示燈電路.png (4.75 KB, 下載次數: 198)

指示燈電路.png

主電路部分按鍵選擇電路.png (13.91 KB, 下載次數: 193)

主電路部分按鍵選擇電路.png

基于at89c51的電子密碼鎖設計.7z

296.25 KB, 下載次數: 338, 下載積分: 黑幣 -5

評分

參與人數 5黑幣 +31 收起 理由
@不死鳥 + 8 很給力!
stkh + 8 贊一個!
TimeBandits + 5 很給力!
taylen16 + 5 很給力!
q1210765138 + 5

查看全部評分

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

使用道具 舉報

沙發
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久成人精品视频 | 国产精品国产三级国产aⅴ入口 | 亚洲精品一区二区三区四区高清 | 免费看黄色片 | 国产精品久久欧美久久一区 | 午夜在线观看视频 | 中文字幕99| 国产午夜精品久久久 | 日韩二区 | 91精品国产综合久久福利软件 | 欧美在线a| 亚洲一区综合 | 久久久精彩视频 | 伊色综合久久之综合久久 | 久久y| 精品欧美激情在线观看 | 91免费看片 | 国产精品一码二码三码在线 | 91精品国产一区二区三区 | 国产高清毛片 | 国产高清在线视频 | 国产1区2区3区 | 一级片av| 二区精品| 国产三级精品三级在线观看四季网 | 亚洲毛片 | 亚洲精品久久久久久首妖 | 久久国产精品一区二区三区 | 一区二区不卡 | 亚洲国产69 | 久久午夜国产精品www忘忧草 | 日日夜夜精品视频 | 成人中文字幕在线 | 国产激情一区二区三区 | 日韩成人在线观看 | 伊人网影院 | 999久久| 久久人| 一区二区三区精品视频 | 亚洲欧洲成人av每日更新 | 精品久久久久久久久久久久久久久久久 |