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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3355|回復: 1
打印 上一主題 下一主題
收起左側

電子鎖相關提問

[復制鏈接]
回帖獎勵 5 黑幣 回復本帖可獲得 1 黑幣獎勵! 每人限 1 次
跳轉到指定樓層
樓主
這是網上找的一個電子鎖程序,自己進行仿真了,但是輸入密碼環節不知道初始密碼,也好像沒法設定初始密碼,有沒有大神可以幫我看一下,是不是程序問題,還是我自己沒搞懂?

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcden=P1^2;
sbit lcdrs=P1^0;
sbit lcdrw=P1^1;
sbit p17=P1^7;      //開門指示:指示燈和蜂鳴器
uchar table1[8]={'N','A','M','E',':'};      //定義數碼管的第一行"name: "
uchar table2[8]={'C','O','D','E',':'};       //定義數碼管的第二行"lode: "
uchar name[10]={'0','1','2','3'};   
uchar cod[20]={'0','0','0','0','1','1','1','1','2','2','2','2','3','3','3','3'};    //定義四個用戶,并設置對應的用戶和密碼,
                                          //其中用戶0定義為超級用戶0,用戶1、用戶2和用戶3為普通用戶
uint in_name;        //保存輸入的用戶名
uint error_num;          //輸入密碼錯誤的次數
uchar in_code1[4];        //保存第一次輸入的密碼
uchar in_code2[4];        //保存第二次輸入的密碼
uchar code sup[11]={'S','U','P','E','R',' ','U','S','E','R','!'};     //輸入用戶為超級用戶
uchar code nor[12]={'N','O','R','M','A','L',' ','U','S','E','R','!'};    //輸入用戶為普通用戶
uchar code err[6]={'E','R','R','O','R','!'};     //輸入用戶名或密碼錯誤
uchar wait[8]={'W','A','I','T','I','N','G','!'};      //等待
uchar  aga[11]={'I','N','P','U','T',' ','A','G','A','I','N'};  //再次輸入密碼
uchar  ame[9]={'A','M','E','N','D','I','N','G','!'};     //正在修改密碼
uchar  fun[6]={'a','b','c','d','e','f'};       //ABCDEF功能鍵
//====================延時函數======================//
void delay(uint x)
{
   uint a,b;
   for(a=x;a>0;a--)
     for(b=110;b>0;b--);
}
//=================1602寫指令===============//
void write_com(uchar com)
{
lcdrs=0;
P0=com;
delay(10);
lcden=1;
delay(10);
lcden=0;
}
//==============1602寫數據================//
void write_data(uchar dat)
{
lcdrs=1;
P0=dat;
delay(10);
lcden=1;
delay(10);
lcden=0;
}
//===============1602在指定的位置顯示一個字符=============//
void disp_char(uchar x,uchar y,uchar dat)
{
  uint i;
  uchar addr;
  if(y==1)
    addr=0x80+x;
  else
    addr=0xc0+x;
  write_com(addr);
    for(i=0;i<2;i++);
  write_data(dat);
    for(i=0;i<2;i++);
}
//==================1602數碼管初始化函數==================//
void display()
{
lcden=0;
lcdrw=0;
write_com(0x38);  
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
}
//=============4*4鍵盤掃描函數=================//
uint keyscan()
{
   uchar temp;
   uint key=16;    //key=16表示沒有按下任何鍵
   P2=0xfe;         //第一行被置為低電平,開始掃描第一行
   temp=P2;
   temp=temp&0xf0;               
   if(temp!=0xf0)
           {
             delay(1);
             temp=P2;
             temp=temp&0xf0;
             if(temp!=0xf0)
                     {
                              temp=P2;
                              switch(temp)
                              {
                               case(0xee):
                                         key=0;
                                         break;
                               case(0xde):
                                         key=1;
                                         break;
                               case(0xbe):
                                         key=2;
                                         break;
                               case(0x7e):
                                         key=3;
                                         break;
                              }
                              while(temp!=0xf0)    //等待按鍵釋放
                              {
                               temp=P2;
                               temp=temp&0xf0;
                              }
                      }
           }

///////////////////////////////////////////  
   P2=0xfd;         //第二行被置為低電平,開始掃描第二行
   temp=P2;
   temp=temp&0xf0;
   if(temp!=0xf0)
   {
     delay(1);
     temp=P2;
     temp=temp&0xf0;
     if(temp!=0xf0)
     {
       temp=P2;
       switch(temp)
       {
        case(0xed):
                 key=4;
                 break;
        case(0xdd):
                 key=5;
                 break;
        case(0xbd):
                 key=6;
                 break;
        case(0x7d):
                 key=7;
                 break;
       }
       while(temp!=0xf0)    //等待按鍵釋放
       {
       temp=P2;
       temp=temp&0xf0;
       }
     }
    }
////////////////////////////////////////
   P2=0xfb;         //第三行被置為低電平,開始掃描第三行
   temp=P2;
   temp=temp&0xf0;
   if(temp!=0xf0)
   {
     delay(1);
     temp=P2;
     temp=temp&0xf0;
     if(temp!=0xf0)
     {
       temp=P2;
       switch(temp)
       {
        case(0xeb):
                 key=8;
                 break;
        case(0xdb):
                 key=9;
                 break;
        case(0xbb):
                 key=10;
                 break;
        case(0x7b):
                 key=11;
                 break;
       }
       while(temp!=0xf0)    //等待按鍵釋放
       {
         temp=P2;
         temp=temp&0xf0;
       }
     }
    }
//////////////////////////////////////////////  
   P2=0xf7;         //第四行被置為低電平,開始掃描第四行
   temp=P2;
   temp=temp&0xf0;
   if(temp!=0xf0)
   {
     delay(1);
     temp=P2;
     temp=temp&0xf0;
     if(temp!=0xf0)
     {
       temp=P2;
       switch(temp)
       {
        case(0xe7):
                 key=12;
                 break;
        case(0xd7):
                 key=13;
                 break;
        case(0xb7):
                 key=14;
                 break;
        case(0x77):
                 key=15;
                 break;
       }
       while(temp!=0xf0)    //等待按鍵釋放
       {
       temp=P2;
       temp=temp&0xf0;
       }
     }
    }
    return(key);
}
/*/---------------B鍵的功能,刪除用戶--------------------//
void delete_user()
{

;

}
//--------------D鍵的功能,添加用戶----------------------//
void add_user()
{



;


}                                 */
//----------------E鍵的功能,修改密碼-------------//
void amend_code()  
{
  uint i,j,k=16;
    display();
        for(i=0;i<5;i++)
           disp_char(i,1,table1);    //第一行顯示NAME:及對應的用戶名
        disp_char(5,1,name[in_name]);
    for(i=0;i<5;i++)
          disp_char(i,2,table2);           //第二行顯示CODE:AMENDING!
        for(i=0;i<9;i++)
          disp_char(i+5,2,ame);
  for(j=0;j<4;j++)
  {k=keyscan();
        while(k==16)
           k=keyscan();
        cod[in_name*4+i]=fun[k-10];
  }
}
//================F鍵的功能,開門,蜂鳴器間斷響================//
void open_door()
{
   uint i,j;
   for(i=0;i<6;i++)
     for(j=0;j<10000;j++)
         {
           if((j/5000)%2==0)
             p17=1;
           else
             p17=0;
         }
     p17=0;
}
//===================超級用戶相關操作======================//
void super_user()
{
   uint k=16;
   uint flag=0;
   while(flag==0)
   {
     k=keyscan();
     while(!(k==10||k==11||k==13||k==14||k==15))  //當A、B、D、E、F均未被按下時,繼續掃描
       k=keyscan();
     if(k==10)     // 當A鍵被按下時,返回
       flag=1;
     if(k==11)     // 當B鍵被按下時,刪除用戶
     {
           flag=1;
//           delete_user();
         }
     if(k==13)           // 當D鍵被按下時,添加用戶
     {
           flag=1;
//           add_user();
         }
     if(k==14)           // 當E鍵被按下時,修改密碼
     {
           flag=1;
           amend_code();
         }
     if(k==15)          // 當F鍵被按下時,開門
     {
           flag=1;
           open_door();
         }
   }
     delay(6000);
}
//===================普通用戶相關操作:改密、開門========================//
void normal_user()
{
  uint k=16;
  uint flag=0;
  while(flag==0)
  {
    k=keyscan();
    while(!(k==14||k==15))  //當沒有按下E、F鍵時,繼續掃描
      k=keyscan();  
    if(k==14);      //對應于E鍵
    {
           flag=1;            //普通用戶完成一項操作
           amend_code();     //修改當前用戶的密碼
        }
    if(k==15)
        {
          flag=1;            //普通用戶完成一項操作
      open_door();       //F鍵的功能,開門
        }
   }
   delay(6000);
}







