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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機鑰匙密碼鎖,結課時做的一個作業,對電子密碼鎖做了一些改進

[復制鏈接]
跳轉到指定樓層
樓主
ID:308221 發表于 2018-4-15 16:27 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include "reg52.h"                         //此文件中定義了單片機的一些特殊功能寄存器
#include "i2c.h"       
#include "XPT2046.h"
#include "lcd.h"
#define GPIO_KEY P1
typedef unsigned int u16;          //對數據類型進行聲明定義
typedef unsigned char u8;


u8 mimaweishu=0;//用于判斷輸入密碼位數

u8 count1,count2,count3,count4;//指針標志
u8 a=0;//密碼錯誤次數
u8 p,q;
u8 temp;
bit querenwei=0;//確認鍵標志位
bit mimawei=0;//用于確認密碼是否正確
bit FANGSHI=0;//用于確認開鎖時是否需要密碼
bit k=1;//判斷繼電器開關狀態1為關 0為開
sbit jidianqi=P2^2;
sbit red=P2^3;
sbit bell=P2^4;//繼電器,蜂鳴器,警示燈控制

u16 yaoshi=0;  //用于判斷鑰匙狀態,為0時鑰匙插入并轉到底
float dyz;
int tem;
int d0;
int d1;
int d2;
int d3;  //d0-d3是電位AD值處理過后的四位數值,用于判斷是否插入鑰匙并轉到底

u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
u8 mima[8];//初始密碼存儲數組
u8 shurumima[30];//輸入密碼存儲數組
u8 xitongmima[8]={8,8,8,8,8,8,8,8};//系統密碼數組

u8 code table1[]="input the passco";
u8 code table2[]="de:     --------";
u8 code table3[]="*";
u8 code table4[]="right   (^_^)   ";
u8 code table5[]="first  error!!!!";
u8 code table6[]="second error!!!!";
u8 code table7[]="third error see ";
u8 code table8[]="u tomorrow (^_^)";
u8 code table9[]="     welcom     ";
u8 code table10[]="     (^_^)      ";
u8 code table11[]="   no passcode  "; //指令數組

/*******************************************************************************
* 函 數 名         : delay
* 函數功能                   : 延時函數,i=1時,大約延時10us
*******************************************************************************/
void delay2(u8 x)
{
        u8 a,b;
        for(a=x;a>0;a--)
         for(b=100;b>0;b--);
}

