#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
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
传统的机械式钥匙开锁,应用起来极补方便,且钥匙容易丢失遗忘。为了满足人们对日常生活中安全保险的需求,我们设计了一款用密码代替钥匙的密码锁。相比于传统的钥匙开锁手段,这款密码锁具有安全性高、成本低、功耗低、易操作等优点。 本系统采用以单片机为核心元件的控制方案。在选取单片机种类时,我们综合性能、存储器、运行速度、I/O口、定时/计数器、串口等方面,最终选用了STC90C52单片机,利用单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性,实现基本的密码锁功能。在单片机的外围电路外接4*4矩阵键盘用于密码的输入和修改,外接AT24C02芯片用于密码的存储,外接LCD1602显示器用于显示各种信息,蜂鸣器报警,除此之外还有复位电路和晶振电路、继电器等,复位电路和晶振电路与STC90C52单片机组成单片机最小系统。它具有设置、修改6位用户密码、密码错误报警等功能。本系统成本低廉,功能实用。 资源中含有个人设计的基于Keil5软件开发的工程,可参考使用 关键词: 密码锁; 报警; 蜂鸣器; STC90C52;密码;
资源推荐
资源详情
资源评论
收起资源包目录
程序.zip (13个子文件)
程序
密码锁LCD1602_uvopt.bak 55KB
密码锁LCD1602.OBJ 33KB
密码锁LCD1602.uvopt 55KB
密码锁LCD1602_uvproj.bak 13KB
密码锁LCD1602.plg 1KB
密码锁LCD1602.LST 32KB
密码锁LCD1602 27KB
STARTUP.A51 6KB
密码锁LCD1602.M51 39KB
密码锁LCD1602.lnp 58B
密码锁LCD1602.hex 8KB
密码锁LCD1602.c 14KB
密码锁LCD1602.uvproj 13KB
共 13 条
- 1
资源评论
陆九条
- 粉丝: 113
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功