【普中】基于51单片机的矩阵电子暗码锁LCD1602液晶显示 proteus仿真+程序+ ...

打印 上一主题 下一主题

主题 1593|帖子 1593|积分 4779

【普中】基于51单片机的矩阵电子暗码锁LCD1602液晶显示设计
( proteus仿真+程序+设计报告+讲解视频)
仿真图proteus8.16(有低版本)
程序编译器:keil 4/keil 5
编程语言:C语言
设计编号:P14
1.主要功能:

基于51单片机AT89C51/52(与AT89S51/52、AT89C51/52、STC89C51/52等51内核单片机通用)
基于51单片机的暗码锁LCD1602液晶显示设计
1.按键设置6位暗码,输入暗码若暗码正确,则锁打开。显示open!开锁指示灯点亮。
2.暗码可以自己修改(6位暗码),必须是开始状态才气改密。为防止误操作,修改暗码得输入两次。
3.若暗码输入错误次数超过3次,蜂鸣器报警并且锁定键盘,需复位重新开始操作。
4.系统具有24C02有复位、掉电保存暗码功能。
5.必要在Proteus软件和普中51开辟板实现功能验证。
(如今仅完全适配普中开辟板A234,其他普中开辟板型号可能必要做代码修改或接线)
需留意仿真中51单片机芯片是兼容的,AT89C51,AT89C52是51单片机的具体型号,内核是一样的。相同的原理图里,无论stc还是at都一样,引脚功能都是一样的,程序是兼容的,芯片可以替换为STC89C52/STC89C51/AT89C52/AT89C51等51单片机芯片。
讲解视频:

仿真讲解+实物演示+代码讲解

2.仿真

开始仿真
打开仿真工程,双击proteus中的单片机,选择hex文件路径,然后开始仿真。
1、首次利用时输入:131420,对暗码进行初始化,当显示:initpassword, 证实暗码初始化完成,此时的暗码为:000000。然后可以改密了。
(如暗码忘记就再输入131420初始化,然后暗码就是000000)

2.输入暗码正确,LCD显示open,继电器导通模拟开锁动作。

3当输入暗码错误后,LCD显示error,报警并锁定键盘3秒钟。

3. 程序代码