void delay(u16 z)
{
        u16 x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
void delay0(u16 r)
{
        while(r--);

}
/*******************************************************************************
* 函 數 名         : yaoshichuli
* 函數功能                   : 用于轉換鑰匙轉動所改變的電位器AD值
*******************************************************************************/
void yaoshichuli()
{
        u16 temp;
        static u8 z;
        if(z==50)
        {
                z=0;
                temp = Read_AD_Data(0x94);                //   AIN0 電位器
                dyz=(float)temp/4096.*5;
                tem=dyz*1000;
                d0=tem/1000;
                d1=tem%1000/100;
                d2=tem%100/10;
                d3=tem%10;
                yaoshi=d0+d1;
        }
  z++;
}


void Timer1Init()
{
        TMOD|=0X10;

        TH1=(65536-50000)/256;       
        TL1=(65536-50000)%256;       
        ET1=1;
        EA=1;
        TR1=0;                       
}
/*******************************************************************************
* 函 數 名         : mimabijiao
* 函數功能                   : 用于確認密碼是否正確?
*******************************************************************************/
bit mimabijiao()
{
        bit i;
        u8 m;
        for(m=0;m<8;m++)
  {
      if(mima[m]==shurumima[m])
            i=1;
         else
        {
              i=0;
               m=8;
         }
   }
        return i;

}

///**********************************LCD跟隨密碼顯示’*‘函數**************************************
void lcd_display()
{
  u8 i=0;
  LcdWriteCom(0x80+0x40+8);
  for(i=0;i<mimaweishu;i++)
  {
    LcdWriteData(table3[0]);
  }
}
/*******************************************************************************
* 函 數 名         : k1-k16chuli
* 函數功能                   : 處理各個按鍵功能
k1-k10為數字:0-9
k11 k12 為無效鍵  k13用于取消密碼鎖  k14為關鎖鍵  k15 k16分別是確認鍵和取消鍵
*******************************************************************************/
void k1chuli()
{
        shurumima[mimaweishu]=0;
        mimaweishu++;
}

void k2chuli()
{
        shurumima[mimaweishu]=1;
        mimaweishu++;
}

void k3chuli()
{
        shurumima[mimaweishu]=2;
        mimaweishu++;
}

void k4chuli()
{
        shurumima[mimaweishu]=3;
        mimaweishu++;
}

void k5chuli()
{
        shurumima[mimaweishu]=4;
        mimaweishu++;
}

void k6chuli()
{
        shurumima[mimaweishu]=5;
        mimaweishu++;
}

void k7chuli()
{
        shurumima[mimaweishu]=6;
        mimaweishu++;
}

void k8chuli()
{
        shurumima[mimaweishu]=7;
        mimaweishu++;
}

void k9chuli()
{
        shurumima[mimaweishu]=8;
        mimaweishu++;
}

void k10chuli()
{
        shurumima[mimaweishu]=9;
        mimaweishu++;
}

void k11chuli()
{
        shurumima[mimaweishu]=10;
        mimaweishu++;
}

void k12chuli()
{
        shurumima[mimaweishu]=11;
        mimaweishu++;
}
//方式改變鍵每按一次方式轉換一次,只有兩種方式
void k13chuli()
{
        if(a==0&&(yaoshi==0))
        {
        FANGSHI=~FANGSHI;
        }                //修改.............................
        if(FANGSHI==1)
        {
                LcdWriteCom(0x01);
                LcdWriteCom(0x80);
                for(count3=0;count3<16;count3++)
     {
       LcdWriteData(table11[count3]);        //????,?? first erro
                   delay(5);
     }
        }
        else if(FANGSHI==0)
        {
                LcdWriteCom(0x01);
    LcdWriteCom(0x80);
    for(count3=0;count3<16;count3++)
       {
         LcdWriteData(table1[count3]);      
        }
     LcdWriteCom(0x80+0x40);
     for(count3=0;count3<16;count3++)
      {
       LcdWriteData(table2[count3]);      
       }
        }
}
void k14chuli()
{
        jidianqi=1;
        k=1;
}
//確認鍵函數****************************************************、//
void k15chuli()
{
        querenwei=1;
        if(mimaweishu==8)
        {
                mimawei=mimabijiao();
        }
        else
        {
                mimawei=0;
        }
        if(querenwei==1)
        {
                querenwei=0;
                mimaweishu=0;
       
          for(count3=0;count3<8;count3++)
    {        
       delay(5);
       shurumima[count3]=0x0f;               
    }  
                TR1=1;
                count1=0;
                 if(mimawei==1)
     {        
           a=0;
           jidianqi=0;
                             k=0;
           mimawei=0;                         
           LcdWriteCom(0x01);
           LcdWriteCom(0x80);
           for(count3=0;count3<16;count3++)
           {
              LcdWriteData(table4[count3]);      
               delay(5);
            }
      }
                 else
      {   
          mimaweishu=0;
          red=0;
          bell=0;//開啟警示燈和電鈴
                                  delay0(100);
          a++;
         if(a==1)
          {
           for(count3=0;count3<8;count3++)
                  {        
                      delay(5);
                      shurumima[count3]=0x0f;               
                   }
             LcdWriteCom(0x01);                                                                                
             LcdWriteCom(0x80);
            for(count3=0;count3<16;count3++)
                     {
                         LcdWriteData(table5[count3]);      
                         delay(5);
                      }
            TR1=1;
           }
                                        if(a==2)
          {
           for(count3=0;count3<8;count3++)
                  {        
                      delay(5);
                      shurumima[count3]=0x0f;               
                   }
             LcdWriteCom(0x01);                                                                                
             LcdWriteCom(0x80);
            for(count3=0;count3<16;count3++)
                     {
                         LcdWriteData(table6[count3]);      
                         delay(5);
                      }
            TR1=1;
           }
                                        if(a==3)
          {
           for(count3=0;count3<8;count3++)
                  {        
                      delay(5);
                      shurumima[count3]=0x0f;               
                   }
             LcdWriteCom(0x01);                                                                                
             LcdWriteCom(0x80);
            for(count3=0;count3<16;count3++)
                     {
                         LcdWriteData(table7[count3]);        
                         delay(5);
                      }
                                                LcdWriteCom(0x80+0x40);
            for(count3=0;count3<16;count3++)
                     {
                         LcdWriteData(table8[count3]);      
                         delay(5);
                      }
            TR1=0;
           }



      }
  }
}

void k16chuli()
{
        mimaweishu=0;
        LcdWriteCom(0x80);                                          
  for(count3=0;count3<16;count3++)
  {
        LcdWriteData(table1[count3]);              
        delay(5);
  }
  LcdWriteCom(0x80+0x40);
  for(count3=0;count3<16;count3++)
  {
        LcdWriteData(table2[count3]);      
        delay(5);
        shurumima[count3]=0x0f;                       
  }

}
//**************************************************第一行掃描********************************
void key_scan()
{
GPIO_KEY=0XFE;
temp=GPIO_KEY&0Xf0;
if(temp!=0xf0)
{
delay(100);
if(temp!=0xf0)
{
temp=GPIO_KEY;
switch(temp)
{
case 0xee:
k1chuli();
break;

case 0xde:
k2chuli();
break;

case 0xbe:
k3chuli();
break;

case 0x7e:
k4chuli();
break;
}
while(temp!=0xf0)
{
temp=GPIO_KEY&0xf0;
        red=0;
}
}
}
GPIO_KEY=0xfd;
temp=GPIO_KEY;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(100);
if(temp!=0xf0)
{
temp=GPIO_KEY;
switch(temp)
{
case 0xed:
k5chuli();
break;

case 0xdd:
k6chuli();
break;

case 0xbd:
k7chuli();
break;

case 0x7d:
k8chuli();
break;
}
while(temp!=0xf0)
{
temp=GPIO_KEY;
temp=temp&0xf0;
}
}
}

GPIO_KEY=0xfb;
temp=GPIO_KEY;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(100);
if(temp!=0xf0)
{
temp=GPIO_KEY;
switch(temp)
{
case 0xeb:
k9chuli();
break;

case 0xdb:
k10chuli();
break;

case 0xbb:
k11chuli();
break;

case 0x7b:
k12chuli();
break;
}
while(temp!=0xf0)
{
temp=GPIO_KEY;
temp=temp&0xf0;
}
}
}

