返回主页 单片机教程XL2000开发板 单片机学习 自制编程器 单片机资料 软件下载 电子技术产品介绍如何购买 进入论坛

第一章:硬件资源模块 第二章:keilc软件使用
at89s51单片机实验及实践课题     at89s51单片机实验及实践课题
1.闪烁灯2.模拟开关灯
3.多路开关状态指示4.广告灯的左移右移
5.广告灯(利用取表方式)6.报警产生器
7.I/O并行口直接驱动LED显示8.按键识别方法之一
9.一键多功能按键识别技术10.00-99计数器
11.00-59秒计时器(软件延时)12.可预置可逆4位计数器
13.动态数码显示技术14.4×4矩阵式键盘识别技术
15.定时计数器T0作定时(一)16.定时计数器T0作定时应用技术(二)
17.99秒马表设计18.“嘀、嘀、……”报警声
19.“叮咚”门铃20.数字钟(★)
21.拉幕式数码显示技术22.电子琴
23.模拟计算器数字输入及显示24.8×8LED点阵显示技术
25.点阵LED“0-9”数字显示技术26.点阵式LED简单图形显示技术
27.ADC0809A/D转换器基本应用技术28.数字电压表
29.两点间温度控制30.四位数数字温度计
31.6位数显频率计数器32.电子密码锁设计
33.4×4键盘的电子密码锁34.带有存储器功能的数字温度计-DS1624技术应用
35.DS18B20数字温度计使用

单片机c语言<>欢迎进入51单片机学习网论坛讨论

本站新域名www.8951.com开通WWW.51C51.COM 中国单片机编程技术普及推广第一站!

32.    电子密码锁设计

1.实验任务

根据设定好的密码,采用二个按键实现密码的输入功能,当密码输入正确之后,锁就打开,如果输入的三次的密码不正确,就锁定按键3秒钟,同时发现报警声,直到没有按键按下3种后,才打开按键锁定功能;否则在3秒钟内仍有按键按下,就重新锁定按键3秒时间并报警。

2.电路原理图

4.32.1

3.系统板上硬件连线

(1).            把“单片机系统”区域中的P0.0/AD0用导线连接到“音频放大模块”区域中的SPK IN端子上;

(2).            把“音频放大模块”区域中的SPK OUT端子接喇叭和;

(3).            把“单片机系统”区域中的P2.0/A8P2.7/A158芯排线连接到“四路静态数码显示”区域中的任一个ABCDEFGH端子上;

(4).            把“单片机系统“区域中的P1.0用导线连接到“八路发光二极管模块”区域中的L1端子上;

(5).            把“单片机系统”区域中的P3.6/WRP3.7/RD用导线连接到“独立式键盘”区域中的SP1SP2端子上;

4.程序设计内容

(1).            密码的设定,在此程序中密码是固定在程序存储器ROM中,假设预设的密码为“12345”共5位密码。

(2).            密码的输入问题:

由于采用两个按键来完成密码的输入,那么其中一个按键为功能键,另一个按键为数字键。在输入过程中,首先输入密码的长度,接着根据密码的长度输入密码的位数,直到所有长度的密码都已经输入完毕;或者输入确认功能键之后,才能完成密码的输入过程。进入密码的判断比较处理状态并给出相应的处理过程。

(3).            按键禁止功能:初始化时,是允许按键输入密码,当有按键按下并开始进入按键识别状态时,按键禁止功能被激活,但启动的状态在3次密码输入不正确的情况下发生的。

5.C语言源程序

#include <AT89X52.H>

unsigned char code ps[]={1,2,3,4,5};

unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,

                               0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};

unsigned char pslen=9;

unsigned char templen;

unsigned char digit;

unsigned char funcount;

unsigned char digitcount;

unsigned char psbuf[9];

bit cmpflag;

bit hibitflag;

bit errorflag;

bit rightflag;

unsigned int second3;

unsigned int aa;

unsigned int bb;

bit alarmflag;

bit exchangeflag;

unsigned int cc;

unsigned int dd;

bit okflag;

unsigned char oka;

unsigned char okb;

void main(void)

{

  unsigned char i,j;

  P2=dispcode[digitcount];

  TMOD=0x01;

  TH0=(65536-500)/256;

  TL0=(65536-500)%256;

  TR0=1;

  ET0=1;

  EA=1;

  while(1)

    {

      if(cmpflag==0)

        {

          if(P3_6==0) //function key

            {

              for(i=10;i>0;i--)

              for(j=248;j>0;j--);

              if(P3_6==0)

                {

                  if(hibitflag==0)

                    {

                      funcount++;

                      if(funcount==pslen+2)

                        {

                          funcount=0;

                          cmpflag=1;

                         }

                       P1=dispcode[funcount];

                    }

                    else

                      {

                         second3=0;

                      }

                  while(P3_6==0);

                }

            }

          if(P3_7==0) //digit key

            {

              for(i=10;i>0;i--)

              for(j=248;j>0;j--);

              if(P3_7==0)

                {

                  if(hibitflag==0)

                    {

                      digitcount++;                     

                      if(digitcount==10)

                        {

                          digitcount=0;

                        }

                      P2=dispcode[digitcount];

                      if(funcount==1)

                        {

                          pslen=digitcount;

                          templen=pslen;

                        }

                        else if(funcount>1)

                          {

                            psbuf[funcount-2]=digitcount;

                          }

                    }

                    else

                      {

                        second3=0;

                      }

                  while(P3_7==0);

                }

            }

        }

        else

          {

            cmpflag=0;

            for(i=0;i<pslen;i++)

              {

                if(ps[i]!=psbuf[i])

                  {

                    hibitflag=1;

                    i=pslen;

                    errorflag=1;

                    rightflag=0;

                    cmpflag=0;

                    second3=0;

                    goto a;

                  }

              }

            cc=0;

            errorflag=0;

            rightflag=1;

            hibitflag=0;

a:          cmpflag=0;

          }

    }

}

 

void t0(void) interrupt 1 using 0

{

  TH0=(65536-500)/256;

  TL0=(65536-500)%256;

  if((errorflag==1) && (rightflag==0))

    {

      bb++;

      if(bb==800)

        {

          bb=0;

          alarmflag=~alarmflag;

        }

      if(alarmflag==1)

        {

          P0_0=~P0_0;

        }

      aa++;

      if(aa==800)

        {

          aa=0;

          P0_1=~P0_1;

        }

      second3++;

      if(second3==6400)

        {

          second3=0;

          hibitflag=0;

          errorflag=0;

          rightflag=0;

          cmpflag=0;

          P0_1=1;

          alarmflag=0;

          bb=0;

          aa=0;

        }

    }

  if((errorflag==0) && (rightflag==1))

    {

      P0_1=0;

      cc++;

      if(cc<1000)

        {

          okflag=1;

        }

        else if(cc<2000)

          {

            okflag=0;

          }

          else

            {

              errorflag=0;

              rightflag=0;

              hibitflag=0;

              cmpflag=0;

              P0_1=1;

              cc=0;

              oka=0;

              okb=0;

              okflag=0;

              P0_0=1;

            }

      if(okflag==1)

        {

          oka++;

          if(oka==2)

            {

              oka=0;

              P0_0=~P0_0;

            }

        }

        else

          {

            okb++;

            if(okb==3)

              {

                okb=0;

                P0_0=~P0_0;

              }

          }

    }

}