利用keil4或者keil5编译,代码有注释,可以结合报告理解代码含义。
  1. //==================================================================================================
  2. //=======================================LCD1602====================================================
  3. //==================================================================================================
  4. #define yi 0x80 //LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80)
  5. #define er 0x80+0x40 //LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)
  6. //----------------延时函数,后面经常调用----------------------
  7. void delay(uint xms)//延时函数,有参函数
  8. {
  9.         uint x,y;
  10.         for(x=xms;x>0;x--)
  11.          for(y=110;y>0;y--);
  12. }
  13. //--------------------------写指令---------------------------
  14. void write_1602com(uchar com)//****液晶写入指令函数****
  15. {
  16.         lcd1602_rs=0;//数据/指令选择置为指令
  17.         lcd1602_rw=0; //读写选择置为写
  18.         P0=com;//送入数据
  19.         delay(1);
  20.         lcd1602_en=1;//拉高使能端,为制造有效的下降沿做准备
  21.         delay(1);
  22.         lcd1602_en=0;//en由高变低,产生下降沿,液晶执行命令
  23. }
  24. //-------------------------写数据-----------------------------
  25. void write_1602dat(uchar dat)//***液晶写入数据函数****
  26. {
  27.         lcd1602_rs=1;//数据/指令选择置为数据
  28.         lcd1602_rw=0; //读写选择置为写
  29.         P0=dat;//送入数据
  30.         delay(1);
  31.         lcd1602_en=1; //en置高电平,为制造下降沿做准备
  32.         delay(1);
  33.         lcd1602_en=0; //en由高变低,产生下降沿,液晶执行命令
  34. }
  35. //-------------------------初始化-------------------------
  36. void lcd_init(void)
  37. {
  38.         write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据
  39.         write_1602com(0x0c);//开显示不显示光标
  40.         write_1602com(0x06);//整屏不移动,光标自动右移
  41.         write_1602com(0x01);//清显示
  42. }
  43. //========================================================================================
  44. //=========================================================================================
  45. //==============将按键值编码为数值=========================
  46. unsigned char coding(unsigned char m)         
  47. {
  48.         unsigned char k;
  49.         switch(m)
  50.         {
  51.                 case (1): k=1;break;
  52.                 case (2): k=2;break;
  53.                 case (3): k=3;break;
  54.                 case (4): k='A';break;
  55.                
  56.                 case (5): k=4;break;
  57.                 case (6): k=5;break;
  58.                 case (7): k=6;break;
  59.                 case (8): k='B';break;
  60.                
  61.                 case (9): k=7;break;
  62.                 case (10): k=8;break;
  63.                 case (11): k=9;break;
  64.                 case (12): k='C';break;
  65.                
  66.                 case (13): k='*';break;
  67.                 case (14): k=0;break;
  68.                 case (15): k='#';break;
  69.                 case (16): k='D';break;
  70.         }
  71.         return(k);
  72. }
  73. //=====================按键检测并返回按键值===============================
  74. void delay_uint(unsigned     int i)//延时
  75. {
  76.    while(i--);
  77. }
  78. 完整代码见文末下载链接
  79. unsigned char keynum(void)
  80. {
  81.    unsigned char i, j; // 定义变量i和j分别存储行列索引
  82.    i = 0;
  83.    j = 0;
  84.    // 设置P1端口的低四位输出为0,高四位保持不变,准备读取键盘列信号
  85.    P1 = 0x0f;
  86.    // 判断是否有键被按下(即P1端口的值不全为0x0f)
  87.    if(P1 != 0x0f) {
  88.            // 延时去抖,等待10ms再次检测,确保按键稳定
  89.            delay_uint(10000);
  90.            // 再次检查,确认按键确实被按下
  91.            if(P1 != 0x0f) {
  92.                    // 根据P1的值判断是哪一行被按下
  93.                    switch(P1) {
  94.                            case 0x0e: i = 3; break; // 第1行
  95.                            case 0x0d: i = 2; break; // 第3行
  96.                            case 0x0b: i = 1; break; // 第3行
  97.                            case 0x07: i = 0;           // 第4行
  98.                    }
  99.                    // 设置P1端口的高四位输出为0,低四位保持不变,准备读取键盘行信号
  100.                    P1 = 0xf0;
  101.                    // 根据P1的新值判断是哪一列被按下
  102.                    switch(P1) {
  103.                            case 0xe0: j = 13; break; // 第1列
  104.                            case 0xd0: j = 9;  break; // 第2列
  105.                            case 0xb0: j = 5;  break; // 第3列
  106.                            case 0x70: j = 1;                 // 第4列
  107.                    }
  108.            }
  109.    }
  110.    // 检查新获取的按键值(行列索引组合)是否与上一次的不同
  111.    if(key != i + j) {
  112.            // 更新按键值并返回
  113.            key = i + j;
  114.            return key;
  115.    } else {
  116.            // 如果按键值没有变化,返回0表示没有新按键事件
  117.            return 0;
  118.    }
  119. }
  120. //=======================一声提示音,表示有效输入========================
  121. void OneAlam(void)
  122. {
  123.         beep_cnt=1;
  124.         beep_time=BEEP_TIME;
  125. }
  126. //========================二声提示音,表示操作成功========================
  127. void TwoAlam(void)
  128. {
  129.         beep_cnt=2;
  130.         beep_time=BEEP_TIME;
  131. }
  132. //========================三声提示音,表示错误========================
  133. void ThreeAlam(void)
  134. {
  135.         beep_cnt=3;
  136.         beep_time=BEEP_TIME;
  137. }
  138. //=======================显示提示输入=========================
  139. void DisplayChar(void)
  140. {
  141.         unsigned char i;
  142.         if(pass==1)
  143.         {
  144.                 //DisplayListChar(0,1,LockOpen);
  145.                 write_1602com(er);                                   //在二行开始显示
  146.                 for(i=0;i<16;i++)
  147.                 {
  148.                         write_1602dat(LockOpen[i]);           //显示open 开锁成功
  149.                 }
  150.         }
  151.         else
  152.         {
  153.                 if(N==0)
  154.                 {
  155.                         //DisplayListChar(0,1,Error);
  156.                         write_1602com(er);
  157.                         for(i=0;i<16;i++)
  158.                         {
  159.                                 write_1602dat(Error[i]);        //显示错误
  160.                         }
  161.                 }
  162.                 else
  163.                 {
  164.                         //DisplayListChar(0,1,start_line);       
  165.                         write_1602com(er);
  166.                         for(i=0;i<16;i++)
  167.                         {
  168.                                 write_1602dat(start_line[i]);//显示开始输入       
  169.                         }
  170.                 }
  171.         }
  172. }
  173. //========================重置密码==================================================
  174. //==================================================================================
  175. void ResetPassword(void)
  176. {
  177.         unsigned char i;       
  178.         unsigned char j;
  179.         if(pass==0)
  180.         {
  181.                 pass=0;                          
  182.                 DisplayChar();           //显示错误
  183.                 ThreeAlam();           //没开锁时按下重置密码报警3声
  184.         }
  185.         else                                   //开锁状态下才能进行密码重置程序
  186.         {
  187.             if(ReInputEn==1)   //开锁状态下,ReInputEn置1,重置密码允许
  188.                 {
  189.                         if(N==6)           //输入6位密码
  190.                         {
  191.                                 ReInputCont++;                        //密码次数计数       
  192.                                 if(ReInputCont==2)                //输入两次密码
  193.                                 {
  194.                                         for(i=0;i<6;)
  195.                                         {
  196.                                                 if(TempPassword[i]==InputData[i])        //将两次输入的新密码作对比
  197.                                                         i++;
  198.                                                 else                                                                //如果两次的密码不同
  199.                                                 {
  200.                                                         //DisplayListChar(0,1,Error);
  201.                                                         write_1602com(er);
  202.                                                         for(j=0;j<16;j++)
  203.                                                         {
  204.                                                                 write_1602dat(Error[j]);        //显示错误Error
  205.                                                         }
  206.                                                         ThreeAlam();                        //错误提示       
  207.                                                         pass=0;                                        //关锁
  208.                                                         ReInputEn=0;                        //关闭重置功能,
  209.                                                         ReInputCont=0;
  210.                                                         DisplayChar();
  211.                                                         break;
  212.                                                 }
  213.                                         }
  214.                                         if(i==6)
  215.                                         {
  216.                                                 //DisplayListChar(0,1,ResetOK);
  217.                                                 write_1602com(er);
  218.                                                 for(j=0;j<16;j++)
  219.                                                 {
  220.                                                         write_1602dat(ResetOK[j]);          //密码修改成功,显示
  221.                                                 }
  222.                                                 TwoAlam();                                //操作成功提示
  223.                                                  WrToROM(TempPassword,0,6);                //将新密码写入24C02存储
  224.                                                 ReInputEn=0;
  225.                                         }
  226.                                         ReInputCont=0;
  227.                                         CorrectCont=0;
  228.                                 }
  229.                                 else                                          //输入一次密码时
  230.                                 {
  231.                                         OneAlam();
  232.                                         //DisplayListChar(0, 1, again);                 //显示再次输入一次
  233.                                         write_1602com(er);
  234.                                         for(j=0;j<16;j++)
  235.                                         {
  236.                                                 write_1602dat(again[j]);                        //显示再输入一次
  237.                                         }                                       
  238.                                         for(i=0;i<6;i++)
  239.                                         {
  240.                                                 TempPassword[i]=InputData[i];                //将第一次输入的数据暂存起来                                               
  241.                                         }
  242.                                 }
  243.                         N=0;                                                //输入数据位数计数器清零
  244.                    }
  245.             }
  246.         }
  247. }
  248. //=======================输入密码错误超过三过,报警并锁死键盘======================
  249. void Alam_KeyUnable(void)
  250. {
  251.         P1=0x00;
  252.         {
  253.                 beep_cnt=255;
  254.                 beep_time=BEEP_TIME;
  255.         }
  256. }
  257. //=======================取消所有操作============================================
  258. void Cancel(void)
  259. {       
  260.         unsigned char i;
  261.         unsigned char j;
  262.         //DisplayListChar(0, 1, start_line);
  263.         write_1602com(er);
  264.         for(j=0;j<16;j++)
  265.         {
  266.                 write_1602dat(start_line[j]);          //显示开机输入密码界面
  267.         }
  268.         TwoAlam();                                //提示音
  269.         for(i=0;i<6;i++)
  270.         {
  271.                 InputData[i]=0;                //将输入密码清零
  272.         }
  273.         KEY=1;                                        //关闭锁
  274.         pass=0;                                        //密码正确标志清零
  275.         ReInputEn=0;                        //重置输入充许标志清零
  276.         ErrorCont=0;                        //密码错误输入次数清零
  277.         CorrectCont=0;                        //密码正确输入次数清零
  278.         ReInputCont=0;                        //重置密码输入次数清零
  279.         s3_keydown=0;
  280.         key_disable=0;                        //锁定键盘标志清零
  281.         N=0;                                        //输入位数计数器清零
  282. }
