找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求一个数码管6位密码锁程序加仿真三次输入错误锁定的

[复制链接]
跳转到指定楼层
楼主
4黑币

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

使用道具 举报

沙发
ID:111634 发表于 2016-6-21 22:21 | 只看该作者
本帖最后由 zl2168 于 2016-6-21 22:22 编辑

功能齐全的电子密码锁,其中有输错3次密码发出警车声。
Proteus仿真一下,确认有效。 实验28 电子密码锁.rar (57.34 KB, 下载次数: 78)




以上摘自张志良编著80C51单片机实用教程》ISBN978-7-04-044532-9,高教社出版。欢迎咨询,zzlls@126.com


书中电路和程序设计有详细说明,程序语句条条有注解。



回复

使用道具 举报

板凳
ID:111634 发表于 2016-6-21 22:23 | 只看该作者
本帖最后由 zl2168 于 2016-6-21 22:24 编辑

电子密码锁功能设计



回复

使用道具 举报

地板
ID:111634 发表于 2016-6-21 22:25 | 只看该作者
电子密码锁程序设计



以上摘自张志良编著《80C51单片机实用教程》ISBN 978-7-04-044532-9,高教社出版。欢迎咨询,zzlls@126.com




回复

使用道具 举报

5#
ID:111634 发表于 2016-6-21 22:26 | 只看该作者
电子密码锁电路设计




以上摘自张志良编著《80C51单片机实用教程》ISBN978-7-04-044532-9,高教社出版。欢迎咨询,zzlls@126.com


书中电路和程序设计有详细说明,程序语句条条有注解。





回复

使用道具 举报

6#
ID:127957 发表于 2016-6-24 16:01 | 只看该作者
有没有C语言程序
回复

使用道具 举报

7#
ID:111634 发表于 2016-6-24 20:22 | 只看该作者
本帖最后由 zl2168 于 2016-6-25 08:38 编辑
余少 发表于 2016-6-24 16:01
有没有C语言程序

80C51单片机实用教程》书中有
回复

使用道具 举报

8#
ID:128041 发表于 2016-6-24 23:55 | 只看该作者
是的,应该是这样的
回复

使用道具 举报

9#
ID:462923 发表于 2019-1-6 15:56 | 只看该作者
/*
课程名称:电子密码锁设计
设计任务:根据设定好的密码,采用按键实现6为的输入功能,
                                        当用户输入的密码正确并且是在规定的时间(普
                                        通用户要求在12s内输入正确的密码)时,锁就
                                        打开,如果输入的三次密码不正确,就发出警报
                                        声。如果用户的时间超过40秒,电路将报警80
                                        秒,若电路连续报警三次,电路将锁定键盘5分
                                        钟,防止他人的非法操作
*/
#include"reg51.h"        
#include"intrins.h"

#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long

sbit bj = P3^0;                        //定义报警
sbit led_y = P3^5;         //定义黄色灯
sbit led_r = P3^6;        //定义红色灯
sbit led_g = P3^7;        //定义绿色灯

ulong pwd = 234567;         //定义电子锁密码
uint gy = 0;                      //定义管理员/用户(管理员为1)标识
uint ss = 0;                                  //定义上锁标识(0时表示已上锁)
uint flag = 0;                   //定义中断函数中所用到的标识
uchar sd = 1;                                 //定义键盘锁定(1为未锁)标识
uint pcw = 0;               //定义密码错误次数
uint bjc = 0;                                  //定义报警次数
uint jp = 0;                                  //定义键盘扫描值
uint cnt = 0;                   //定义中断次数
uint mcnt = 0;
uint cs = 0;                     //定义超时标识
uchar key;
//uchar j;


//定义共阳数码管段选数组
uchar code table[11] ={0x3F,0x06,0x5B,0x4F,0x66,
                                                                                         0x6D,0x7D,0x07,0x7F,0x6F,0x08};
//定义按键
uchar code table1[16] = {0xee,0xde,0xbe,0x7e,
                                                                                                0xed,0xdd,0xbd,0x7d,
                                                                                                0xeb,0xdb,0xbb,0x7b,
                                                                                                0xe7,0xd7,0xb7,0x77};

//定义储存按键值
uchar table2[6];

//定义短延迟函数
void delay(uint n)        
{
   while(n--);
}