//=================第二次輸入密碼函數====================//     
void input_code2()
{
  uint i,j,flag2=0;
  uint k2=16;        
  error_num=0;                          
  while(flag2==0&&error_num<3)
  {
    for(i=0;i<4;i++)     //輸入4位數密碼,保存在in_code2中
    {
     k2=keyscan();
         while(k2==16)
              k2=keyscan();         
     in_code2=fun[k2-10];
     display();
         for(j=0;j<5;j++)
            disp_char(j,1,table1[j]);    //第一行顯示NAME:及對應的用戶名
         disp_char(5,1,name[in_name]);
         for(j=0;j<5;j++)
                   disp_char(j,2,table2[j]);         //第二行先后顯示CODE:*,CODE:**,CODE:***,CODE:****
         for(j=0;j<i+1;j++)
            disp_char(5+j,2,'*');
     delay(10);
    }
        delay(10);
//------檢驗輸入的密碼是否與第一次輸入的密碼一致-------//
    if(in_code2[0]==in_code1[0]&&in_code2[1]==in_code1[1]&&in_code2[2]==in_code1[2]&&in_code2[3]==in_code1[3])   
    {
           flag2=1;         //輸入密碼正確,退出while循環
           p17=1;                        //指示燈亮,蜂鳴器響,表示密碼正確
           delay(400);
           p17=0;
        }
    else
        {
          flag2=0;         //輸入密碼錯誤重新輸入
          error_num++;
      display();
          for(j=0;j<5;j++)                  //第一行顯示NAME:及對應的用戶名
             disp_char(j,1,table1[j]);
          disp_char(5,1,name[in_name]);
          for(j=0;j<5;j++)                          //第二行顯示CODE:ERROR!2
             disp_char(j,2,table2[j]);
          for(j=0;j<6;j++)
                   disp_char(j+5,2,err[j]);
          disp_char(11,2,'2');
          delay(10);
         }
  }
}                           
//=================第一次輸入密碼函數====================//     
void input_code1()
{
  uint i,j,n,flag1=0,k1=16;
  error_num=0;
  while(flag1==0&&error_num<3)
  {
         for(i=0;i<4;i++)     //輸入4位數密碼,保存在in_code1中
   {
     k1=16;
     k1=keyscan();
         while(k1==16)
              k1=keyscan();   
     in_code1=fun[k1-10];
     display();
         for(j=0;j<5;j++)
            disp_char(j,1,table1[j]);    //第一行顯示NAME:及對應的用戶名
         disp_char(5,1,name[in_name]);
         for(j=0;j<5;j++)
                   disp_char(j,2,table2[j]);         //第二行先后顯示CODE:*,CODE:**,CODE:***,CODE:****
         for(n=0;n<i+1;n++)
            disp_char(5+n,2,'*');
     delay(10);
   }
      delay(600);                           
//-------------檢驗輸入的密碼是否正確---------//
    if(in_code1[0]==cod[in_name*4+0]&&in_code1[1]==cod[in_name*4+1]&&in_code1[2]==cod[in_name*4+2]&&in_code1[3]==cod[in_name*4+3])   
    {
          flag1=1;     //輸入密碼正確,退出wlile循環,等待第二次輸入密碼
      display();
          for(j=0;j<5;j++)
            disp_char(j,1,table1[j]);    //第一行顯示NAME:及對應的用戶名
          disp_char(5,1,name[in_name]);         
          for(j=0;j<5;j++)
                   disp_char(j,2,table2[j]);         //第二行顯示CODE:INPUT AGAIN
          for(j=0;j<11;j++)
                   disp_char(j+5,2,aga[j]);    //INPUT AGAIN
          delay(10);
          p17=0;                       //指示燈亮,蜂鳴器響,表示密碼正確
          delay(400);
          p17=1;
        }  
    else
         {
          flag1=0;         //輸入密碼錯誤重新輸入
          error_num++;
          display();
          for(j=0;j<5;j++)                  //第一行顯示NAME:及對應的用戶名
             disp_char(j,1,table1[j]);
          disp_char(5,1,name[in_name]);
          for(j=0;j<5;j++)                         //第二行顯示CODE:ERROR!1
             disp_char(j,2,table2[j]);
          for(j=0;j<6;j++)
                   disp_char(j+5,2,err[j]);
          disp_char(11,2,'1');
          delay(100);
         }            
   }
}