GPIO_KEY=0xf7;
temp=GPIO_KEY;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(100);
if(temp!=0xf0)
{
temp=GPIO_KEY;
switch(temp)
{
case 0xe7:
k13chuli();
break;

case 0xd7:
k14chuli();
break;

case 0xb7:
k15chuli();
break;

case 0x77:
k16chuli();
break;
}
   while(temp!=0xf0)
   {
      temp=0xf7;
      temp=temp&0xf0;
    }
   }
}
}

//用于無鑰匙工作方式時掃描按鍵,專門改變工作方式無其他功能
void key_scan1()
{
        u16 temp;
        P1=0xf7;
  temp=P1;
  temp=temp&0xf0;
        if(temp!=0xf0)
        {
                delay(100);
                if(temp!=0xf0)
                {
                        temp=P1;
                        if(temp==0xe7)
                        {
                                k13chuli();
                        }
                }
        }
}
//初始化函數,集合定時器,LCD顯示,初始顯示,以及各種變量希望的初始值
void chushihua()
{
        u8 i;
        Timer1Init();
        LcdInit();
              for(i=0;i<8;i++)
        {
                At24c02Write(i,xitongmima[i]);
                delay2(100);
        }
        for(i=0;i<8;i++)
        {
                mima[i]=At24c02Read(i);
                delay(5);
        }
        count1=0;
        count3=0;
        jidianqi=1;
        k=1;
  red=1;
  bell=1;
  p=2;
  q=2;
  a=0;               
  LcdWriteCom(0x80);
                for(count3=0;count3<16;count3++)
                        {
                                LcdWriteData(table9[count3]);      
                        }
                LcdWriteCom(0x80+0x40);
                for(count3=0;count3<16;count3++)
                        {
                                LcdWriteData(table10[count3]);      
                        }                               
}
void chuli()
{
        if((yaoshi!=0)&&(a!=3))
                {
                        q=2;
                        for(;p>1;p--)
                        {
                          LcdWriteCom(0x01);
        LcdWriteCom(0x80);
        for(count3=0;count3<16;count3++)
        {
          LcdWriteData(table9[count3]);      
        }
        LcdWriteCom(0x80+0x40);
        for(count3=0;count3<16;count3++)
        {
         LcdWriteData(table10[count3]);      
        }
                  }
                        mimaweishu=0;
                }
                else
                {
                          p=2;
                    if(FANGSHI==1)
                    {
                                 if(yaoshi==0&&(a!=3))
                                 {
                                           jidianqi=0;
                                 }
                                 key_scan1();
                     }
                     else if(FANGSHI==0)
                     {
                                  if(yaoshi==0&&(a!=3))
                                  {
                                            // key_scan();
                                       // lcd_display();   
                                                                       
                                                                        if(mimaweishu==0)
                                        {
                                            if(k==1)  
                                                  {
                                                                                                                for(;q>1;q--)
                                                                                                                {
                                                           LcdWriteCom(0x01);
                              LcdWriteCom(0x80);
                                for(count3=0;count3<16;count3++)
                                  {
                                      LcdWriteData(table1[count3]);      
                                  }
                                   LcdWriteCom(0x80+0x40);
                               for(count3=0;count3<16;count3++)
                                 {
                                 LcdWriteData(table2[count3]);      
                                 }
                                                                                                                        }
                                             }
                                        }
                                        key_scan();
                                        lcd_display();
                             }                               
           }         
        }       
}


