产品选型

51单片机源代码 51单片机控制的万能密码锁(附仿真文件+源代码)

小编 2024-10-24 产品选型 23 0

51单片机控制的万能密码锁(附仿真文件+源代码)

前几天有小伙伴留言说想知道单片机是怎么样控制密码锁的,正好做过一个类似的实验,下面我分享出来,希望对你们有所帮助。

51单片机控制的万能密码锁系统,PROTEUS仿真文件

初始密码:12345678

此程序用51单片机控制74LS164锁存器来实现

单片机与存储器之间通过IIC 通过通讯来建立密码系统通讯

仿真启动开始设置密码

万能密码锁参考程序源代码:

#include<AT89x51.h>

#include"intrins.h"

#include"key.h"

#include"xsh.h"

#include"24c02.h"

#define ulong unsigned long

bit BJCB=0;//报警标志

XG=0,//修改密码标志位

BJ=0,//报警标志位

SJ=0;//锁键盘标志位

// xg=0;//修改密码标志位

uchar PSWD0_0[16]={0};//密码输入缓存存储单元

//uchar code PSWD0_1[16]={1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8};//用户初始密码存储单元

//uchar PSWD1_0[16]={0};//读出密码缓存存储单元

uchar PSWD1_1[16]={1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8};////管理员初始密码存储单元

sbit OUT=P3^5;//输出端口

sbit L1=P0^2;//上电指示

sbit L2=P0^1;//开锁指示

sbit L3=P0^0;//报警指示

uint mg=0,//密码个数

KSC=0,//开锁次数

BJC=0,//报警次数

TCNTY=0,//用户按键定时次数累加

TCNTG=0,//管理员输入密码定时次数

yhsh,//用户输入标志位

glsh,//管理员输标志位

shw;//密码输入标志位

void yhmimaxig();//密码修改程序

void glmimaxig();//管理员修改程序

void bjyin(ulong t)

{

ulong c;

uint n;

for(c=0;c<t;c++)

{

for(n=0;n<50;n++); //延时

BEEP=~BEEP; //取反输出到喇叭的信号

}

}

void delay_10ms(void)

{

uint i = 1000;

while(i--);

}

//////////////定时中断服务函数//////////////////////////////////////

void timer0() interrupt 1

{

uint i;

TH0=(65536-50000)/256; //对TH0 TL0赋值50MS定时

TL0=(65536-50000)%256; //重装计数初值

if(yhsh==1)

{

TCNTY++;//用户定时计数

if(shw==1)

{

TR0=0;

TCNTY=0;

}

if(TCNTY==400)

{

TR0=0;//关闭T0定时器

TCNTY=0;

mg=0;//密码个数清零

L1=1;

for(i=0;i<2;i++)//声光报警电路

{

L3=0;

bjyin(1000);

L3=1;

delay(1000);

}

L1=0;

}

}

else if(glsh==1)

{

TCNTG++;//管理员定时计数

if(shw==1)

{

TR0=0;

TCNTG=0;

}

if(TCNTG==400)

{

TR0=0;//关闭T0定时器

TCNTG=0;

mg=0;//密码个数清零

L1=1;

for(i=0;i<2;i++)//声光报警电路

{

L3=0;

bjyin(1000);

L3=1;

delay(1000);

}

L1=0;

}

}

}

void main()

