电子密码锁单片机设计完整程序电路
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机课程设计
1 系统的总体设计和主要元器件介绍
(1)设计要求
✧以STC89C516单片机为核心器件,结合按键电路、LCD1602显示
电路、报警指示电路和开锁机构,利用单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性通过软件程序来控制整个系统实现电子密码锁的以下基本功能:
✧(1)输入密码时显示所输入“*”,具有一定防偷看功能。
✧(2)密码通过键盘输入,若密码正确,则显示灯发光,将锁打
开
✧(3)密码输入错误,蜂鸣器将报警提示。
密码输错四次,则蜂
鸣器报警15秒,显示灯亮。
✧(4)用户可以自由设定密码
✧本密码锁具有设计方法合理,简单易行成本低,安全实用等特点,
具有一定的推广价值。
(2)系统的总体思路设计
以STC89C516单片机为主控制单元,键盘为主要输入单元,结合开锁装置、报警器和显示器完成整个系统设计。
✧系统的运行过程大致如下:
✧假设初始状态为闭锁,此时整个系统只等待按键输入,显示屏显
示“Input password Press key A”。
按下A后,每按下一个数据键(即每输入一个密码),lcd1602显示一个“*”,当密码全部输入完成后,需按下确认键“#”,此时系统判断密码是否正确,正确则开锁,错误则报警。
若按下密码重置键“*”,则需先输入原密码,正确后请输入新密码,还要确认一遍新密码。
按下删除键可以删除输错的密码。
(3)主要元器件介绍
1、stc89C52介绍
图一 stc89C52引脚图
本次课程设计选用的是AT89C52,AT89C52是一种带8K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。
单片机的可擦除只读存储器可以反复擦除1000次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C52是一种高效微控制器。
AT89C52单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
振荡器特性:
XTAL1和XTAL2分别为反向放大器的输入和输出。
该反向放大器可以配置为片内振荡器。
石晶振荡和陶瓷振荡均可采用。
如采用外部时钟源驱动器件,XTAL2应不接。
有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。
(2)LCD1602显示器
接口信号说明:
1602型LCD的接口信号说明如表2-2所示。
表2-2 LCD1602接口信号说明
1602型LCD主要技术参数:
显示容量:16×2个字符
芯片工作电压:4.5—5.5V
工作电流:2.0mA(5.0V)
模块最佳工作电压:5.0V
字符尺寸:2.95×4.35(W×H)mm
1602型LCD基本操作程序如下表所示:
表2-3 LCD1602基本操作程序
(3)AT24C02
1. 概述
AT24C02是一个2K位串行CMOS E2PROM,内部含有256个8位字节,CATALYST 公司的先进CMOS技术实质上减少了器件的功耗。
AT24C02有一个16字节页写缓冲器。
该器件通过IIC总线接口进行操作,有一个专门的写保护功能。
2. 管脚配置
管脚封装如右图1所示。
图1 管脚封装
DIP:双列直插式封装,是最简单的一种封装技术。
3. 极限参数
工作温度工业级-55℃ +125℃
商业级0 ℃+75℃
贮存温度-65℃ +150℃
各管脚承受电压-2.0 Vcc+2.0V
Vcc管脚承受电压-2.0 +7.0V
封装功率损耗(Ta=25℃) 1.0W
焊接温度(10 秒) 300℃
输出短路电流100mA
表1 可靠性参数
符号参数最小最大单位参考测试模式
NEND 耐久性1,000,000 周期/字节MIL-STD-883 测试方法1033
TDR 数据保存时间100 年MIL-STD-883 测试方法1008
VZAP ESD 2000 V MIL-STD-883 测试方法3015
ILTH 上拉电流100 mA JEDEC 标准17
4.特性:
1.数据线上的看门狗定时器
2.可编程复位门栏电平
3.高数据传送速率为400KHz和1C总线兼容
4.2.7V至7V的工作电压
5.低功耗CMOS工艺
6.16字节页写缓冲区
7.片内防误擦除写保护
8.高低电平复位信号输出
9.100万次擦写周期
10.数据保存可达100年
11.商业级、工业级和汽车温度范围
5. 功能描述
AT24C02支持IC,总线数据传送协议IC,总线协议规定任何将数据传送到总线的器件作为发送器。
任何从总线接收数据的器件为接收器。
数据传送是由产生串行时钟和所有起始停止信号的主器件控制的。
主器件和从器件都可以作为发送器或接收器,但由主器件控制传送数据(发送或接收)的模式,通过器件地址输入端A0、A1和A2可以实现将最多8个AT24C02器件连接到总线上。
6. 管脚描述
表2 管脚描述
SCL 串行时钟
AT24C02串行时钟输入管脚用于产生器件所有数据发送或接收的时钟,这是一个输入管脚。
SDA 串行数据/地址
AT24C02 双向串行数据/地址管脚用于器件所有数据的发送或接收,SDA 是一个开漏输出管脚,可与其它开漏输出或集电极开路输出进行线或(wire-OR)。
A0、A1、A2 器件地址输入端
这些输入脚用于多个器件级联时设置器件地址,当这些脚悬空时默认值为0。
当使用AT24C02 时最大可级联8个器件。
如果只有一个AT24C02被总线寻址,这三个地址输入脚(A0、A1、A2 )可悬空或连接到Vss,如果只有一个AT24C02被总线寻址这三个地址输入脚(A0、A1、A2 )必须连接到Vss。
WP 写保护
如果WP管脚连接到Vcc,所有的内容都被写保护只能读。
当WP管脚连接到Vss 或悬空允许器件进行正常的读/写操作
2、硬件电路设计
(1)设计原理
本设计主要由单片机、矩阵键盘、液晶显示器和密码存储等部分组成。
其中矩阵键盘用于输入数字密码和进行各种功能的实现。
由用户通过连接单片机的矩阵键盘输入密码,后经过单片机对用户输入的密码与AT24C02中保存的密码进行对
比,从而判断密码是否正确,然后控制引脚的高低电平传到开锁电路或者报警电路控制开锁还是报警,实际使用时只要将单片机的负载由继电器换成电子密码锁的电磁铁吸合线圈即可,当然也可以用继电器的常开触点去控制电磁铁吸合线圈。
图二
(2) 电路总体构成
图三
stc89C52
键盘输入
复位电路
AT24C02
密码存储电路
晶振电路
电源输入
显示电路
报警电路
开锁电路
(3) 单片机主控制模块(含晶振、复位基本工作电路)
图四
(4)键盘电路设计
按键模块采用4×4行列矩阵结构,由4条行线和4条列线构成。
行线和列线共有16个交叉点每个交叉点可以放置一个按键,这样共可以放置16个按键。
按键电路如图五所示。
图五
KEYL0~KEYL3为行线,分别接单片机的P1.0~P1.3;KEYR0~KEYR3为列线,分别接单片机的P1.4~P1.7。
软件编程采用行扫描法,程序编写比较复杂,但
是理解较容易切。
图中顺序前十个按键为0~9,最后3个按键分别为修改密码键、确认键和关机键。
(5)显示电路设计
显示电路由LCD1602构成。
其结构图如图六所示。
图六
(6) 报警电路设计
报警电路主要由PNP三极管和蜂鸣器构成。
报警电路图如图七所示。
图七
LS1为一个5V的压电蜂鸣器,当对其1、2号引脚施加5V电压时,便会鸣叫。
由图七可知,当P3.7输出低电平时蜂鸣器鸣叫;当P3.7输出高电平时,蜂鸣器停止鸣叫。
通过控制P3.7输出低电平的时间长短来控制蜂鸣器长叫或短叫。
(7) 电子锁控制电路
电子锁控制电路主要由继电器、三极管和发光二极管构成。
电子锁控制电路图如图5所示。
图八
继电器线圈的一个引脚接电源正极,另一端接NPN三极管的集电极。
三极管的基极通过一个电阻接单片机的引脚。
当LOCKCON输出高电平时,三极管导通,继电器线圈得电,触点闭合,发光二极管发光,相当于电子锁闭锁;当LOCKCON 输出低电平时,三极管截止,继电器线圈失电,触点释放,发光二极管熄灭,相当于电子锁开锁。
图中普通二极管是继电器线圈的续流二极管,为感应电动势提供回路,以免损坏三极管。
(8) 密码存储电路
AT24C02是ATMEL公司的2KB字节的电可擦除存储芯片,采用两线串行的总线和单片机通讯,电压最低可以到2.5V,额定电流为1mA,静态电流10Ua(5.5V),芯片内的资料可以在断电的情况下保存40年以上,而且采用8脚的DIP封装,使用方便。
其电路原理如图九所示。
A0
1
A1
2
A2
3
GND
4
VCC
5
WP
6
SCL
7
SDL
8
U3
AT24C02
VCC
R9
5.1k R10
5.1k
VCC
P3.5
P3.6
P3.7
图九
图中1、2、3脚是三条地址线,用于确定芯片的硬件地址,在AT89S51上它们都能接地,第5脚和第8脚分别为正、负电源。
AT24C02中带有片内地址寄存器,每写入或读出一个数据字节后,该地址寄存器自动加1,以实现对下一个储存单元的读写,所有字节均以单一操作方式读取。
图十本电路中的应用图
(9) 复位电路
单片机复位是使CPU和系统中的其他功能部件都处在一个确定的初始状态,并从这个状态开始工作,例如复位后PC=0000H,使单片机从第—个单元取指令。
无论是在单片机刚开始接上电源时,还是断电后或者发生故障后都要复位。
在复位期间(即RST为高电平期间),P0口为高组态,P1-P3口输出高电平;外部程序存储器读选通信号PSEN无效。
地址锁存信号ALE也为高电平。
根据实际情况选择如图十所示的复位电路。
该电路在最简单的复位电路下增加了手动复位按键,在接通电源瞬间,电容C1上的电压很小,复位下拉电阻上的电压接近电源电压,即RST为高电平,在电容充电的过程中RST端电压逐渐下降,当RST端的电压小于某一数值后,CPU脱离复位状态,由于电容C1足够大,可以保证RST 高电平有效时间大于24个振荡周期,CPU能够可靠复位。
增加手动复位按键是为了避免死机时无法可靠复位。
当复位按键按下后电容C1通过R5放电。
当电容C1放电结束后,RST端的电位由R11与R15分压比决定。
由于R11<<R15 因此RST 为高电平,CPU处于复位状态,松手后,电容C1充电,RST端电位下降,CPU脱离复位状态。
R11的作用在于限制按键按下瞬间电容C1的放电电流,避免产生火花,以保护按键触电。
C1 R11
R15
10k
图十一复位电路原理图
(10) 单片机电路及PCB图
单片机电路主要由单片机、振荡电路和复位电路构成。
单片机电路图如图十一所示。
图十二
AT89C52单片机的P0口用于输出LCD显示。
P1口用于构成行列矩阵键盘。
P3.7用于控制蜂鸣器的鸣叫。
P3.3用于控制电子锁的开闭。
P3.1 P3.0控制储存芯片的sda、sck。
P3.4 控制lcd显示的E P3.5 控制rs P3.6控制rw。
1、软件设计
软件设计主要是对键盘进行扫描,根据按键控制报警电路、电子锁电路,并将结果显示。
因此整个软件分为按键子程序、显示子程序、、储存子程序,电子锁控制子程序及主程序。
主函数
按键子程序
unsigned char keyscan()
{
unsigned char temp,key;
key = 0xff;
JPJK = 0xfe;
temp = JPJK;/
temp &= 0xf0;// temp = temp & 0xf0
if(temp != 0xf0)
{
delay_ms(10);
temp = JPJK;
temp &= 0xf0;
if(temp != 0xf0)
temp = JPJK;
baoj1();
switch(temp)
{
case 0xee: key = 1;break;
case 0xde: key = 2;break;
case 0xbe: key = 3;break;
case 0x7e: key = 0x0a;break;
}
while(temp != 0xf0)
{
temp = JPJK;
temp &= 0xf0;
}
}
}
JPJK = 0xfd;
temp = JPJK;
temp &= 0xf0;// temp = temp & 0xf0
if(temp != 0xf0)
{
delay_ms(10);
temp = JPJK;
temp &= 0xf0;
if(temp != 0xf0)
{
temp = JPJK;
baoj1();
switch(temp)
{
case 0xed: key = 4;break;
case 0xdd: key = 5;break;
case 0xbd: key = 6;break;
case 0x7d: key = 0x0b;break;
}
while(temp != 0xf0)
{
temp = JPJK;
temp &= 0xf0;
}
}
}
JPJK = 0xfb;
temp = JPJK;
temp &= 0xf0;
if(temp != 0xf0)
{
delay_ms(10);
temp = JPJK;
temp &= 0xf0;
if(temp != 0xf0)
{
temp = JPJK;
baoj1();
switch(temp)
{
case 0xeb: key = 7;break;
case 0xdb: key = 8;break;
case 0xbb: key = 9;break;
case 0x7b: key = 0x0c;break;
}
while(temp != 0xf0)
{
temp = JPJK;
temp &= 0xf0;
}
}
}
JPJK = 0xf7;
temp = JPJK;
temp &= 0xf0
temp = temp & 0xf0
if(temp != 0xf0)
{
delay_ms(10);
temp = JPJK;
temp &= 0xf0;
if(temp != 0xf0)
{
temp = JPJK;
baoj1();
switch(temp)
{
case 0xe7: key = 0;break;
case 0xd7: key = 0x0e;break;
case 0xb7: key = 0x0f;break;
case 0x77: key = 0x0d;break;
}
while(temp != 0xf0)
{
temp = JPJK;
temp &= 0xf0;
}
}
}
return key;
}
显示程序
bit lcd_busy()
{
bit result;
lcdrs = 0;
lcdwr = 1;
lcden = 1;
_nop_();
_nop_();
result = (bit)(DA TA&0x80);
lcden = 0;
return result;
}
void write_com(unsigned char com) {
while(lcd_busy());
lcdwr = 0;
lcdrs = 0;
lcden = 0;
DATA = com;
delay_ms(5);
lcden = 1;
delay_ms(5);
lcden = 0;
}
void write_data(unsigned char date) {
while(lcd_busy());
lcdwr = 0;
lcdrs = 1;
lcden = 0;
DATA = date;
delay_ms(5);
lcden = 1;
delay_ms(5);
lcden = 0;
}
void write_1_char(unsigned char zifu)
{
write_data(zifu);
}
void write_n_char(unsigned char zifu[])
{
unsigned char count;
for(count=0; ;count++)
{
write_1_char(zifu[count]);
if(zifu[count+1]=='\0')
break;
}
}
void lcd_pos(unsigned char x,unsigned char y) {
unsigned char pos;
if(x == 0)
x = 0x80;
else if(x == 1)
x = 0x80 + 0x40;
pos = x + y;
write_com(pos);
}
void yjinit()
{
dula = 0;
wela = 1;
lcden = 0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
存储子程序
void delay()
{
;;
}
void i2cinit()
{
SDA = 1;
delay();
SCL = 1;
delay();
}
void start()
{
SDA = 1;
SCL = 1;
delay();
SDA = 0;
delay();
}
void stop()
{
SDA = 0;
delay();
SCL = 1;
delay();
SDA = 1;
delay();
}
void respons()
{
unsigned char i = 0;
SCL = 1;
delay();
while(SDA == 1 && i < 255)
i++;
SCL = 0;
delay();
}
void writebyte(unsigned char date) {
unsigned char i,temp;
temp = date;
for(i = 0; i < 8; i++)
{
temp <<= 1;
SCL = 0;
delay();
SDA = CY;
delay();
SCL = 1;
delay();
}
SCL = 0;
delay();
SDA = 1;
delay();
}
unsigned char readbyte()
{
unsigned char i,k;
SCL = 0;
delay();
SDA = 1;
for(i = 0; i < 8; i++)
{
SCL = 1;
delay();
k = (k << 1) | SDA;
SCL = 0;
delay();
}
delay();
return k;
}
void write_add(unsigned char address,unsigned char date) {
start();
writebyte(0xa0);
respons();
writebyte(address);
respons();
writebyte(date);
respons();
stop();
}
unsigned char read_add(unsigned char address)
{
unsigned char date;
start();
writebyte(0xa0);
respons();
writebyte(address);
respons();
start();
writebyte(0xa1);/
respons();
date = readbyte();
stop();
return date;
}
void write_n_add(unsigned char * p,unsigned char address,unsigned char n) {
unsigned char i;
for(i = 0; i < n; i++)
{
write_add((address + i),*(p + i));
delay_ms(30);
}
}
void read_n_add(unsigned char * p,unsigned char address,unsigned char n) {
unsigned char i;
for(i = 0; i < n; i++)
{
*(p + i) = read_add(address + i);
}
}
密码处理及主函数
bit mimaduibi(unsigned char *string1,unsigned char *string2)
{
unsigned char count;
for(count = 0; count < 6; count++)
{
if(string1[count] != string2[count])
return 0;
}
return 1;
}
unsigned char step_choose(void)
{
uchar key;
key = 0xff;
write_com(0x06);
write_com(0x01);
lcd_pos(0,0);
write_n_char(" Input password ");
lcd_pos(1,0);
write_n_char(" Press key A ");
while((key != A) && (key != B))
key = keyscan();
return key;
}
bit input_mima(uchar * mima)
{
unsigned char count,key;
lcd_pos(1,0);
for(count = 0; count < 7; count++)
{
delay_ms(100);
if(count < 6)
{
do{key = keyscan();}
while(key == 0xff);
if((key != backspace) && (key != A) && (key != enter))
{
write_data('*');
mima[count] = key;
continue;
}
if(key == backspace)
{
if(count > 0)
{
lcd_pos(1,--count);
write_data(' ');
mima[count] = ' '
lcd_pos(1,count);
count--;
}
}
if(key == enter)
{
lcd_pos(0,0);
return(0);
}
}
if(key == clear)
{
if(count > 0)
{
count=0;
write_com(0x01);
write_com(0x0f);
lcd_pos(0,0);
write_n_char(" press password ");
lcd_pos(1,count);
count--;
}
}
if(count==6)
{
do{key = keyscan();}
while((key != backspace)&&(key != enter));
if(key == backspace)
{
lcd_pos(1,--count);
write_data(' ');
mima[count]=' ';
lcd_pos(1,count);
count--;
}
if(key == enter)
{
return(1);
}
}
}
}
void baoj1()
{
int i;
for(i = 0;i < 10; i++)
{
baojing = 0;
delay_ms(6);
baojing = 1;
delay_ms(6);
}
}
void baoj()
{
uchar i;
for(i = 0; i < 10; i++)
baoj1();
}
void baoj2()
{
uchar i;
for(i = 0; i < 20; i++)
baoj1();
}
void mimachuli()
{
uchar key,i;
uchar idata mima_1[6]={' ',' ',' ',' ',' ',' '};
uchar idata mima_2[6]={' ',' ',' ',' ',' ',' '};
uchar idata mima_3[6]={' ',' ',' ',' ',' ',' '};
key = step_choose();
if(key == A)
{
read_n_add(mima_1,0x00,6);
write_com(0x06);
write_com(0x01);
write_com(0x0f);
lcd_pos(0,0);
write_n_char(" press password ");
if(input_mima(mima_2))
{
if(mimaduibi(mima_2,mima_1))
{
lcd_pos(0,0);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_n_char(" Password right ");
lcd_pos(1,0);
write_n_char("welcome to home");
aa = 0;
lock = 1;
baojing = 0;
delay_ms(1000);
baojing = 1;
TR0 = 1;
flag_t0 = 1;
while(key != D && flag_t0)
{
key = keyscan();
}
TR0 = 0;
lock = 0;
}
Else
{
lcd_pos(0,0);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_n_char(" password wrong");
delay_ms(1000);
aa++;
if(aa == 3)
{
lcd_pos(0,0);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_n_char(" Password wrong");
lcd_pos(1,0);
write_n_char(" you are thief");
aa = 0;
i = 20;
while(i--)
baoj();
}
}
}
else
{
lcd_pos(0,0);
write_com(0x0c);
write_com(0x06);
write_com(0x01);/
write_n_char(" password wrong");
delay_ms(1000);
aa++;
if(aa == 3)
{
lcd_pos(0,0);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_n_char(" Password wrong");
lcd_pos(1,0);
write_n_char(" you are thief");
aa = 0;
i = 20;
while(i--)
baoj();
}
}
}
if(key == B)//B
{
read_n_add(mima_1,0x00,6);
write_com(0x06);
write_com(0x01);
write_com(0x0f);
lcd_pos(0,0);
write_n_char(" input password");
write_com(0x0f);
if(input_mima(mima_2))
{
if(mimaduibi(mima_2,mima_1))
{
lcd_pos(0,0);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_n_char(" password right ");
aa = 0;
delay_ms(1500);
flag_change = 1;
while(flag_change)
{
write_com(0x06);
write_com(0x01);
write_com(0x0f);
lcd_pos(0,0);
write_n_char(" In new password");
delay_ms(1500);
if(input_mima(mima_2))
{
lcd_pos(0,0);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_n_char(" Input new pass ");
lcd_pos(1,0);
write_n_char(" word again");
delay_ms(2000);
lcd_pos(0,0);
write_com(0x0f);
write_com(0x06);
write_com(0x01);
write_n_char("In new password");
if(input_mima(mima_3))
{
if(mimaduibi(mima_2,mima_3))
{
lcd_pos(0,0);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_n_char(" Password has ");
lcd_pos(1,0);
write_n_char(" change already");
write_n_add(mima_3,0x00,6);
delay_ms(2000);
flag_change = 0;
}
Else
{
lcd_pos(0,0);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_n_char("password wrong");
delay_ms(1000);
aa++;
if(aa == 3)
{
aa = 0;
i = 20;
while(i--)
baoj();
}
flag_change = 0;
}
}
Else
{
lcd_pos(0,0);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_n_char(" password wrong");
delay_ms(1000);
aa++;
if(aa == 3)
{
aa = 0;
i = 20;
while(i--)
baoj();
}
}
}
Else
{
lcd_pos(0,0);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_n_char("password wrong");
delay_ms(1000);
flag_change = 0;
aa++;
if(aa == 3)
{
aa = 0;
i = 20;
while(i--)
baoj();
}
}
}
}
Else
{
lcd_pos(0,0);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_n_char("password wrong");
delay_ms(1000);
aa++;
if(aa == 3)
{
lcd_pos(0,0);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_n_char(" Password wrong");
lcd_pos(1,0);
write_n_char(" you are thief");aa = 0;
i = 20;
while(i--)
baoj();
}
}
}
Else
{
lcd_pos(0,0);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_n_char("password wrong");
delay_ms(1000);
aa++;
if(aa == 3)
{
lcd_pos(0,0);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_n_char(" password wrong");
lcd_pos(1,0);
write_n_char(" you are thief");
aa = 0;
i = 20;
while(i--)
baoj();
}
}
}
}
void timer0() interrupt 1
{
TH0 = 0x4c;
TL0 = 0x00;
bb++;
if(bb == 200)
{
bb = 0;
flag_t0 = 0;
}
}
void main()
{
yjinit();
i2cinit();
baojing = 1;
lock = 0;
TMOD = 0x21;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
ES = 1;
EA = 1;
ET0 = 1;
IT0 = 1;
TR0 = 0;
TH0 = 0x4c;
TL0 = 0x00;
IP = 0x10 ;
while(1)
{
mimachuli();
}
}
串口中断程序及手机控制
void Com_Int(void) interrupt 4
{
EA = 0;
if(RI == 1)
{
buf = SBUF ;
RI = 0;
if(buf==0x35)
{ int i;
lock=1;
lcd_pos(0,0);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_n_char(" Password right ");
lcd_pos(1,0);
write_n_char("welcome to home");
baojing = 0;
delay_ms(1000);
baojing = 1;
for(i=0;i<5;i++)
{
delay_ms(3000);
}
lock=0;
lcd_pos(0,0);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_n_char("Input password");
lcd_pos(1,0);
write_n_char(" Press key A");
key = keyscan();
}
if(buf==0x34)
{
lock=0;
lcd_pos(0,0);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_n_char("Input password");
lcd_pos(1,0);
write_n_char(" Press key A");
key = keyscan();
}
}
ES = 1;
EA = 1;
}
2、总结
本文详细介绍了如何使用AT89C52单片和其他元器件设计一款电子密码锁。
首先介绍了系统的具体要求实现的功能,在此基础上将整个系统划分为键盘模块、显示模块、报警模块、电子锁控制模块和单片机模块;然后给出了每个模块的硬件电路图,并对硬件电路图作了相应的说明;最后根据功能和硬件电路图给出了系统相关模块的子程序和系统主程序。
通过本密码锁的设计,使我对单片机有了更深的了解。
特别是键盘扫描方法,以前只是理论上知识,而本次设计让我有机会去实践了这一知识。
本设计只是一个简单的密码锁,还有很多功能可以添加上去,如密码不必必须是6位,少于6位也可以;密码的明码显示,密码加密处理等。
这次课程设计才开始做时感觉很简单,原理很明确各模块的电路设计也很简单,可是到了真正做时才知道其实还是有很多困难的,理论上的通过不代表硬件上可以实现,在硬件设计中总是会有很多的问题,一个小小的错误就可能导致实验的失败。
理论上I/O端口输出的电压为4.7——5v,可是实际用时就是不能够带动蜂鸣器,感觉自己还是有很多深层的理论知识没有掌握,有事没有实际理论支持仅凭感觉做,这个很不好,这次课程设计让我发现了很多自身的问题,以后要好好改正,加强理论学习,打好基础。
参考文献:
【1】《51单片机C语言应用开发技术大全》龙脉工作室刘坤、宋戈、赵红波、张宪栋编著,人民邮电出版社
【2】《51单片机应用设计与仿真——基于Keil与Proteus》丁明亮、唐前辉主编,北京航空航天大学出版社
附:
1、整体电路图
31。