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

QQ登錄

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

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

一個(gè)基于51單片機(jī)的電子密碼設(shè)計(jì)與制作(代碼注釋,仿真都有)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
在此分享一個(gè)自己原創(chuàng)制作的基于51單片機(jī)的電子密碼設(shè)計(jì)此電子密碼鎖的功能有:
(1)六位密碼輸入(如需修改密碼位數(shù),請(qǐng)看注釋?zhuān)?br /> (2)不同的密碼權(quán)限,管理員有修改密碼,保持鎖常開(kāi),手動(dòng)關(guān)鎖的功能,一般用戶(hù)沒(méi)有這些功能;
(3)定時(shí)關(guān)鎖(附件里的定時(shí)了五秒,如需修改,請(qǐng)看注釋?zhuān)?br /> (4)蜂鳴器報(bào)警;
(5)LCD1602顯示(有一般的并口驅(qū)動(dòng),和IIC驅(qū)動(dòng));
嗯,應(yīng)該就這些。
如圖為Proteus仿真圖


嗯,電磁鎖的原理跟繼電器的差不多(我也不是太懂),仿真中就用繼電器模擬電磁鎖的開(kāi)關(guān)了,亮燈表示通電,門(mén)鎖上,滅燈表示斷電,門(mén)打開(kāi)。
仿真中沒(méi)有斷電保護(hù),也就是說(shuō),斷電后,密碼回到初始狀態(tài),修改的密碼無(wú)效。我沒(méi)有用外部的存儲(chǔ)器保存數(shù)據(jù),用的是51單片機(jī)自帶的EEPROM。實(shí)現(xiàn)斷電保護(hù)的程序一起打包了,不過(guò)注釋掉了,因?yàn)闀?huì)影響仿真,燒到硬件上的恢復(fù)一下就好。具體怎么實(shí)現(xiàn)斷電保護(hù)有蠻多方式,可以在51hei論壇里找找。

