|
/*******************************************************************************
初始密碼:000000 密碼位數:6位
注意:掉電后,所設密碼會丟失,重新上電時,密碼恢復為原始的000000
與P1.0相連的8位發光LED點亮代表鎖被打開;熄滅代表鎖被鎖上
程序功能:
1、開鎖:
下載程序后,直接按六次數字0(即代表密碼000000),LED亮,鎖被打開,輸入密碼時,
六位數碼管依次顯示小橫杠。
2、更改密碼:
只有當開鎖(LED亮)后,該功能方可使用。
首先按下更改密碼鍵,然后設置相應密碼,此時六位數碼管會顯示設置密碼對應
的數字。最后設置完六位后,按下
確認密碼更改,此后新密碼即生效。
3、重試密碼:
當輸入密碼時,密碼輸錯后按下重試鍵,可重新輸入六位密碼。
當設置密碼時,設置中途想更改密碼,也可按下此鍵重新設置。
4、關閉密碼鎖:
按下上鎖按鍵即可將打開的密碼鎖關閉。
功能測試:輸入原始密碼000000---按下更改密碼按鍵---按0到9設置密碼---按確認鍵
密碼更改---按上鎖按鍵關閉密碼鎖---輸入新的密碼打開密碼鎖
*******************************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar old1,old2,old3,old4,old5,old6; //原始密碼000000
unsigned char PassWord[6];
uchar new1,new2,new3,new4,new5,new6; //每次MCU采集到的密碼輸入
uchar a=16,b=16,c=16,d=16,e=16,f=16; //送入數碼管顯示的變量
uchar wei,key,temp;
unsigned char st=0;
bit allow,genggai,ok,wanbi,retry,close; //各個狀態位
sbit beep=P3^6;
sbit Lock=P3^7;
sbit GLED=P3^5;
sbit RLED=P3^4;
sbit SCL = P3^3; //引腳定義
sbit SDA = P3^2;
unsigned char code table[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40};
void InitI2C();
void I2CStart();
void I2CStop();
void I2CSend(uchar byte);
uchar I2CRead();
uchar read_eeprom(uchar addr);
void write_eeprom(uchar addr, uchar databyte);
/*****************************************************************************
** 函數名稱:delay
** 功能描述:延時
******************************************************************************/
void delay(unsigned int i)
{
uint j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
/*****************************************************************************
** 函數名稱:InitI2C
** 功能描述:配置模擬I2C的IO端口
******************************************************************************/
void InitI2C()
{
SDA = 1;
SCL = 1;
}
/*****************************************************************************
** 函數名稱:I2CStart
** 功能描述:發送I2C總線起始狀態
** 輸 入:無
** 輸 出:無
** 全局變量:無
** 調用模塊:delay()
** 可移植性:直接移植
******************************************************************************/
void I2CStart()
{
SDA = 1;
delay(1); // 延時子程序
SCL = 1;
delay(1);
SDA = 0;
delay(1);
SCL = 0;
}
/*****************************************************************************
** 函數名稱:I2CStop
** 功能描述:發送I2C總線停止起始狀態
** 輸 入:無
** 輸 出:無
** 全局變量:無
** 調用模塊:delay()
** 可移植性:直接移植
******************************************************************************/
void I2CStop()
{
SCL = 0;
delay(1);
SDA = 0;
delay(1);
SCL = 1;
delay(1);
SDA = 1;
delay(1);
}
/*****************************************************************************
** 函數名稱:I2CSend
** 功能描述:向I2C總線發送一個字節數據,并檢測應答
** 輸 入:待發送字節byte
** 輸 出:無
** 全局變量:無
** 調用模塊:delay()
** 可移植性:直接移植
******************************************************************************/
void I2CSend(uchar byte)
{
uchar mask;
uchar i;
mask = 0x80;
for(i = 0; i < 8; i++)
{
SCL = 0;
delay(1);
if((mask & byte) == 0)
{
SDA = 0;
}
else
{
SDA = 1;
}
mask >>= 1;
delay(1);
SCL = 1;
delay(1);
}
SCL = 0;
SDA = 1;
delay(1);
SCL = 1;
delay(1);
SCL = 0;
}
/*****************************************************************************
** 函數名稱:I2CRead
** 功能描述:從I2C總線讀取最后一個字節數據,并發送非應答位
** 輸 入:無
** 輸 出:接收到的字節byte
** 全局變量:無
** 調用模塊:delay()
** 可移植性:直接移植
******************************************************************************/
uchar I2CRead()
{
uchar byte;
uchar i;
byte = 0;
for(i = 0; i < 8; i++)
{
SCL = 0;
SDA = 1;
delay(1);
SCL = 1;
delay(1);
byte <<= 1;
if(SDA == 1)
{
byte |= 0x01;
}
delay(1);
}
SCL = 0;
SDA = 1;
delay(1);
SCL = 1;
delay(1);
SCL = 0;
return byte;
}
/*****************************************************************************
** 函數名稱:read_eeprom
** 功能描述:讀取EEPROM數據函數
** 輸 入:EEPROM中目的地址addr
** 輸 出:讀取的數據
******************************************************************************/
uchar read_eeprom(uchar addr)
{
uchar databyte;
I2CStart();
I2CSend(0xa0);
I2CSend(addr);
I2CStart();
I2CSend(0xa1);
databyte = I2CRead();
I2CStop();
return databyte;
}
/*****************************************************************************
** 函數名稱:write_eeprom
** 功能描述:向EEPROM寫入數據函數
** 輸 入:EEPROM中目的地址addr及寫入的數據
** 輸 出:無
******************************************************************************/
void write_eeprom(uchar addr, uchar databyte)
{
I2CStart();
I2CSend(0xa0);
I2CSend(addr);
I2CSend(databyte);
I2CStop();
}
void display(void)
{
switch(st)
{
case 0: st=1;P0=0xff;P2=table[a];P0=0xfe;break;
case 1: st=2;P0=0xff;P2=table;P0=0xfd;break;
case 2: st=3;P0=0xff;P2=table[c];P0=0xfb;break;
case 3: st=4;P0=0xff;P2=table[d];P0=0xf7;break;
case 4: st=5;P0=0xff;P2=table[e];P0=0xef;break;
case 5: st=0;P0=0xff;P2=table[f];P0=0xdf;break;
}
}
void Timer0() interrupt 1
{
TR0=0;
TH0 = (65535-2000)/256;
TL0 = (65535-2000)%256;
display();
//............................................剩余代碼請下載壓縮包..........................................
|
-
QQ圖片20190727095845.png
(193 KB, 下載次數: 127)
下載附件
2019-7-27 09:59 上傳
-
-
密碼鎖.zip
2019-7-27 09:59 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
49.43 KB, 下載次數: 60, 下載積分: 黑幣 -5
強大的密碼鎖(可密碼更改,按上鎖按鍵關閉密碼鎖,設置密碼)
|