void main()
{       
        chushihua();
        while(1)
        {
                yaoshichuli();
          chuli();       
  }
}
//****************************************定時器1中斷函數*****************************
void Timer1() interrupt 3
{        

        TH1=(65536-50000)/256;
        TL1=(65536-50000)%256;
        if(count1<20)
        {
                count1++;
        }
        else                                                        
        {
                TR1=0;
                count1=0;
                mimawei=0;

                red=1;
                bell=1;
                                        if(a!=0)
                                        {
                LcdWriteCom(0x01);
                LcdWriteCom(0x80);
                for(count3=0;count3<16;count3++)
                        {
                                LcdWriteData(table1[count3]);      
                        }
                LcdWriteCom(0x80+0x40);
                for(count3=0;count3<16;count3++)
                        {
                                LcdWriteData(table2[count3]);      
                        }
                                        }
                                        else
                                        {
                                                    LcdWriteCom(0x01);
                LcdWriteCom(0x80);
                for(count3=0;count3<16;count3++)
                        {
                                LcdWriteData(table9[count3]);      
                        }
                LcdWriteCom(0x80+0x40);
                for(count3=0;count3<16;count3++)
                        {
                                LcdWriteData(table10[count3]);      
                        }
                                        }
        }

}


6、鑰匙電子鎖.zip

82.82 KB, 下載次數: 8, 下載積分: 黑幣 -5

評分

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

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字字幕一区二区三区四区五区 | 国产黄色小视频 | 99精品一区二区 | 国产精品高清在线 | 欧美激情 一区 | 免费在线观看成年人视频 | 又爽又黄axxx片免费观看 | 免费av手机在线观看 | 亚洲精品在线看 | 天天看天天操 | 国产成人99久久亚洲综合精品 | 中文字幕av一区二区三区 | 天天成人综合网 | 黄色欧美在线 | 91久久久久久 | 蜜桃臀av一区二区三区 | 精品久久一区 | 日本三级黄视频 | 国产精品美女久久久久aⅴ国产馆 | 国产欧美精品一区二区色综合朱莉 | 国产中文字幕av | 午夜影院在线观看免费 | 日日摸日日碰夜夜爽亚洲精品蜜乳 | 国产视频中文字幕在线观看 | 断背山在线观看 | 国产xxxx岁13xxxxhd| 国产精品久久久久久久久图文区 | 欧美一区二区在线 | 99精品久久99久久久久 | 日韩专区中文字幕 | 日韩高清一区 | 久久高清 | 久久99精品久久久久久琪琪 | 91tv在线观看 | 亚洲三级在线观看 | 精品一区二区三区四区五区 | 国产成人综合久久 | 色婷婷综合网站 | 国产激情91久久精品导航 | 国产视频1区2区 | 欧美 日韩 国产 成人 在线 |