历史上的今天
今天是:2024年11月13日(星期三)
2019年11月13日 | 单片机6位数电子密码锁源码+PCB+仿真原理图设计(可改密码
2019-11-13 来源:51hei
电子密码锁的电路原理图

Altium Designer画的原理图和PCB图如下:
密码锁仿真原理图如下

以下是一套单片机电子密码锁程序:
/*******************************************************************************
初始密码: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) {
史海拾趣
|
我是新手,请求达人指点。 mcbsp 的 接受FIFO 中断怎么进不去 我用的是2812 ,由于2812自带的AD 是12位的,不满足我的精度要求,所以我外扩了一个AD转换芯片 AD73360 (16位)。 启动AD73360之后按说应该往回传踩到的数据,可是我在调试的时候怎么老进不去多通道缓冲串口的接受中断呢(接受深度我设置的是8)? ...… 查看全部问答> |
|
需要在开机进入explorer之前把SD卡的几个文件拷到windows目录下。 我不懂驱动,于是瞎试一番。 在sdmemory的sdmemmain.cpp的DllEntry增加拷贝文件函数: 1 extern \"C\" BOOL WINAPI DllEntry(HINSTANCE hInstance, ...… 查看全部问答> |
|
基于WIN CE与s2410的外部中断的实现 断是指在执行程序的过程中,出现了异常情况和特殊请求时,计算机将停止现行程序的运行,转去对这些异常情况或特殊情况进行处理。 一、中断的基本知识 二、wince下关于中断的主要函数及其说明 三、s2410下关 ...… 查看全部问答> |
|
高手帮帮忙啊!我用RDA执行PULL时出现错误提示:An error was encountered wile running this program. 我的代码: Public Const strInternetURL = \"http://localhost/sscesa20.dll\" Public Const strRemoteConnect = \"Provider=SQLOLEDB.1;P ...… 查看全部问答> |
|
故障现象:一辆五十铃汽车在闭合点火开关后,仪表显示正常,但充电指示灯不亮,且将点火开关置于Ⅱ档(起动档)时起动机无反应。 故障排除:检查充电指示灯,充电指示灯显示正常。因为该车充电指示灯受组合继电器控制,所以又拆下组合继电器 ...… 查看全部问答> |




