#include <reg52.h> //调用单片机头文件
#define uchar unsigned char //无符号字符型 宏定义 变量范围0~255
#define uint unsigned int //无符号整型 宏定义 变量范围0~65535
uchar value,i; //变量
sbit relay = P2^2; //继电器定义
sbit beep = P3^3; //蜂鸣器定义
sbit beiguan = P2^3; //背光
uint flag_time;
uint flag_guan;
uchar smg_i;
uchar dis_smg[7]={0};
uchar password[7]={6,5,4,3,2,1}; //密码保存
uchar password_bj[7]={1,2,3,4,5,6}; //密码比较
uchar code password_r[6] = {1,2,3,1,2,3} ;
uchar code password_gl[6] = {5,2,0,0,2,5} ;
uchar password_xg[6]; //密码修改
uchar flag_password; //密码正确否
uchar flag_password_cichu1;//密码错误次数
bit flag_200ms=1; //200ms标志位
uchar key_can;
uchar menu_1,menu_i;
sbit scl = P2^1; //24C02 IO口定义
sbit sda = P2^0; //24C02 IO口定义
uchar code table_num[]="0123456789abcdefg";
sbit rs=P2^5; //寄存器选择信号 H:数据寄存器 L:指令寄存器
sbit rw=P2^6; //寄存器选择信号 H:数据寄存器 L:指令寄存器
sbit e =P2^7; //片选信号 下降沿触发
/***********************延时函数************************/
void delay_uint(uint q)
{
while(q--);
}
/***********************lcd1602写命令函数************************/
void write_com(uchar com)
{
e=0;
rs=0;
rw=0;
P0=com;
delay_uint(3);
e=1;
delay_uint(25);
e=0;
}
/***********************lcd1602写数据函数************************/
void write_data(uchar dat)
{
e=0;
rs=1;
rw=0;
P0=dat;
delay_uint(3);
e=1;
delay_uint(25);
e=0;
}
/*********************光标控制***********************/
void lcd1602_guanbiao(uchar open_off,uchar add)
{
if(open_off == 1) //开光标
{
write_com(0x80+add); //将光标移动到秒个位
write_com(0x0f); //显示光标并且闪烁
}
else
{
write_com(0x0c); //关光标
}
}
/***********************lcd1602上显示两位十进制数************************/
void write_sfm2(uchar hang,uchar add,uchar date)
{
uchar shi,ge;
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
shi=date%100/10;
ge=date%10;
write_data(0x30+shi);
write_data(0x30+ge);
}
/***********************lcd1602上显示这字符函数************************/
void write_string(uchar hang,uchar add,uchar *p)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
while(1)
{
if(*p == '\0') break;
write_data(*p);
p++;
delay_uint(50);
}
}
/***********************lcd1602初始化设置************************/
void init_1602()
{
write_com(0x38); //
delay_uint(100);
write_com(0x38);
delay_uint(100);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
delay_uint(1000);
write_string(1,0," Password Lock ");
write_string(2,0," Input: ");
lcd1602_guanbiao(1,7+0x40); //开光标
}
/***************启始信号 ***************************/
void start()
{
sda = 1;
scl = 1;
sda = 0;
scl = 0;
}
/****************结束信号 **************************/
void stop()
{
sda = 0;
scl = 1;
sda = 1;
scl = 0;
}
/*****************检测应答*************************/
void ack()
{
uchar i;
sda = 1;
scl = 1;
while((i < 100) & (sda == 1)) i++;
scl =0;
}
void ack_zhuji()
{
sda = 0;
scl = 1;
scl = 0;
sda = 1;
}
/*****************非应答*************************/
void no_ack()
{
sda = 1;
scl = 1;
scl = 0;
}
/*****************写一个字节*************************/
void write_iic(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
scl = 0;
dat <<= 1 ;
sda = CY;
scl = 1;
}
scl = 0;
}
/*******************读一个字节***********************/
uchar read_iic()
{
uchar i,value;
for(i=0;i<8;i++)
{
scl = 1;
value <<= 1;
if(sda == 1)
value |= 0x01;
scl = 0;
}
return value;
}
/*****************向24C02写一个字节进去*************************/
void write_24c02(uchar add,uchar dat)
{
start();
write_iic(0xa0);
ack();
write_iic(add);
ack();
write_iic(dat);
no_ack();
stop();
}
/******************从24C02读一个字节进去************************/
uchar read_24c02(uchar add)
{
uchar value;
start();
write_iic(0xa0);
ack();
write_iic(add);
ack();
start();
write_iic(0xa1);
ack();
value = read_iic();
no_ack();
stop();
return value;
}
/*****************向24C02写多个字节进去*************************/
void write_24c02_8(uchar n,uchar add,uchar *p)
{
uchar i;
EA = 0;
start();
write_iic(0xa0);
ack();
write_iic(add);
for(i=0;i<n;i++)
{
ack();
write_iic(*p);
p++;
}
no_ack();
stop();
EA = 1;
}
/******************从24C02读多个字节进去************************/
void read_24c02_8(uchar n,uchar add,uchar *p)
{
uchar i;
EA = 0;
start();
write_iic(0xa0);
ack();
write_iic(add);
ack();
start();
write_iic(0xa1);
ack();
for(i=0;i<n;i++)
{
p[i] = read_iic();
if(i == n-1)
{
ack();
stop();
}
else
ack_zhuji();
}
EA = 1;
}
/***********************1ms延时函数*****************************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<120;j++);
}
void key() //独立按键程序
{
static uchar key_new = 0, key_l;
key_can = 20; //按键值还原
P1 = 0x0f;
if((P1 & 0x0f) != 0x0f) //按键按下
{
delay_1ms(1); //按键消抖动
if(((P1 & 0x0f) != 0x0f) && (key_new == 1))
{ //确认是按键按下
key_new = 0;
key_l = (P1 | 0xf0); //矩阵键盘扫描
P1 = key_l;
switch(P1)
{
case 0xee: key_can = 1; break; //得到按键值
case 0xde: key_can = 4; break; //得到按键值
case 0xbe: key_can = 7; break; //得到按键值
case 0x7e: key_can = 10; break; //得到按键值
case 0xed: key_can = 0; break; //得到按键值
case 0xdd: key_can = 8; break; //得到按键值
case 0xbd: key_can = 5; break; //得到按键值
case 0x7d: key_can = 2; break; //得到按键值
case 0xeb: key_can = 3; break; //得到按键值
case 0xdb: key_can = 6; break; //得到按键值
case 0xbb: key_can = 9; break; //得到按键值
case 0x7b: key_can = 11; break; //得到按键值
case 0xe7: key_can = 15; break; //得到按键值
case 0xd7: key_can = 14; break; //得到按键值
case 0xb7: key_can = 13; break; //得到按键值
case 0x77: key_can = 12; break; //得到按键值
}
}
}
else
{
key_new = 1;
}
}
/***************把数组清空**********************/
void clear_shuzu(uchar *p)
{
for(i=0;i<7;i++)
p[i] = 0;
}
/*************定时器0初始化程序***************/
void time_init()
{
EA = 1; //开总中断
TMOD = 0X01; //定时器0、工作方式1
ET0 = 1; //开定时器0中断
TR0 = 1; //允许定时器0定时
}
/******************下载程序密码初始化**********************/
void password_chushifa()
{
scl = 0;
value = read_24c02(10) ;
if(value != 75)
{
value = 75;
beep = 0;
write_24c02(10,value);
delay_1ms(200);
write_24c02_8(6,0,password_r);
delay_1ms(200);
read_24c02_8(6,0,password);
beep = 1;
}
}
/****************按键功能处理********************/
void key_with()
{
static uchar value;
if(key_can == 14) //手动关闭密码锁
relay = 1;
if(menu_1 == 0)
{
if(key_can <= 9)
if(menu_i < 6) //密码输入
{
menu_i ++;
if(menu_i > 6)
menu_i = 6;
smg_i = menu_i;
for(i=6;i>0;i--)
password_bj[i] = password_bj[i-1];
password_bj[0] = key_can;
for(i=0;i<smg_i;i++)
dis_smg[i] ='*';//0x30 + password_bj[i];
write_string(2,7,dis_smg);
lcd1602_guanbiao(1,7 + menu_i + 0x40); //开光标
}
if(key_can == 11) //密码删除
{
for(i=0;i<menu_i;i++)
password_bj[i] = password_bj[i+1];
menu_i --;
password_bj[menu_i] = ' ';
dis_smg[menu_i] = ' ';
write_string(2,7,dis_smg);
lcd1602_guanbiao(1,7 + menu_i
单片机课程设计:基于LCD1602显示的51单片机密码锁设计
需积分: 0 95 浏览量
更新于2022-12-08
3
收藏 55KB ZIP 举报
传统的机械式钥匙开锁,应用起来极补方便,且钥匙容易丢失遗忘。为了满足人们对日常生活中安全保险的需求,我们设计了一款用密码代替钥匙的密码锁。相比于传统的钥匙开锁手段,这款密码锁具有安全性高、成本低、功耗低、易操作等优点。
本系统采用以单片机为核心元件的控制方案。在选取单片机种类时,我们综合性能、存储器、运行速度、I/O口、定时/计数器、串口等方面,最终选用了STC90C52单片机,利用单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性,实现基本的密码锁功能。在单片机的外围电路外接4*4矩阵键盘用于密码的输入和修改,外接AT24C02芯片用于密码的存储,外接LCD1602显示器用于显示各种信息,蜂鸣器报警,除此之外还有复位电路和晶振电路、继电器等,复位电路和晶振电路与STC90C52单片机组成单片机最小系统。它具有设置、修改6位用户密码、密码错误报警等功能。本系统成本低廉,功能实用。
资源中含有个人设计的基于Keil5软件开发的工程,可参考使用
关键词: 密码锁; 报警; 蜂鸣器; STC90C52;密码;
陆九条
- 粉丝: 119
- 资源: 3
最新资源
- 基于蒙特卡洛抽样的电动汽车充电负荷计算(matlab代码版) 主要内容:代码主要主要研究的的是大规模电动汽车的蒙特卡洛模拟,包括电动汽车起始充电时间以及每日行使里程的概率密度分布,在此基础上,进一步计
- MATLAB代码:基于粒子群算法的含风光燃储微网优化调度 关键词:微网优化调度 粒子群算法 风光燃储 参考文档:《基于多目标粒子群算法的微电网优化调度-王金全》仅参考部分模型,非完全复现 优势:代码
- kmeans聚类,肘部法确定聚类个数 代码对数据先进行归一化然后聚类 可设定聚类个数范围,根据肘部法选择合适的聚类个数 可求得每类的具体数据 matlab代码,备注清楚,更改为自己的数据和要求即可
- 同步机VSG DFIG双馈风电机组同步机控制,并网端电源分为理想电源或同步发电机 机组1.5MW,采用控制策略如图片所示 (附赠同步机简易模型)
- P3分布参数拟合与ks检验,累计概率密度画图 对数据进行3参数拟合(形状、尺度、位置参数),可设置ks检验的显著性水平 matlab代码,备注清楚,更改为自己的数据即可
- FLAC3D水力压裂例子,可以拿来参考,有单孔和双孔
- 基于高频脉振电压注入的PMSM无传感器控制 无感控制,高频电压注入 1.包括位置观测器构成是带通滤波器加低通滤波器,采用PLL锁相环,是离散模型 2.也有连续模型,用的是龙贝格观测器提取转子位置和转速
- 拉锥光纤,镀膜、耦合、光栅…… Rsoft beamprop,光纤仿真,光子晶体光纤仿真
- 基于floyd算法的路径规划算法matlab代码,求解常见的路径规划问题 内含算法的注释,模块化编程,新手小白可快速入门 佛洛依德算法,路径规划算法,栅格地图
- 二维互相关随机场模拟实践,保姆级教程 基于matlab与flac6.0的乔列斯基分解的中点法模拟岩土体互相关随机场 自相关函数可以选择:指数型、高斯型、二阶自回归型、指数余弦型、三角型自相关函数 案例
- STM32环形串口队列程序 大数据串口收发 实时不丢包 串口程序平常产品开发中编写或移植的程序并亲自测试通过,均为工程文件格式,可直接编译使用 该程序为大数据量吞吐的串口收发例程,中断接收,边收边
- MCGS与三菱变频器通讯基于MODBUS-RTU程序 ~ 可以通过触摸屏控制变频器正反转,运行停止,还能监视变频器的运行频率,输出频率,输出电压,输出电流以及转速 MCGS嵌入版7.7软件打开
- svr支持向量机回归预测 案例提供数据进行归一化处理,对训练数据训练,对测试集预测,并计算mae、rmse、R2、mre等误差指标 matlab代码,备注详细,根据自己需要修改案例数据即可
- pytho面试资源库(含基础题和面试真题带答案)
- stm32低压无感BLDC方波控制方案 MCU是ST32M0核 负载的ADC反电动势采样 1.启动传统三段式,强拖的步数少,启动快,任意电机基本可以顺利启动切闭环; 2.配有英非凌电感法入算法; 3
- 永磁同步电机滑模控制的直接转矩控制的matlab仿真 SMC DTC直接转矩控制加滑膜控制 转速环调节器 磁链和转矩调节器 磁链和转矩的计算SVPWM矢量控制 含有报告