{

uint i;

TMOD=0x01; //定时器工作在方式1

ET0=1;

EA=1;

TH0=(65536-50000)/256; //对TH0 TL0赋值

TL0=(65536-50000)%256; //使定时器0.05秒中断一次

//Read_page24c02(0x00,PSWD1_1,16);//向24c02里读用户初始密码

//i2cWrite24LC16B(0,0X20);

/////////////第一次向24c02里写入初始管理员密码、用户密码、开锁次数/////////////////////

for(i=0;i<16;i++) //用一次写一个向24c02里写

{

i2cWrite24LC16B(PSWD1_1[i],i);

delay_10ms;

}

for(i=0;i<16;i++) //用一次写一个向24c02里写

{

i2cWrite24LC16B(PSWD1_1[i],0x10+i);

delay_10ms;

} //proteus仿真时用,烧程序时,第一次用,第二次不用。

KSC=i2cRead24LC16B(0X20);

loop: L1=0;//上电红灯亮

L2=1;//开锁成功后绿灯亮

L3=1;//输错时黄灯亮报警

OUT=0;//开信号关闭

display_0(KSC);//开锁前显示

///////////密码输入/////////////////

if(SJ==0)//锁键盘标志位为0

{

do

{

flag=0;//键盘标志位

key();

if(flag==1&&num==12) //判断是否为管理员功能键按下

{

goto gl;

}

if(flag==1&&num<=9)

{

PSWD0_0[mg]=num;

mg++;//密码个数

}

if(flag==1&&num==14&&mg>=1)//输入错误删除

{

mg=mg-1;

}

if(mg==1) //有密码键按下开定时器限时

{

TR0=1;

yhsh=1;

}

}

while(num!=15);

if(mg!=16)

{

for(i=mg;i<16;i++)

{

PSWD0_0[i]=0;

}

}

/////////////////密码比较电路////////////////////////////

if(flag==1&&num==15)

{ flag=0;

yhsh=0;

shw=1;

num=0;

for(i=0;i<16;i++) //从24c02里读出16个密码

{

PSWD1_1[i]=i2cRead24LC16B(i);

delay_10ms;

}

for(i=0;i<16;i++)

{

if(PSWD1_1[i]!=PSWD0_0[i])

{

BJCB=1;

break;

}

else

BJCB=0;

}

}

if(BJCB!=0)

{

BJC++;

if(BJC!=3)

{

BJCB=0; //第一次和第二次报警

delay(500);

mg=0;//密码个数清零

L1=1;

for(i=0;i<3;i++)//声光报警电路

{

L3=0;

display_3();

bjyin(1000);

L3=1;

delay(1000);

}

goto loop;

}

else if(BJC==3)

{

BJC=0;

BJCB=0;

display_5();//三次输入密码失败,自锁

SJ=1;//锁键盘标志位

mg=0;//密码个数清零

L1=1;

for(i=0;i<2;i++)//声光报警电路

{

L3=0;

bjyin(1000);

L3=1;

delay(1000);

}

goto loop;

}

}

else

if(BJCB==0)

{

KSC++;

display_1(KSC);

i2cWrite24LC16B(KSC,0X20);

if(KSC==100)

{

SJ=1;

}

L2=0;

L1=1;

OUT=1;

mg=0;//密码个数清零

loop1:do //键盘扫描等待功能键按下

{

flag=0;

key();

if(flag)

{

flag=0;

switch(num)

{

case 13:

{

display_2();

do

{

flag=0;//键盘标志位

key();

if(flag==1&&num<=9)

{

PSWD0_0[mg]=num;

mg++;//密码个数

}

if(flag==1&&num==14&&mg>=1)//输入错误删除

{

mg=mg-1;

}

if(mg==16)

{

do //键盘扫描等待功能键按下

{

flag=0;

key();

}

while(num!=15);

}

}

while(num!=15);

if(mg!=16&&num==15)

{

for(i=mg;i<16;i++)

{

PSWD0_0[i]=0;

}

}

if(flag==1&&num==15)

{

flag=0;

mg=0;

for(i=0;i<16;i++) //用一次写一个向24c02里写

{

i2cWrite24LC16B(PSWD0_0[i],i);

delay_10ms;

}

display_1(KSC);

do //键盘扫描等待功能键按下

{

flag=0;

key();

}

while(num!=11); //按下返回键,锁锁返回

{

goto loop;

}

}

};break;

case 11: {

goto loop;

//break;

}

}

}

}

while(flag!=0);//如果设置密码键按下

goto loop1;

// i2cWrite24c02_page(0x00,PSWD1_1,mg);

}

}

else

{

do

{

flag=0;

key();

}

while(num!=12);//判断是否为管理员功能键按下

gl:do//管理员输入密码

{

flag=0;

key();

if(flag==1&&num<=9)

{

PSWD0_0[mg]=num;

mg++;//密码个数

}

if(flag==1&&num==14&&mg>=1)//删除键按下

{

mg=mg-1;

}

if(mg==1)

{

TR0=1;

}//开定时器TO限5秒开锁

}

while(num!=15);

if(mg!=16&&num==15)

{

for(i=mg;i<16;i++)

{

PSWD0_0[i]=0;

}

}

//////////管理员密码比较///////////////////////

//Read_page24c02(0x10,PSWD0_1,16)

for(i=0;i<16;i++) //从24c02里读出16个密码

{

PSWD1_1[i]=i2cRead24LC16B((0x10+i));

delay_10ms;

}

if(flag==1&&num==15)

{ flag=0;

shw=1;

num=0;

for(i=0;i<mg;i++)

{

if(PSWD1_1[i]!=PSWD0_0[i])

{ BJCB=1;

break;

}

else

BJCB=0;

}

}

if(BJCB!=0)

{

BJC++;

if(BJC!=3)

{

BJCB=0; //第一次和第二次报警

mg=0;//密码个数清零

L1=1;

for(i=0;i<2;i++)//声光报警电路

{

L3=0;

display_3();

bjyin(1000);

L3=1;

delay(1000);

}

display_1(KSC);

goto loop;

}

else

{

BJCB=0;

display_5();//三次输入密码失败,自锁

mg=0;//密码个数清零

delay(10000);

display_1(KSC);

goto loop;

}

}

else

{

SJ=0;

display_4();//管理员开锁显示

mg=0;

L2=0;

L1=1;

L3=0;//密码个数清零

do //键盘扫描等待功能键按下

{

flag=0;

key();

}

while(flag==0); //如果设置密码键按下

if(flag==1&&num==13)

{

flag=0;

display_2();

do

{

flag=0;//键盘标志位

key();

if(flag==1&&num<=9)

{

PSWD0_0[mg]=num;

mg++;//密码个数

}

if(flag==1&&num==14&&mg>=1)//输入错误删除

{

mg=mg-1;

}

if(mg==16)

{

do //键盘扫描等待功能键按下

{

flag=0;

key();

}

while(num!=15);

}

}

while(num!=15);

if(mg!=16&&num==15)

{

for(i=mg;i<16;i++)

{

PSWD0_0[i]=0;

}

}

if(flag==1&&num==15)

{

flag=0;

mg=0;

for(i=0;i<16;i++) //用一次写一个向24c02里写

{

i2cWrite24LC16B(PSWD0_0[i],(0x10+i));

delay_10ms;

}

display_4();

do //键盘扫描等待功能键按下

{

flag=0;

key();

}

while(num!=11); //按下返回键,锁锁返回

{

goto loop;

}

}

}

if(flag==1&&num==10)

{

KSC=0;

i2cWrite24LC16B(KSC,0X20);

display_1(KSC);

do //键盘扫描等待功能键按下

{

flag=0;

key();

}

while(num!=11);//按下返回键,锁锁返回

goto loop;

}

if(flag==1&&num==11)//按下返回键,锁锁返回

{

goto loop;

}

}

}

}