//定义延迟n s函数
void delayns(uint n)   
{
    unsigned char a,b,c,e;
                for(e=n;e>0;e--)
                        for(c=167;c>0;c--)
                                        for(b=171;b>0;b--)
                                                        for(a=16;a>0;a--);
    _nop_();  //if Keil,require use intrins.h
}        


//定义初始化函数
void init()
{
        uchar i,k;
        led_y = 0;
        led_r = 1;
        led_g = 1;
        bj = 1;
        EA = 1;                                                                                       //打开总中断
        EX1 = 1; IT1 = 1;               //打开外部中断1,并设置触发方式为下降触发方式
        TMOD = 0X01;                                                                                 //设置定时器0工作方式1
        TH0 = (65536 - 50000)/256;            
        TL0 = (65536 - 50000)%256;                   //给定时器0赋值为50ms
        for(i = 0;i < 6; i++)
        {
                 table2[i] = 10;
        }
        for(k = 0;k<8;k++)
        {
                P0=0x08;
                P2 = k;        
        }
               
}

//定义上锁中断函数
void INT_0() interrupt 0
{
        uchar h;
        ss = 0;                                                                                                //密码锁上锁
        led_g = 1;
        for(h = 0;h < 6; h++)                     //初始化table2[]为10
        {
                 table2[h] = 10;
        }
}

//定义管理员/用户切换中断函数
void INT_1() interrupt 2
{
        uchar h;
        if(flag == 0)
        {        
                gy = 1;                                                                                        //关闭管理员指示灯
                led_y = 1;                                                                        //关闭密码错误指示灯
                flag = 1;               
          for(h = 0;h < 6; h++)     //初始化table2[]为10
                {
                         table2[h] = 10;
                }
        }
        else
        {
                gy = 0;                                                                                        //关闭管理员指示灯
                led_y = 0;                                                                        //关闭密码错误指示灯
                flag = 0;
                for(h = 0;h < 6; h++)             //初始化table2[]为10
                {
                         table2[h] = 10;
                }
        }        
}
//定义计时器中断函数
void timer() interrupt 1
{
        TH0 = (65536 - 50000)/256;
        TL0 = (65536 - 50000)%256;
        ++cnt;                                                            //中断一次加以
        if(cnt == 20)                                                     //每1秒
        {
                cnt = 0;
                ++mcnt;
                if(gy)                                                                                   //管理员时
                {
                         if(mcnt > 40)
                         {
                                        bjc++;
                                        cs = 1;
                                  bj = 0;
                                  delayns(80);
                                  bj = 1;
                         }
                         else if(mcnt > 5)                                //大于5秒时
                         {
                                 cs = 1;        
                         }
                         else                                                                                        //小于5秒时
                         {
                                 cs = 0;
                         }
                }
                else                                                                                                //用户时
                {
                        if(mcnt > 40)
                        {
                                bjc++;
                                cs = 1;
                                 bj = 0;
                                delayns(80);
                                bj = 1;
                        }
                        else if(mcnt > 12)                                // 大于12秒时
                        {
                           cs = 1;
                        }
                        else                                                                                        //小于1秒时
                        {
                                 cs = 0;
                        }                                         
                }
               
        }
}
//定义显示函数
void display( uint wei, uint duan)
{
        P2 = wei;
        P0 = table[duan];
        delay(50);
}

