您的位置 首页 传感器

密码锁课程设计

要求:1.设计基于单片机控制的密码锁2.基本功能要求:a.12个按键,用于输入密码及设定,其中s/c分短按(clear)和长按(set)b.两个led灯反…

要求:

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)

{

m1=temp;//取得按键的行号(对应的便是低4位)

temp=m0|m1;//组合成终究的按键好

}

KeyCnt++;

if(KeyCnt==7)

KeyCnt=0;

ok_right++;

if(ok_right==8)

ok_right=0;

switch(temp)

{

case 0xee:key=0;break;//按键对应的码表

case 0xde:key=1;break;

case 0xbe:key=2;break;

case 0x7e:key=3;break;

case 0xed:key=4;break;

case 0xdd:key=5;break;

case 0xbd:key=6;break;

case 0x7d:key=7;break;

case 0xeb:key=8;break;

case 0xdb:key=9;break;

case 0xbb:

key=10;

P1=0x0f;

delay1ms(700);

temp=P1;

if(temp == 0x0f) //短按

flag=1;

else

flag=2;//长按

break;

case 0x7b:key=11;break;

default:key=16;break;

}

do{

temp=P1;//消除按起颤动

temp&=0X0f;

}while(temp!=0x0f);

}

}

}

以上内容就能够满足要求。。。。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/chuanganqi/266669.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部