历史上的今天
返回首页

历史上的今天

今天是:2025年02月26日(星期三)

正在发生

2020年02月26日 | 单片机密码锁程序+仿真+详细注释

2020-02-26 来源:51hei

程序名:密码锁
编写人:    
编写时间:  
硬件支持:STC89C52RC 外部12MHZ晶振 
说明备注:
1、输入密码时在LCD屏幕上显示暗码(*),设置管理员密码时显示明码。
2、用户密码3组位5位密码及管理员密码1组。
3、断电保护密码不消失。
4、可手动复位管理员密码及用户密码。
5、输入管理员密码才能修改用户密码,密码不能为6个0,管理员密码需要按复位键进行设置。
6、可指定秀给任意1组的密码。
7、LCD操作步骤提示。
8、密码输入错误3次蜂鸣器报警,输入错误5次键盘锁定(需要复位解锁)。
9、输入管理员密码才能修改用户密码,密码不能为6个0,管理员密码需要按复位键进行设置。
10、按键提示音,开锁音,错误音,报警音。
11、第一次上电强制要求设置管理员密码     

 

1.jpg?imageView2/2/w/550 (176.44 KB, 下载次数: 4)

下载附件  保存到相册

2019-4-12 23:11 上传


此图片仅供参考

后来用STC12C5A60S2做的 用的是内部集成的eeprom 添加了刷卡开锁+更换为12864屏
因为很多功能不能仿真 没有发上来  

单片机主程序:

/********************************************************************************************/

#include "config.h"

#include "lcd1602.h"

#include "eeprom.h"

#include "LOCK.h"

#include "delay.h"

#include "KEY.h"


void Timer0Init(void);        //50毫秒@12.000MHz

void Timer1Init(void);        //1毫秒@12.000MHz

/********************************************************************************************/

//                        主程序                        //

/********************************************************************************************/

void main(void){


        LOCK=0;                                        //初始化锁关闭状态

        ALAM=1;

        EA=1;                                        //开启总中断

        Timer0Init();                        //50毫秒@12.000MHz

        Timer1Init();                        //1毫秒@12.000MHz

        Delay1ms(400);                 //启动等待,等LCD讲入工作状态

        Init_LCD1602();         //LCD初始化        

        InitLock();                                 //密码锁上电初始化

        while(1){               //进入主循环

                keyjiance();                //读取按键状态、确定要执行动作

        }

}

void Timer0Init(void){                //50毫秒@12.000MHz

        TMOD &= 0xF0;                        //设置定时器模式

        TMOD |= 0x01;                        //设置定时器模式

        TL0 = 0xB0;                                //设置定时初值

        TH0 = 0x3C;                                //设置定时初值

        TF0 = 0;                                //清除TF0标志

        TR0 = 0;                                //定时器1停止计时

        ET0 = 1;                                //使能T0中断

}

void InterruptTimer0() interrupt 1{

        unsigned char countt0;

        TL0=0xB0;

        TH0=0x3C;                   //定时器重新赋初值

        countt0++;              //计时变量加,加1次时50ms

        if(countt0==20){        //加到20次就是1s

                countt0=0;          //变量清零

                second++;           //秒加

                if(key_disable==1){ //键盘锁状态时

                        if(second==3){  //秒加到1s时

                                TR0=0;      //关定时器

                                TL0=0xB0;        //再次赋初值

                                TH0=0x3C;   //再次赋初值

                                Cancel0();        //返回--取消所有操作

                                second=0;   //秒清零

                        }

                }

                else{                    //不在键盘锁状态时

                        if(second==6){  //秒加到5时                

                                TR0=0;      //关闭定时器

                                second=0;   //秒清零

                                Cancel0();        //返回--取消所有操作

                                TL0=0xB0;        //重新赋初值

                                TH0=0x3C;   //重新赋初值

                        }

                        else

                                TR0=1;      //打开定时器

                }                       

    }        

}

void Timer1Init(void){                //1毫秒@12.000MHz

        TMOD &= 0x0F;                        //设置定时器模式

        TMOD |= 0x10;                        //设置定时器模式

        TL1 = 0x18;                                //设置定时初值

        TH1 = 0xFC;                                //设置定时初值

        TF1 = 0;                                //清除TF1标志

        TR1 = 1;                                //定时器1开始计时

        ET1 = 1;                             //使能T1中断

}

//*********************************中断服务函数**************************************

void  time1_int(void) interrupt 3{//定时器T1

        TL1 = 0x18;                                //重置定时初值

        TH1 = 0xFC;                                //重置定时初值

        KeyScan();                                //矩阵键盘扫面

}

复制代码




锁.c :

#include "config.h"

#include "LCD1602.h"

#include "eeprom.h"

#include "delay.h"

#include "KEY.h"

#include "LOCK.h"



bit  pass=0;                                                                        //密码正确标志

bit  ReInputIx=0;                                                                          //重置密码功能标志 

bit  ReInputEn=0;                                                                          //重置密码输入允许标志        

bit  key_disable=0;                                                                        //锁定键盘标志

