问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

求电子密码锁的设计。要自己做的,独一份。 发到404888191@qq.com...

发布网友 发布时间:2024-04-06 01:30

我来回答

1个回答

热心网友 时间:2024-08-01 11:34

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define WRITE 0xA0 /* 定义24C04的器件地址SLA和方向位W */
#define READ 0xA1 /* 定义24C04的器件地址SLA和方向位R */
#define FALSE 0
#define TRUE ~FALSE
//////////////////////////////////////////////////////////////////////
#define HIGH 1
#define LOW 0
sbit lcdrs=P2^0;
sbit lcdrw=P2^1;
sbit lcden=P2^2;
sbit alarm=P2^3;
sbit red=P2^7;
sbit green=P2^6;
sbit SDA = P3^6;
sbit SCL = P3^7;
sbit WP = P3^5;
uchar hour,min,sec,us,js=0;
uchar flag=1,canscan=0,lock=0;
uchar password[6];
uchar password1[6];
uchar password2[6];
uchar input[6]={0,1,2,3,4,5};
uchar code a[]={0xF7,0xFB,0xFD,0xFE};
uchar CODE[6] = {0,0,0,0,0,0};
uchar scannum=0;

void delay1( void )
{
}
/****************************************************************************
* 函数原型: void I_start(void);
* 功 能: 提供I2C总线工作时序中的起始位。
****************************************************************************/
void I_start( void )
{ SDA = HIGH ;
delay1() ;
SCL = HIGH ;
delay1() ;
SDA = LOW ;
delay1() ;
SCL = LOW ;
delay1() ;
}
/****************************************************************************
* 函数原型: void I_stop(void);
* 功 能: 提供I2C总线工作时序中的停止位。
****************************************************************************/
void I_stop( void )
{
SDA = LOW ;
delay1() ;
SCL = HIGH ;
delay1() ;
SDA = HIGH ;
delay1() ;
SCL = LOW ;
delay1() ;
}
/****************************************************************************
* 函数原型: void I_init(void);
* 功 能: I2C总线初始化。在main()函数中应首先调用本函数, 然后再调用
* 其它函数。
****************************************************************************/
void I_init( void )
{
SCL = LOW ;
I_stop() ;
}
/****************************************************************************
* 函数原型: bit I_clock(void);
* 功 能: 提供I2C总线的时钟信号, 并返回在时钟电平为高期间SDA 信号线上状
* 态。本函数可用于数据发送, 也可用于数据接收。
****************************************************************************/
bit I_clock( void )
{
bit sample ;
SCL = HIGH ;
delay1() ;
sample = SDA ;
SCL = LOW ;
delay1() ;
return ( sample ) ;
}
/****************************************************************************
* 函数原型: bit I_send(uchar I_data);
* 功 能: 向I2C总线发送8位数据, 并请求一个应答信号ACK。如果收到ACK应答
* 则返回1(TRUE), 否则返回0(FALSE)。
****************************************************************************/
bit I_send( uchar I_data )
{
uchar i ;
/* 发送8位数据 */
for ( i=0 ; i<8 ; i++ )
{
SDA = (bit)( I_data & 0x80 ) ;
I_data = I_data << 1 ;
I_clock() ;
}
/* 请求应答信号ACK */
SDA = HIGH ;
return ( ~I_clock() );
}
/****************************************************************************
* 函数原型: uchar I_receive(void);
* 功 能: 从I2C总线上接收8位数据信号, 并将接收到8位数据作为一个字节
* 返回, 不回送应答信号ACK。主函数在调用本函数之前应保证SDA信
* 号线处于浮置状态, 即使8051的P1.7脚置1。
****************************************************************************/
uchar I_receive( void )
{
uchar I_data = 0;
register uchar i ;
for ( i=0 ; i<8 ; i++ )
{
I_data *= 2 ;
if (I_clock()) I_data++;
}
return ( I_data ) ;
}
/****************************************************************************
* 函数原型: void I_Ack(void);
* 功 能: 向I2C总线发送一个应答信号ACK, 一般用于连续数据读取时。
*****************************************************************************/
/*void I_Ack( void )
{
SDA = LOW ;
I_clock() ;
SDA = HIGH ;
} *
/****************************************************************************
* 函数原型: bit E_address(uchar Address);
* 功 能: 向24C04写入器件地址和一个指定的字节地址。
*****************************************************************************/
bit E_address( uint Address )
{
I_start() ;
if ( I_send( WRITE ) )
return ( I_send( Address ) ) ;
else
return ( FALSE ) ;
}
/****************************************************************************
* 函数原型: bit E_read_block(void);
* 功 能: 从24C04中读取BLOCK_SIZE个字节的数据并转存于外部RAM存储映象
* 单元, 采用序列读操作方式从片内0地址开始连续读取数据。如果
* 24C04不接受指定的地址则返回0(FALSE)。
*****************************************************************************/
uchar E_read(uchar add )
{ uchar rec=0;
E_address(add);
I_start() ;
I_send( READ );
rec = ( I_receive() );
I_clock() ;
I_stop() ;
return rec;
}
/****************************************************************************
* 函数原型: void wait_5ms(void);
* 功 能: 提供5ms延时(时钟频率为12MHz)。
*****************************************************************************/
void wait_5ms( void )
{
int i ;
for ( i=0 ; i<1000 ; i++ );
}
/****************************************************************************
* 函数原型: bit E_write_block(void);
* 功 能: 将外部RAM存储映象单元中的数据写入到24C04的头BLOCK_SIZE个字节。
* 采用字节写操作方式, 每次写入时都需要指定片内地址。如果24C04
* 不接受指定的地址或某个传送的字节未收到应答信号ACK, 则返回0
* (FALSE)。
*****************************************************************************/
void E_write( uchar s,uint add )
{
if ( E_address(add) )
{ if(I_send(s))
{
I_stop() ;
wait_5ms();
}
}
}