最后,如果有什么意见或者建议欢迎您留言给我,让我们共同学习一起进步,

如果需要 完整代码或设计文件,请在下方留言或者私信我,看到后会第一时间回复。

谢谢大家!

如果喜欢我的文章请评论转发加关注哦。

51单片机 16X192点阵程序动态显示汉字 教程(附仿真文件+源代码)

网友投稿

最近有小伙伴给我留言说希望我能写一篇汉子动态程序显示的文章,他想学习这方面的知识,我就抽空用仿真软件做了一个,鉴于项目比较简单,我就不过多的描述了,有问题请及时留言。

下面进入正题:

51单片机 16X192点阵程序动态显示任意汉字

程序参考源代码如下:

#include<AT89X52.H>

sbit ST=P3^5;

sbit E1=P3^4;

sbit MR=P3^7;

char cashe[12];

char code wd[12][16]={

{0xFF,0xC0,0xFE,0xFE,0xFE,0xFE,0x80,0xFE,0xFD,0xFD,0xFB,0xF7,0xEF,0xDF,0x3F,0xFF},

{0xFF,0x03,0xFF,0xFF,0xFF,0xFF,0x01,0x7F,0x7F,0x7F,0x7F,0x7F,0x7D,0x7D,0x81,0xFF},/*"无",0*/

/* (16 X 16 , 宋体 )*/

{0xDF,0xDF,0xDF,0xCF,0x57,0x58,0x5F,0xDF,0xDE,0xDE,0xDE,0xDD,0xDD,0xDB,0xDB,0xD7},

{0x7F,0x6F,0x73,0x77,0x7F,0x01,0x5F,0x5F,0xDF,0xDF,0xDF,0xDF,0xDD,0xDD,0xE1,0xFF},/*"忧",1*/

/* (16 X 16 , 宋体 )*/

{0xFE,0xFE,0xFE,0xC0,0xDE,0xDE,0xC0,0xDE,0xDE,0xDE,0xC0,0xDE,0xFE,0xFE,0xFF,0xFF},

{0xFF,0xFF,0xFF,0x07,0xF7,0xF7,0x07,0xF7,0xF7,0xF7,0x07,0xF7,0xFD,0xFD,0x01,0xFF},/*"电",2*/

/* (16 X 16 , 宋体 )*/

{0xFF,0xC0,0xFF,0xFF,0xFF,0xFE,0xFE,0xFE,0x00,0xFE,0xFE,0xFE,0xFE,0xFE,0xFA,0xFD},

{0xFF,0x0F,0xDF,0xBF,0x7F,0xFF,0xFF,0xFB,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},/*"子",3*/

/* (16 X 16 , 宋体 )*/

{0xFF,0x83,0xBB,0xAB,0xAA,0xAA,0xA9,0xAB,0xAB,0xAA,0xEE,0xD7,0xDB,0xBB,0x7F,0xFF},

{0x7F,0x3F,0x7F,0x01,0xFD,0xFD,0xBD,0xBD,0x5D,0xED,0x05,0xED,0xFD,0xFD,0xEB,0xF7},/*"购",4*/

/* (16 X 16 , 宋体 )*/

{0xEF,0xEF,0xAF,0xAE,0x82,0xAD,0x6B,0xEB,0xE6,0xCD,0x2B,0xEF,0xEE,0xED,0xEB,0xFF},

{0x7F,0x7F,0x7F,0x03,0xAB,0xAB,0x6B,0x6B,0xDB,0xDB,0xBB,0x7B,0xFB,0xFB,0xD7,0xEF},/*"物",5*/

/* (16 X 16 , 宋体 )*/

};