推荐阅读

史海拾趣

台湾稳态公司的发展小趣事

在电子行业中,技术创新是企业保持竞争力的关键。台湾稳态公司始终坚持以创新为核心的发展理念,不断投入研发资源,推动产品创新和技术升级。通过持续的创新努力,稳态公司成功开发出了多款具有行业领先水平的新产品,引领了行业潮流,也为公司的持续发展注入了新的动力。

Connection One公司的发展小趣事

为了进一步提升国际竞争力,Connection One公司开始实施全球化战略布局。公司在全球范围内设立研发中心和销售网络,以便更好地了解当地市场需求并提供定制化产品。这一举措不仅加速了公司的国际化进程,还为其带来了更多的商业机会。

Aavid Niagra公司的发展小趣事

在快速发展的同时,Aavid Niagra公司始终关注企业社会责任和可持续发展。公司积极参与环保事业,推广绿色生产和消费理念。同时,公司还注重员工培训和福利保障,为员工创造一个良好的工作环境和发展空间。这些举措不仅提升了公司的社会形象,也为公司的长远发展奠定了坚实的基础。


这些故事框架主要围绕公司的初创、技术创新、全球化战略、行业变革应对以及企业社会责任等关键节点进行构建。您可以根据Aavid Niagra公司的实际情况和公开资料,对每个故事进行具体化和个性化的描述,以确保故事的准确性和可信度。

兆易创新(GigaDevice)公司的发展小趣事

为了拓展市场份额,Aavid Niagra公司开始实施全球化战略布局。公司先后在多个国家和地区设立了生产基地和研发中心,以便更好地服务当地客户。同时,公司还积极参与国际电子行业的交流与合作,不断提升自身的国际影响力。全球化战略的实施为公司带来了更多的发展机遇,也使其在全球电子散热市场上占据了重要地位。

Akahane Electronics Ind Corp公司的发展小趣事

随着全球市场的不断扩大,Akahane意识到单打独斗难以为继,于是积极寻求与国际同行的合作。通过与欧美知名电子企业建立战略合作关系,Akahane不仅获得了先进的技术支持,还成功打入国际市场,进一步提升了品牌影响力。同时,公司还积极参与国际电子行业的交流活动,学习借鉴先进的管理经验和市场策略,为公司的长远发展奠定了坚实基础。

Amptek Inc公司的发展小趣事

Akahane深知人才是企业发展的核心动力。因此,公司一直注重人才培养和引进。通过建立健全的培训机制和激励机制,Akahane吸引了一批批优秀的研发人才和管理人才。这些人才为公司的技术创新和市场拓展提供了有力支撑。同时,公司还积极与高校和研究机构合作,共同培养电子行业的后备力量。

问答坊 | AI 解惑

51单片机C语言入门教程.pdf

51单片机C语言入门教程.pdf…

查看全部问答>

物理地址到虚拟地址的转换问题?

2440中UART0寄存器对应的物理地址为 0x50000000,对应的虚拟地址在g_oalAddressTable表中为0x91000000 g_oalAddressTable         DCD     0x91000000, 0x50000000,  1     &nb ...…

查看全部问答>

二个程序谁的耗的资源少,效率高?

一个程序主函数中就是一个检测文件是否存在的循环. 另一个程序在主函数中另建一个线程,被建的线程中是一个检测文件是否存在的循环. …

查看全部问答>

求助: 安装EVC 电脑卡住

我的机子装不了eVC4,安装到配置wince platform manager 4.0 时,就死机了 重启后就出现未识别的硬件和硬件安装向导, 提示什么虚拟PC的 只要安装也就卡机了. 这是怎么回事? 我电脑是SP3的,台式机一样的系统都安装得好好的…

查看全部问答>

【原创】在VC/eVC中实现VB中的Split函数

VB中,sItem = Split(s, \",\")   CString s; CString sItem[13]; byte pItem; byte p1, p2; s += \",\"; p1 = 0; pItem = 0; for (p2 = 0; p2 < s.GetLength(); p2++) {         if (s.GetAt(p2) == \',\') &nb ...…

查看全部问答>

(转贴)像素和分辨率以及换算

经常会有朋友问到200万高清网络机是多少分辨率,或者1600*1200是多少万像素?今天刚好从网上找到一篇这样的文章,希望对大家有帮助。   1.什么是像素?简单的说,我们通常所说的像素,就是CCD上光电感应元件的数量,一个感光元件经过感光 ...…

查看全部问答>

2010成都物联网峰会展品图片分享

这组图片是三个星期以前拍的,回来之后就马不停蹄的赶项目进度,推迟到现在才发上来。本人拍照水平很菜,加上展品放在玻璃柜里面,拍出来相片实在一般般,大家将就一下。 对这次展会的总体印象是规格高,规模大,在一定程度上反映出了中国物联网 ...…

查看全部问答>

dsp2812 到货了?

请问斑竹,片子到货了吗,还要等多久呢?…

查看全部问答>

开关电源设计指南

开关电源设计指南有书签…

查看全部问答>