找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3723|回复: 1
打印 上一主题 下一主题
收起左侧

关于stc15单片机红外控制密码锁的设计报告

[复制链接]
跳转到指定楼层
楼主
ID:356974 发表于 2018-7-11 15:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机微机原理及接口技术
综合系统设计报告

目:线

学    院:信息工程学院电子通信工程

专业班级:电子信息类164


关于15单片机红外控制密码锁的设计


摘要

电子系统设计环节是为了学生能够更好地巩固和实践所学专业知识而设置的,在本次实践中,我以《单片机原理及接口》课程中所学知识为基础,设计了红外密码锁。该系统通过红外遥控器,判断哪个按键,经数据转换把数值送入数码管显示并识别密码的正确性。

本系统的设计说明重点介绍了如下几方面的内容:

1)基于单片机红外密码锁的基本功能,同时对红外接收与发送进行了简单的阐述;

2)介绍了系统的总体设计、给出了系统的整体流程框图,并对其进行了功能模块划分及所采用的元器件进行了详细说明;




目录

摘要              Ⅰ

Abstract              Ⅱ

第一章 绪论              5

1 .1 课题背景及目的              5

1. 2 国内外研究现状              6

第二章 课题任务              6

2 .1 设计简介              6

2. 2 设计目的              6

2. 3 设计任务              6

第三章 方案描述              7

第四章 理论分析              7

4 .1 遥控器对应码值              7

4. 2 密码锁部分              7

第五章 理论分析              8

5 .1 15单片机              8

5. 2 红外线原理              8

第六章 电路与程序设计              8

第七章 程序操作实现              10

附件(程序)              10

参考文献(References)              15



第一章 绪论

1 .1 课题背景及目的

在日常的生活和工作中, 住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。若使用传统的机械式钥匙开锁,人们常需携带多把钥匙, 使用极不方便, 且钥匙丢失后安全性即大打折扣。随着科学技术的不断发展,人们对日常生活中的安全保险器件的要求越来越高。为满足人们对锁的使用要求,增加其安全性,用密码代替钥匙的密码锁应运而生。密码锁具有安全性高、成本低、功耗低、易操作等优点。

在安全技术防范领域,具有防盗报警功能的电子密码锁逐渐代替传统的机械式密码锁,克服了机械式密码锁密码量少、安全性能差的缺点,使密码锁无论在技术上还是在性能上都大大提高一步。随着大规模集成电路技术的发展,特别是单片机的问世,出现了带微处理器的智能密码锁,它除具有电子密码锁的功能外,还引入了智能化管理、专家分析系统等功能,从而使密码锁具有很高的安全性、可靠性,应用日益广泛。

随着人们对安全的重视和科技的发展,许多电子智能锁(指纹识别、IC卡辨认)已在国内外相继面世。但是这些产品的特点是针对特定的指纹和有效卡,只能适用于保密要求的箱、柜、门等。而且指纹识识别器若在公共场所使用存在容易机械损坏,IC卡还存在容易丢失、损坏等特点。加上其成本较高,一定程度上限制了这类产品的普及和推广。鉴于目前的技术水平与市场的接收程度,电子密码锁是这类电子防盗产品的主流。

但是接触式密码锁系统都相应的存在着不同的缺点。例如:接触式密码锁系统成本较低,体积小,卡片本身无须电源,但使用不太方便,而且有接触磨损。相比之下,红外遥控密码锁系统的成本与接触式密码锁系统相当,而且可以进行近距离遥控,使用十分方便。而且它已经与 PC 机的数据库相结合,可以组成一套酒店房间的门禁管理系统。  

由于红外遥控具有许多优点, 例如红外线发射装置采用红外发光二极管遥控发射器易于小型化且价格低廉; 采用数字信号编码和二次调制方式,不仅可以实现多路信息的控制,增加遥控功能,提高信号传输的抗干扰性,减少误动作,而且功率消耗低;红外线不会向室外泄露,不会产生信号串扰;反应速度快、传输效率高、工作稳定可靠等。工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。所以红外线遥控是目前使用最广泛的一种通信和遥控手段。 在本设计中,红外遥控密码锁和 PC 机、数据库相结合,能够实现适时的、强大的管理,使得整个红外遥控系统得到更好的完善。

  •                                                                                                                                                                                                                                                              2 国内外研究现状