//=================輸入用戶名函數===================//
void input_name()
{
  uint j,flag0=0,error_num=0;
  uint k0=16;                          
  while(flag0==0)         
  {
    k0=keyscan();
        while(k0==16)                 //k0=16表示未輸入用戶名
          k0=keyscan();
//-----------------------------//
    if(k0>=0&&k0<4)           //輸入為用戶0、用戶1、用戶2、用戶3
    {
      flag0=1;                   //flag=1表示輸入一個正確的用戶
      in_name=k0;                  //記下所輸入的正確用戶的序號   
      display();            
          for(j=0;j<5;j++)                //第一行顯示NAME:及輸入的用戶
             disp_char(j,1,table1[j]);
          disp_char(5,1,k0);
          for(j=0;j<5;j++)                         //第二行顯示CODE:
             disp_char(j,2,table2[j]);
      delay(10);
          p17=0;                  //指示燈亮,蜂鳴器響,表示用戶名正確
          delay(400);   
          p17=1;
    }                                
//-------------------------------//
   if((k0>=4&&k0<=15))   //輸入的用戶錯誤
   {
     flag0=0;
         error_num++;
     display();                  
          for(j=0;j<5;j++)                           //第一行顯示NAME:ERROR!
             disp_char(j,1,table1[j]);
          disp_char(5,1,fun[k0-10]);
          for(j=0;j<6;j++)
             disp_char(j+7,1,err[j]);
          for(j=0;j<5;j++)                          //第二行顯示CODE:
             disp_char(j,2,table2[j]);
      delay(10);
    }
  }                                          
}
void init()
{
  uint m;
  p17=0;
  display();     //等待輸入用戶名
  for(m=0;m<5;m++)
        disp_char(m,1,table1[m]);
  for(m=0;m<8;m++)
        disp_char(m+7,1,wait[m]);
  for(m=0;m<5;m++)                         //第二行顯示CODE:
  disp_char(m,2,table2[m]);
  delay(10);
}
//====================主函數=====================//
void main()
{
  uint m;
  init();
  while(1)
  {
  input_name();            //進入用戶名輸入函數
  input_code1();               //用戶名正確,接下來第一次輸入密碼
  if(error_num<3)
  {
    input_code2();               //第一次輸入密碼正確,第二次輸入密碼
        if(error_num<3)
        {
      if(in_name==0)
      {  
       // display();           
            for(m=0;m<5;m++)                                 //第一行顯示NAME:及對應的用戶名
              disp_char(m,1,table1[m]);   
            disp_char(5,1,name[in_name]);
            for(m=0;m<11;m++)                            //第二行顯示輸入用戶為超級用戶
              disp_char(m,2,sup[m]);
        delay(10);
        super_user();             //進入超級用戶相關操作
     }
     else
     {
      // display();                             
            for(m=0;m<5;m++)                                  //第一行顯示NAME:及對應的用戶名
             disp_char(m,1,table1[m]);   
           disp_char(5,1,name[in_name]);      
           for(m=0;m<12;m++)                //第二行顯示輸入用戶為普通用戶
          disp_char(m,2,nor[m]);   
       delay(10);
       normal_user();              //進入普通用戶相關操作
      }
        }
  }
          delay(500);
  }
}

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

