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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

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

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

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

代碼借鑒了例程,例程沒(méi)什么注釋?zhuān)一旧虾芏嚓P(guān)鍵地方都給出了注釋?zhuān)矣X(jué)得已經(jīng)很走心了,代碼這種東西要多看多練,稍微幾天不打就沒(méi)啥感覺(jué)了,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)タ刂茖?duì)應(yīng)的數(shù)碼管,temp讀取P3口的狀態(tài),keyvalue為矩陣鍵盤(pán)的鍵值
  15. uchar a=16;b=16;c=16;d=16;e=16;f=16;//作用于數(shù)碼管顯示函數(shù)中的變量,剛開(kāi)始為不亮
  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ù)碼管顯示'-'這個(gè)字樣
  19. uchar code we[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//數(shù)碼管對(duì)應(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)閉,燈也會(huì)跟著數(shù)碼管關(guān)閉,由s19按鍵負(fù)責(zé)
  25. // allow表示只有密碼鎖密碼正確的情況下,才能進(jìn)行修改密碼的操作
  26. // reinput表示密碼重新輸入,主要用在密碼輸錯(cuò)或者中途改密碼時(shí)覺(jué)得輸錯(cuò)密碼的情況下
  27. /******使用到的變量定義*******/

  28. /******延時(shí)函數(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í)函數(shù)*******/

  36. /******看起來(lái)方便的函數(shù)*******/
  37. /*我看了很多關(guān)于74HC573級(jí)聯(lián)驅(qū)動(dòng)數(shù)碼管的代碼
  38. 代碼看起來(lái)挺長(zhǎng)的,我感覺(jué)我這種寫(xiě)法會(huì)方便一點(diǎn)
  39. 不用寫(xiě)這么多*/
  40. void convenience(uchar duan,uchar wei)
  41. {
  42.         dula = 0;//不懂的可以去看74HC573的芯片手冊(cè)或者這個(gè)芯片驅(qū)動(dòng)數(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. /******看起來(lái)方便的函數(shù)*******/

  54. /******數(shù)碼管顯示函數(shù)*******/
  55. //此處abcdef為形參與上面的abcdef不同,上面的abcdef為實(shí)參,用來(lái)讓六位數(shù)碼管顯示想要的符號(hào)/數(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. /******按鍵松手檢測(cè)函數(shù)******/
  67. //仿真的我不清楚但是實(shí)物的話,松手檢測(cè)是必須的
  68. //感覺(jué)矩陣按鍵的寫(xiě)法不能跟單個(gè)按鍵一樣————可以不加松手檢測(cè)
  69. //我就曾經(jīng)因?yàn)闆](méi)加矩陣按鍵松手檢測(cè)導(dǎo)致效果有問(wèn)題
  70. //所以我覺(jué)得應(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. /******按鍵松手檢測(cè)函數(shù)******/

  82. /******按鍵掃描函數(shù)*******/
  83. void keyscan()
  84. {
  85.         P3 = 0xfe;temp = P3;temp = temp & 0xf0;//檢測(cè)第一行按鍵是否有被按下的
  86.         if(temp!=0xf0)//與獨(dú)立按鍵寫(xiě)法類(lèi)似
  87.         {
  88.                 delay(10);//延時(shí)
  89.                 if(temp!=0xf0)
  90.                 {
  91.                         temp = P3;//讀取P3狀態(tài)看看是哪個(gè)按鍵被按下
  92.                         switch(temp)
  93.                         {//wei++是干什么用的呢,我會(huì)在下面的函數(shù)中告訴你
  94.                                 case 0xee:keyvalue=0;wei++;break;//看不懂鍵值的,先去看看矩陣按鍵的知識(shí)
  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();//松手檢測(cè)
  101.                 }
  102.         }
  103.         P3 = 0xfd;temp = P3;temp = temp & 0xf0;//檢測(cè)第二行按鍵是否有被按下的
  104.         if(temp!=0xf0)//與獨(dú)立按鍵寫(xiě)法類(lèi)似
  105.         {
  106.                 delay(10);//延時(shí)
  107.                 if(temp!=0xf0)
  108.                 {
  109.                         temp = P3;//讀取P3狀態(tài)看看是哪個(gè)按鍵被按下
  110.                         switch(temp)
  111.                         {
  112.                                 case 0xed:keyvalue=4;wei++;break;//看不懂鍵值的,先去看看矩陣按鍵的知識(shí)
  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();//松手檢測(cè)
  119.                 }
  120.         }
  121.         P3 = 0xfb;temp = P3;temp = temp & 0xf0;//檢測(cè)第三行按鍵是否有被按下的
  122.         if(temp!=0xf0)//與獨(dú)立按鍵寫(xiě)法類(lèi)似
  123.         {
  124.                 delay(10);//延時(shí)
  125.                 if(temp!=0xf0)
  126.                 {
  127.                         temp = P3;//讀取P3狀態(tài)看看是哪個(gè)按鍵被按下
  128.                         switch(temp)
  129.                         {
  130.                                 case 0xeb:keyvalue=8;wei++;break;//看不懂鍵值的,先去看看矩陣按鍵的知識(shí)
  131.                                 case 0xdb:keyvalue=9;wei++;break;
  132.                                 case 0xbb:change=1;wei=0;break;//s16按鍵,修改密碼
  133.                                 case 0x7b:
  134.                                         if(allow)//只有密碼正確,allow才會(huì)為1
  135.                                         {
  136.                                                 ok = 1;//確認(rèn)密碼修改完畢
  137.                                         }
  138.                                         break;//s17按鍵 密碼修改完畢確認(rèn)鍵
  139.                                 default:break;
  140.                         }
  141.                         keyRelease();//松手檢測(cè)
  142.                 }
  143.         }
  144.         P3 = 0xf7;temp = P3;temp = temp & 0xf0;//檢測(cè)第四行按鍵是否有被按下的
  145.         if(temp!=0xf0)//與獨(dú)立按鍵寫(xiě)法類(lèi)似
  146.         {
  147.                 delay(10);//延時(shí)
  148.                 if(temp!=0xf0)
  149.                 {
  150.                         temp = P3;//讀取P3狀態(tài)看看是哪個(gè)按鍵被按下
  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();//松手檢測(cè)
  158.                 }
  159.         }
  160. }
  161. /******按鍵掃描函數(shù)*******/

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

  211. /******驗(yàn)證密碼正確函數(shù)*******/
  212. void CheckPassword()
  213. {
  214.         if(finish)
  215.         {
  216.                 //新舊密碼對(duì)比,正確就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. /******驗(yàn)證密碼正確函數(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)//沒(méi)有進(jìn)行修改密碼操作時(shí),應(yīng)把finish置零
  236.                                 finish = 0;
  237.                 }
  238.                 if(change)//進(jìn)行修改密碼操作時(shí)
  239.                 {
  240.                         if(allow)//原始密碼正確才能進(jìn)行操作
  241.                         {
  242.                                 while(!finish)//只有密碼全部輸完才能退出循環(huán)
  243.                                 {
  244.                                         keyscan();//因?yàn)榭ㄔ谶@里的while循環(huán),不能再返回到上面的掃描語(yǔ)句,故要加上去
  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;//不用多說(shuō)
  258.                         wei = 0;//從頭開(kāi)始輸密碼啦
  259.                         change = 0;//不用再改啦
  260.                         old1=new1;old2=new2;old3=new3; //此時(shí),舊的密碼將被代替
  261.                         old4=new4;old5=new5;old6=new6;
  262.                         a=b=c=e=f=d=16;//數(shù)碼管不亮,你可以理解為視覺(jué)效果更好看一點(diǎn)把
  263.                 }
  264.                 if(reinput)//重新輸入密碼
  265.                 {
  266.                         reinput = 0;//這個(gè)肯定要等于0吧,不然就一直逃不出這個(gè)if了
  267.                         wei = 0;//這個(gè)肯定也要0吧,不然一直wei++就超過(guò)了數(shù)碼管的位數(shù)啦
  268.                         finish = 0;//你重新輸入密碼,是不是密碼沒(méi)輸完,那么這個(gè)肯定也要0吧
  269.                         new1=new2=new3=new4=new5=new6=0;//把我們之前輸錯(cuò)的密碼全清零了
  270.                         a=b=c=e=f=d=16;//你重新輸入密碼,數(shù)碼管不亮
  271.                 }
  272.                 if(close)//關(guān)閉密碼鎖
  273.                 {
  274.                         close = 0;//關(guān)閉數(shù)碼管,萬(wàn)物皆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;//把我們之前輸錯(cuò)的密碼全清零了
  281.                         a=b=c=e=f=d=16;//你重新輸入密碼,數(shù)碼管不亮
  282.                 }
  283.                 display(a,b,c,d,e,f);//不屬于任何一個(gè)if,實(shí)時(shí)顯示
  284.         }
  285. }
  286. /******主函數(shù)******/
復(fù)制代碼
原本想發(fā)一個(gè)演示的視頻但是容量有點(diǎn)大,就不發(fā)了


評(píng)分

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

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:399179 發(fā)表于 2022-3-26 22:00 來(lái)自觸屏版 | 只看該作者
這個(gè)程序斷電后不能記憶新密碼吧?
回復(fù)

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 99九色| 中文字幕久久精品 | 国产色网 | 久久久久久av | 色视频网站 | 欧美高清hd| 欧美一区二区三区久久精品 | 国产精品久久久久久久久婷婷 | 高清色| 青青久久| 亚洲一区二区三区免费 | 草草网 | 天天操夜夜爽 | 亚洲高清一区二区三区 | 午夜影院在线观看视频 | 欧美国产日本一区 | 成人精品一区 | 天天天天天天操 | 久久久一区二区三区 | 精品免费在线 | 欧美一二三四成人免费视频 | 精品av| 日韩一区二区三区在线观看 | 国产精品久久久久久久久久久久久久 | 久久久久网站 | 国产精品一区一区三区 | 日韩中文字幕一区 | 女女爱爱视频 | 人妖av| 韩日精品一区 | 福利网站在线观看 | 国产精品99久久久久久久久 | 中文字幕一区二区三区四区五区 | 久久综合狠狠综合久久综合88 | 国产精品久久久久久久久久久久午夜片 | 精品一区二区三区在线观看国产 | 一级黄色毛片a | 亚洲美女一区二区三区 | 日日操夜夜操天天操 | 日本不卡一区二区三区在线观看 | 欧洲视频一区二区 |