|
調試通過,,,電子密碼鎖,,,資料,,,,分享
lcd1602液晶屏顯示 并且用24c02保存數據
0.png (37.1 KB, 下載次數: 162)
下載附件
2016-4-24 19:32 上傳
仿真圖 電路圖(proteus仿真文件可以從51黑本貼附件下載)
0.png (64.86 KB, 下載次數: 169)
下載附件
2016-4-24 19:33 上傳
全部資料(壓縮包)下載:
密碼鎖單片機源程序仿真.zip
(128 KB, 下載次數: 383)
2016-4-24 19:34 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
S0-S9為密碼數字鍵;
S10為刪除鍵,刪除上一次輸入的數字;
S11為清除鍵,清除所有輸入的數字;
S12為確認鍵,輸入密碼后按確認鍵確認密碼是否輸入正確;
S13為密碼修改鍵。
S1-S10鍵按下5秒后,沒有其他鍵按下,則發出報警聲,聲音持續10s;
輸入密碼后按確認鍵,若密碼正確,則綠燈亮,否則則紅燈亮。
下面是部分程序預覽(完整版本請下載本帖附件):
- //S1-S9為數字密碼輸入鍵0-9
- //S10-S13為功能鍵
- //S10為單個數字刪除鍵,S11為所以數字清除鍵,S12為密碼確認鍵,S13為修改密碼鍵
- #include<reg52.h> //包含頭文件
- #include"IIC.h" //包含IIC總線頭文件
- #include"1602.h" //包含1602頭文件
- #include"keyboard.h" //包含鍵盤掃描頭文件
- sbit led_red=P2^5; //位定義綠燈,密碼輸入正確時顯示
- sbit led_gre=P2^6; //位定義紅燈,密碼輸入錯誤時顯示
- sbit spk=P2^7;
- uchar ASC[]={'0','1','2','3','4','5','6','7','8','9'}; //將數字轉換成字符型數據供1602顯示
- uchar one=0,two=1,three=2,four=3; //初始密碼0123
- uint t0,t1; //定時器0、1分別溢出的次數
- void Init_time0(void) //定時器0初始化函數
- {
- TMOD=0x11;
- TH0=(65535-50000)/256;
- TL0=(65535-50000)%256;
- TH1=(65535-2000)/256;
- TL1=(65535-2000)%256;
- EA=1;
- ET0=1;
- ET1=1;
- TR0=0;
- TR1=0;
- }
- void main(void) //主函數
- {
- uchar flag=0,cflag=0;
- //flag、cflag分別為修改密碼標志和修改密碼時初始密碼輸入正確標志(輸入新密碼標志)
- uchar i=0,k=0;
- //i為輸入密碼時輸入數字密碼的個數
- //k為修改密碼時輸入數字密碼的個數
- uchar j=0,t=0,shu=1;
- //j用于for循環中判斷輸入密碼和存儲密碼對比
- //t=0為進入修改密碼狀態,只要是為了修改密碼時的初始顯示
- //shu用于輸入新密碼時,四位密碼的地址
- uchar num,newpassword[4];
- //num為按鍵值,newpassword數組存放每次輸入的數字密碼S0-S13和0-13對應
- Init_IIC(); //初始化IIC
- Init_1602(); //初始化1602
- Init_time0(); //初始化定時器0
- led_red=0; //熄滅綠燈和紅燈
- led_gre=0;
- spk=0;
- write_add(1,one); //寫入初始密碼0123到E2PROM
- delay_ms(5);
- write_add(2,two);
- delay_ms(5);
- write_add(3,three);
- delay_ms(5);
- write_add(4,four);
- delay_ms(5);
- displaylistchar(0,0,"Input Password:"); //1602初始化后顯示Input Password:
- while(1)
- {
- /*檢測是否有按鍵按下,若沒有則不停掃描*/
- num=KeyPro(); //掃描按鍵
- if(num!=0xff) //如果有鍵按下
- {
- /*******************************************************************************************/
- /*輸入密碼*/
- if((num!=13)&&(flag==0)) //S13為修改密碼鍵,flag為修改密碼標志,flag=1時修改密碼,判斷是否修改密碼
- {
- displaylistchar(0,0,"Input Password:");
- if(num>=0&&num<=9) //如果是0-9按下,則輸入0-9并在液晶上顯示0-9
- {
- TR0=~TR0; //若按鍵后五秒內沒有打開鎖,則報警
- t0=0;
- displayonechar(i,1,ASC[num]); //顯示輸入的數字密碼
- newpassword[i++]=num;
- }
-
- if(num==10) //如果10按下,在有數字輸入的情況下刪除上次輸入的數字
- {
- TR0=~TR0; //若按鍵后五秒內沒有打開鎖,則報警
- t0=0;
- if(i>0)
- {
- i=i-1;
- displayonechar(i,1,' ');
- }
- }
-
- if(num==11) //如果是11按下,清除所有輸入的數據,重新輸入
- {
- TR0=0;
- i=0;
- displaylistchar(0,1," ");//清除該行
- }
-
- if(num==12) //確認鍵,如果密碼正確,則綠燈亮紅燈熄,否則則紅燈亮綠燈熄
- {
- TR0=0;
- if(i==4) //四位密碼,所以只在輸入四個密碼的情況下檢測密碼是否正確
- {
- for(j=0;j<4;j++)
- {
- if(newpassword[j]!=read_add(j+1)) //輸入的密碼和存儲的密碼對比,若有一個錯誤,則跳出密碼對比
- break;
- }
- if(j==i) //若j=i成立,則密碼正確
- {
- led_gre=1; //亮綠燈
- led_red=0;
- displaylistchar(0,1,"Right Open!"); //顯示輸入正確
- delay_ms(1000);
- i=0; //按鍵輸入數置0
- displaylistchar(0,1," ");//清除該行
- }
- else //若不成立則密碼不正確
- {
- led_gre=0; //亮紅燈
- led_red=1;
- displaylistchar(0,1,"Wrong Retry!"); //顯示輸入錯誤
- delay_ms(1000);
- i=0; //按鍵輸入數置0
- displaylistchar(0,1," ");//清除該行
- }
- }
- else //若按鍵輸入數i不等于4,則密碼肯定錯誤
- {
- led_gre=0; //亮紅燈
- led_red=1;
- displaylistchar(0,1,"Wrong Retry!"); //顯示輸入錯誤
- delay_ms(1000);
- i=0; //按鍵輸入數置0
- displaylistchar(0,1," ");//清除該行
- }
- }
-
- if(i==6) //虛設六位密碼,數字按鍵輸入六次后還沒有按確定的話,則提示密碼錯誤
- {
- TR0=0;
- led_gre=0; //亮紅燈
- led_red=1;
- displaylistchar(0,1,"Wrong Retry!"); //顯示輸入錯誤
- delay_ms(1000);
- i=0; //按鍵輸入數置0
- displaylistchar(0,1," ");//清除該行
- }
- }
- /*******************************************************************************************/
- /*******************************************************************************************/
- /*修改密碼*/
- else //有S13鍵按下或修改密碼標志flag置1
- {
- if(cflag==0) //修改密碼時初始密碼輸入正確標志cflag置0時為輸入初始密碼檢測狀態,類似前面的密碼輸入
- {
- i=0; //按鍵輸入數置0
- flag=1; //S13鍵按下,修改密碼標志置1
- if(t==0) //t=0為進入修改密碼狀態,只要是為了修改密碼時的初始顯示
- {
- displaylistchar(0,0,"Change Password:");
- delay_ms(500);
- displaylistchar(0,1,"Old Password:");
- delay_ms(500);
- displaylistchar(0,1," ");//清除該行
- }
- t++; //正在修改密碼狀態,則不用再次進入修改密碼狀態
- if(num>=0&&num<=9) //如果是0-9按下,則輸入0-9并在液晶上顯示0-9
- {
- TR0=~TR0; //若按鍵后五秒內沒有打開鎖,則報警
- t0=0;
- displayonechar(k,1,ASC[num]);
- newpassword[k++]=num;
- }
-
- if(num==10) //單個密碼刪除鍵,和輸入密碼時一樣
- {
- TR0=~TR0; //若按鍵后五秒內沒有打開鎖,則報警
- t0=0;
- if(k>0)
- {
- k=k-1;
- displayonechar(i,1,' ');
- }
- }
-
- if(num==11) //所以密碼清除鍵,和輸入密碼時一樣
- {
- TR0=0;
- k=0;
- flag=0;
- displaylistchar(0,1," ");//清除該行
- }
-
- if(num==12) //確認鍵,和輸入密碼時一樣
- {
- TR0=0;
- if(k==4)
- {
- for(j=0;j<4;j++)
- {
- if(newpassword[j]!=read_add(j+1))
- break;
- }
- if(j==k) //若初始密碼輸入正確后提示輸入新密碼,并將輸入新密碼標志cflag置1
- {
- led_gre=1;
- led_red=0;
- displaylistchar(0,1,"Right Open!");
- delay_ms(500);
- displaylistchar(0,1," ");//清除該行
- displaylistchar(0,1,"New Password:");
- delay_ms(500);
- displaylistchar(0,1," ");//清除該行
- k=0;
- cflag=1;
- }
- else //若輸入錯誤,則跳出密碼修改,flag=0
- {
- led_gre=0;
- led_red=1;
- displaylistchar(0,1,"Wrong Retry!");
- delay_ms(1000);
- k=0;
- flag=0;
- displaylistchar(0,1," ");//清除該行
- displaylistchar(0,0," ");//清除該行
- displaylistchar(0,0,"Input Password:");
- }
- }
- else //修改密碼時輸入原密碼數不等于4,顯然密碼錯誤,跳出密碼修改
- {
- led_gre=0;
- led_red=1;
- displaylistchar(0,1,"Wrong Retry!");
- delay_ms(1000);
- k=0;
- flag=0;
- displaylistchar(0,1," ");//清除該行
- displaylistchar(0,0," ");//清除該行
- displaylistchar(0,0,"Input Password:");
-
- }
- }
- if(k==6) //數字按鍵輸入六次后還沒有按確定的話,則提示密碼錯誤 ,跳出密碼修改
- {
- TR0=0;
- led_gre=0;
- led_red=1;
- displaylistchar(0,1,"Wrong Retry!");
- delay_ms(1000);
- k=0;
- flag=0;
- displaylistchar(0,1," ");//清除該行
- displaylistchar(0,0," ");//清除該行
- displaylistchar(0,0,"Input Password:");
- }
- }
- else //輸入新密碼標志置1,輸入新密碼并顯示新輸入的密碼
- {
- if(num>=0&&num<=9)
- {
- write_add(shu,num);
- displayonechar(shu-1,1,ASC[num]);
- shu++;
- if(shu==5)
- {
- t=0;
- shu=1;
- cflag=0;
- flag=0;
- displaylistchar(0,1,"Change Success!");
- delay_ms(500);
- displaylistchar(0,0," ");//清除該行
- displaylistchar(0,1," ");//清除該行
- displaylistchar(0,0,"Input Password:");
- }
- }
- }
- }
- }
-
- }
- }
- void time0(void) interrupt 1
- {
- TH0=(65535-50000)/256;
- TL0=(65535-50000)%256;
- t0++;
- if(t0==100)
- {
- t0=0;
- TR0=0;
- TR1=1;
- }
- }
- void time1(void) interrupt 3
- {
- TH1=(65535-2000)/256;
- TL1=(65535-2000)%256;
- t1++;
- spk=~spk;
- if(t1==5000)
- {
- t1=0;
- TR1=0;
- }
- }
復制代碼
|
|