历史上的今天
返回首页

历史上的今天

今天是:2024年11月13日(星期三)

正在发生

2019年11月13日 | 单片机6位数电子密码锁源码+PCB+仿真原理图设计(可改密码

2019-11-13 来源:51hei

电子密码锁的电路原理图

电子密码锁的电路原理图

Altium Designer画的原理图和PCB图如下:
0.png?imageView2/2/w/550

密码锁仿真原理图如下
0.png?imageView2/2/w/5500.png?imageView2/2/w/550


以下是一套单片机电子密码锁程序:

/*******************************************************************************

初始密码:000000         密码位数:6位

注意:掉电后,所设密码会丢失,重新上电时,密码恢复为原始的000000

与P1.0相连的8位发光LED点亮代表锁被打开;熄灭代表锁被锁上


程序功能:

                  1、开锁:

                  下载程序后,直接按六次数字0(即代表密码000000),LED亮,锁被打开,输入密码时,

                  六位数码管依次显示小横杠。

                  2、更改密码:

                  只有当开锁(LED亮)后,该功能方可使用。

                  首先按下更改密码键,然后设置相应密码,此时六位数码管会显示设置密码对应

                  的数字。最后设置完六位后,按下确认密码更改,此后新密码即生效。

                  3、重试密码:

                  当输入密码时,密码输错后按下重试键,可重新输入六位密码。

                  当设置密码时,设置中途想更改密码,也可按下此键重新设置。

                  4、关闭密码锁:

                  按下上锁按键即可将打开的密码锁关闭。

                  

功能测试:输入原始密码000000---按下更改密码按键---按0到9设置密码---按确认键

       密码更改---按上锁按键关闭密码锁---输入新的密码打开密码锁

*******************************************************************************/

#include


#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[b];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();

        TR0=1;

}



void keyscan(void)

{

        P1=0xfe;

   temp=P1;

   temp=temp&0xf0;

   if(temp!=0xf0)

   {

                delay(10);

      if(temp!=0xf0)

      {        

推荐阅读

史海拾趣

ALCOA公司的发展小趣事

近年来,随着环保意识的提高,ALCOA积极推动可持续发展和环保倡议。公司致力于减少生产过程中的能源消耗和废弃物排放,同时也在研发更环保的铝材和生产工艺。这些努力不仅提升了公司的社会形象,也为其在电子行业中的长期发展奠定了坚实的基础。

以上五个故事,只是ALCOA公司发展历程中的一部分。然而,这些故事足以展现出这家公司在电子行业中的卓越成就和持续创新的精神。

Emerson公司的发展小趣事

1890年,Emerson在美国密苏里州圣路易斯市成立,最初是一家电机和风扇制造商。1892年,新公司靠交流电机起家,并生产出了第一批销往北美的电风扇,净销售额接近6万美元。随着技术的不断革新,Emerson于1897年开始生产吊扇,这一创新使得高层建筑更加宜居,吊扇业务迅速成为公司的重要收入来源。

ABOV(现代单片机)公司的发展小趣事

第二次世界大战期间,Emerson迅速调整生产策略,转产炮弹弹壳等军需品。在随后的五年中,公司共生产出超过1000万支铜制炮弹弹壳,为战争的胜利做出了重要贡献。同时,Emerson还利用战时的技术积累,为战后的电气工业发展奠定了基础。

AMSCO [Austria micro systems AG]公司的发展小趣事

进入20世纪,Emerson迎来了一系列技术突破。1903年,公司成功研发出马力超过1/2的电机,这些电机被广泛应用于洗衣机、缝纫机等家用电器,进一步拓宽了公司的业务范围。此外,Emerson还积极开拓海外市场,通过并购和战略合作,逐步将业务拓展至全球范围。

Celduc Relais公司的发展小趣事

在追求经济效益的同时,Celduc Relais公司也积极践行环保理念。公司注重绿色生产,采用环保材料和工艺,减少生产过程中的污染排放。同时,公司还积极参与环保公益活动,推动电子行业的可持续发展。这一举措不仅提升了公司的社会形象,也为行业的绿色发展做出了积极贡献。

CQR SECURITY公司的发展小趣事

在激烈的市场竞争中,CQR SECURITY公司不断探索创新服务模式。公司推出了基于云计算的安全服务平台,为客户提供更加便捷、高效的安全服务。同时,CQR还加强了对客户需求的深入了解,量身定制安全解决方案,满足客户的个性化需求。这种创新服务模式不仅提升了客户满意度,还为CQR带来了更多的商业机会。

问答坊 | AI 解惑

我是新手,请求达人指点。 mcbsp 的 接受FIFO 中断怎么进不去

我用的是2812 ,由于2812自带的AD 是12位的,不满足我的精度要求,所以我外扩了一个AD转换芯片 AD73360 (16位)。 启动AD73360之后按说应该往回传踩到的数据,可是我在调试的时候怎么老进不去多通道缓冲串口的接受中断呢(接受深度我设置的是8)? ...…

查看全部问答>

测距离的转感器 分析

测距离的转感器 分析…

查看全部问答>

最早什么时侯可以从SD卡拷贝文件到windows目录?

需要在开机进入explorer之前把SD卡的几个文件拷到windows目录下。 我不懂驱动,于是瞎试一番。 在sdmemory的sdmemmain.cpp的DllEntry增加拷贝文件函数: 1        extern \"C\" BOOL WINAPI DllEntry(HINSTANCE hInstance, ...…

查看全部问答>

请问,OAL和BOOTLOADER有什么区别?

书上说,“BL用来初始化硬件资源,下载系统镜像,而OAL是系统内核的一部分”?…

查看全部问答>

基于WIN CE与s2410的外部中断的实现

基于WIN CE与s2410的外部中断的实现 断是指在执行程序的过程中,出现了异常情况和特殊请求时,计算机将停止现行程序的运行,转去对这些异常情况或特殊情况进行处理。 一、中断的基本知识 二、wince下关于中断的主要函数及其说明 三、s2410下关 ...…

查看全部问答>

求救!evb下我的RDA连接出错

高手帮帮忙啊!我用RDA执行PULL时出现错误提示:An error was encountered wile running this program. 我的代码: Public Const strInternetURL = \"http://localhost/sscesa20.dll\" Public Const strRemoteConnect = \"Provider=SQLOLEDB.1;P ...…

查看全部问答>

关于FPGA内部各逻辑块之间的延时测量

请问如何测量Spartan-3芯片内部各逻辑块之间的延时时间?…

查看全部问答>

蓄电池极性接反后引起的电路故障

故障现象:一辆五十铃汽车在闭合点火开关后,仪表显示正常,但充电指示灯不亮,且将点火开关置于Ⅱ档(起动档)时起动机无反应。 故障排除:检查充电指示灯,充电指示灯显示正常。因为该车充电指示灯受组合继电器控制,所以又拆下组合继电器 ...…

查看全部问答>

滤波器问题

这是用LTC1068做四阶椭圆滤波器的电路图,可是不明白后面运放芯片的作用,特请高手支招。下面的图是07年电子设计大赛的电路图,望高手支招 [ 本帖最后由 开窍的木偶 于 2011-8-8 10:28 编辑 ]…

查看全部问答>