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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于c51電子密碼鎖源代碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:398790 發表于 2018-9-16 21:32 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
void key_scan();
uchar count0,count1,count3,num,n=0,temp,a,j,count4;
uchar mima[8];                                                        //初始密碼存儲區
uchar tab_key[50];                                                //輸入密碼存儲區
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
bit enterflag;                                                        //確認鍵按下與否的標志
bit mimaflag;                                                        //密碼正確與否的標志
bit xiugaiflag;                                                        //修改密碼標志        
bit enter1flag;                                                //修改密碼確認鍵標志        
sbit red=P3^7;
sbit bell=P3^6;
sbit rs=P2^0;
sbit rw=P2^1;
sbit lcden=P2^2;
sbit scl=P3^4;
sbit sda=P3^5;
uchar code table1[]="input the passco";
uchar code table2[]="de:     --------";
uchar code table3[]="*";
uchar code table4[]="right   (^_^)   ";
uchar code table5[]="first  error!!!!";
uchar code table6[]="second error!!!!";
uchar code table7[]="third error see ";
uchar code table8[]="u tomorrow (^_^)";
uchar code table9[]="define the passc";
uchar code table10[]="ode:    --------";
uchar code table11[]="code   is    new";
//******************************鍵盤消抖函數*******************************
void delay1()
{ ;; }
void delay2(uchar x)
{
        uchar a,b;
        for(a=x;a>0;a--)
         for(b=100;b>0;b--);
}

void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}

//****************************e^2room的初始化*******************************
void start()  //開始信號
{        
        sda=1;
        delay1();
        scl=1;
        delay1();
        sda=0;
        delay1();
}

void stop()   //停止
{
        sda=0;
        delay1();
        scl=1;
        delay1();
        sda=1;
        delay1();
}
//****************************應答信號*************************************
void respond()  
{
        uchar i;
        scl=1;
        delay1();
        while((sda==1)&&(i<250))i++;
        scl=0;
        delay1();
}
//*****************************寫字節操作函數**********************************
void write_byte(uchar date)
{
        uchar i,temp;
        temp=date;
        for(i=0;i<8;i++)
        {
                temp=temp<<1;                        //保持最高位,左移到進位CY
                scl=0;
            delay1();
                sda=CY;
                delay1();
                scl=1;
                delay1();
        }
        scl=0;
        delay1();
        sda=1;//總線釋放
        delay1();
}
//*******************************讀字節操作函數*****************************
uchar read_byte()
{
        uchar i,k;
        scl=0;
        delay1();
        sda=1;
        delay1();
        for(i=0;i<8;i++)
        {
                scl=1;
                delay1();        
                k=(k<<1)|sda;    //或運算,放到最低位
                scl=0;
                delay1();        
        }
        return k;
}
//**********************************寫地址函數******************************
void write_add(uchar address,uchar date)
{
        start();
        write_byte(0xa0);
        respond();
        write_byte(address);
        respond();
        write_byte(date);
        respond();
        stop();
}
//*******************************讀地址函數*************************************
uchar read_add(uchar address)
{
        uchar date;
        start();
        write_byte(0xa0);
        respond();
        write_byte(address);
        respond();
        start();
        write_byte(0xa1);
        respond();
        date=read_byte();
        stop();
        return date;
}
//****************************LCD1602的初始化*******************************
void write_com(uchar com)
{
        rs=0;
        lcden=0;
        P0=com;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;        
}

void write_date(uchar date)
{
        rs=1;
        lcden=0;
        P0=date;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;        
}

//***************************************密碼比較函數********************************
bit mimacmp()                                       
{
        bit flag;
        uchar i;
        for(i=0;i<8;i++)
                {
                        if(mima[i]==tab_key[i])
                                flag=1;
                        else
                                {
                                flag=0;
                                i=8;
                                }
                }
        return(flag);                                                        //返回flag
}

////**********************************LCD顯示函數開始**************************************
void lcd_display()
{
uchar i=0;
write_com(0x80+0x40+8);
for(i=0;i<n;i++)
{
write_date(table3[0]);
}
}