void t0_init()
{
TMOD=0x01;
TL0=0xb0;
TH0=0x3c;
TR0=0;
EA=1;
ET0=1;
}

void delay(uchar n)
{
uchar i;
while(n--)
for(i=125;i>0;i--);
}
/*1602液晶程序*/
//向液晶写入命令或地址
void write_com(uchar com)
{
lcdrs=0;
lcdrw=0;
P0=com;
delay(2);
lcden=1;
delay(2);
lcden=0;
}
//向液晶写入数据
void write_data(uchar date)
{
lcdrs=1;
lcdrw=0;
P0=date;
delay(2);
lcden=1;
delay(2);
lcden=0;
}
//设置显示模式
void init_lcd()
{
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
//显示位置确定
void gotoxy(uchar x,uchar y)
{
if(x==1)
write_com(0x80+y);
if(x==2)
write_com(0xc0+y);
}
//字符串的显示
void write_str(uchar *str)
{
while(*str!='\0')
{
write_data(*str);
delay(2);
str++;
}
}
//数字的显示
void write_num(uchar num)
{
write_data(0x30+num);
}

void write_num2(uchar num)
{
uchar x,y;
x=num/10;
y=num%10;
write_num(x);
write_num(y);
}
/*按键子程序*/
uchar scan(void)
{
uchar row,col;
uchar j,m;
P1=0xF0;
if((P1&0xF0)!=0xF0)
{
delay(1);
if((P1&0xF0)!=0xF0)
col=~(P1|0x0F);
j=0;
P1=a[j];
while(j<=3)
{
if((P1&0xF0)!=0xF0)
{
row=~a[j];
break;
}
else
{j++;P1=a[j];}
}
m=row+col;
return(m);
}
else
return(0);
}
uchar coding(uchar m)
{
uchar k;
switch(m)
{
case(0x08+0x80):k=0;break;
case(0x08+0x40):k=1;break;
case(0x08+0x20):k=2;break;
case(0x08+0x10):k=3;break;
case(0x04+0x80):k=4;break;
case(0x04+0x40):k=5;break;
case(0x04+0x20):k=6;break;
case(0x04+0x10):k=7;break;
case(0x02+0x80):k=8;break;
case(0x02+0x40):k=9;break;
case(0x02+0x20):k=10;break;
case(0x02+0x10):k=11;break;
case(0x01+0x80):k=12;break;
case(0x01+0x40):k=13;break;
case(0x01+0x20):k=14;break;
case(0x01+0x10):k=15;break;
}
return(k);
}

void setpassword()//修改密码子函数
{
uchar tmp,key,i=0,j,jj;
gotoxy(1,0);
write_str(" ");
gotoxy(1,10);
write_str("SET ");
while(1)
{
tmp=scan();
if(tmp!=0&&js==0)
{
key=coding(tmp);
if(key<=9&&i<6)//输入密码
{
if(i<6){password1[i]=key;gotoxy(1,i);write_data(0x2a);}
i++;
alarm=0;
delay(250);
alarm=1;
}

if(i>=6&&(key==11)){
gotoxy(1,10);
write_str("SET AG");
gotoxy(1,0);
write_str(" ");
js=js+1;
i=0;
// break;
}
delay(250);
}
if(tmp!=0&&js==1)
{
key=coding(tmp);
if(key<=9&&i<6)//输入密码
{
if(i<6){password2[i]=key;gotoxy(1,i);write_data(0x2a);}
i++;
alarm=0;
delay(250);
alarm=1;
}

if(i>=6&&(key==11)){
for(j=0;j<=5;j++)
{
if (password2[j]!=password1[j])
{
gotoxy(1,10);
write_str("SET er");
gotoxy(1,0);
write_str(" ");
break;
}
else
{
for(jj=0;jj<=5;jj++)
{
password[jj]=password1[jj];
}
gotoxy(1,10);
write_str("SET OK");
gotoxy(1,0);
write_str(" ");
js=0;
break;
}

}
js=0;
break;
delay(250);
}
}
}
}

void buzzeralarm()//报警函数
{
alarm=0;
delay(250);
alarm=1;
delay(250);
alarm=0;
delay(250);
alarm=1;
delay(250);
alarm=0;
delay(250);
alarm=1;
delay(250);
}

void time0() interrupt 1
{
TL0=0xb0;
TH0=0x3c;
alarm=0;
if(++us==20)
{
us=0;
gotoxy(1,6);
write_num2(sec);
gotoxy(1,3);
write_num2(min);
gotoxy(1,0);
write_num2(hour);
if(++sec==60)
{
sec=0;
if(++min==60)
{
min=0;
if(++hour==1)
{
hour=0;TR0=0;lock=0;
gotoxy(2,10);
write_str("UNLOCKED");
}
}
}
}
if (min==5)
{
hour=0;TR0=0;lock=0;
gotoxy(2,10);
write_str("UNLOCKED");
alarm=1;
scannum=0;
gotoxy(1,0);
write_str(" ");
}
}

void main(void)
{
uchar tmp,key,i=0,j,ii;
green=0;
red=0;
t0_init();
init_lcd();
I_init();
WP = 0;
for(ii = 0;ii <6;ii++)
{
E_write(CODE[ii],ii);
}
for(ii = 0;ii < 6;ii++)
{
password[ii]= E_read(ii);
}
while(1)
{
tmp=scan();
if(tmp!=0)
{
key=coding(tmp);
if((key<=9)&&(i<6)&&(lock==0)&&(green!=1))//输入密码
{ red=0;
gotoxy(1,10);
write_str(" ");
gotoxy(1,i);
input[i]=key;
i++;
alarm=0;
write_data(0x2a);
delay(250);
alarm=1;
}
if(key==10)//清除已输入的密码
{
gotoxy(1,i-1);
write_data(0x20);
if(i>0)i--;
delay(250);
}
if(i==6&&key==11)//确认键
{
i=0;
for(j=0;j<=5;j++)
{
if(input[j]!=password[j])flag=1;
else flag=0;
}
if(lock==0)
{
if(flag){
scannum++;
gotoxy(2,10);
write_str("ERR! ");
write_num(scannum);
red=1;
for(j=0;j<=1;j++)
{
buzzeralarm();
}
if(scannum==3){lock=1;TR0=1;}
}
else {
gotoxy(2,10);
write_str("OK! ");
green=1;
buzzeralarm();
}
}
if(lock){gotoxy(2,10);
write_str("LOCKED");}
gotoxy(1,0);
write_str(" ");
canscan=0;
delay(250);
}
if((green==1)&&(key==13)){green=0; scannum=0;gotoxy(2,10);
write_str("LOCKED");}
if((key==12)&&(green==1))//修改密码
{
setpassword();
}
}
}
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
全国一卷2016高考语文作文奖惩之后怎样写 如何理解2016年全国卷一语文作文题目 迪丽热巴初吻对象曝光[迪丽热巴的初吻给了谁] 北京同等学力申硕专业目录 同等学力申硕是哪些专业 同等学力申硕都有哪些专业可以选择 同等学力申硕专业有哪些 2024年同等学力申硕招生专业目录 同等学力申硕专业一览表 2024年同等学力招生专业有哪些? 100分急求算法与数据结构高手帮写实验报告!!! 切开西瓜保存方法切开的西瓜怎么保存 为什么海边的天空是粉色 草甘膦对树木有危害吗?出现什么症状。 作者为什么用只有一个地球做课题 为什么说只有一个地球青山不老的题目好好在哪里? 请问水银开关在生活中哪些电器有用到?还有一个问题,水银开关有限电器电 ... 六年级上册第八单元哪一课的题目好,好在哪 今晚在建设银行存钱,被显示操作超时,钱被暂存了,请问钱有没有事情,我... 卫衣不能泡洗的原因? 北汽威旺m3o普通钥匙怎么锁门 郭吉安现在是什么职务? 户外休闲椅安装攻略 c 里怎么给数组定义一个空间? C语言中用数组开辟一块足够的空间,实现向数组中进行数据的添加,插入... 关于java数组开辟空间 系统怎样为数组开辟存储空间来存放数组的?例如:int a[2][3] 的存储... 矮个子可以打排球吗 左肺下叶,占左肺的百分之八十了,还可以做微创的吗? 四个字霸气队名 买海尔冰箱送空气炸锅,没收到赠品不小心给点击确认收货了怎么办?_百 ... 浓五的酒馆中了一个空气炸锅什么时候收到 求高手把这个日本出游路线翻译成日语,跪谢!!捉急啊!! 樱花树怕水淹吗樱花树怕水多吗 微信手机号在24小时内,已绑定两个,已达到限制,不能在绑定其他微信... 一个号码怎么注册两个码 摩托车嘉陵金悍125-7a仪表灯是什么型号的? 一个手机号注册两个怎么弄 丝印代码4C7、7A分别代表什么型号的IC? ...注册会计师《审计》知识点:主要业务活动和相关内部控制 你觉得银河护卫队3能够成为漫威影视的最佳吗? 听戏听得怎么形容 高考网上阅卷是怎么回事?答题时需要注意些什么? 温州南塘印象主题酒店无线密码 百泉镇秀峰东路74号怎么去,印象主题酒店 江西南城县有什么性价比高的宾馆? 赌博只有口供没有证据能判 郭德纲的生日是几月几号郭德纲的生日是什么时候 重庆9月份时和卖烤红薯吗? 健康证办一个要多少钱