找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5766|回复: 4
收起左侧

强大的单片机密码锁程序(可密码更改,按上锁按键关闭密码锁,设置密码)

[复制链接]
ID:430893 发表于 2019-7-27 09:59 | 显示全部楼层 |阅读模式
/*******************************************************************************
初始密码:000000         密码位数:6位
注意:掉电后,所设密码会丢失,重新上电时,密码恢复为原始的000000
与P1.0相连的8位发光LED点亮代表锁被打开;熄灭代表锁被锁上
程序功能:
                  1、开锁:
                  下载程序后,直接按六次数字0(即代表密码000000),LED亮,锁被打开,输入密码时,
                  六位数码管依次显示小横杠。
                  2、更改密码:
                  只有当开锁(LED亮)后,该功能方可使用。
                  首先按下更改密码键,然后设置相应密码,此时六位数码管会显示设置密码对应
                  的数字。最后设置完六位后,按下
      确认密码更改,此后新密码即生效。
                  3、重试密码:
                  当输入密码时,密码输错后按下重试键,可重新输入六位密码。
                  当设置密码时,设置中途想更改密码,也可按下此键重新设置。
                  4、关闭密码锁:
                  按下上锁按键即可将打开的密码锁关闭。
                  
功能测试:输入原始密码000000---按下更改密码按键---按0到9设置密码---按确认键
       密码更改---按上锁按键关闭密码锁---输入新的密码打开密码锁
*******************************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar old1,old2,old3,old4,old5,old6; //原始密码000000
unsigned char PassWord[6];
uchar new1,new2,new3,new4,new5,new6;  //每次MCU采集到的密码输入
uchar a=16,b=16,c=16,d=16,e=16,f=16; //送入数码管显示的变量
uchar wei,key,temp;
unsigned char st=0;
bit allow,genggai,ok,wanbi,retry,close;         //各个状态位         

sbit beep=P3^6;
sbit Lock=P3^7;
sbit GLED=P3^5;
sbit RLED=P3^4;
sbit SCL = P3^3;                  //引脚定义
sbit SDA = P3^2;
unsigned char code table[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40};

void InitI2C();
void I2CStart();
void I2CStop();
void I2CSend(uchar byte);
uchar I2CRead();
uchar read_eeprom(uchar addr);
void write_eeprom(uchar addr, uchar databyte);
/*****************************************************************************
** 函数名称:delay
** 功能描述:延时
******************************************************************************/
void delay(unsigned int i)
{
        uint j,k;
  for(j=i;j>0;j--)
    for(k=125;k>0;k--);
}

/*****************************************************************************
** 函数名称:InitI2C
** 功能描述:配置模拟I2C的IO端口
******************************************************************************/
void InitI2C()
{
         SDA = 1;
         SCL = 1;
}
/*****************************************************************************
** 函数名称:I2CStart
** 功能描述:发送I2C总线起始状态
** 输    入:无
** 输    出:无
** 全局变量:无
** 调用模块:delay()
** 可移植性:直接移植
******************************************************************************/
void I2CStart()
{
        SDA = 1;   
        delay(1);      // 延时子程序
        SCL = 1;
        delay(1);
        SDA = 0;
        delay(1);
        SCL = 0;
}
/*****************************************************************************
** 函数名称:I2CStop
** 功能描述:发送I2C总线停止起始状态
** 输    入:无
** 输    出:无
** 全局变量:无
** 调用模块:delay()
** 可移植性:直接移植
******************************************************************************/
void I2CStop()
{
        SCL = 0;
    delay(1);
        SDA = 0;
        delay(1);
        SCL = 1;
        delay(1);
        SDA = 1;
        delay(1);
}
/*****************************************************************************
** 函数名称:I2CSend
** 功能描述:向I2C总线发送一个字节数据,并检测应答
** 输    入:待发送字节byte
** 输    出:无
** 全局变量:无
** 调用模块:delay()
** 可移植性:直接移植
******************************************************************************/
void I2CSend(uchar byte)
{
        uchar mask;
        uchar i;
        mask = 0x80;
        for(i = 0; i < 8; i++)
        {
                SCL = 0;
                delay(1);
                if((mask & byte) == 0)
                {
                        SDA = 0;
                }
                else
                {
                        SDA = 1;
                }
                mask >>= 1;
                delay(1);
                SCL = 1;
                delay(1);
        }
        
        SCL = 0;
        SDA = 1;
        delay(1);
        SCL = 1;
        delay(1);
        SCL = 0;

        
}
/*****************************************************************************
** 函数名称:I2CRead
** 功能描述:从I2C总线读取最后一个字节数据,并发送非应答位
** 输    入:无
** 输    出:接收到的字节byte
** 全局变量:无
** 调用模块:delay()
** 可移植性:直接移植
******************************************************************************/
uchar I2CRead()
{
        uchar byte;
        uchar i;
        byte = 0;
        for(i = 0; i < 8; i++)
        {
                SCL = 0;
                SDA = 1;
                delay(1);
                SCL = 1;
                delay(1);
                byte <<= 1;         
                if(SDA == 1)
                {
                        byte |= 0x01;
                }
                delay(1);
        }
        SCL = 0;
        SDA = 1;
        delay(1);
        SCL = 1;
        delay(1);
        SCL = 0;
        
        return byte;
}
/*****************************************************************************
** 函数名称:read_eeprom
** 功能描述:读取EEPROM数据函数
** 输    入:EEPROM中目的地址addr
** 输    出:读取的数据
******************************************************************************/
uchar read_eeprom(uchar addr)
{
        uchar databyte;
        I2CStart();
        I2CSend(0xa0);
        I2CSend(addr);
        I2CStart();
        I2CSend(0xa1);
        databyte = I2CRead();
        I2CStop();
        return databyte;
        
}
/*****************************************************************************
** 函数名称:write_eeprom
** 功能描述:向EEPROM写入数据函数
** 输    入:EEPROM中目的地址addr及写入的数据
** 输    出:无
******************************************************************************/
void write_eeprom(uchar addr, uchar databyte)
{
        I2CStart();
        I2CSend(0xa0);            
        I2CSend(addr);
        I2CSend(databyte);
        I2CStop();
}
void display(void)
{
        
   switch(st)
        {
                case 0: st=1;P0=0xff;P2=table[a];P0=0xfe;break;
                case 1: st=2;P0=0xff;P2=table;P0=0xfd;break;
                case 2: st=3;P0=0xff;P2=table[c];P0=0xfb;break;
                case 3: st=4;P0=0xff;P2=table[d];P0=0xf7;break;
                case 4: st=5;P0=0xff;P2=table[e];P0=0xef;break;
                case 5: st=0;P0=0xff;P2=table[f];P0=0xdf;break;
        }
}
void Timer0() interrupt 1
{
        TR0=0;
         TH0  = (65535-2000)/256;
        TL0  = (65535-2000)%256;
        display();

//............................................剩余代码请下载压缩包..........................................

QQ图片20190727095845.png

密码锁.zip

49.43 KB, 下载次数: 59, 下载积分: 黑币 -5

强大的密码锁(可密码更改,按上锁按键关闭密码锁,设置密码)

回复

使用道具 举报

ID:1 发表于 2019-7-27 22:17 | 显示全部楼层
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

ID:56665 发表于 2019-7-31 08:21 | 显示全部楼层
下载了,谢谢分享,最好有原理图。
回复

使用道具 举报

ID:863477 发表于 2020-12-19 16:32 | 显示全部楼层
有没有原理图
回复

使用道具 举报

ID:851329 发表于 2020-12-19 17:13 | 显示全部楼层
来个原理图就完美了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表