功能:1,點擊開鎖后,輸入密碼,設置的初始密碼為666666,LED燈亮
2,點擊上鎖,密碼鎖鎖上,LED燈關閉
3,點擊修改密碼,先輸入原密碼,正確后輸入新密碼,屏幕顯示save over,點擊保存密碼,密碼保存在EEPROM中(因為不知道怎么在PROTEUS中使用EEPROM所以這個功能實現不了,但是要是在單片機開發板上就可以)
4,開鎖10秒后自動上鎖
5,串口可以使用虛擬串口,但由于學的不多,只能傳入單個字符選擇需要實現的功能,然后用鍵盤實現功能
6,初學以來第一次做的比學單個功能時稍大一點的程序,可能有些地方考慮不周,可以交流一下嘛^-^.
電路原理圖如下:
捕獲.PNG (217.58 KB, 下載次數: 90)
下載附件
2019-8-23 10:29 上傳
單片機源程序如下:
- #include<reg52.h>
- #include"lcd.h"
- #include"eeprom.h"
- #include"keyboard.h"
- #include"sounder.h"
- #include"led.h"
- #define u8 unsigned char
- #define u16 unsigned int
-
- unsigned long pass=666666;
- unsigned int Timer0=0;
- unsigned char uartvalue=0;
- u8 code str1[]=" Password: ";
- u8 code str2[]=" Close ";
- u8 code str3[]=" Old Password: ";
- u8 code str4[]="0123456789";
- u8 code str5[]=" OPEN ";
- u8 code str6[]=" Password Lock ";
- u8 code str7[]=" Wrong! ";
- u8 code str8[]=" New Password: ";
- u8 code str9[]="******";
- u8 code str10[]=" Change Over ";
- u8 code str11[]=" Save Over ";
- u8 code str12[]="修改密碼";
- u8 code kong[]=" ";
- u8 strbuff[16];
- void E2init()//EEPROM初始值
- {
- unsigned long num1,num2,num3,date1,date2,date3;
- num1=pass/10000;
- num2=pass/100%100;
- num3=pass%100;
- At24c02write(1,num1);
- At24c02write(2,num2);
- At24c02write(3,num3);
- date1=At24c02read(1);
- date2=At24c02read(2);
- date3=At24c02read(3);
- pass=(date1*10000+date2*100+date3);
- }
- void Lockinit()//最初屏顯
- {
- unsigned char i;
- Write_cmd(0x80);
- for(i=0;i<16;i++)
- {
- Write_dat(str6[i]);
- }
- }
- void clear(unsigned char j)//清屏
- {
- unsigned char i;
- if(j==0)
- {
- Write_cmd(0x80);
- for(i=0;i<16;i++)
- {
- Write_dat(kong[i]);
- }
- }
- if(j==1)
- {
- Write_cmd(0x80+0x40);
- for(i=0;i<16;i++)
- {
- Write_dat(kong[i]);
- }
- }
- }
-
- void open()//開鎖
- {
- unsigned char i=0,j=0;
- unsigned long mima=0;
- while(1)
- {
- Keyvalue();
- if(keystate==1&&(value>=0&&value<=9||value==14))//輸入密碼
- {
- keystate=0;
- Write_cmd(0x80+0x40+j);
- Write_dat(str9[j]);
- j++;
- mima=mima*10+value;
- if(value==14)
- {
- clear(1);
- j=0;
- mima=0;
- }
- }
- if(j==6)//密碼輸入完畢,判斷
- {
- delay(50000);
- if(mima==pass)//正確
- {
- Write_cmd(0x80);
- for(i=0;i<16;i++)
- {
- Write_dat(str5[i]);
- }
- TR0=1;
- clear(1);
- LED=0;
- }
- else//錯誤
- {
- Write_cmd(0x80);
- for(i=0;i<16;i++)
- {
- Write_dat(str7[i]);
- }
- clear(1);
- LED=1;
- }
- break;
- }
- }
- }
-
- void change()//修改密碼
- {
- unsigned char i,j=0;
- unsigned long mima=0,changemima=0;
- TR0=0;
- Timer0=0;
- while(1)
- {
- Keyvalue();
- if(keystate==1&&(value>=0&&value<=9||value==14))//輸入密碼
- {
- keystate=0;
- Write_cmd(0x80+0x40+j);
- Write_dat(str4[value]);
- j++;
- mima=mima*10+value;
- if(value==14)
- {
- clear(1);
- j=0;
- mima=0;
- }
- }
- if(j==6)//輸入完畢,判斷
- {
- delay(50000);
- clear(1);
- if(mima==pass)//密碼正確
- {
- Write_cmd(0x80);
- for(i=0;i<16;i++)
- {
- Write_dat(str8[i]);
- }
- i=0;
- while(1)
- {
- Keyvalue();
- if(keystate==1&&(value>=0&&value<=9||value==14))//輸入需要修改的密碼
- {
- keystate=0;
- Write_cmd(0x80+0x40+i);
- Write_dat(str4[value]);
- changemima=changemima*10+value;
- i++;
- if(value==14)
- {
- clear(1);
- i=0;
- changemima=0;
- }
- }
- if(i==6)//輸入完畢,保存
- {
- delay(50000);
- pass=changemima;
- Write_cmd(0x80);
- for(i=0;i<16;i++)
- {
- Write_dat(str10[i]);
- }
- clear(1);
- break;
- }
- }
- }
- else//舊密碼輸入錯誤
- {
- Write_cmd(0x80);
- for(i=0;i<16;i++)
- {
- Write_dat(str7[i]);
- }
- clear(1);
- LED=1;
- }
- break;
- }
- }
- }
- void save()//保存密碼
- {
- unsigned char i;
- unsigned long num1,num2,num3;
- TR0=0;
- Timer0=0;
- num1=pass/10000;
- num2=pass/100%100;
- num3=pass%100;
- At24c02write(1,num1);
- At24c02write(2,num2);
- At24c02write(3,num3);
- Write_cmd(0x80);
- for(i=0;i<16;i++)
- {
- Write_dat(str11[i]);
- }
- clear(1);
- }
- void KeyBoard()//鍵值功能
- {
- unsigned char i=0;
- unsigned char keylock = 0;
-
- while(1)
- {
- Keyvalue();
- if(value==10)//開鎖
- {
- keystate=0;
- Write_cmd(0x80);
- for(i=0;i<16;i++)
- {
- Write_dat(str1[i]);
- }
- keylock=1;
- }
- if(value==11)//上鎖
- {
- keystate=0;
- Write_cmd(0x80);
- for(i=0;i<16;i++)
- {
- Write_dat(str2[i]);
- }
- clear(1);
- LED=1;
- break;
- }
- if(value==12)//修改密碼
- {
- keystate=0;
- Write_cmd(0x80);
- for(i=0;i<16;i++)
- {
- Write_dat(str3[i]);
- }
- keylock=2;
- }
- if(value==13)//保存密碼
- {
- keystate=0;
- keylock=3;
- }
- switch(keylock)
- {
- case 1:keylock = 0;open();value=15;break;
- case 2:keylock = 0;change();value=15;break;
- case 3:keylock = 0;save();value=15;break;
- default:break;
- }
- }
- }
- void main()
- {
- TMOD=0X21; //定時器1方式2,定時器0方式1
- SCON=0X50; //串口設置
- PCON=0X80; //波特率加倍
- TH1=0XFA; //設置波特率為9600
- TL1=0XFA;
- TH0=0XF8; //定時2ms
- TL0=0XCC;
- EA=1;
- ES=1;
- ET0=1;
- TR1=1;
- Lcdinit(); //LCD1602初始化
- Lockinit();
- E2init();
- while(1)
- {
- KeyBoard();
- }
- }
- void ledonoff() interrupt 1
- {
- unsigned char i;
- TH0=0XF8;
- TL0=0XCC;
- if(LED==0)
- {
- Timer0++;
- }
- if(Timer0==5000)
- {
- LED=1;
- Timer0=0;
- Write_cmd(0x80);
- for(i=0;i<16;i++)
- {
- Write_dat(str2[i]);
- }
- TR0=0;
- }
- }
- void Uart() interrupt 4
- {
- unsigned char UART_buff;
- if(RI)
- {
- UART_buff=SBUF;
- if(UART_buff=='0') value=10;
- if(UART_buff=='1') value=11;
- if(UART_buff=='2') value=12;
- if(UART_buff=='3') value=13;
- SBUF=UART_buff;
- }
- if(TI)
- {
- TI=0;
- }
- }
復制代碼
源程序51hei下載,但是沒有仿真,求大神分享個仿真圖啊:
test_23,門禁.zip
(72.98 KB, 下載次數: 50)
2019-8-23 10:28 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|