功能:1,点击开锁后,输入密码,设置的初始密码为666666,LED灯亮
2,点击上锁,密码锁锁上,LED灯关闭
3,点击修改密码,先输入原密码,正确后输入新密码,屏幕显示save over,点击保存密码,密码保存在EEPROM中(因为不知道怎么在PROTEUS中使用EEPROM所以这个功能实现不了,但是要是在单片机开发板上就可以)
4,开锁10秒后自动上锁
5,串口可以使用虚拟串口,但由于学的不多,只能传入单个字符选择需要实现的功能,然后用键盘实现功能
6,初学以来第一次做的比学单个功能时稍大一点的程序,可能有些地方考虑不周,可以交流一下嘛^-^.
电路原理图如下:
单片机源程序如下:
- #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)
|