制作密碼鎖,在51黑里受益頗多;這次設計結束,反饋給大家
制作出來的實物圖如下:
單片機源程序如下:
- #include<reg51.h>
- #include<OLED.h>
- #include<keypad.h>
- #include<intrins.h>
- #include<eeprom.h>
- #define uchar unsigned char
- #define uint unsigned int
-
- sbit LED1=P1^7;
- sbit BEEP=P3^7;
- uchar x=11,count,j;
- void Delay() //@11.0592MHz
- {
-
- unsigned char i, t, k;
- _nop_();
- _nop_();
- i = 20;
- t = 3;
- k = 203;
- do
- {
- do
- {
- while (--k);
- } while (--t);
- } while (--i);
-
- }
- void Timer_init (void)
- {
- EA = 1; //中斷總開關
- TMOD=0x01; //設置定時器0工作方式1后面運行TR位啟動
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- ET0=1;
-
- // IT0 = 1; //1:下沿觸發(fā) 0:低電平觸發(fā)
-
- }
- void Tenseconds()
- {
- if(x==10)
- OLED_DisplayText(1,3,"10",OLED_NOT_INVERT_COLOR);
- if(x==9)
- OLED_DisplayText(1,3," 9",OLED_NOT_INVERT_COLOR);
- if(x==8)
- OLED_DisplayText(1,3," 8",OLED_NOT_INVERT_COLOR);
- if(x==7)
- OLED_DisplayText(1,3," 7",OLED_NOT_INVERT_COLOR);
- if(x==6)
- OLED_DisplayText(1,3," 6",OLED_NOT_INVERT_COLOR);
- if(x==5)
- OLED_DisplayText(1,3," 5",OLED_NOT_INVERT_COLOR);
- if(x==4)
- OLED_DisplayText(1,3," 4",OLED_NOT_INVERT_COLOR);
- if(x==3)
- OLED_DisplayText(1,3," 3",OLED_NOT_INVERT_COLOR);
- if(x==2)
- OLED_DisplayText(1,3," 2",OLED_NOT_INVERT_COLOR);
- if(x==1)
- OLED_DisplayText(1,3," 1",OLED_NOT_INVERT_COLOR);
- if(x==0)
- {
- OLED_Clear();
- OLED_DisplayText(1,1,"請按返回鍵返回",OLED_NOT_INVERT_COLOR);
- OLED_DisplayText(3,0,"返回",OLED_NOT_INVERT_COLOR);
- j=0;
- }
- }
-
- void Enter() //確定鍵,只有按下s13才可以繼續(xù)進行
- { uchar dat;
- do{P2=0xf0;
- while(P2==0xf0);
- dat=key_scan();
- }while(dat!=0x0a);
- }
- void System()
- {
- OLED_DisplayText(0,2,"淮北師范大學",OLED_NOT_INVERT_COLOR);
- OLED_DisplayText(1,2,"電子信息工程班",OLED_NOT_INVERT_COLOR);
- OLED_DisplayText(2,2,"20191304032",OLED_NOT_INVERT_COLOR);
- Delay();
- }
- void press(uchar *s,uchar x) //按鍵輸入
- {
- uchar dat;
- int num;
- for(num=0;num<=4;num++)
- {
- //**************************************************
- if(num>=4)
- { P2=0xf0;
- while(P2==0xf0);
- dat=key_scan();
- if((dat!=0x0a) && (dat!=0x0b)&& (dat!=0x0c))
- {
- num--;
- }
- if(dat==0x0a)
- {
- OLED_DisplayText(x,num," ",OLED_NOT_INVERT_COLOR);
- }
- if(dat==0x0b)
- {
- OLED_DisplayText(x,num-1,"-",OLED_NOT_INVERT_COLOR);
- s--;
- num=num-2;
- }
- if(dat==0x0c)
- {
- s=s-num;
- num=-1;
- OLED_DisplayText(x,0,"----",OLED_NOT_INVERT_COLOR);
- }
-
- }
- else
- {
- P2=0xf0;
- while(P2==0xf0);
- dat=key_scan();
- if((dat!=0x0a)&&(dat!=0x0b)&&(dat!=0x0c))
- { *s=dat;
- OLED_DisplayText(x,num,"*",OLED_NOT_INVERT_COLOR);
- s++;
-
- }
- if(dat==0x0b)
- {
- OLED_DisplayText(x,num-1,"-",OLED_NOT_INVERT_COLOR);
- s--;
- num=num-2;
- }
- if(dat==0x0c)
- {
- s=s-num;
- num=-1;
- OLED_DisplayText(x,0,"----",OLED_NOT_INVERT_COLOR);
- }
- }
- }
-
- }
-
- void main()
- { int dat,x;
- OLED_Init();
- Timer_init ();
- System();
-
- read();//第一次輸入燒錄時,請將這里改為 “write();”!。!
-
- do{
- LED1=1;
- BEEP=1;
- OLED_Clear();
- OLED_DisplayText(0,0,"請輸入密碼:",OLED_NOT_INVERT_COLOR);//OLED顯示文本(行(0到3行), 列(0到15列),文本, 是否反色)
- OLED_DisplayText(1,0,"----",OLED_NOT_INVERT_COLOR);//OLED顯示文本(行(0到3行), 列(0到15列),文本, 是否反色)
- OLED_DisplayText(3,0,"確定",OLED_NOT_INVERT_COLOR);//OLED顯示文本(行(0到3行), 列(0到15列),文本, 是否反色)
- OLED_DisplayText(3,12,"刪除",OLED_NOT_INVERT_COLOR);//OLED顯示文本(行(0到3行), 列(0到15列),文本, 是否反色)
- press(key,1);
- if((key[0]==iic[0])&&(key[1]==iic[1])&&(key[2]==iic[2])&&(key[3]==iic[3]))
- {
- j=0;
- OLED_Clear();
- OLED_DisplayText(3,12," ",OLED_NOT_INVERT_COLOR);
- OLED_DisplayText(0,0,"直接開鎖請按1",OLED_NOT_INVERT_COLOR);
- OLED_DisplayText(1,0,"修改密碼請按2",OLED_NOT_INVERT_COLOR);
- do
- {
- P2=0xf0; //鍵入1或2繼續(xù)執(zhí)行下面語句,否則等待
- while(P2==0xf0);
- dat=key_scan();
- }while(dat!=0x01&&dat!=0x02);
- if(dat==1) //開鎖
- {
- OLED_Clear();
- LED1=0;
- OLED_DisplayText(1,4,"開鎖成功!",OLED_INVERT_COLOR );
- OLED_DisplayText(3,0,"返回",OLED_NOT_INVERT_COLOR );
- Enter();
-
- }
- if(dat==2) //修改密碼
- { OLED_Clear();
- do{
- OLED_Clear();
- OLED_DisplayText(0,0,"輸入修改密碼:",OLED_NOT_INVERT_COLOR);
- OLED_DisplayText(1,0,"----",OLED_NOT_INVERT_COLOR);
- press(key,1);
- OLED_DisplayText(2,0,"確定密碼:",OLED_NOT_INVERT_COLOR); //再次輸入密碼
- OLED_DisplayText(3,0,"----",OLED_NOT_INVERT_COLOR);
- press(iic,3);
- if((key[0]==iic[0])&&(key[1]==iic[1])&&(key[2]==iic[2])&&(key[3]==iic[3]))
- {
- OLED_Clear();
- OLED_DisplayText(1,4,"修改成功!",OLED_INVERT_COLOR);
- OLED_DisplayText(3,0,"返回",OLED_NOT_INVERT_COLOR );
-
- Erase();//第一次輸入燒錄時,請將這里注釋掉。。!
- write();//第一次輸入燒錄時,請將這里注釋掉。。!
-
- Enter();break; //修改密碼成功
- }
- else //修改密碼不成功,重新修改
- {
- OLED_Clear();
- OLED_DisplayText(3,12," ",OLED_NOT_INVERT_COLOR);
- OLED_DisplayText(1,2,"兩次密碼不一致",OLED_INVERT_COLOR);
- OLED_DisplayText(2,4,"請重新輸入",OLED_INVERT_COLOR);
- OLED_DisplayText(3,0,"返回",OLED_NOT_INVERT_COLOR );
- Enter();
- }
- }while(1);
- }
- }
-
- else //密碼不正確,重新輸入密碼
- {
-
- j++;
- if(j==3) //如果輸錯超過3次,開啟定時器中斷,鍵盤鎖住,10s內無法操作
- {
- TR0=1;
-
- }
- OLED_Clear();
-
- if (j<=2)
- {
- BEEP=0;
- }
- else
- {BEEP=1;}
-
- OLED_DisplayText(3,12," ",OLED_NOT_INVERT_COLOR);
- OLED_DisplayText(1,4,"密碼錯誤",OLED_INVERT_COLOR);
- OLED_DisplayText(3,0,"返回",OLED_NOT_INVERT_COLOR );
- Enter();
- }
- }
- while(1);
- }
- void TimeInterrupt() interrupt 1 //定時器中斷服務程序
- {
-
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- count++;
- if (count>=20)
- {
- count=0;
- x--;
- OLED_DisplayText(1,5,"秒后解鎖",OLED_NOT_INVERT_COLOR);
- Tenseconds();
- if(x<=0)
- {
- TR0=0;
- x=11;
- }
- }
- }
復制代碼
附件是Keil5代碼下載(1個文件):
oled12864(IIC) 掉電儲存密碼鎖.zip
(84.67 KB, 下載次數(shù): 85)
2022-5-25 13:25 上傳
點擊文件名下載附件
|