目前大部分的锁采用的都是机械式的,其最大的缺点是利用简单工具就能很容易地把锁打开。针对这种情况,我们设计了一种红外遥控密码锁,而一般设备都采用专用的遥控编码及解码集成电路,其制作简单、容易,但由于特定功能的限制,只适用于专用的电器产品,其应用范围受到限制。而设计的红外遥控密码锁系统能提高门禁系统的可靠性和安全性,适应市场需要。该系统具有普通电子密码锁功能的同时,还增加了遥控功能。该系统具有较强的实际应用价值,所涉及的技术包括:红外载波数据传输技术、单片机控制技术、红外遥控系统编码及译码技术、电路设计与演示板制作技术等。

第二章 课题任务

2 .1 设计简介

单片机由于其微小的体积和极低的成本,广泛的应用于家用电器、工业控制等领域中。在工业生产中。单片机微型计算机是微型计算机的一个重要分支,也是颇具生命力的机种。单片机微型计算机简称单片机,特别适用于控制领域,故又称为微控制器。本系统避开了传统的键盘输入计算器,大大减少了I/O引脚和键盘的复杂性。系统采用STC15系列单片机为中心器件来设计计算器控制器并用数码管来进行显示。

2. 2 设计目的

通过本次课题实践,运用《单片机原理及接口》所学知识及查阅相关资料,完成简易计算器的设计,达到理论知识与实践更好结合、提高综合运用所学知识和设计能力的目的。
通过本次设计训练,可以使我们在基本思路和基本方法上对基于STC15单片机的嵌入式系统设计有一个比较感性的认识,并具备一定程度的设计能力。

2. 3 设计任务

在本次课题实践中,主要完成如下方面的设计任务:
1)掌握15单片机的最小电路及外围扩展电路的设计方法;
2)了解单片机数据转换功能及工作过程;
3)完成主要功能模块的硬件电路设计及必要的参数确定;
4)用keil软件完成程序的编写及调试。

第三章 方案描述

总体框图如图1所示。

图1

本密码锁是以STC15W4系列58S4单片机为核心构成的简易密码锁系统。该系统通过单片机控制,实现对红外遥控器扫描进行实时的按键检测,并把检测数据存储并判断显示出来。

第四章 理论分析

4 .1 遥控器对应码值

先确定输入的数字,并把数字显示出来。首先要判断红外遥控器上是哪个键按下,找到每个数字的编码地址,依次如下:
“0”:   0x16
“1”:   0x0c
“2”:   0x18
“3”:   0x5e
“4”:   0x08
“5”:   0x1c
“6”:   0x5a
“7”:   0x42
“8”:   0x52
“9”:   0x4a
当按下数字键的时候可直接让它在显示在数码管上,再输入第二个数(同第一个数的显示方法一样),以上各显示结果的地址均已固定。

4. 2 密码锁部分

先用3个数码管位码分别显示输入的密码,输入第几位密码,密码是否正确(0/1)。开始定义一个数组用来存储初始密码,再有另一个数组存储输入的8位密码,然后通过数码管显示,最后是密码判断,即两个数组进行比较,若相等则密码正确,否则错误。

第五章 主要器件介绍

5.1、单片机
本次实验采用了STC15系列单片机,编程实验所应用的STC15W4K32S4芯片电压工作范围宽,不需要任何转换芯片,可以直接通过电脑USB接口进行ISP下载编程,集成了更多的SRAM、定时器、串口,集成了更多的高能部件,比较器,带死区控制的6路15位专用PWM,开发了功能强大的在线编程软件。
5.2、红外线发射和接收

人们见到的红外遥控系统分为发射和接收两部分。发射部分的发射元件为红外发光二极管,它发出的是红外线而不是可见光。

常用的红外发光二极管发出的红外线波长为 940nm 左右,外形与普通φ5mm 发光二极管相同,只是颜色不同。一般有透明、黑色和深蓝等三种。判断红外发