复制代码
4. 设计报告

12485字设计报告,内容包括目次,硬件设计、软件设计、软硬件框图、调试、结论等

20世纪80年代后,随着电子锁专用集成电路的出现,电子锁的体积缩小,可靠性提高,成本较高,是得当利用在安全性要求较高的场所,且必要有电源提供能量,利用还局限在一定范围,难以遍及,所以对它的研究一直没有显着进展。
如今,在西方发达国家,电子暗码锁技术相对先辈,种类齐全,电子暗码锁已被广泛应用于智能门禁系统中,通过多种更加安全,
更加可靠的技术实现大门的管理。在我国电子锁团体程度尚处于国际上70年代左右,电子暗码锁的成本还很高,市场上仍以按键电子锁为主,按键式和卡片钥匙式电子锁已引进国际先辈程度,现国内有几个厂生产供应市场。但国内自行研制开辟的电子锁,其市场结构尚未形成,应用还不广泛。国内的不少企业也引进了天下上先辈的技术,发展远景非常可观。希望通过不断的积极,使电子暗码锁在我国也能得到广泛应用
5. 设计资料内容清单&&下载链接

资料设计资料包括仿真,程序代码、讲解视频、功能要求、设计报告、软硬件设计框图等。
0、常见利用标题及解决方法–必读!!!!
1、仿真图
2、程序源码注释
3、功能要求
4、开题报告
5、设计报告
6、软硬件流程框图
7、烧录工具
8、讲解视频
9、实物图
Altium Designer 安装破解
KEIL+proteus 单片机仿真设计教程
KEIL安装破解
Proteus元器件查找
Proteus安装
Proteus简易利用教程
单片机学习资料
普中-2&普中-3&普中-4开辟板原理图.pdf
相关数据手册
答辩技巧
设计报告常用描述
鼠标双击打开查找嘉盛单片机51 STM32单片机课程毕业设计.url

资料下载链接:

https://docs.qq.com/doc/DS2pPenNRaHB6SlR1

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

飞不高

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表