/*******************************************************************************************
程序名稱:單片機電子密碼鎖 (可修改設置密碼)——基于51單片機與AT24C02與LCD1602顯示
————————————————單片機實驗課大作業——————————————————
程序介紹:輸入正確密碼時,液晶屏提示,打開繼電器,然后燈泡亮,蜂鳴器開始播放音樂;
輸入密碼錯誤時, 液晶屏提示,當三次錯誤時,蜂蜜器發出報警聲
作者:walt740
編寫日期:2013/12/16
********************************************************************************************/
#include<reg52.h>
#include<string.h>
#include<intrins.h>
#include<compact.h>
#include<lcd1602.h>
#include<iic.h>
#include<keyboard.h>
#include<sounder.h>
void total_init(); // 總初始化
void lock_process(); // 密碼鎖 處理過程
/***********************************************************************/
void main() //主函數
{
total_init();
while(1)
{
lock_process();
}
}
/**********************************************************************/
void total_init() // 總初始化
{
beep=0;
Time0_Init(); //定時器0中斷初始化
init();
init_lcd();
delayms(5);
/*------------------------------修改代碼(2014.8.29)-------------------------------------------*/
aa=Recstring(0xa0,1,buffer,6); //先從EEPROM中接收數據,存入buffer緩存中,
delayms(5);
if(buffer[0]==NULL) //如果數組的首個元素為空,則表示EEPROM中未有數據
{
aa=Sendstring(0xa0,1,table2,6); //執行發送語句,將默認密碼存入EEPROM中
delayms(5);
aa=Recstring(0xa0,1,buffer,6); //重新接收數據,存入buffer緩存中,
delayms(10);
} /*首次執行密碼鎖程序會執行本段程序,以后則直接執行 aa=Recstring(0xa0,1,buffer,6);/
/*---------------------------------------------------------------------------------------------*/
P1=0x0f;
}
/**********************************************************************/
void lock_process() // 密碼鎖 處理過程
{
if(P1!=0x0f)
{
temp=Keys_Scan();
switch(temp)
{
case 0: case 1: case 2: case 3: case 4:
case 5: case 6: case 7: case 8: case 9:
if (i<=5) //密碼限制在6位以內
{
Userpassword=temp;
DSY_BUFFER='*';
Display_String(DSY_BUFFER,0xc0);
i++;
}break;
case 10: //按A鍵開鎖
for(k=0;k<6;k++)
{
if(buffer[k]==(Userpassword[k]+48))
flag=1;
else
flag=0;
}
if (flag==1)
{
flag=0;
i=0;
relay=0; //點亮LED
clear_password();
Display_String("OPEN OK! ",0xc0);
IS_valid_user = 1;
j=0;
Play_Song(0); //播放
}
else
{
j++;
relay=1; //關閉LED
clear_password();
Display_String("ERROR!Have try ",0xc0);
write_com(0xcf);
write_date(0x30+j);
IS_valid_user=0;
}
i=0;
break;
case 11: //按B鍵上鎖
relay=1;
clear_password();
Display_String(table,0x80);
Display_String("Lock OK! ",0xc0);
i=0;
IS_valid_user=0;
break;
case 12: //按C鍵設置新密碼
//如果是合法用戶則提示輸入新密碼
if ( !IS_valid_user)
{
i=0;
Display_String("No rights ! ",0xc0);
delayms(1000);
Display_String("Input Password...",0x80);
Display_String("Lock OK! ",0xc0);
}
else
{
i=0;
Display_String("New Password: ",0x80);
Display_String(" ",0xc0);
}
break;
case 13: //按D鍵保存新密碼
if ( !IS_valid_user)
{
i=0;
Display_String("No rights ! ",0xc0);
delayms(1000);
Display_String("Input Password...",0x80);
Display_String("Lock OK! ",0xc0);
}
else
{
i = 0;
init();
delayms(5);
for(k=0;k<6;k++)
{
Userpassword[k]=Userpassword[k]+48;
}
aa=Sendstring(0xa0,1,Userpassword,6);
delayms(5);
aa=Recstring(0xa0,1,buffer,6);
delayms(5);
clear_password();
Display_String(table,0x00);
Display_String("Password Saved! ",0xc0);
delayms(1000);
Display_String("Do lock agian ? ",0xc0);
}
break;
case 14: //按E鍵消除所有輸入
i=0;
clear_password();
Display_String(" ",0xc0);
break;
case 15: //清除一位
if(i!=0)i--;
for(n=0;n<i;n++)
{
DSY_BUFFER1[n]='*';
}
Display_String(DSY_BUFFER1,0xc0);
}
P1=0x0f;
}
if(j==3)
{
Display_String("THIEF!!!THIEF!!!",0xc0);
j=0;
bell();
}
}
/***********************************END**************************************/
音樂數組文件
unsigned char code SONG[] ={ //祝你平安
0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20,
0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x20,0x20,0x20,0x20,0x20,0x1c,0x20,
0x20,0x80,0x2b,0x20,0x26,0x20,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x80,0x26,0x20,
0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x60,0x40,0x10,0x39,0x10,0x26,0x20,
0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x80,0x26,0x20,0x2b,0x10,0x2b,0x10,
0x2b,0x20,0x30,0x10,0x39,0x10,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x20,
0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x18,0x20,0x18,0x20,0x26,0x20,
0x20,0x20,0x20,0x40,0x26,0x20,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20,
0x20,0x80,0x1c,0x20,0x1c,0x20,0x1c,0x20,0x30,0x20,0x30,0x60,0x39,0x10,0x30,0x10,
0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x10,0x26,0x10,0x26,0x10,0x2b,0x10,0x2b,0x80,
0x18,0x20,0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x60,0x26,0x10,0x2b,0x20,0x30,0x20,
0x30,0x20,0x1c,0x20,0x20,0x20,0x20,0x80,0x26,0x20,0x30,0x10,0x30,0x10,0x30,0x20,
0x39,0x20,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x10,0x40,0x10,0x20,0x10,
0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x00,
//路邊的野華不要采
0x30,0x1C,0x10,0x20,0x40,0x1C,0x10,0x18,0x10,0x20,0x10,0x1C,0x10,0x18,0x40,0x1C,
0x20,0x20,0x20,0x1C,0x20,0x18,0x20,0x20,0x80,0xFF,0x20,0x30,0x1C,0x10,0x18,0x20,
0x15,0x20,0x1C,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20,
0x30,0x80,0xFF,0x20,0x20,0x1C,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,
0x20,0x2B,0x40,0x20,0x20,0x1C,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,
0x20,0x2B,0x40,0x20,0x30,0x1C,0x10,0x18,0x20,0x15,0x20,0x1C,0x20,0x20,0x20,0x26,
0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20,0x30,0x80,0x20,0x30,0x1C,0x10,0x20,
0x10,0x1C,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,0x15,0x1F,
0x05,0x20,0x10,0x1C,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,
0x30,0x1C,0x10,0x18,0x20,0x15,0x20,0x1C,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B,
0x20,0x26,0x20,0x20,0x20,0x30,0x30,0x20,0x30,0x1C,0x10,0x18,0x40,0x1C,0x20,0x20,
0x20,0x26,0x40,0x13,0x60,0x18,0x20,0x15,0x40,0x13,0x40,0x18,0x80,0x00,
};
還有很多,你們可以看壓縮包里的
|