//****************************************鍵盤功能分配函數群開始****************************
//** 0 ** 1 **2 ** 3**                     
//** 4** 5** 6 **7 **
//**8** 9** 確認(A)  **無效(B)
//**取消(C)**修改密碼鍵(D)**確認修改鍵(E)**無效(F)

void key_manage1()
{
tab_key[n]=0;
n++;
if(xiugaiflag==1)
{
mima[count4]=0;
count4++;
}
}

void key_manage2()
{

tab_key[n]=1;
n++;
if(xiugaiflag==1)
{
mima[count4]=1;
count4++;
}
}

void key_manage3()
{

tab_key[n]=2;
n++;
if(xiugaiflag==1)
{
mima[count4]=2;
count4++;
}
}

void key_manage4()
{
tab_key[n]=3;
n++;
if(xiugaiflag==1)
{
mima[count4]=3;
count4++;
}
}

void key_manage5()
{
tab_key[n]=4;
n++;
if(xiugaiflag==1)
{
mima[count4]=4;
count4++;
}
}

void key_manage6()
{
tab_key[n]=5;
n++;
if(xiugaiflag==1)
{
mima[count4]=5;
count4++;
}
}
void key_manage7()
{
tab_key[n]=6;
n++;
if(xiugaiflag==1)
{
mima[count4]=6;
count4++;
}
}
void key_manage8()
{
tab_key[n]=7;
n++;
if(xiugaiflag==1)
{
mima[count4]=7;
count4++;
}
}

void key_manage9()
{
tab_key[n]=8;
n++;
if(xiugaiflag==1)
{
mima[count4]=8;
count4++;
}
}
void key_manage10()
{
tab_key[n]=9;
n++;
if(xiugaiflag==1)
{
mima[count4]=9;
count4++;
}
}
//**********************************確認鍵**************************************************************  
void key_manage11()
{
        enterflag=1;                                        //確認鍵按下
        if(n==8)                                           //只有輸入8個密碼后按確認才做比較
                mimaflag=mimacmp();
        else
                mimaflag=0;
         if(enterflag==1)
                {
                        enterflag=0;
                        n=0;
                        //用FFFFFFFF清除已經輸入的密碼
                        for(count3=0;count3<8;count3++)
                        {        
                                delay(5);
                                tab_key[count3]=0x0f;               
                        }               

                        TR1=1;                                                                        //打開計數器1
                        count1=0;                                                                //定時器1由50MS累計到1S所用的計數器
                        if(mimaflag==1)
                        {        
                                a=0;

                                write_com(0x01);
                                write_com(0x80);
                                for(count3=0;count3<16;count3++)
                                {
                                        write_date(table4[count3]);        //密碼正確,顯示RIGHT,綠燈亮
                                        delay(5);
                                }
                        }

                    else
                        {   
                                 n=0;
                                 red=0;
                            bell=0;
                                a++;
                                if(a==1)
                                {
                                        for(count3=0;count3<8;count3++) //ffffffff清除密碼
                                        {        
                                                delay(5);
                                                tab_key[count3]=0x0f;               
                                        }
                                        write_com(0x01);                                                                                
                                        write_com(0x80);
                                        for(count3=0;count3<16;count3++)
                                        {
                                                write_date(table5[count3]);        //密碼錯誤,顯示 first error,紅燈亮
                                                delay(5);
                                        }
                                                TR1=1;
                                }
                                if(a==2)
                                {        
                                        for(count3=0;count3<8;count3++) //ffffffff清除密碼
                                        {        
                                                delay(5);
                                                tab_key[count3]=0x0f;               
                                        }
                                                write_com(0x01);
                                                write_com(0x80);
                                                for(count3=0;count3<16;count3++)
                                                {
                                                        write_date(table6[count3]);        //密碼錯誤,顯示SECOND ERROR,紅燈亮
                                                        delay(5);
                                                }
                                                        TR1=1;
                                }

                                  if(a==3)
                                        {        
                                                for(count3=0;count3<8;count3++) //ffffffff清除密碼
                                                {        
                                                        delay(5);
                                                        tab_key[count3]=0x0f;               
                                                }
                                                write_com(0x01);
                                                write_com(0x80);
                                                for(count3=0;count3<16;count3++)
                                                {
                                                        write_date(table7[count3]);        //密碼錯誤,顯示third error see,紅燈亮
                                                        delay(5);
                                                }
                                                write_com(0x80+0x40);
                                                for(count3=0;count3<16;count3++)
                                                {
                                                        write_date(table8[count3]);//密碼錯誤,顯示 U TOMORROW ,紅燈亮
                                                        delay(5);
                                                }
                                                        TR1=0;

                                        }

                }
        }

}
void key_manage12()
{
tab_key[n]=11;
n++;                                                  //密碼計數清零

}
//****************************************************取消鍵********************************************  
void key_manage13()
{

n=0;                                                  //密碼計數清零
write_com(0x80);                                                //指針所指位置
for(count3=0;count3<16;count3++)
{
        write_date(table1[count3]);                //第一行顯示INPUT THE PASSPORD:
        delay(5);
}
write_com(0x80+0x40);
for(count3=0;count3<16;count3++)
{
        write_date(table2[count3]);        //開機顯示--------
        delay(5);
        tab_key[count3]=0x0f;                        //用FFFFFFFF清楚已經輸入的密碼
}

}
//*******************************************修改密碼鍵**********************************
void key_manage14()
{
        uchar aa=0;
        n=0;
        xiugaiflag=1;
        write_com(0x01);
        write_com(0x80);
for(count3=0;count3<16;count3++)
{
        write_date(table9[count3]);        //顯示define the password
        delay(5);
        tab_key[count3]=0x0f;                        //用FFFFFFFF清楚已經輸入的密碼
}
        write_com(0x80+0x40);
for(count3=0;count3<16;count3++)
{
        write_date(table10[count3]);        //顯示--------
        delay(5);
}
TR0=1;

}
//******************************************修改密碼鍵的確認鍵********************************
void key_manage15()
{
n=0;
enter1flag=1;
if(enter1flag==1)
{
        enter1flag=0;
        count4=0;
        for(count3=0;count3<16;count3++)
        {
        tab_key[count3]=0x0f;                        //用FFFFFFFF清楚已經輸入的密碼
         }
        write_com(0x01);
        write_com(0x80);
        for(count3=0;count3<16;count3++)
        {
                write_date(table11[count3]);
                delay(100);
        }
        TR1=1;
        count1=0;
}
}
void key_manage16()
{
tab_key[n]=15;
n++;
}