//定义键盘扫描函数并显示按键
void scan()
{
        uchar i,j,h,k,m=20, e = 1;
        while(j != 6)                                                         //读取六个键值
        {
        
                P1 = 0xf0;                                                                     //置行为0.列为1,读列值
                if(P1 != 0xf0)                                              //判断有无键盘被按下        
                {        
                        delay(19000);                                                     //消振
                        if(P1 != 0xf0)                                             //确实有键盘被按下
                        {        
                                uchar temp = P1;                       //存储列列读入值
                                if(j==5)                                                                        //当最后一位密码输入时
                                {
                                        ET0 = 0;                                                                //关闭定时/计数0中断
                                }
                                if(j == 0)                                                           //当要输入第一个密码时
                                {
                                        ET0 = 1;        TR0 = 1;                        //开启定时/计数0中断
                                        led_r = 1;                                       //关闭报警灯
                                        led_g = 1;                                                   //关闭打开指示灯
                                        for(h = 0;h < 6; h++)   //初始化table2[]为10
                                        {
                                                 table2[h] = 10;
                                        }
                                }
                                P1 = 0x0f;                                                                //置列为0.行为1,读行值
                                key = temp|P1;                                           //将列、行综合,读取键值
                                for(i = 0; i < 10; i++)
                                {
                                        if(key == table1[i])                //判断键值
                                        {
                                                   table2[j] = i;                        //将密码存储到table2[]中
                                                        j++;
                                                        break;
                                        }
                                }
                        }
                }
                for(k = 0;k < 6;k++)                                   //显示输入键值
                {        
                        uint n=20;
                        while(n--)
                                display(k,table2[k]);
                }
        }
        for(k = 0;k < 6;k++)                                           //显示输入键值
        {        
                uint n=20;
                while(n--)
                        display(k,table2[k]);
        }
}
//定义报警函数
void speaker(uint n)
{                                   
        uint i;
        for(i = 0; i<n; i++)
        {
                 bj = 0;
                delayns(1);
                bj = 1;
        }
}
//定义密码正确函数验证函数
void mmyz()
{
        uchar mmy;
        uint m1 = pwd/100000;                                                                                //取得密码的第一位
        uint m2 = pwd%100000/10000;                                            //取得密码的第二位
        uint m3 = pwd%100000%10000/1000;                                //取得密码的第三位
        uint m4 = pwd%100000%10000%1000/100;                //取得密码的第四位
        uint m5 = pwd%100000%10000%1000%100/10;        //取得密码的第五位
        uint m6 = pwd%100000%10000%1000%100%10;        //取得密码的第六位
        //判断密码的正确性
        mmy = (m1==table2[0])&(m2==table2[1])&(m3==table2[2])
                                &(m4==table2[3])&(m5==table2[4])&(m6==table2[5]);
        if(!cs)                                                                                                                           //没超过规定时间
        {
                 if(mmy == 1)                                                                                                        //密码正确
                {
                        ss = 1;
                        led_g = 0;                                                                                                         //打开密码锁。绿灯亮
                        EX0 = 1; IT0 = 1;                                                                   //打开外部中断0,并设置触发方式为下降触发方式
                        pcw = 0;                                                                                                    //密码错误次数清零
                        bjc = 0;                                                                                                    //报警次数清零
                        bj = 1;                                                                                                             //关闭报警
                }
                else                                                                                                                                        //密码错误
                {
                        pcw++;                                                                                                            //密码错误加1
                        led_r = 0;                                                                                                        //密码错误,红灯亮
                        if(pcw >=3)
                        {
                           pcw = 0;
                           bjc++;
                                 P2 = 0xff;
                           speaker(1);
                           if(bjc == 3)
                           {
                                           bjc = 0;                                                                                        //报警
                                                led_r = 0;
                                                led_g = 0;
                                                P2 = 0xff;
                                           EA = 0;                                                                                          //关闭总中断
                                                delayns(300);                                                                //锁定5分钟
                                                EA = 1;                                                                                 //开启总中断
                                                led_r = 1;
                                                led_g = 1;
                           }
                        }
                }
        }
        else                                                                                                                          //超过规定时间
        {
                uchar h;
          for(h = 0;h < 6; h++)                               //初始化table2[]为10
                {
                         table2[h] = 10;
                }
        }
        
}

//定义主函数
void main()           
{         
        uchar i;
        init();                                                                                                                                           //初始化程序
        while(1)
        {
                        if(!ss)                                                                                                                                
                        {
                                        if(gy)                                                                                                          //管理员时
                                        {
                                                if(sd == 1)
                                                {
                                                        scan();                                                                                          //调用键盘扫面函数,接收输入的键值
                                                        mmyz();                                                                                          //验证密码
                                                }
                                        }
                                        else                                                                                                 //用户时
                                        {
                                                 if(sd == 1)
                                                {
                                                        scan();                                                                                          //调用键盘扫面函数,接收输入的键值
                                                        mmyz();                                                                                          //验证密码
                                                }
                                        }
                        }
                        else
                        {
                                        for(i = 0;i < 6;i++)                                                   //显示输入键值
                                        {        
                                                        table2[i] = 10;
                                        }
                                        for(i = 0;i < 6;i++)                                                   //显示输入键值
                                        {        
                                                        uint n=20;
                                                        while(n--)
                                                        display(i,table2[i]);
                                        }
                        }
        }
}
回复

使用道具 举报

10#
ID:506491 发表于 2019-4-7 20:39 来自手机 | 只看该作者
空印 发表于 2019-1-6 15:56
/*
课程名称:电子密码锁设计
设计任务:根据设定好的密码,采用按键实现6为的输入功能,

谢谢大佬
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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