单片机课设报告红外密码锁.docx
《单片机课设报告红外密码锁.docx》由会员分享,可在线阅读,更多相关《单片机课设报告红外密码锁.docx(44页珍藏版)》请在冰豆网上搜索。
![单片机课设报告红外密码锁.docx](https://file1.bdocx.com/fileroot1/2023-2/6/986cd329-59c6-41af-bdf2-8d1bfef7fb80/986cd329-59c6-41af-bdf2-8d1bfef7fb801.gif)
单片机课设报告红外密码锁
华侨大学
单片机课程设计报告
题目红外密码锁
班级09电子C班
一、总体设计思路
红外遥控电子密码锁由红外遥控发射遥控、红外接收终端、电子锁构成。
当红外接收终端收到遥控器送来的开锁密码,并与保存在终端中的密码对比。
当对比成功后终端向电子锁发出开锁命令,完成开锁功能。
此题目的重点、难点是实现红外信号的接收、密码储存和显示操作结果。
由于红外遥控不影响周边环境、不干扰其他电器设备,其无法穿透墙壁,因此,不同房间的家用电器可使用通用的遥控器而不会产生相互干扰;电路调试简单,只要按给定电路连接无误,一般不需任何调试即可投入工作;编解码容易,可进行多路遥控。
而且红外电子密码所体积较小、操作方便等优势,具有很好的市场前景。
1、本设计主要硬件功能部分
本系统主要由六大部分组成:
1)单片机最小系统模块;
2)LCD显示电路模块;
3)红外接收模块;
4)LED指示灯和蜂鸣器模块;
2、总体电路仿真图
二、模块电路设计思路
1、STC89C52介绍
STC89C52是由深圳宏晶科技公司生产的与工业标准MCS-51指令集和输出管脚相兼容的单片机。
STC89C52主要功能如表2.1所示,其PDIP封装如图2.1所示
主要功能特性
兼容MCS51指令系统
8K可反复擦写FlashROM
32个双向I/O口
256x8bit内部RAM
3个16位可编程定时/计数器中断
时钟频率0-24MHz
2个串行中断
可编程UART串行通道
2个外部中断源
共6个中断源
2个读写中断口线
3级加密位
低功耗空闲和掉电模式
软件设置睡眠和唤醒功能
表2.1STC89C52主要功能
STC89C52引脚介绍
①主电源引脚(2根)
VCC(Pin40):
电源输入,接+5V电源
GND(Pin20):
接地线
②外接晶振引脚(2根)
XTAL1(Pin19):
片内振荡电路的输入端
XTAL2(Pin20):
片内振荡电路的输出端
③控制引脚(4根)
RST/VPP(Pin9):
复位引脚,引脚上出现2个机器周期的高电平将使单片机复位。
ALE/PROG(Pin30):
地址锁存允许信号
PSEN(Pin29):
外部存储器读选通信号
EA/VPP(Pin31):
程序存储器的内外部选通,接低电平从外部程序存储器读指令,如果接高电平则从内部程序存储器读指令。
④可编程输入/输出引脚(32根)
STC89C52单片机有4组8位的可编程I/O口,分别位P0、P1、P2、P3口,每个口有8位(8根引脚),共32根。
P0口(Pin39~Pin32):
8位双向I/O口线,名称为P0.0~P0.7
P1口(Pin1~Pin8):
8位准双向I/O口线,名称为P1.0~P1.7
P2口(Pin21~Pin28):
8位准双向I/O口线,名称为P2.0~P2.7
P3口(Pin10~Pin17):
8位准双向I/O口线,名称为P3.0~P3.7
2、红外接收模块
遥控发射器专用芯片很多,根据编码格式可以分成两大类,这里我们使用的超薄型红外线遥控器使用的就是6121编码。
当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。
这种遥控码具有以下特征:
采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”,
其波形如图7所示。
上述“0”和“1”组成的32位二进制码经38kHz的载频进行二次调制以提高发射效率,达到降低电源功耗的目的。
然后再通过红外发射二极管产生红外线向空间发射。
遥控器在按键按下后,周期性地发出同一种32位二进制码,周期约为108ms。
一组码本身的持续时间随它包含的二进制“0”和“1”的个数不同而不同,大约在45~63ms之间,
下图为发射波形
当一个键按下超过36ms,振荡器使芯片激活,将发射一组108ms的编码脉冲,这108ms发射代码由一个起始码(4.5ms),一个结果码(4.5ms),低8位地址码(9ms~18ms),高8位地址码(9ms~18ms),8位数据码(9ms~18ms)和这8位数据的反码(9ms~18ms)组成。
如果键按下超过108ms仍未松开,接下来发射的代码(连发代码)将仅由起始码(9ms)和结束码(2.5ms)组成。
代码格式(以接收代码为准,接收代码与发射代码反向)
1)位定义
2)单发代码格式
3)连发代码格式
电路实现
一体化的红外接收装置将遥控信号的接收、放大、检波、整形集于一身,并且输出可以让单片机识别的TTL信号,这样大大简化了接收电路的复杂程度和电路的设计工作,方便使用。
在本系统中我们采用红外一体化接收头HS0038,外观图如图所示。
HS0038黑色环氧树脂封装,不受日光、荧光灯等光源干扰,内附磁屏蔽,功耗低,灵敏度高。
在用小功率发射管发射信号情况下,其接收距离可达35m。
它能与TTL、COMS电路兼容。
HS0038为直立侧面收光型。
它接收红外信号频率为38kHz,周期约26μs,同时能对信号进行放大、检波、整形,得到TTL电平的编码信号。
三个管脚分别是地、+5V电源、解调信号输出端。
利用外部中0断进行数据的接收。
图表为HS0038硬件结构
3、LCD1602液晶显示模块
各个引脚功能名称及作用
电路图如下
4、LED指示及蜂鸣器模块
蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。
蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。
蜂鸣器在电路中用字母“H”或“HA”(旧标准用“FM”、“LB”、“JD”等)表示。
有源蜂鸣器直接接上额定电源(新的蜂鸣器在标签上都有注明)就可连续发声;而无源蜂鸣器则和电磁扬声器一样,需要接在音频输出电路中才能发声。
本系统采用有源蜂鸣器,控制更简单。
蜂鸣器硬件如下图:
LED指示模块由三个LED灯组成,分别为红、绿、黄三种颜色。
当红灯亮时,密码锁处于锁紧状态;绿灯亮时,密码锁开启状态,当黄灯亮时,则输入密码错误提示,同时若三次输入错误,三灯全亮,同时蜂鸣器响。
LED指示模块如下:
4、密码模块(STC89C52内部存储自带EEPROM)
1、内置EEPROM简介
单片机运行时的数据都存在于RAM(随机存储器)中,在掉电后RAM中的数据是无法保留的,那么怎样使数据在掉电后不丢失呢?
这就需要使用EEPROM或FLASHROM等存储器来实现。
在传统的单片机系统中,一般是在片外扩展存储器,单片机与存储器之间通过IIC或SPI等接口来进行数据通信。
这样不光会增加开发成本,同时在程序开发上也要花更多的心思。
在STC单片机中内置了EEPROM(其实是采用IAP技术读写内部FLASH来实现EEPROM),这样就节省了片外资源,使用起来也更加方便。
下面就详细介绍STC单片机内置EEPROM及其使用方法。
要使用IAP功能,与以下几个特殊功能寄存器相关:
ISP_DATA:
ISP/IAP操作时的数据寄存器。
ISP/IAP从Flash读出的数据放在此处,向Flash写的数据也需放在此处
ISP_ADDRH:
ISP/IAP操作时的地址寄存器高八位。
ISP_ADDRL:
ISP/IAP操作时的地址寄存器低八位。
ISP_CMD:
ISP/IAP操作时的命令模式寄存器,须命令触发寄存器触发方可生效。
ISP_TRIG:
ISP/IAP操作时的命令触发寄存器。
单片机芯片型号起始地址内置EEPROM容量(每扇区512字节)
STC89C51RC,STC89LE51RC0x2000共八个扇区
TSC89C52RC,STC89LE52RC0x2000共八个扇区
STC89C54RD+,STC89LE54RD+0x8000共五十八个扇区
STC89C55RD+,STC89LE55RD+0x8000共五十八个扇区
STC89C58RD+,STC89LE58RD+0x8000共五十八个扇区
寄存器标识地址名称76543210初始值
ISP_DATA0xE2ISP/IAP闪存数据寄存器11111111
ISP_ADDRH0xE3ISP/IAP闪存地址高位00000000
ISP_ADDRL0xE4ISP/IAP闪存地址低位00000000
ISP_CMD0xE5ISP/IAP闪存命令寄存器MS2MS1MS0xxxxx000
ISP_TRIG0xE6ISP/IAP闪存命令触发xxxxxxxx
ISP_CONTR0xE7ISP/IAP控制寄存器ISPENSWBSSWRSTWT2WT1WT000xx000
B7B6B5B4B3B2B1B0命令/操作模式选择
保留命令选择
-----000待机模式,无ISP/IAP操作
-----001对用户的应用程序Flash区及数据Flash区字节读
-----010对用户的应用程序Flash区及数据Flash区字节编程
-----011对用户的应用程序Flash区及数据Flash区扇区擦除
2、EEPROM在密码锁中的使用
因为EEPROM具有掉电数据不丢失的功能,在密码锁中用于存储密码信息是再好不过的了。
这次设计使用了EEPROM的第一个扇区,地址开始为0x2000,连续存储8位密码。
应用EEPROM时应该主义一个问题,在reg52头文件中,未定义EEPROM中的ISP_DATA:
ISP_ADDRH:
ISP_ADDRL:
ISP_CMD:
等寄存器,需在reg52头文件中定义,如下图所示:
三、功能简介
关于红外密码锁的功能,下面我将简单地描述一下:
1、对于密码锁首次开机,里面是未设密码的,此时CPU首先读取EEPROM内的8位密码数据,当全为0xff时则表示未写入任何数据,此时会提示设置密码。
2、确认设置密码,进入设置界面,此时用户可以自行设置8位的密码,按确认键,密码存入EEPROM中,同时返回。
3、设置密码完毕后,进入输入密码界面。
此时用户可以输入8位密码进行开锁操作。
此时三个LED灯都不亮。
4、若输入密码错误,则黄色LED灯亮,页面提示剩余开锁机会,1秒后返回密码输入界面。
此密码锁有三次的输入机会,若三次输入均错误,则密码锁锁死,红色LED灯亮,同时报警声想起,持续1分中后,重新返回输入界面。
5、当输入密码正确,则密码锁打开,此时绿色LED灯亮,表示密码锁打开,此时LCD显示开锁状态的8秒时间倒计时,同时提示是否进入修改密码设置。
6、若倒计时为0或按下返回键,LED灯灭,密码锁锁住,返回输入界面。
7、若按下确认,则进入设置密码的界面,操作同2;
四、设计过程中的问题及改进
在这次的课程设计中,遇到过许多的问题,幸运的时都顺利地解决,一下是所遇的问题及解决方法:
1、EEPROM数据写入时与读出的数据不一样。
运用EEPROM时,在数据写入后,必须立即进行数据对比,看是否正确写入,因为有时写入EEPROM的数据会发生错误。
在我经过数据写入再读出校验后,很好地解决了这个问题。
2、首次输入密码可以进行开锁,再次输入时则一直提示输入错误。
进过检验,发现程序中密码进行对比时,有一变量未重新置0;导致一直提示错误。
后在每次进行密码对比时,将此变量重新置0,密码锁正常工作。
五、心得
通过本次论文设计,使我加深了对单片机的认识,并且熟悉了单片机系统的设计流程,收获丰硕。
功能上基本达标,硬件设施基本合乎要求,软件设计可以配合硬件实现其功能。
这次的课程设计,我了解了红外发射的各种编码格式,对红外接收电路有了初步的认识。
在运用C语言编程方面,我初步熟悉了C51编程步骤,对于模块化的编程有了初步的认知和能够初步地编写基本程序。
这次的实践设计,极大地增加了我对电子方面的兴趣,对于我们所学地理论知识的理解也进行了加深。
从这次的论文设计中,我真正的体会到,知识的重要性,特别是要理论联系实际,把我们所学的理论知识运用到实际生活当中,要用知识改变一切。
六、参考文献
1、《51单片机计数与运用系统开发案例精选》江志红编著清华大学出版社
2、《单片机原理与运用》张毅刚主编高等教育出版社
3、《STC89C52中文资料.PDF》宏晶科技:
专业单片机/存储器供应商www.MCU-M
4、红外遥控编码资料明浩(pnzwzw@)收集整理
5、STC89C51RC,STC89C52RC,STC89C54RD+EEPROM例程
出自viviFire,
本程序参考宏晶公司提供的STC5Axx系列EEPROM例子程序
附录一、程序
1、主程序头文件------------------------------------------
#ifndef_main_h_
#define_main_h_
#ifndefuint
#defineuintunsignedint
#endif
#ifndefuchar
#defineucharunsignedchar
#endif
externucharlock_code1[8];
externucharlock_code2[8];
externucharcode_num1,code_num2,v_num,daoji_num;
externvoidreadbus_eeprom();
#endif
主程序------------------------------------------------------------------------------------------
#include
#include"decoding.h"
#include"eeprom.h"
#include"1602.h"
#include"set_code.h"
#include
#defineucharunsignedchar
#defineuintunsignedint
#definesure11
#defineback12
ucharcodestr1_main[]="thereisnothe";
ucharcodestr2_main[]="codehere";
ucharcodestr3_main[]="inputthecode?
";
ucharcodestr4_main[]="sure";
ucharcodestr5_main[]="thelockisopen";
ucharcodestr6_main[]="setcode:
sure";
ucharcodestr7_main[]="warming!
!
!
!
";
ucharlock_code1[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
ucharlock_code2[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
ucharcode_num1,code_num2,jishi_num=8,count=0,v_num,daoji_num=3,min_daoji;
bitdaoji_flag1=1,daoji_flag2=0;
sbitLED5=P1^5;
sbitLED6=P1^6;
sbitbeep=P3^7;
voidreadbus_eeprom();
voiddelay();
ucharComparision_code();
externunsignedcharbyte_read(unsignedintbyte_addr);
/*****************************
延时程序
**************************/
voiddelay()
{uinti,j;
for(i=0;i<60000;i++);
for(j=0;j<30000;j++);
}
/*********************
主函数
**********************/
voidmain()
{TMOD=0x11;//设置定时器T1工作方式1,T0方式1
TH1=(65536-50000)/256;//赋初值(50ms初值)
TL1=(65536-50000)%256;
ET1=1;//使能定时器1
TR1=0;
EX0=1;//开红外接收中断1,
IT0=1;//下降沿触发
PX0=1;//红外接收级别最高
EA=1;
lcd_init();
readbus_eeprom();//读出密码
code_num1=Comparision_code();
while(code_num1==8)//count=8;没有存储密码;则写入密码
{write_str(0x80,str1_main);
write_str(0xc0,str2_main);
delay();//延时1s左右
set_code();
}
while
(1)//请输入密码进入主程序
{write_str(0x80,str3_main);
write_str(0xc0,str4_main);
delay();
input_code();//输入8位密码并比较返回code_num2
while(code_num2==1)//输入8位密码密码正确code_num=1;执行开锁
{TR1=1;daoji_num=3;//开计时中断输入错误变量置3;
write_str(0x80,str5_main);
write_str(0xc0,str6_main);
write_position(2,14);
lcd_wdat(jishi_num/10+0x30);//开启时间倒计时显示
lcd_wdat(jishi_num%10+0x30);
LED6=0;//绿灯亮
if(key==back||jishi_num==0)//时间到或按下返回键
{code_num2=0;TR1=0;jishi_num=8;LED6=1;}
if(key==sure)//sure键,进入密码修改
{TR1=0;jishi_num=8;
LED6=1;
set_code();
code_num2=0;
}
}
while(daoji_num==0)//三次输入错误,锁死
{TR1=1;
daoji_flag2=1;daoji_flag1=0;
write_str(0x80,str7_main);
beep=0;//蜂鸣器响
LED5=0;//红灯亮
write_position(2,14);
lcd_wdat(min_daoji/10+0x30);//开启时间倒计时60s显示
lcd_wdat(min_daoji%10+0x30);
if(min_daoji==0)//倒计时=0;关定时中断,程序返回输入界面
{TR1=0;
daoji_num=3;
daoji_flag2=0;daoji_flag1=1;
min_daoji=60;
}
}
}
}
/************************
1s计时中断
*************************/
voidT1_time1s()interrupt3
{
TH1=(65536-50000)/256;//赋初值(50ms初值)
TL1=(65536-50000)%256;
count++;//计时满50ms溢出一次
if(count==20)//溢出20次即50ms*20=1000ms=1s
{count=0;
if(daoji_flag1==1)//开启时间倒计时8s
{jishi_num=jishi_num-1;}
if(daoji_flag2==1)//锁死时间倒计时60s
{min_daoji=min_daoji-1;}
}
}
/***************************
读出eeprom中密码数组
*******************************/
voidreadbus_eeprom()
{
uintaddress=0x2000;
uchari=0;
for(i=0;i<8;i++)
{lock_code1[i]=byte_read(address);
address=address+1;
}
}
/********************************
判断是否有密码存在
*********************************/
unsignedcharComparision_code()
{uchari,j=0;
for(i=0;i<8;i++)
{if(lock_code1[i]==0xff)
{j++;}
}
returnj;
}
2、红外解码程序--------------------------------
头文件---------------
#ifndef_decoding_h
#define_decoding_h
#ifndefuint
#defineuintunsignedint
#endif
#ifndefuchar
#defineucharunsignedchar
#endif
externvoidencode();
externunsignedcharkey;
externunsignedcharuser_code,uuser_code,data_code,udata_code;
#endif
解码主程序--------------------------------------------------------------------
/**********************************************************
*红外解码保存相关函数及变量
**********************************************************/
#include
#defineucharunsignedchar
#d