找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3538|回复: 2
收起左侧

基于C51单片机的密码锁代码

[复制链接]
ID:200281 发表于 2017-6-1 22:49 | 显示全部楼层 |阅读模式
分享一个密码锁的小程序
0.png

单片机源代码如下:
  1. #include<reg51.h>        //  包含51单片机寄存器定义的头文件
  2. unsigned char ID;    //储存流水灯的流动速度
  3. sbit S1=P1^4;          //位定义S1为P1.4

  4. /**************************************************************
  5. 函数功能:延时子程序
  6. **************************************************************/
  7. void delay(void)    //因为仅对一个按键扫描,所以延时时间较长约200ms
  8. {
  9.   unsigned char i,j;
  10.   for(i=0;i<200;i++)
  11.    for(j=0;j<100;j++)
  12.            ;
  13. }


  14. /**************************************************************
  15. 函数功能:主函数
  16. **************************************************************/
  17. void main(void)
  18. {
  19.    TMOD=0x02;     //使用定时器T0的模式2
  20.           EA=1;          //开总中断
  21.         ET0=1;         //定时器T0中断允许
  22.         TR0=1;         //定时器T0开始运行
  23.         TH0=256-200;   //定时器T0赋初值,每200微妙来1次中断请求
  24.         TL0=256-200;

  25.   ID=0;
  26.    while(1)
  27.           {
  28.                   switch(ID)
  29.             {
  30.               case 0: P3=0xfe;
  31.                       break;
  32.                                   case 1: P3=0xfd;
  33.                       break;
  34.                                   case 2: P3=0xfb;
  35.                       break;
  36.                                   case 3: P3=0xf7;
  37.                       break;            
  38.             }
  39.      }
  40.    }
  41. /**************************************************************
  42. 函数功能:定时器T0的中断服务子程序,进行键盘扫描
  43. **************************************************************/
  44. void intersev(void) interrupt 1 using 1
  45. {
  46.   TR0=0;  //关闭定时器T0
  47.   P1=0xff;
  48.   if(S1==0)       //如果是按键S1按下
  49.     {
  50.            delay();       //延时20ms,软件消抖
  51.             if(S1==0)       //如果是按键S1按下
  52.                    ID=ID+1;
  53.           }   
  54.         if(ID==4)
  55.            ID=0;       

  56.           TR0=1;               //启动定时器T0

  57. }


  58. #include<reg51.h>   //包含51单片机寄存器定义的头文件
  59. sbit P14=P1^4;      //将P14位定义为P1.4引脚
  60. sbit P15=P1^5;      //将P15位定义为P1.5引脚
  61. sbit P16=P1^6;      //将P16位定义为P1.6引脚
  62. sbit P17=P1^7;      //将P17位定义为P1.7引脚
  63. sbit sound=P3^7;    //将sound位定义为P3.7
  64. unsigned char keyval;    //储存按键值
  65. /**************************************************************
  66. 函数功能:延时输出音频
  67. **************************************************************/
  68. void delay(void)   
  69. {
  70.    unsigned char i;
  71.         for(i=0;i<200;i++)
  72.                  ;
  73. }

  74. /**************************************************************
  75. 函数功能:软件延时子程序
  76. **************************************************************/
  77. void delay20ms(void)   
  78. {
  79.    unsigned char i,j;
  80.         for(i=0;i<100;i++)
  81.          for(j=0;j<60;j++)
  82.            ;
  83. }
  84. /**************************************************************
  85. 函数功能:主函数
  86. **************************************************************/
  87. void main(void)
  88. {
  89.    unsigned char D[ ]={0,8,0,8,7,4,11};      //设定密码
  90.    EA=1;                  //开总中断
  91.         ET0=1;                 //定时器T0中断允许         
  92.         TMOD=0x01;            //使用定时器T0的模式1
  93.         TH0=(65536-500)/256;  //定时器T0的高8位赋初值
  94.         TL0=(65536-500)%256;  //定时器T0的高8位赋初值
  95.         TR0=1;                //启动定时器T0
  96.         keyval=0xff;          //按键值初始化
  97.        
  98.         while(keyval!=D[0])   //第一位密码输入不正确,等待
  99.              ;                 
  100.         while(keyval!=D[1])   //第二位密码输入不正确,等待
  101.              ;
  102.         while(keyval!=D[2])   //第三位密码输入不正确,等待
  103.              ;       
  104.         while(keyval!=D[3])   //第四位密码输入不正确,等待
  105.              ;
  106.         while(keyval!=D[4])   //第五位密码输入不正确,等待
  107.              ;
  108.         while(keyval!=D[5])   //第六位密码输入不正确,等待
  109.              ;   
  110.         while(keyval!=D[6])  //没有输入"OK",等待
  111.            ;                 
  112.          P3=0xfe;           //P3.0引脚输出低电平,点亮LED

  113. }
  114. /**************************************************************
  115. 函数功能:定时器0的中断服务子程序,进行键盘扫描,判断键位
  116. **************************************************************/
  117.   void time0_interserve(void) interrupt 1 using 1    //定时器T0的中断编号为1,使用第一组寄存器
  118.   {
  119.      unsigned char i;
  120.      TR0=0;                  //关闭定时器T0          
  121.      P1=0xf0;                 //所有行线置为低电平"0",所有列线置为高电平"1"
  122.           if((P1&0xf0)!=0xf0)      //列线中有一位为低电平"0",说明有键按下
  123.              delay20ms();           //延时一段时间、软件消抖
  124.           if((P1&0xf0)!=0xf0)      //确实有键按下
  125.             {
  126.                P1=0xfe;             //第一行置为低电平"0"(P1.0输出低电平"0")
  127.                if(P14==0)           //如果检测到接P1.4引脚的列线为低电平"0"
  128.              keyval=1;            //可判断是S1键被按下
  129.            if(P15==0)             //如果检测到接P1.5引脚的列线为低电平"0"
  130.              keyval=2;            //可判断是S2键被按下
  131.            if(P16==0)             //如果检测到接P1.6引脚的列线为低电平"0"
  132.              keyval=3;            //可判断是S3键被按下
  133.            if(P17==0)            //如果检测到接P1.7引脚的列线为低电平"0"
  134.              keyval=4;           //可判断是S4键被按下

  135.            P1=0xfd;             //第二行置为低电平"0"(P1.1输出低电平"0")
  136.               if(P14==0)           //如果检测到接P1.4引脚的列线为低电平"0"
  137.              keyval=5;            //可判断是S5键被按下
  138.            if(P15==0)             //如果检测到接P1.5引脚的列线为低电平"0"
  139.              keyval=6;            //可判断是S6键被按下
  140.            if(P16==0)             //如果检测到接P1.6引脚的列线为低电平"0"
  141.              keyval=7;            //可判断是S7键被按下
  142.            if(P17==0)            //如果检测到接P1.7引脚的列线为低电平"0"
  143.              keyval=8;           //可判断是S8键被按下
  144.                
  145.            P1=0xfb;             //第三行置为低电平"0"(P1.2输出低电平"0")
  146.             if(P14==0)          //如果检测到接P1.4引脚的列线为低电平"0"
  147.              keyval=9;          //可判断是S9键被按下
  148.            if(P15==0)           //如果检测到接P1.5引脚的列线为低电平"0"
  149.              keyval=0;         //可判断是S10键被按下
  150.            if(P16==0)          //如果检测到接P1.6引脚的列线为低电平"0"
  151.              keyval=11;        //可判断是S11键被按下
  152.        if(P17==0)          //如果检测到接P1.7引脚的列线为低电平"0"
  153.                                      keyval=12;        //可判断是S12键被按下
  154.                        
  155.                                    P1=0xf7;             //第四行置为低电平"0"(P1.3输出低电平"0")
  156. ……………………

  157. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
密码锁.rar (9.75 KB, 下载次数: 18)
回复

使用道具 举报

ID:344774 发表于 2018-6-6 13:15 | 显示全部楼层
怎么没有
回复

使用道具 举报

ID:344774 发表于 2018-6-6 13:16 | 显示全部楼层
什么情况?我点下载附件了,结果什么都没下载下来,还扣了我的积分
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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