//****************************************定時器1的50MS,共延時1秒*****************************
void time_1() interrupt 3
{        

        TH1=(65536-50000)/256;
        TL1=(65536-50000)%256;
        if(count1<20)
        {
                count1++;
        }
        else                                                         //計時到1S
        {
                TR1=0;
                count1=0;
                mimaflag=0;

                red=1;
                bell=1;
                //顯示FFFFFFFF
                write_com(0x01);
                write_com(0x80);
                for(count3=0;count3<16;count3++)
                        {
                                write_date(table1[count3]);        //顯示INPUT THE PASSCODE
                                delay(5);
                        }
                write_com(0x80+0x40);
                for(count3=0;count3<16;count3++)
                        {
                                write_date(table2[count3]);        //開機顯示FFFFFFFF
                                delay(5);
                        }
        }

}
//***********************************************定時0**********************************************
void time_0() interrupt 1
{        

        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
if(count4<8)
{
        key_scan();
}
else
{
        TR0=0;
        count4=0;
}
}

//初始化函數
void init()
{        

        uchar i;
        lcden=0;
        write_com(0x38);                                        //打開顯示模式設置
        write_com(0x0c);                                        //打開顯示,光標等等設置未零
        write_com(0x06);                                        //當讀或寫一個字符后地址指針加一,且光標加一,當寫一個字符后整頻顯示左移,
        write_com(0x01);                                        //清零指令
        write_com(0x80);                                        //指針所指位置

        //定時器初始化
        TMOD=0x11;                                                        //T0,T1工作方式1
        TH0=(65536-2000)/256;
        TL0=(65536-2000)%256;                                //T0初始化2MS

        TH1=(65536-50000)/256;
        TL1=(65536-50000)%256;                                //T1初始化50MS

        TR1=0;
        ET1=1;
        EA=1;
        TR0=0;
        ET0=1;

        count0=0;                                                        //初始沒有密碼輸入,故為零
        enterflag=0;                                                //沒有確認鍵按下
        mimaflag=0;                                                        //密碼正確與否鍵先置零

        red=1;                                                                //紅燈不亮
//************密碼存入EPROM中**********************************
        sda=1;
        delay(5);
        scl=1;
        delay(5);
        for(i=0;i<8;i++)
        {
                write_add(i,8);
                delay2(100);
        }
        for(i=0;i<8;i++)
        {
                mima[i]=read_add(i);
                delay(5);
        }

}
void main()
{        rw=0;               
        init();
        write_com(0x80);                                                //指針所指位置
        for(count3=0;count3<16;count3++)
        {
                write_date(table1[count3]);                //第一行顯示INPUT THE PASSPORD:
                delay(5);
        }
        write_com(0x80+0x40);
        for(count3=0;count3<16;count3++)
        {
                write_date(table2[count3]);                //開機顯示FFFFFFFF
                delay(5);
        }
        while(1)
        {
                key_scan();                                                      //調用鍵盤掃描函數
                lcd_display();
        }

}
//**************************************************鍵盤掃描函數開始********************************
void key_scan()
{
//**********掃描第一行*********
P1=0xfe;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(100);
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xee:
key_manage1();
break;

case 0xde:
key_manage2();
break;

case 0xbe:
key_manage3();
break;

case 0x7e:
key_manage4();
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
//**************************************************掃描第二行***********************************
P1=0xfd;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(100);
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xed:
key_manage5();
break;

case 0xdd:
key_manage6();
break;

case 0xbd:
key_manage7();
break;

case 0x7d:
key_manage8();
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
//*********************************************掃描第三行***********************************
P1=0xfb;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(100);
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xeb:
key_manage9();
break;

case 0xdb:
key_manage10();
break;

case 0xbb:
key_manage11();
break;

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

//***************************************************掃描第四行****************************************
P1=0xf7;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(100);
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xe7:
key_manage13();
break;

case 0xd7:
key_manage14();
break;

case 0xb7:
key_manage15();
break;

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

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

使用道具 舉報

沙發
ID:1 發表于 2018-9-17 00:00 | 只看該作者
補全原理圖或者詳細說明一下電路連接即可獲得100+黑幣
回復

使用道具 舉報

板凳
ID:398790 發表于 2018-9-18 20:06 | 只看該作者
上面描述的原理圖
回復

使用道具 舉報

地板
ID:398790 發表于 2018-9-18 20:20 | 只看該作者
仿真圖,源代碼,鍵盤排列

電子密碼鎖.rar

12.8 MB, 下載次數: 29, 下載積分: 黑幣 -5

仿真圖,源代碼,鍵盤排列

回復

使用道具 舉報

5#
ID:185815 發表于 2018-11-6 08:28 | 只看該作者
感謝分享
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产视频一区二区 | 欧美日韩国产精品一区 | 永久免费在线观看 | 中文字幕av亚洲精品一部二部 | 亚洲精品乱码久久久久久9色 | 天天色天天射天天干 | 久久国产成人 | 日韩欧美三级电影在线观看 | 日日摸日日碰夜夜爽亚洲精品蜜乳 | 91欧美精品| 国产精品久久久久不卡 | 欧美一区在线视频 | www.天天操.com| 欧美精品1区2区3区 精品国产欧美一区二区 | 中文字幕在线视频网站 | 毛片一级黄色 | 日日碰狠狠躁久久躁婷婷 | 国产精品一区二区三区四区五区 | 99久久婷婷国产亚洲终合精品 | 91久久久精品国产一区二区蜜臀 | 国产精品99久久久久久大便 | 国产激情偷乱视频一区二区三区 | 综合二区| 亚洲国产一区二区三区在线观看 | 日韩视频在线免费观看 | 久久毛片网站 | 精品亚洲一区二区 | av成人在线观看 | 欧美日韩福利视频 | 成人一级片在线观看 | 久草视频观看 | 欧美一区二区三区四区视频 | 7799精品视频天天看 | 精品一区二区三区四区五区 | 国产一区2区 | 81精品国产乱码久久久久久 | 91看片免费 | 精品一区二区三区免费视频 | 精品二三区 | 在线国产中文字幕 | 一级片成人 |