使用道具 舉報

沙發
ID:111634 發表于 2017-4-28 21:52 | 只看該作者
本帖最后由 zl2168 于 2017-4-29 11:03 編輯

網上亂七八糟的,大都有bug,看看我給你推薦的。


功能齊全的電子密碼鎖
電路設計   

功能設計   

程序設計   

Proteus仿真   
先Proteus仿真一下,確認有效,驗證上述功能。
電子密碼鎖1.rar (1.13 MB, 下載次數: 12)
仿真電路和Hex文件能在清華出版社網站免費下載,程序源代碼只能到書上看了。到圖書館借,或到新華書店翻閱,或到網上書店打折購買。



以上摘自張志良編著80C51單片機實用教程》ISBN978-7-04-044532-9,高教社出版。書中電路和程序設計有詳細說明,程序語句條條有注解。


歡迎咨詢,zzlls@126.com







回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国外成人在线视频网站 | 热久久性 | 曰韩一二三区 | 精品网 | 精品国产欧美日韩不卡在线观看 | 国产最好的av国产大片 | 免费精品视频 | 日韩精品一区二区三区中文在线 | 日韩精品一区二区三区在线观看 | 亚洲精品1区 | 欧美成人一区二区三区 | 欧美在线| 欧美日韩在线一区二区 | 一级黄色日本片 | 久久久久亚洲 | 国产精品一二区 | 国产色片在线 | 色综合久久伊人 | 中文字幕一区二区三区在线乱码 | 玖玖视频 | 国产精品久久久乱弄 | 999久久久 | 国外成人在线视频网站 | 四虎在线视频 | 国产午夜精品一区二区三区嫩草 | 在线2区 | 日本三级电影免费 | 国产精品久久免费观看 | 日韩一区二区精品 | 不卡视频一区 | 成人免费精品视频 | 欧美一级免费看 | 国产99久久精品一区二区永久免费 | 色视频在线播放 | 日本午夜网站 | 午夜在线免费观看视频 | 欧美精品在线播放 | 日韩欧美大片在线观看 | 久免费视频 | 精品国产网 | 日日噜噜夜夜爽爽狠狠 |