光二极管的好坏与判断普通二极管一样的方法。单只红外发光二极管的发射功率约 100mW。红外发光二极管的发光效率需用专用仪器测定,而业余条件下,只能凭经验用拉距法进行粗略判定。

接收电路的红外接收管是一种光敏二极管,使用时要给红外接收二极管加反向偏压,它才能正常工作而获得高的灵敏度。红外接收二极管一般有圆形和方形两种。由于红外发光二极管的发射功率较小,红外接收二极管收到的信号较弱,所以接收端就要增加高增益放大电路。然而现在不论是业余制作或正式的产品,大都采用成品的一体化接收头。红外线一体化接收头是集红外接收、放大、滤波和比较器输出等的模块,性能稳定、可靠。所以,有了一体化接收头,人们不再制作接收放大电路,这样红外接收电路不仅简单而且可靠性大大提高。  

第六章 电路与程序设计

主程序进行程序中用到的一些存储单元的初始化。首先,进行存储单元初始化,给数码管显示单元,红外发送与接收程序,数码管显示数据转换程序,数码管显示数据转换子程序和显示子程序。
5.1.红外信号发射程序框图

5.2.遥控接收程序框图




红外遥控器的0码和1码
进入中断
红外接收程序



第七章 程序操作实现

(输入密码)                       (密码错误显示0)

(密码正确显示1)            