這是部分程序,為了方便使用,我把驅(qū)動(dòng)程序分成了.c和.h文件。修改一下對(duì)應(yīng)的管腳就可以使用了。
  1. #include "MAIN.h"

  2. int main(void){
  3.                
  4.         LOCK = 0;                                                              //關(guān)鎖
  5.         BUZ = 1;                                                                //關(guān)蜂鳴器
  6. //        ISP_Password_Read();                                          //從Flash或EEPROM中讀出密碼,進(jìn)行初始化
  7.         init_timer();                                                            //初始化定時(shí)器
  8.         LCD_init();                                                             //顯示初始
  9.         delayms(10);                                                                                
  10.         LCD_printf(0,0,"Please input");
  11.         LCD_printf(1,0,"Password:");
  12.         BUZ_time(5);                                                       //響鳴提示可以輸入密碼

  13.         while(1){
  14.                 KEY_read();                                                //按鍵值讀取
  15.                 DISPLAY();                                                 //顯示
  16.                 BUZ_cmd();                                                //蜂鳴器響應(yīng)
  17.                 PassTiem();                                                //繼電器響應(yīng)
  18.         }
  19. }

  20. /****************************************
  21.                                                                               
  22.          定時(shí)計(jì)數(shù)器初始化子程序                                
  23.                                                                               
  24. *****************************************/

  25. void init_timer() {
  26.         
  27.         TMOD = 0X01;                                                  //設(shè)置T0為定時(shí)器,工作方式為1,16位定時(shí)/計(jì)數(shù)器
  28.         TH0 = TH;                                                        //設(shè)置定時(shí)器0初值,定時(shí)50ms
  29.            TL0 = TL;
  30.         EA = 1;                                                            //中斷使能開(kāi)
  31.         ET0 = 1;                                                          //定時(shí)器0中開(kāi)
  32.         TR0 = 0;                                                          //定時(shí)器0關(guān)                 
  33. }

  34. /****************************************
  35. *                                                                                
  36. *        定時(shí)器0中斷子程序                                       
  37. *                                                                                
  38. *****************************************/

  39. void timer_irs_0() interrupt 1{
  40.                         
  41.         if(time < hold_time) {                                        //這里設(shè)置定時(shí)為hold_time*50ms
  42.                 TH0 = TH;                                                //重新賦值50
  43.                    TL0 = TL;               
  44.                 time++;
  45.                 if(((hold_time - time) % 20) == 0){                                       //顯示剩余時(shí)間                                                
  46.                         count[0] = '0' + ((hold_time - time) / 20) /10;
  47.                         count[1] = '0' + ((hold_time - time) / 20) %10;
  48.                         LCD_printf(1,9,count);                                                
  49.                         BUZ_time(50);
  50.                         time++;                                                                      //由于響鈴50ms,計(jì)時(shí)補(bǔ)償
  51.                 }

  52.         }
  53.         else {
  54.                 TR0 = 0;                                                        //定時(shí)器0關(guān)
  55.                 time = 0;                                                       //溢出標(biāo)志清零
  56.                 LCD_WriteCommand(0X01);                             //清屏
  57.                 delayms(10);
  58.                 LCD_printf(0,0,"Closing!");
  59.                 BUZ_time(50);                                                //響鳴提示已關(guān)鎖
  60.                 delayms(200);
  61.                 CLEAR();                                                        //清空數(shù)據(jù)
  62.                                 
  63.         }
  64.                                                    
  65. }

  66. /****************************************                                                                             
  67.         LCD顯示程序                                                      
  68.                                                                               
  69.         顯示操作信息,給用戶(hù)操作提示                                                                                                                             
  70. *****************************************/

  71. uchar DISPLAY(void){
  72.         uchar t;
  73.         if(flag_pass && flag_a){                                        //通過(guò)且為管理員,顯示Adm和剩余時(shí)間
  74.                 LCD_WriteCommand(0X01);
  75.                 delayms(10);
  76.                 LCD_printf(0,0,"Welcome,Adm!");
  77.                 LCD_printf(1,0,"Passtime:");
  78.                 return 0x00;
  79.         }
  80.         if(flag_pass && !flag_a){                                           //通過(guò)但非管理員,顯示User和剩余時(shí)間
  81.                 LCD_WriteCommand(0X01);
  82.                 delayms(10);
  83.                 LCD_printf(0,0,"Welcome,User!");
  84.                 LCD_printf(1,0,"Passtime:");
  85.                 return 0x00;
  86.         }
  87.         if(flag_error){                                                                //不通過(guò),錯(cuò)誤顯示,顯示錯(cuò)誤次數(shù)
  88.                 t = '0' + flag_error_time;
  89.                 LCD_WriteCommand(0X01);
  90.                 delayms(10);
  91.                 LCD_printf(0,0,"Input,error!");
  92.                 LCD_printf(1,0,&t);
  93.                 return 0x00;
  94.         }               
  95.         if(flag_m1){                                                   //管理員按下M1/M2,顯示常開(kāi)
  96.                 LCD_WriteCommand(0X01);
  97.                 delayms(10);
  98.                 LCD_printf(0,0,"Passing!");
  99.                 LCD_printf(1,0,"Hold on!");
  100.                 return 0x00;
  101.         }
  102.         if(flag_m2){
  103.                 LCD_WriteCommand(0X01);                                                //清屏
  104.                 delayms(10);
  105.                 LCD_printf(0,0,"Password Change");
  106.                 LCD_printf(1,0,"First :");
  107.                 return 0x00;        
  108.         }
  109.         if(flag_lock){
  110.                 LCD_WriteCommand(0X01);                                        //管理員按下LOCK,顯示準(zhǔn)備關(guān)鎖
  111.                 delayms(10);
  112.                 LCD_printf(0,0,"Closing!");
  113.                 LCD_printf(1,0,"Attention!");
  114.                 return 0x00;
  115.         }
  116.         return 0x00;        
  117. }
復(fù)制代碼

嗯。我也不是什么大神,寫(xiě)的東西不是那么完美,如果有什么錯(cuò)誤的地方,請(qǐng)多多包涵,打包的文件里有程序、仿真、硬件效果圖(都是用現(xiàn)成的模塊制作的,非自己做板,請(qǐng)別嫌棄)。如何修改程序以達(dá)到相應(yīng)的效果,請(qǐng)看注釋的內(nèi)容(我能注釋的都注釋了)。


全部資料51hei下載地址:
電子密碼鎖制作.7z (1.11 MB, 下載次數(shù): 17)

評(píng)分

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

查看全部評(píng)分

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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