|
0.png (93.79 KB, 下載次數: 129)
下載附件
2016-5-16 03:35 上傳
89C52單片機的密碼鎖:
密碼鎖主程序精華版89c52.rar
(89.5 KB, 下載次數: 51)
2016-5-12 15:42 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
部分程序預覽:
- /****************************************************************/
- /****通過借鑒別人作品自己加以修改才完成了此作品*****************/
- /****如果大家有啥建議歡迎聯系我,我們共同改進*******************/
- /*************************************************/
- /********這個程序舍去了外部eeprom簡化了外圍電路****************/
- #include<reg52.h>
- #include<intrins.h>
- #include<1602yj.h>
- #include<key.h>
- #include<bujing.h>
- #include<eeprom.h>
- #include<buzzer.h>
- #include<time.h>
- #include<mima.h>
- #define address 0x2000
- uchar idata mima_5[6] = {1,2,3,4,5,6}; //初始密碼
- uchar idata mima_6[6]={1,1,1,1,1,1}; //管理員密碼
- uchar flag_change,flag;
- uchar aa;//存放密碼錯誤的次數,夠三次報警
- uint num;//計數
- uchar flag_bg,flag_h,m;
- uchar flag_key=1;
- uchar i;
- void init()
- {
- init_lcd();//液晶初始化
- fen=1; //關閉蜂鳴器
- beiguang=0;//打開液晶背光
- TMOD |= 0x11; //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響
- //TH0=0x00; //給定初值
- //TL0=0x00;
- ET1=0; //定時器中斷關閉 警報用
- TR1=0; //定時器開關關閉 警報用
- EA = 1;//打開總中斷
- ET0 = 1;//打開定時器0中斷
- TR0 = 0;//關閉定時器
- TH0 = 0x4c;//50ms裝初值
- TL0 = 0x00;
- EX1=1;
- IT1=1; //外部中斷0為下降沿觸發
- }
- void mima()
- {
- uchar key;
- uchar idata mima_1[6]={' ',' ',' ',' ',' ',' '};//存放密碼緩沖區
- uchar idata mima_2[6]={' ',' ',' ',' ',' ',' '};
- uchar idata mima_3[6]={' ',' ',' ',' ',' ',' '};
- key=step_choose();
-
- beiguang=0;
-
- TR0=0;
- switch (key) //switch語句比if語句效率高 在這里選擇這種語句
- {
- case E: //恢復出廠設置
- {
-
- lcdpos(0,0);
- write_com(0x06);//寫一個字符后地址指針加 1
- write_com(0x01);//顯示清零,數據指針清零
- write_com(0x0f);//顯示光標
- display_n(" Admin Password ");
- lcdpos(1,0);
- if(input_mima(mima_2)) //處理輸入密碼
- {
- if(mimaduibi(mima_2,mima_6)) //密碼正確
- {
- lcdpos(0,0);
- write_com(0x0c);
- write_com(0x06);//寫一個字符后地址指針加 1
- write_com(0x01);//顯示清零,數據指針清零
- display_n(" PassWord Right ");
-
- ERASE(address);
- for(i=0;i<6;i++)
- { Write_ISP (address+i, mima_5[i]);}
- delayx(1500);
- aa = 0; //清除密碼錯誤次數
- fen = 0; //響一下
- delayx(1000);
- fen = 1;
- }
- else //密碼 不正確
- {
- lcdpos(0,0);
- write_com(0x0c); //關光標
- write_com(0x06);//寫一個字符后地址指針加 1
- write_com(0x01);//顯示清零,數據指針清零
- display_n("PassWord Error");
- delayx(1000);
- aa++;
- if(aa == 4)
- {
- aa = 0;
- warn(); //密碼不正確報警
- }
-
- }
- }
- else //密碼沒有輸入正確或完成
- {
- lcdpos(0,0);
- write_com(0x0c); //關光標
- write_com(0x06);//寫一個字符后地址指針加 1
- write_com(0x01);//顯示清零,數據指針清零
- display_n("PassWord Error");
- delayx(1000);
- aa++;
- if(aa == 4)
- {
- aa = 0;
- warn(); //密碼不正確報警
- }
-
- }
-
-
-
-
- }
-
- break;
- case A: //A被按下,接收輸入密碼,
- {
- for(i=0;i<6;i++)
- {
-
- mima_1[i]= Read_ISP(address+i);
-
- }
- write_com(0x06);//寫一個字符后地址指針加 1
- write_com(0x01);//顯示清零,數據指針清零
- write_com(0x0f);//顯示光標
- lcdpos(0,0);
- display_n(" Input PassWord");
-
- if(input_mima(mima_2)) //處理輸入密碼
- {
- if(mimaduibi(mima_2,mima_1)) //密碼正確
- {
- lcdpos(0,0);
- write_com(0x0c);
- write_com(0x06);//寫一個字符后地址指針加 1
-
- write_com(0x01);//顯示清零,數據指針清零
- display_n(" PassWord Right ");
- aa = 0; //清除密碼錯誤次數
- kai(); //開鎖
- fen = 0; //響一下
- delayx(1000);
- fen = 1;
- TR0 = 1;
- flag_h=1;
- flag=0;
-
- while(key != C&&flag_h!=0) //C沒按下一直開 如果忘記關門定時器10s到了會自動關門
- {
- key = scan();
-
- }
- if(flag_h==1||m==0)//檢測是不關過門 flag_h==1表示沒關門 m檢測進入外部中斷后執行關門指令 也除去一個警告
- { guan();
- flag=1;
- TR0 = 0;
- }
- }
- else //密碼 不正確
- {
- lcdpos(0,0);
- write_com(0x0c); //關光標
- write_com(0x06);//寫一個字符后地址指針加 1
- write_com(0x01);//顯示清零,數據指針清零
- display_n("PassWord Error");
- delayx(1000);
- aa++;
- if(aa == 4)
- {
-
- aa = 0;
- warn(); //密碼不正確報警
- }
-
- }
- }
- else //密碼沒有輸入正確或完成
- {
- lcdpos(0,0);
- write_com(0x0c); //關光標
- write_com(0x06);//寫一個字符后地址指針加 1
- write_com(0x01);//顯示清零,數據指針清零
- display_n("PassWord Error");
- delayx(1000);
- aa++;
- if(aa == 4)
- {
- aa = 0;
- warn(); //密碼不正確報警
- }
-
- }
- }
- break;
- case F: //F被按下,修改密
- {
- for(i=0;i<6;i++)
- {
-
- mima_1[i]= Read_ISP(address+i);
-
- }
- write_com(0x06);//寫一個字符后地址指針加 1
- write_com(0x01);//顯示清零,數據指針清零
- write_com(0x0f);//顯示光標
- lcdpos(0,0);
- display_n(" Input PassWord");
- write_com(0x0f);//顯示光標
- if(input_mima(mima_2)) //處理輸入密碼
- {
- if(mimaduibi(mima_2,mima_1)) //密碼正確
- {
- lcdpos(0,0);
- write_com(0x0c);
- write_com(0x06);//寫一個字符后地址指針加 1
- write_com(0x01);//顯示清零,數據指針清零
- display_n(" PassWord Right ");
-
- aa = 0; //清除密碼錯誤次數
- delayx(1000);
-
- flag_change = 1;
- if(flag_change) //下面開始修改密碼
- { lcdpos(0,0);
- write_com(0x0c); //關閉光標
- write_com(0x06);//寫一個字符后地址指針加 1
- write_com(0x01);//顯示清零,數據指針清零
- display_n("In New PassWord");
- delayx(1000);
- lcdpos(1,0);
- write_com(0x0f);//顯示光標
-
-
- if(input_mima(mima_2)) //處理輸入密碼
- {
-
- lcdpos(0,0);
- write_com(0x0c);
- write_com(0x06);//寫一個字符后地址指針加 1
- write_com(0x01);//顯示清零,數據指針清零
- display_n("Input New Pass"); //確定新密碼
- lcdpos(1,0);
- display_n("PassWord again");
- delayx(2000);
- lcdpos(0,0);
- write_com(0x0f);//顯示光標
- write_com(0x06);//寫一個字符后地址指針加 1
- write_com(0x01);//顯示清零,數據指針清零
- display_n("In New PassWord");
- if(input_mima(mima_3)) //處理輸入密碼
- {
- if(mimaduibi(mima_2,mima_3)) //密碼正確
- {
- lcdpos(0,0);
- write_com(0x0c);
- write_com(0x06);//寫一個字符后地址指針加 1
- write_com(0x01);//顯示清零,數據指針清零
- display_n("Change PassWord");
- lcdpos(1,0);
- display_n(" SUCCESSFULLY ");
- ERASE(address);
- for(i=0;i<6;i++)
- { Write_ISP (address+i, mima_3[i]);}//把修改的密碼存進內部rom
- delayx(2000);
- flag_change = 0;
- }
- else //密碼 不正確
- {
- lcdpos(0,0);
- write_com(0x0c); //關光標
- write_com(0x06);//寫一個字符后地址指針加 1
- write_com(0x01);//顯示清零,數據指針清零
- display_n("PassWord Error");
- delayx(1000);
- aa++;
- if(aa == 4)
- {
- aa = 0;
- warn(); //密碼不正確報警
- }
- flag_change = 0;
- }
- }
- else //密碼沒有輸入正確或完成
- {
- lcdpos(0,0);
- write_com(0x0c); //關光標
- write_com(0x06);//寫一個字符后地址指針加 1
- write_com(0x01);//顯示清零,數據指針清零
- display_n("PassWord Error");
- delayx(1000);
- aa++;
- if(aa == 4)
- {
- aa = 0;
- warn(); //密碼不正確報警
- }
- }
-
- }
- else //密碼沒有輸入正確或完成
- {
- lcdpos(0,0);
- write_com(0x0c); //關光標
- write_com(0x06);//寫一個字符后地址指針加 1
- write_com(0x01);//顯示清零,數據指針清零
- display_n("PassWord Error");
- delayx(1000);
- flag_change = 0;
- aa++;
- if(aa == 4)
- {
- aa = 0;
- warn(); //密碼不正確報警
- }
- }
-
- }
- }
- else //密碼 不正確
- {
- lcdpos(0,0);
- write_com(0x0c); //關光標
- write_com(0x06);//寫一個字符后地址指針加 1
- write_com(0x01);//顯示清零,數據指針清零
- display_n("PassWord Error");
- delayx(1000);
- aa++;
- if(aa == 4)
- {
- aa = 0;
- warn(); //密碼不正確報警
- }
- }
- }
- else //密碼沒有輸入正確或完成
- {
- lcdpos(0,0);
- write_com(0x0c); //關光標
- write_com(0x06);//寫一個字符后地址指針加 1
- write_com(0x01);//顯示清零,數據指針清零
- display_n("PassWord Error");
- delayx(1000);
- aa++;
- if(aa == 4)
- {
- aa = 0;
- warn(); //密碼不正確報警
- }
- }
- }
- break;
- case C: if(flag==0)
- {
- guan();
- flag=1;
- }
- break;
- default:
- break;
- }
- }
- void main()
- {
- init();
-
- while(1)
- {
-
- mima();
-
- /* lcdpos(0,1);
- display1(scan());// *///測試矩陣鍵盤程序 鍵盤必須改成‘1’字符形式
- }
-
- }
- void timer0() interrupt 1 //定時器0中斷, 背光// 自鎖
- {
- TH0 = 0x4c;//50ms定時
- TL0 = 0x00;
- num++;
- if(num ==600)//30s時間到
- {
- num = 0;
- flag_bg=1;
- }
- }
- void counter(void) interrupt 2
- {
- if(flag==0)
- {
- flag=1;
- TR0 = 0;
- flag_h=0;
- m=0;
- //guan(); 有1個警告 所以不在此調用關鎖函數
- }
- }
- /***************因兩個定時器工作要考慮優先級********/
- /*************定時不準*****************************/
- /*********所以用了一個定時器**********************/
復制代碼
|
評分
-
查看全部評分
|