附件(程序)

  1. #include "stc15.h"//包含单片机头文件
  2. #include "gpio.h"//包含初始化UO端口头文件
  3. #include <intrins.h>
  4. #define uchar unsigned char
  5. #include"595hc.h"//包含数码管是示头文件
  6. unsigned char IR_UserH=0;//用户码(地址)高字节
  7. unsigned char IR_UserL=0;//用户码(地址)低字节
  8. unsigned char IR_data=0;//数排码
  9. unsigned char IR_data2=0; //数据反码
  10. unsigned char passnum[8]={6,6,6,6,6,6,6,6};//初始正确密码
  11. unsigned char intnum[8]={0,0,0,0,0,0,0,0};
  12. unsigned char number=0;
  13. unsigned char t;
  14. unsigned char l;
  15. unsigned char i;
  16. typedef unsigned char u8;
  17. sbit out_0=P4^6;
  18. sbit out_1=P4^7;
  19. unsigned char code_length=0;//遥控代码长度
  20. unsigned long code_t=0;//临时保存遥控代码
  21. unsigned long code_tt=0;//保存遥控代码
  22. bit bdata code_right=0;//接收代码是否为正确标志位
  23. unsigned char d_code_x(unsigned int t) //判断红外位是0还是1的子程序
  24. {
  25.     if(t<=0x480&&t>=0x300)                              //0x300~0x480为有效0码
  26.               return 0;
  27.               else
  28.               {
  29.                  if(t<=0x8ee&&t>=0x700)              //0x700~0x8ee为有效1 码
  30.                    return 1;
  31.                             else
  32.                               return 0xff;                              //错误
  33.               }
  34. }
  35. void receive_code()interrupt 10              //判断中断INT2下降沿触发接收代码
  36. {
  37.   unsigned int temp;
  38.   unsigned long dd_code;
  39.   if(TR0==0)
  40.   {
  41.      TH0=TL0=0;
  42.               TR0=1;
  43.   }
  44.   else
  45.   {
  46.     TR0=0;
  47.               temp=TH0*256+TL0;
  48.               TH0=TL0=0;
  49.               TR0=1;
  50.               dd_code=d_code_x(temp);
  51.               if(dd_code==0||dd_code==1)
  52.                  {
  53.                                code_t=code_t+(dd_code<<code_length);
  54.                             code_length++;                               //遥控代码长度
  55.                  }
  56.                 else
  57.               {
  58.                  if(code_length>=32&&code_right==0)
  59.                  {
  60.                    code_tt=code_t;
  61.                             code_right=1;                            //正确
  62.                  }
  63.                  code_length=0;                            //清零
  64.                  code_t=0;
  65.               }
  66.   }
  67. }
  68.   //延迟
  69.   void yans(u8 n)                            //@11.0592MHz
  70. {
  71.               unsigned char i, j,x;
  72.               for(x=0;x<n;x++)
  73.               {
  74.               _nop_();
  75.               _nop_();
  76.               _nop_();
  77.               i = 11;
  78.               j = 190;
  79.               do
  80.               {
  81.                             while (--j);
  82.               } while (--i);
  83.    }
  84. }
  85. void main(void)
  86. {
  87.     GPIO();                            //初始化IO端口为准双向口
  88.               TMOD=0x11;                //T0定时方式1,T定时方式1
  89.               INT_CLKO|=0X10;                //开外部中断INT2,下降沿触发
  90.               TR0=0;                                            //定时器0计数开关
  91.               EA=1;                                            //开CPU总中断EA
  92.               while(1){
  93. number=0;
  94. i=0;
  95.      while(number!=8)
  96.               {
  97.               IR_UserL=(unsigned char)(code_tt&0xff);                            //用户码低8位
  98.               IR_UserH=(unsigned char)((code_tt>>8)&0xff);                 //高八位
  99.               IR_data=(unsigned char)((code_tt>>16)&0xff);                            //数据码8位
  100.               IR_data2=(unsigned char)((code_tt>>24)&0xff);                               //数据反码8位
  101.               if(code_right==1)
  102.               {
  103.                  INT_CLKO&=0xEF;                 //关外部中断INT2
  104.                  code_right=0;
  105.                  switch(IR_data)                            //红外接收判断
  106.               {
  107. case 0x16:intnum[l]=(unsigned char)(0);Dis_buf[0]=0;l++;number++;/*yans(50000);*/break;                  //扫描码对应为十六进制数,0
  108. case 0x0c:intnum[l]=(unsigned char)(1);Dis_buf[0]=1;l++;number++;/*yans(50000);*/break;       //1
  109. case 0x18:intnum[l]=(unsigned char)(2);Dis_buf[0]=2;l++;number++;/*yans(50000);*/break;                  //2
  110. case 0x5e:intnum[l]=(unsigned char)(3);Dis_buf[0]=3;l++;number++;/*yans(50000);*/break;                  //3
  111. case 0x08:intnum[l]=(unsigned char)(4);Dis_buf[0]=4;l++;number++;/*yans(50000);*/break;       //4
  112. case 0x1c:intnum[l]=(unsigned char)(5);Dis_buf[0]=5;l++;number++;/*yans(50000);*/break;       //5
  113. case 0x5a:intnum[l]=(unsigned char)(6);Dis_buf[0]=6;l++;number++;/*yans(50000);*/break;       //6
  114. case 0x42:intnum[l]=(unsigned char)(7);Dis_buf[0]=7;l++;number++;/*yans(50000);*/break;       //7
  115. case 0x52:intnum[l]=(unsigned char)(8);Dis_buf[0]=8;l++;number++;/*yans(50000);*/break;     //8
  116. case 0x4a:intnum[l]=(unsigned char)(9);Dis_buf[0]=9;l++;number++;/*yans(50000);*/break;       //9

  117.                                           /*default:code_tt=0;*/
  118.       }
  119.                  }               
  120. INT_CLKO|=0x10;                               //开外部中断INT2
  121.               }
  122. Dis_buf[3]=(unsigned char)(number+1);
  123. display();
  124. }
  125. //密码判断
  126. {for(i=0;i<8;i++)            
  127.                             {
  128. if(intnum[i]==passnum[i])t++;
  129.                                           else if(intnum[i]!=passnum[i])
  130.                                           {
  131.                                           Dis_buf[7]=(unsigned char)(0);
  132.                                          

  133. display();break;
  134.                                           }
  135.                             }
  136. if(t==8){
  137.                                           Dis_buf[7]=(unsigned char)(1);
  138.                                          

  139. display();t=0;
  140.                             }
  141.               }
  142.               }
  143. }
复制代码

完整的Word格式文档51黑下载地址:
NANCHANG UNIVERSITY.docx (942.54 KB, 下载次数: 33)


评分

参与人数 1黑币 +50 收起 理由
admin + 50

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:563265 发表于 2019-6-15 23:56 | 只看该作者
这个代码不全吧   感觉好像有问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表