找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2411|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

基于清翔單片機(jī)的簡易數(shù)碼管密碼鎖程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:966442 發(fā)表于 2022-1-28 18:26 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
程序功能: 1、開鎖: 下載程序后,直接按六次S6(即代表數(shù)字0),8位LED亮,鎖被打開,輸入密碼時,
                  六位數(shù)碼管依次顯示小橫杠。
                  2、更改密碼:
                  只有當(dāng)開鎖(LED亮)后,該功能方可使用。
                  首先按下更改密碼鍵S16,然后設(shè)置相應(yīng)密碼,此時六位數(shù)碼管會顯示設(shè)置密碼對應(yīng)
                  的數(shù)字。最后設(shè)置完六位后,按下S17確認(rèn)密碼更改,此后新密碼即生效。
                  3、重試密碼:
                  當(dāng)輸入密碼時,密碼輸錯后按下鍵S18,可重新輸入六位密碼。
                  當(dāng)設(shè)置密碼時,設(shè)置中途想更改密碼,也可按下此鍵重新設(shè)置。
                  4、關(guān)閉密碼鎖:
                  按下S19即可將打開的密碼鎖關(guān)閉。
推薦初級演示步驟:輸入原始密碼000000按6次S6密碼正確后LED全部亮表示鎖已打開---按下更
改密碼按鍵S16---按S6到S15設(shè)置密碼---按S17
                        確認(rèn)密碼更改---按S19關(guān)閉密碼鎖---輸入新的密碼打開密碼鎖

        功能鍵
                                                S6---S15        數(shù)字鍵0-9
                                S16---更改密碼                S17---更改密碼完畢后確認(rèn)
                                S18---重試密碼、重新設(shè)定        S19---關(guān)閉密碼鎖
                                初始密碼:000000         密碼位數(shù):6位
                                注意:掉電后,所設(shè)密碼會丟失,重新上點時,密碼恢復(fù)為原始的000000
                                與P1相連的8位發(fā)光LED點亮代表鎖被打開;熄滅代表鎖被鎖上

代碼借鑒了例程,例程沒什么注釋,我基本上很多關(guān)鍵地方都給出了注釋,我覺得已經(jīng)很走心了,代碼這種東西要多看多練,稍微幾天不打就沒啥感覺了,Keil代碼下載: 密碼鎖.rar (40.82 KB, 下載次數(shù): 41)

