51单片机中怎么设置密码锁?
答案:2 悬赏:0 手机版
解决时间 2021-11-05 19:27
- 提问者网友:精神病院里
- 2021-11-05 11:20
谁能告诉我STC89C52单片机怎么设置密码锁?他是怎么实现的,也就是说用什么方法可以实现?谢谢
最佳答案
- 五星知识达人网友:未来江山和你
- 2019-03-08 12:35
设置一个标示位记录密码输入是否正确,正确就将该标示位置1,可以进行所有功能的操作,否则仅仅显示和按键能够使用。
全部回答
- 1楼网友:雪起风沙痕
- 2021-02-16 22:17
用stc52编的,下面是c程序,调试已经成功,自己看程序吧……
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define lcd_data p0
sbit sda=p3^5;
sbit scl=p3^4;//24c08控制口设置
sbit lcd_rs = p3^3; //寄存器选择输入
sbit lcd_rw = p3^6; //液晶读/写控制
sbit lcd_en = p3^7; //液晶使能控制
sbit lcd_psb = p3^2; //串/并方式控制
sbit fm=p2^4;//蜂鸣器控制口
sbit rs=p2^5;
sbit t_clk = p2^0; //实时时钟时钟线引脚 //
sbit t_io = p2^1; //实时时钟数据线引脚 //
sbit t_rst = p2^2; //实时时钟复位线引脚 //
sbit ds=p2^3;
sbit en=p2^6;
sbit zz=p2^7;
sbit fz=p3^1;
sbit acc0=acc^0;
sbit acc7=acc^7;
uint temp1,s_temp; //定义整形变量
float f_temp; //定义浮点型变量
uchar time[]=" : : ";
uchar day[]=" 20 / / ( ) ";
uchar temp0[]=" 温度: . 度 ";
uchar num,num1,flag,count,a,b;
uchar unlock_i;//解密标志位
uchar t[4];
uchar t1[4];
void delay_ms(uint z)//长延时
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay() //短延时,大约5us
{
; ;
}
void reshi()
{
if(rs==1)
{ unlock_i=1;
}
else
{
unlock_i=0;
}
}
uchar code mima[]={'0','1','2','3','4','5','6','7','8','9','0','*'};
void lcd_xieping0(uchar x,uchar y,uchar date);
void lcd_xieping(uchar x,uchar y,uchar *str);
/
v_wtinputbyte(ucda);
t_clk = 1;
t_rst =0;
}
uchar uc_r1302(uchar ucaddr)
{
uchar ucda;
t_rst = 0;
t_clk = 0;
t_rst = 1;
v_wtinputbyte(ucaddr); // 地址,命令 //
ucda = uc_rtoutputbyte(); // 读1byte数据 //
t_clk = 1;
t_rst =0;
return(ucda);
}
void init1302(void)
{
v_w1302(0x8e,0x00); //控制写入wp=0
v_w1302(0x80,0x80);
v_w1302(0x90,0xa9);
v_w1302(0x80,0x00); //秒
v_w1302(0x82,0x24); //分
v_w1302(0x84,0x12); //时
v_w1302(0x86,0x29); //日
v_w1302(0x88,0x10); //月
v_w1302(0x8a,0x05); //星期
v_w1302(0x8c,0x10); //年 //
v_w1302(0x8e,0x80);
}
void donetime(void)
{
uchar d;
d=uc_r1302(0x87);
day[10]=(d&0x0f)+48;
day[9]=((d>>4)&0x03)+48;
d=uc_r1302(0x89);
day[7]=(d&0x0f)+48;
day[6]=((d>>4)&0x01)+48;
d=uc_r1302(0x8b);
day[13]=(d&0x07)+48;
d=uc_r1302(0x8d);
day[4]=(d&0x0f)+48;
day[3]=(d>>4)+48;
d=uc_r1302(0x81);
time[15]=(d&0x0f)+48;
time[14]=(d>>4)+48;
d=uc_r1302(0x83);
time[12]=(d&0x0f)+48;
time[11]=(d>>4)+48;
d=uc_r1302(0x85);
time[9]=(d&0x0f)+48;
time[8]=(d>>4)+48;
}
//**************************************************************
// 温度检测函数
//**************************************************************
void dsreset(void) //18b20复位,初始化函数
{
uint i;
ds=0;
i=103;
while(i>0)i--;
ds=1;
i=4;
while(i>0)i--;
}
bit tempreadbit(void) //读1位函数
{
uint i;
bit dat;
ds=0;i++; //i++ 起延时作用
ds=1;i++;i++;
dat=ds; //读数据
i=8;while(i>0)i--;
return (dat);
}
uchar tempread(void) //读1个字节
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在dat里
}
return(dat);
}
void tempwritebyte(uchar dat) //向18b20写一个字节数据
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01; //判断最后一位是1还是0
dat=dat>>1;
if(testb) //写 1
{
ds=0;
i++;i++;
ds=1;
i=8;while(i>0)i--;
}
else
{
ds=0; //写 0
i=8;while(i>0)i--;
ds=1;
i++;i++;
}
}
}
void tempchange(void) //ds18b20 开始获取温度并转换
{
dsreset(); //初始化,每次对18b20的操作都首先要初始化
delay_ms(1);
tempwritebyte(0xcc); // 写跳过读rom指令
tempwritebyte(0x44); // 写温度转换指令
}
void get_temp() //读取寄存器中存储的温度数据
{
uchar a,b;
dsreset(); //初始化
delay_ms(1);
tempwritebyte(0xcc); // 写跳过读rom指令
tempwritebyte(0xbe); //写读指令
a=tempread(); //读低8位
b=tempread(); //读高8位
temp1=b;
temp1<<=8; //两个字节组合为1个字
temp1=temp1|a;
f_temp=temp1*0.0625; //温度在寄存器中为12位 分辨率位0.0625°
}
//**************************************************************
// 解密函数
//**************************************************************
void unlock()
{
uchar in,i;
if(num==0)
{
lcd_xieping(0,0,"**密码锁系统** ");
lcd_xieping(1,0,"—————————");
lcd_xieping(2,0," 请输入密码: ");
lcd_xieping(3,0," ");
for(i=0;i<4;i++)
{
t1[i]=keyscan1();
lcd_xieping(3,i,"*");
num=0;
}//输密码
}
in=keyscan1();
if(in==12)//in-确定键标志位
{
in=0;
num=0;
if((t1[0]==t[0])&&(t1[1]==t[1])&&(t1[2]==t[2])&&(t1[3]==t[3]))
{
flag=1;//解密成功与否标志位
//unlock_i=1;
a=0;//功能键标志
lcd_xieping(0,0,"**密码锁系统** ");
lcd_xieping(1,0,"——————————");
lcd_xieping(2,0," 密码正确! ");
lcd_xieping(3,0," 您的身份已确认");
delay_ms(1500);
lcd_xieping(1,0,"————————");
lcd_xieping(2,0,"功能 i 开锁 ");
lcd_xieping(3,0," ii修改密码");
}
else
{
flag=0;
count++;
if(count==3)
{
count=0;
num=1;
lcd_xieping(1,0,"——————————");
lcd_xieping(2,0,"您的机会已用完 ");
lcd_xieping(3,0,"对不起**无法进入");
fm=0;
delay_ms(1000);
fm=1;
}
}
}
}
//**************************************************************
// 修改密码函数
//**************************************************************
void xiugaimima()
{ uchar i,j,l,im,ib;
uchar t2[4];
uchar t3[4];
num=0;
lcd_xieping(1,0,"————————");
lcd_xieping(2,0,"请输入新密码: ");
lcd_xieping(3,0," ");
for(i=0;i<4;i++)
{
t2[i]=keyscan1();
lcd_xieping0(3,i,mima[num]);
num=0;
}
im=keyscan1();
if(im==12)//im,in,ib,同为确定键标志位
{
im=0;
num=0;
lcd_xieping(1,0,"————————");
lcd_xieping(2,0,"请再次输入新密码");
lcd_xieping(3,0," ");
for(i=0;i<4;i++)
{
t3[i]=keyscan1();
lcd_xieping0(3,i,mima[num]);
num=0;
}
}
ib=keyscan1();
if(ib==12)
{
ib=0;
num=0;
if(t2[0]==t3[0]&&t2[1]==t3[1]&&t2[2]==t3[2]&&t2[3]==t3[3])
{
t[0]=t3[0];
t[1]=t3[1];
t[2]=t3[2];
t[3]=t3[3];
lcd_xieping(1,0,"————————");
lcd_xieping(2,0," 祝贺您! ");
lcd_xieping(3,0," 密码修改成功 ");
flag=0;
for(j=0;j<4;j++)
{
l=j+1;
write(l,t[j]);
delay_ms(10);
}//24c08写数据
delay_ms(1000);
}
else
{
lcd_xieping(2,0,"两次输入密码不同");
lcd_xieping(3,0," 密码修改失败 ");
flag=1;
delay_ms(500);
}
}
}
//**************************************************************
// 显示函数
//**************************************************************
void xianshi()
{
donetime();
tempchange();
get_temp();
s_temp=f_temp*100;
temp0[7]=(s_temp/1000)+48;
temp0[8]=(s_temp%1000/100)+48;
temp0[10]=(s_temp%100/10)+48;
temp0[11]=(s_temp%10)+48;
lcd_xieping(0,0,"**密码锁系统** ");
lcd_xieping(1,0,temp0);
lcd_xieping(2,0,day);
lcd_xieping(3,0,time);
num=0;
}
//**************************************************************
// 开锁函数
//**************************************************************
void kaisuo()
{
uchar i;
lcd_xieping(2,0," 开锁中…… ");
lcd_xieping(3,0,"——耐心等待——");
for(i=3;i>0;i--)
{
fm=0;
delay_ms(100);
fm=1;
delay_ms(100);
flag=0;
}
dianjizz();
delay_ms(10000);
dianji_stop();
lcd_xieping(2,0,"—开锁过程结束—");
lcd_xieping(3,0," 请开门 ");
delay_ms(5000);
dianjifz();
delay_ms(10000);
dianji_stop();
flag=0;
}
//**************************************************************
// 主函数
//**************************************************************
void main()
{
uchar m;
unlock_i=1;
lcd_init(); //液晶初始化
//init1302();
kjxs(); //开机显示
for(m=0;m<4;m++)
{
t[m]=read(m+1);
delay_ms(10);
}//24c08读数据
while(1)
{
reshi();
if(!unlock_i)
{
unlock();//解密函数
}
else
{
xianshi();//时间、日期、温度显示函数
}
if(flag==1)
{
num1=0;
a=keyscan2();
if(a==1)
{
kaisuo();//开锁函数
}
if(a==2)
{
xiugaimima();//修改密码函数
}
}
}
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