void del(int i)//============================//延时程序

{while(i--);}

aline() ////=======================发送一行的显示程序

{

char i=0;

TI=0;

for(i=0;i<12;i++)

{SBUF=cashe[i];while(~TI);TI=0;} //将缓存中的信息转存入595的存储器中,到此不显示

}

main()

{

int m=0,n=0;

TI=0;

SM0=0;

SM1=0;

E1=0;

while(1)

for(m=0;m<16;m++) //共有16行 循环16次显示这16行 串行的595送出行的数据

{ //由74hc154选中要显示的行

for(n=0;n<12;n++) //这个for循环用来向缓存数组中装载要显示的内容

{cashe[11-n]=wd[n][m];} //将第m个字的第n行信息装载 ,因为595串接 数据第一个进去的会在最后一个595中,最后进去的会在第一个595中

aline(); //将缓存中的一行信息载入595缓存中

ST=0;ST=1; //595产生上升沿 输出595锁存的数据

P2=m; //选中要显示的行输出数据

del(100);//延时一段时间,以造成视觉暂存效应

}

}

最后,如果有什么意见或者建议欢迎您留言给我,让我们共同学习一起进步,如果需要 程序完整源代码,请在下方留言或者私信我,看到后会第一时间回复。

如果喜欢我的文章请点赞转发加关注啊,谢谢!

相关问答

multisim怎么使用 51单片机 的头文件?

1.利用multisim建立一个Design,放置一个51单片机,根据向导建立一个51单片机的源代码工程,并选择生成一个main.c文件。2.在生成的main.c中有一个main函数,输...1....

51单片机 是什么内核?

答单片机内核是就是51单片机的CPU内核,字面意思就是51单片机内核构造的指令集51单片机是指80年代Intel开发的8051单片机内核的统称,就是因为这个“8051”有个5...

51单片机 ,stm32,arduino都是用什么语言进行编程的?

51单片机,STM32单片机用汇编或者C语言,现在基本都用C语言编程,Arduino有自己的编程环境,用户也是用C语言编程。51单片机的编程51单片机进入中国比较早,在...51...

51单片机 如何把低电平转高电平汇编程序?

您好,在51单片机中,可以通过修改特定的IO口的输出寄存器来实现将低电平转为高电平的操作。以下是一个简单的示例汇编程序:```ORG0H;程序从地址0开始执行...

51单片机 开发板有什么用?

提供稳定可靠的电路板和设备,减少硬件设计和调试周期。提供原理图,为将来的重新制板提供参考思路提供源代码,为学习、研究提供参考依据,减少了从头开始学习...

51单片机 的程序地址范围是?

MCS51单片机的最大程序空间是64k,也就是从0000开始,一直到FFFF,也就是0到65535。51单片机根据型号不同,内部分配的程序空间也不一样,比方说,程序空间是32k...

51单片机 rxd和txd引脚功能分别是?

RXD是51单片机UART串口的数据接收引脚,TXD是串口的数据发送引脚。使用的时候应该注意RXD和TXD引脚的电路标识,最早的51单片机只有一个UART串口,引脚标识就是R...

51单片机 的头文件究竟该如何写?

单片机的头文件应该包含了该单片机的所有功能模块的声明和定义,包括IO口的定义、中断向量表、外设寄存器的地址定义等。同时,头文件应该提供了一系列的宏定义...

51 系列 单片机 有哪些?

51单片机目前已有多种型号,8031/8051/8751是Intel公司早期的产品,而ATMEL公司的AT89C51、AT89S52则更实用。ATMEL公司的51系列还有AT89C2051、...

51单片机 的正确格式指令?

51单片机的正确指令格式是:[标号:]指令代码(空格)目标操作数[,源操作数][;注释][]号之内的内容可以缺省。指令例子:start:MOVR0,A;指针赋值。标号...51单...

猜你喜欢