單片機(jī)源程序如下:
  1. #include <REGX52.H>
  2. /******數(shù)據(jù)變量定義*******/
  3. typedef unsigned char uchar;
  4. typedef unsigned int uint;
  5. /******數(shù)據(jù)變量定義*******/

  6. /******硬件接口定義*******/
  7. sbit dula = P2^6;
  8. sbit wela = P2^7;
  9. sbit beep = P2^3;
  10. /******硬件接口定義*******/

  11. /******使用到的變量定義*******/
  12. uchar old1,old2,old3,old4,old5,old6;//舊密碼,000000
  13. uchar new1,new2,new3,new4,new5,new6;//單片機(jī)所接受到的新密碼
  14. uchar wei,temp,keyvalue;//wei的增加可以讓我們?nèi)タ刂茖?yīng)的數(shù)碼管,temp讀取P3口的狀態(tài),keyvalue為矩陣鍵盤的鍵值
  15. uchar a=16;b=16;c=16;d=16;e=16;f=16;//作用于數(shù)碼管顯示函數(shù)中的變量,剛開始為不亮
  16. uchar code table[]=
  17. {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
  18.         0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40};//共陰數(shù)碼管,0x00:關(guān)閉數(shù)碼管  0x40:數(shù)碼管顯示'-'這個字樣
  19. uchar code we[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//數(shù)碼管對應(yīng)的位碼
  20. bit finish,ok,close,allow,change,reinput;
  21. // change表示s16按鍵為修改密碼鍵
  22. // finish表示密碼全部輸完的標(biāo)志
  23. // ok表示s17確認(rèn)鍵按下,密碼鎖的密碼已經(jīng)更改完畢
  24. // close表示密碼鎖關(guān)閉,燈也會跟著數(shù)碼管關(guān)閉,由s19按鍵負(fù)責(zé)
  25. // allow表示只有密碼鎖密碼正確的情況下,才能進(jìn)行修改密碼的操作
  26. // reinput表示密碼重新輸入,主要用在密碼輸錯或者中途改密碼時覺得輸錯密碼的情況下
  27. /******使用到的變量定義*******/

  28. /******延時函數(shù)*******/
  29. void delay(unsigned char i)
  30. {
  31.         uchar j,k;
  32.   for(j=i;j>0;j--)
  33.     for(k=125;k>0;k--);
  34. }
  35. /******延時函數(shù)*******/

  36. /******看起來方便的函數(shù)*******/
  37. /*我看了很多關(guān)于74HC573級聯(lián)驅(qū)動數(shù)碼管的代碼
  38. 代碼看起來挺長的,我感覺我這種寫法會方便一點
  39. 不用寫這么多*/
  40. void convenience(uchar duan,uchar wei)
  41. {
  42.         dula = 0;//不懂的可以去看74HC573的芯片手冊或者這個芯片驅(qū)動數(shù)碼管的視頻看一下
  43.         P0 = table[duan];//傳遞段碼
  44.         dula = 1;
  45.         dula = 0;
  46.         
  47.         wela = 0;
  48.         P0 = we[wei];//傳遞位碼
  49.         wela = 1;
  50.         wela = 0;
  51.         delay(5);
  52. }
  53. /******看起來方便的函數(shù)*******/

  54. /******數(shù)碼管顯示函數(shù)*******/
  55. //此處abcdef為形參與上面的abcdef不同,上面的abcdef為實參,用來讓六位數(shù)碼管顯示想要的符號/數(shù)字
  56. void display(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f)
  57. {
  58.         convenience(a,0);
  59.         convenience(b,1);
  60.         convenience(c,2);
  61.         convenience(d,3);
  62.         convenience(e,4);
  63.         convenience(f,5);
  64. }
  65. /******數(shù)碼管顯示函數(shù)*******/

  66. /******按鍵松手檢測函數(shù)******/
  67. //仿真的我不清楚但是實物的話,松手檢測是必須的
  68. //感覺矩陣按鍵的寫法不能跟單個按鍵一樣————可以不加松手檢測
  69. //我就曾經(jīng)因為沒加矩陣按鍵松手檢測導(dǎo)致效果有問題
  70. //所以我覺得應(yīng)該要加
  71. void keyRelease()
  72. {
  73.         while(temp!=0xf0)
  74.         {
  75.                 temp = P3;
  76.                 temp = temp & 0xf0;
  77.                 beep = 0;//按一下蜂鳴器就響
  78.         }
  79.         beep = 1;//蜂鳴器關(guān)掉
  80. }
  81. /******按鍵松手檢測函數(shù)******/

  82. /******按鍵掃描函數(shù)*******/
  83. void keyscan()
  84. {
  85.         P3 = 0xfe;temp = P3;temp = temp & 0xf0;//檢測第一行按鍵是否有被按下的
  86.         if(temp!=0xf0)//與獨立按鍵寫法類似
  87.         {
  88.                 delay(10);//延時
  89.                 if(temp!=0xf0)
  90.                 {
  91.                         temp = P3;//讀取P3狀態(tài)看看是哪個按鍵被按下
  92.                         switch(temp)
  93.                         {//wei++是干什么用的呢,我會在下面的函數(shù)中告訴你
  94.                                 case 0xee:keyvalue=0;wei++;break;//看不懂鍵值的,先去看看矩陣按鍵的知識
  95.                                 case 0xde:keyvalue=1;wei++;break;
  96.                                 case 0xbe:keyvalue=2;wei++;break;
  97.                                 case 0x7e:keyvalue=3;wei++;break;
  98.                                 default:break;
  99.                         }
  100.                         keyRelease();//松手檢測
  101.                 }
  102.         }
  103.         P3 = 0xfd;temp = P3;temp = temp & 0xf0;//檢測第二行按鍵是否有被按下的
  104.         if(temp!=0xf0)//與獨立按鍵寫法類似
  105.         {
  106.                 delay(10);//延時
  107.                 if(temp!=0xf0)
  108.                 {
  109.                         temp = P3;//讀取P3狀態(tài)看看是哪個按鍵被按下
  110.                         switch(temp)
  111.                         {
  112.                                 case 0xed:keyvalue=4;wei++;break;//看不懂鍵值的,先去看看矩陣按鍵的知識
  113.                                 case 0xdd:keyvalue=5;wei++;break;
  114.                                 case 0xbd:keyvalue=6;wei++;break;
  115.                                 case 0x7d:keyvalue=7;wei++;break;
  116.                                 default:break;
  117.                         }
  118.                         keyRelease();//松手檢測
  119.                 }
  120.         }
  121.         P3 = 0xfb;temp = P3;temp = temp & 0xf0;//檢測第三行按鍵是否有被按下的
  122.         if(temp!=0xf0)//與獨立按鍵寫法類似
  123.         {
  124.                 delay(10);//延時
  125.                 if(temp!=0xf0)
  126.                 {
  127.                         temp = P3;//讀取P3狀態(tài)看看是哪個按鍵被按下
  128.                         switch(temp)
  129.                         {
  130.                                 case 0xeb:keyvalue=8;wei++;break;//看不懂鍵值的,先去看看矩陣按鍵的知識
  131.                                 case 0xdb:keyvalue=9;wei++;break;
  132.                                 case 0xbb:change=1;wei=0;break;//s16按鍵,修改密碼
  133.                                 case 0x7b:
  134.                                         if(allow)//只有密碼正確,allow才會為1
  135.                                         {
  136.                                                 ok = 1;//確認(rèn)密碼修改完畢
  137.                                         }
  138.                                         break;//s17按鍵 密碼修改完畢確認(rèn)鍵
  139.                                 default:break;
  140.                         }
  141.                         keyRelease();//松手檢測
  142.                 }
  143.         }
  144.         P3 = 0xf7;temp = P3;temp = temp & 0xf0;//檢測第四行按鍵是否有被按下的
  145.         if(temp!=0xf0)//與獨立按鍵寫法類似
  146.         {
  147.                 delay(10);//延時
  148.                 if(temp!=0xf0)
  149.                 {
  150.                         temp = P3;//讀取P3狀態(tài)看看是哪個按鍵被按下
  151.                         switch(temp)
  152.                         {
  153.                                 case 0xe7:reinput=1;break;//s18 重新修改或輸入密碼
  154.                                 case 0xd7:close=1;break;//s19 關(guān)閉密碼鎖和燈
  155.                                 default:break;
  156.                         }
  157.                         keyRelease();//松手檢測
  158.                 }
  159.         }
  160. }
  161. /******按鍵掃描函數(shù)*******/

  162. /******輸入密碼函數(shù)*******/
  163. void InputPassword()
  164. {
  165.         if(!finish)//finish為1表示密碼全部輸入完畢,為0表示密碼沒輸完
  166.         {
  167.                 //wei=0,就是不操控數(shù)碼管 wei=1就是操控第一個數(shù)碼管,wei=2就是操控第二個數(shù)碼管,依此類推,這就是wei的作用
  168.                 switch(wei)
  169.                 {
  170.                         case 1:new1=keyvalue;//第一個數(shù)碼管接收矩陣按鍵的密碼信息
  171.                                 if(!allow)//在密碼沒輸入正確前,每按一次按鍵數(shù)碼管依次顯示'-',相當(dāng)于隱藏密碼吧
  172.                                         a=17;//如果密碼錯誤,則數(shù)碼管顯示'-'字符
  173.                                 else//allow為1,一般就是說可以改密碼了,這個時候每按一次按鍵,數(shù)碼管依次顯示對應(yīng)的數(shù)字
  174.                                         a=keyvalue;//將鍵值賦給a,a再傳遞到數(shù)碼管顯示函數(shù)
  175.                                 break;
  176.                         case 2:new2=keyvalue;//照貓畫虎更上面類似
  177.                                 if(a==17)
  178.                                         b=17;//如果第一個數(shù)碼管顯示'-'那么接下來的數(shù)碼管也要顯示'-'
  179.                                 else
  180.                                         b=keyvalue;
  181.                                 break;
  182.                         case 3:new3=keyvalue;
  183.                                 if(a==17)
  184.                                         c=17;//如果第一個數(shù)碼管顯示'-'那么接下來的數(shù)碼管也要顯示'-'
  185.                                 else
  186.                                         c=keyvalue;
  187.                                 break;
  188.                         case 4:new4=keyvalue;
  189.                                 if(a==17)
  190.                                         d=17;//如果第一個數(shù)碼管顯示'-'那么接下來的數(shù)碼管也要顯示'-'
  191.                                 else
  192.                                         d=keyvalue;
  193.                                 break;
  194.                         case 5:new5=keyvalue;
  195.                                 if(a==17)
  196.                                         e=17;//如果第一個數(shù)碼管顯示'-'那么接下來的數(shù)碼管也要顯示'-'
  197.                                 else
  198.                                         e=keyvalue;
  199.                                 break;
  200.                         case 6:new6=keyvalue;
  201.                                 if(a==17)
  202.                                         f=17;//如果第一個數(shù)碼管顯示'-'那么接下來的數(shù)碼管也要顯示'-'
  203.                                 else
  204.                                         f=keyvalue;
  205.                                         finish = 1;//就此,六位數(shù)碼管密碼全部輸完
  206.                                 break;
  207.                 }
  208.         }
  209. }
  210. /******輸入密碼函數(shù)*******/

  211. /******驗證密碼正確函數(shù)*******/
  212. void CheckPassword()
  213. {
  214.         if(finish)
  215.         {
  216.                 //新舊密碼對比,正確就allow=1
  217.                 if((new1==old1)&(new2==old2)&(new3==old3)&(new4==old4)&(new5==old5)&(new6==old6))
  218.                 {
  219.                         allow = 1;//只有原始密碼正確才可以進(jìn)行下面的修改密碼的操作
  220.                 }
  221.         }
  222. }
  223. /******驗證密碼正確函數(shù)*******/

  224. /******主函數(shù)******/
  225. void main()
  226. {
  227.         while(1)
  228.         {
  229.                 keyscan();//按鍵掃描
  230.                 InputPassword();//輸入密碼
  231.                 CheckPassword();//確認(rèn)密碼
  232.                 if(allow)
  233.                 {
  234.                         P1=0x00;//燈全亮
  235.                         if(!change)//沒有進(jìn)行修改密碼操作時,應(yīng)把finish置零
  236.                                 finish = 0;
  237.                 }
  238.                 if(change)//進(jìn)行修改密碼操作時
  239.                 {
  240.                         if(allow)//原始密碼正確才能進(jìn)行操作
  241.                         {
  242.                                 while(!finish)//只有密碼全部輸完才能退出循環(huán)
  243.                                 {
  244.                                         keyscan();//因為卡在這里的while循環(huán),不能再返回到上面的掃描語句,故要加上去
  245.                                         InputPassword();//與上同理
  246.                                         if(reinput|close)//如果重新修改密碼或者關(guān)閉密碼鎖
  247.                                         {
  248.                                                 finish = 1;//退出循環(huán)
  249.                                                 break;
  250.                                         }
  251.                                         display(a,b,c,d,e,f);//顯示修改密碼的數(shù)字
  252.                                 }
  253.                         }
  254.                 }
  255.                 if(ok)//密碼修改完畢
  256.                 {
  257.                         ok = 0;//不用多說
  258.                         wei = 0;//從頭開始輸密碼啦
  259.                         change = 0;//不用再改啦
  260.                         old1=new1;old2=new2;old3=new3; //此時,舊的密碼將被代替
  261.                         old4=new4;old5=new5;old6=new6;
  262.                         a=b=c=e=f=d=16;//數(shù)碼管不亮,你可以理解為視覺效果更好看一點把
  263.                 }
  264.                 if(reinput)//重新輸入密碼
  265.                 {
  266.                         reinput = 0;//這個肯定要等于0吧,不然就一直逃不出這個if了
  267.                         wei = 0;//這個肯定也要0吧,不然一直wei++就超過了數(shù)碼管的位數(shù)啦
  268.                         finish = 0;//你重新輸入密碼,是不是密碼沒輸完,那么這個肯定也要0吧
  269.                         new1=new2=new3=new4=new5=new6=0;//把我們之前輸錯的密碼全清零了
  270.                         a=b=c=e=f=d=16;//你重新輸入密碼,數(shù)碼管不亮
  271.                 }
  272.                 if(close)//關(guān)閉密碼鎖
  273.                 {
  274.                         close = 0;//關(guān)閉數(shù)碼管,萬物皆0
  275.                         allow = 0;
  276.                         wei = 0;
  277.                         finish = 0;
  278.                         change = 0;
  279.                         P1 = 0xff;//燈要關(guān)啦
  280.                         new1=new2=new3=new4=new5=new6=0;//把我們之前輸錯的密碼全清零了
  281.                         a=b=c=e=f=d=16;//你重新輸入密碼,數(shù)碼管不亮
  282.                 }
  283.                 display(a,b,c,d,e,f);//不屬于任何一個if,實時顯示
  284.         }
  285. }
  286. /******主函數(shù)******/
復(fù)制代碼
原本想發(fā)一個演示的視頻但是容量有點大,就不發(fā)了


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:399179 發(fā)表于 2022-3-26 22:00 來自手機(jī) | 只看該作者
這個程序斷電后不能記憶新密碼吧?
回復(fù)

使用道具 舉報

板凳
ID:718536 發(fā)表于 2022-3-31 22:20 | 只看該作者
快樂眼淚 發(fā)表于 2022-3-26 22:00
這個程序斷電后不能記憶新密碼吧?

加上EEPROM程序就可以斷電記憶了。在主程序那里讀取一下設(shè)置的密碼。
回復(fù)

使用道具 舉報

地板
ID:332444 發(fā)表于 2023-2-24 13:50 | 只看該作者
剛剛出爐的普中板子密碼鎖8位不用數(shù)組,三次錯誤顯示ERROR演示。
數(shù)碼管驅(qū)動138-573,錯誤有蜂鳴,正確LED顯示,單按鍵確認(rèn)密碼。

回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表