找回密码
 立即注册

QQ登录

只需一步,快速开始

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

我的单片机设计,里面包含proteus仿真和程序代码

[复制链接]
跳转到指定楼层
楼主
简易密码锁设计,bug比较多

单片机源程序如下:
  1. /**************************************************************                                                  *
  2. 功能:通过软件程序设置密码,初始密码为123456,当按键按下之后  *
  3.           再按下确认键,如果密码正确,则绿灯亮,舵机旋转90度,如果*
  4.           密码错误,红灯亮,短暂延时后,数码管清零,红灯灭,重新输*
  5.           入密码。                                                                                                  *
  6. *//************************************************************/


  7. /****************************************************************/
  8.                                                                                                                                  
  9. #include <reg51.h>                                                                                                

  10. #define uchar unsigned char
  11. #define uint  unsigned int

  12. sbit P2_0 = P2^0;
  13. sbit P2_1 = P2^1;
  14. sbit P2_2 = P2^2;
  15. sbit P2_3 = P2^3;
  16. sbit P2_4 = P2^4;
  17. sbit P2_5 = P2^5;
  18. sbit P2_6 = P2^6;
  19. sbit P3_6 = P3^6;
  20. sbit LED_G = P3^0;
  21. sbit LED_R = P3^1;
  22. sbit beep = P3^7;

  23. uint tab[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
  24. uchar h,l,s,o,zhengque,m = 0,v = 1,w = 0,n = 1,keyval_0 ,keyval_1,keyval_2,keyval_3,
  25. keyval_4,keyval_5,keyval_6,keyval_7,keyval_8,keyval_9,keyval_10,keyval_11,keyval_12,
  26. keyval_13,keyval_14,keyval_15,keyval,temp = 0x01;


  27. void delay(uint z)
  28. {
  29.         uint x , y;
  30.         for(x = z ; x > 0 ; x--)
  31.                 for(y = 114 ; y > 0 ; y--);
  32. }
  33. //有参延时

  34. void key_scan1()
  35. {
  36.         
  37.     P1=0x0f;//检测是哪一行有按键按下;
  38.     if(P1!=0x0f)
  39.     {
  40.         delay(10);
  41.         if(P1!=0x0f)
  42.         {
  43.                         beep = ~beep;
  44.             P1=0x0f;
  45.             switch(P1)
  46.             {
  47.                 case(0x0e):h=1;break;
  48.                 case(0x0d):h=2;break;
  49.                 case(0x0b):h=3;break;
  50.                 case(0x07):h=4;break;
  51.             }
  52.         }
  53.         P1=0xf0;//检测是哪一列有按键按下
  54.         switch(P1)
  55.         {
  56.             case(0xe0):l=1;break;
  57.             case(0xd0):l=2;break;
  58.             case(0xb0):l=3;break;
  59.             case(0x70):l=4;break;
  60.         }
  61.         while(P1!=0xf0);//当按键复位时  
  62.                
  63.                 w++;
  64.                 beep = ~beep;
  65.                
  66.                 //按一次第一个数码管显示,按两次前两个数码管显示......         
  67.     }
  68.         
  69. }

  70. void shuru()
  71. {

  72.         P2 = 0Xc0;
  73.         //P0 = 0XBF;
  74.         
  75.         while(v)
  76.         {
  77.                
  78.            key_scan1();
  79.            s = 5*h + l;//行列进行线性运算,通过判断s的值来判断对应按键
  80.            switch(s)
  81.            {
  82.                            case(9):keyval = 0;keyval_0 = 0;break;
  83.             case(8):keyval = 1;keyval_1 = 1;break;                                                                        
  84.             case(7):keyval = 2;keyval_2 = 2;break;                        
  85.             case(6):keyval = 3;keyval_3 = 3;break;
  86.                         case(14):keyval = 4;keyval_4 = 4;break;                        
  87.                         case(13):keyval = 5;keyval_5 = 5;break;        
  88.             case(12):keyval = 6;keyval_6 = 6;break;
  89.             case(11):keyval = 7;keyval_7 = 7;break;
  90.                         case(19):keyval = 8;keyval_8 = 8;break;
  91.             case(18):keyval = 9;keyval_9 = 9;break;
  92.                         case(17):keyval = 10;keyval_10 = 10;break;
  93.             case(16):keyval = 11;keyval_11 = 11;break;
  94.             case(24):keyval = 12;keyval_12 = 12;break;
  95.             case(23):keyval = 13;keyval_13 = 13;break;
  96.                         case(22):keyval = 14;keyval_14 = 14;break;
  97.             case(21):keyval = 15;keyval_15 = 15;break;                           
  98.            }
  99.            
  100.            switch(w)
  101.            {
  102.                    case 1:        P2_0 = 1;P0 = tab[keyval];delay(100);P2_0 = 0;break;
  103.                 case 2:        P2_1 = 1;P0 = tab[keyval];delay(100);P2_1 = 0;break;
  104.                 case 3:        P2_2 = 1;P0 = tab[keyval];delay(100);P2_2 = 0;break;
  105.                 case 4:        P2_3 = 1;P0 = tab[keyval];delay(100);P2_3 = 0;break;
  106.                 case 5:        P2_4 = 1;P0 = tab[keyval];delay(100);P2_4 = 0;break;
  107.                 case 6:        P2_5 = 1;P0 = tab[keyval];delay(100);P2_5 = 0;break;               
  108.            }
  109.            if(P2_6 == 0)
  110.            delay(10);
  111.            if(P2_6 == 0)
  112.            v = 0;
  113.                            
  114.         }  //依次输入密码        
  115. }



  116. void main()
  117. {        
  118.         beep = 0;
  119.         shuru();
  120.         zhengque = ((keyval_1==1)&(keyval_2==2)&(keyval_3==3)&(keyval_4==4)&(keyval_5==5)&(keyval_6==6));//设置的密码        
  121.         if(P2_6 == 0)
  122.         {
  123.                 delay(10);
  124.                 if(P2_6 == 0)         //确认键按下时,判断密码是否正确
  125.                 {
  126.                   if(zhengque)
  127.                   {
  128.                            LED_G = 0;
  129.                          delay(1000);
  130.                          LED_G = 1;
  131.                          EA = 1;
  132.                          IT0 = 1;
  133.                          TMOD = 0X01;
  134.                          TH0 = (60536%256);
  135.                          TL0 = (60536/256);
  136.                         while(n)
  137.                         {
  138.                                 P3_6 = 0;
  139.                         }                 
  140.                   }
  141.                   else
  142.                   {
  143.                   for(o = 0 ; o < 10 ; o++)
  144.                   {
  145.                           LED_R = 0;
  146.                         beep = ~beep;
  147.                         delay(300);
  148.                         LED_R = 1;
  149.                                                                         
  150.                         
  151.                         }
  152.                   }
  153.                 }
  154.         }                                            
  155. }
  156.         
  157. void timer0() interrupt 1  //定时器0控制舵机的PWM
  158. {
  159.         TH0 = (60536%256);
  160.         TL0 = (60536/256);
  161.         m++;
  162.         if(m == 5)
  163. {
  164.         P3_6 = 1;
  165.         m = 0;
  166.         n = 0;
  167. }
  168. }

  169. /*****************************************************************/

复制代码

Keil代码与Proteus仿真下载: 1.zip (116.53 KB, 下载次数: 10)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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