密码锁课程设计
1.设计基于单片机控制的密码锁
2.基本功能要求:
a.12个按键,用于输入密码及设定,其中s/c分短按(clear)和长按(set)
b.两个led灯反映密码输入正确(绿灯亮),错误(红灯亮)
c.原始密码为:000000 应可随以修改(掉电新密码不丢失)
下面是我做的具体过程
下面是protues的截图如下(你可以照着在proteus中设置):
如果你看不到的话,右键点击另存为。。。下载下来。。,就可以了。。。
proteus运行的时候,首先要输入6位密码,然后点击ok键,如果正确的话,绿灯会亮,否则,红灯亮(上面的说明上说的很清楚)
代码贴出来,可以直接子啊uvision4上运行的。。。
//下面程序为密码锁控制程序,可实现设定密码,判断密码是否正确,并且掉电不丢失的功能
#include
//类型重定义
#define uchar unsigned char
#define uint unsigned int
//函数声明
void start();//开始信号
uchar read_add(uchar);
void key_scan();
void write_add(uchar address,uchar date);
void delay1ms(uint z);
void delay();
void stop(); //停止
void respons();//应答
void init();
void write_byte(uchar date);
uchar read_byte();
//全局变量声明
uchar key=0;
uchar password[6];
uchar KeyCnt;
uchar flag=0;
uchar password_err;
uchar ok_right;
//ii2c芯片的时钟线和数据线
sbit sda=P2^3;
sbit scl=P2^2;
//主函数
void main(){
uchar temp,i;
uchar password_err=0;
uchar password_old[6]={0};
KeyCnt=0;
flag=0;
ok_right=0;
password_err=0;
init();//ii2c芯片初始化
for(i=0;i<6;i++){
temp=read_add(i+1);//调用ii2c芯片中的数据(已设定为6位)
if(temp<0 || temp >9 ){//如果读出的数据不对,说明为第一次使用密码锁,就初始化为0
for(i=0;i<6;i++)
password_old[i]=0;
break;
}
password_old[i]=read_add(i+1);
delay1ms(10);
}
key=255;//默认key值设定为255,为了调试使用
while(1){
key_scan();//扫描按键扫描函数
if( key <= 9 ){
password[KeyCnt]=key;
P3=KeyCnt;//输出调试信息
}
if(key == 11){//对应于ok键,判断密码是否正确
for(i=0;i<6;i++)
if(password_old[i] != password[i]){
password_err=1;
break;
}
if(password_err==1){
P2 =(P2&0xfc)|0x02;
password_err=0;
}
else {
P2 =(P2 &0xfc)|0x01;
}
}
if(key==10){//对应于s/c键,进入重设密码子程序
KeyCnt=0;
ok_right=0;
while(1){
key_scan();
//;//key=0;key=16;
if( key <= 9 ){
password[KeyCnt]=key;
P3=KeyCnt;
}
if(flag==2){ //长按
P2 =P2&0xfc;//重设的话,双灯亮
if(ok_right==7&&key==11){
for(i=0;i<6;i++)
{//重设的密码写入存储芯片中
write_add(i+1,password[i]);
delay1ms(10);
}
key=255;
KeyCnt=0;
ok_right=0;
break;
}
}
if(flag == 1){//短按
for(i=0;i<6;i++){
write_add(i+1,0);
if((i+1)/2) P2 =(P2&0xfc)|0x02;
elseP2 =(P2&0xfc)|0x01;
delay1ms(300);
}
KeyCnt=0;
ok_right=0;
key=255;
break;
}
}
}
}
}
/***************************下面为ii2c芯片操作函数集**************************/
void delay()
{ ;; }
void delay1ms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void start()//开始信号
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}
void stop()//停止
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
void respons()//应答
{
uchar i;
scl=1;
delay();
while((sda==1)&&(i<250))i++;
scl=0;
delay();
}
void init()
{
sda=1;
delay();
scl=1;
delay();
}
void write_byte(uchar date)
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<1;
scl=0;
delay();
sda=CY;
delay();
scl=1;
delay();
}
scl=0;
delay();
sda=1;
delay();
}
uchar read_byte()
{
uchar i,k;
scl=0;
delay();
sda=1;
delay();
for(i=0;i<8;i++)
{
scl=1;
delay();
k=(k<1)|sda;
scl=0;
delay();
}
return k;
}
//向ii2c芯片中写入数据
void write_add(uchar address,uchar date)
{
start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
write_byte(date);
respons();
stop();
}
//从ii2c芯片中读出数据
uchar read_add(uchar address)
{
uchar date;
start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
start();
write_byte(0xa1);
respons();
date=read_byte();
stop();
return date;
}
/***************************下面为按键扫描函数**************************/
void key_scan()
{
uchar m0,m1;
uchar temp;
P1=0xf0;//这样设置是为了能使低四位将高四位拉低,释放时自动拉高高四位
temp=P1;
if(temp!=0xf0)
{
delay1ms(10);//延时,去除抖动
if(temp!=0xf0)
{
m0=temp;//获得按键的列号(对应的就是高4位)
P1=0x0f;
temp=P1;
if(temp!=0x0f)
{
m
密码锁课程设 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)