找回密码
 立即注册

QQ登录

只需一步,快速开始

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

设计单片机电子密码锁

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


单片机源程序如下:
  1. #include<reg52.h>
  2. #include<string.h>
  3. #include<intrins.h>
  4. #define Delay4us(); {_nop_();_nop_();_nop_();_nop_();}
  5. #define uchar unsigned char
  6. #define uint unsigned int
  7. uchar        Pre_KeyNo=16,KeyNo=16;
  8. uchar        code Title_Text[]="Your Password...";
  9. char        DSY_BUFFER[16]="                ";
  10. char        UserPassword[16]="                ";
  11. sbit         LCD_RS=P1^0;
  12. sbit         LCD_RW=P1^1;
  13. sbit         LCD_EN=P1^2;
  14. sbit         LED_OPEN=P1^5;
  15. sbit         SCL=P3^2;
  16. sbit         SDA=P3^3;
  17. void Delaynms(uint x)         
  18. {
  19.         uchar i;
  20.         while(x--)
  21.         for(i=0;i<123;i++);
  22. }
  23. void Start()                                 
  24. {
  25.         SDA=1;
  26.         SCL=1;
  27.         Delay4us();
  28.         SDA=0;
  29.         Delay4us();
  30.         SCL=0;
  31. }
  32. void Stop()                                 
  33. {
  34.         SDA=0;
  35.         SCL=1;
  36.         Delay4us();
  37.         SDA=1;
  38.         Delay4us();
  39.         SCL=0;
  40. }

  41. void IIC_Init()               
  42. {
  43.         SCL=0;
  44.         Stop();
  45. }
  46. void ACK()                                 
  47. {
  48.         SDA=0;
  49.         SCL=1;
  50.         Delay4us();
  51.         SCL=0;
  52.         SDA=1;
  53. }
  54. void NO_ACK()                                         
  55. {
  56.         SDA=1;
  57.         SCL=1;
  58.         Delay4us();
  59.         SCL=0;
  60.         SDA=0;
  61. }
  62. uchar RecByte()                        
  63. {
  64.         uchar i,rd;
  65.         rd=0x00;
  66.         SDA=1;
  67.         for(i=0;i<8;i++)
  68.         {
  69.         SCL=1;
  70.         rd<<=1;
  71.         rd|=SDA;
  72.         Delay4us();
  73.         SCL=0;
  74.         Delay4us();
  75.         }
  76.         SCL=0;
  77.         Delay4us();
  78.         return rd;
  79. }
  80. uchar SendByte(uchar wd)                        
  81. {
  82.         uchar i;
  83.         bit ack0;
  84.         for(i=0;i<8;i++)
  85.         {
  86.         SDA=(bit)(wd&0x80);
  87.         _nop_();
  88.         _nop_();
  89.         SCL=1;
  90.         Delay4us();
  91.         SCL=0;
  92.         wd<<=1;
  93.         }
  94.         Delay4us();
  95.         SDA=1;
  96.         SCL=1;
  97.         Delay4us();
  98.         ack0=!SDA;
  99.         SCL=0;
  100.         Delay4us();
  101.         return ack0;
  102. }
  103. uchar SendString(uchar Slave,uchar Subaddr,uchar *Buffer,uchar N)
  104. {
  105.         uchar i;
  106.         Start();
  107.         if(!SendByte(Slave))
  108.         return 0;
  109.         if(!SendByte(Subaddr))
  110.         return 0;
  111.         for(i=0;i<N;i++)
  112.         {
  113.         if(!SendByte(Buffer[i]))
  114.         return 0;        
  115.         }        
  116.         Stop();
  117.         return 1;
  118. }
  119. uchar RecString(uchar Slave,uchar Subaddr,uchar *Buffer,uchar N)
  120. {
  121.         uchar i;
  122.         Start();
  123.         if(!SendByte(Slave))
  124.         return 0;
  125.         if(!SendByte(Subaddr))
  126.         return 0;
  127.         Start();
  128.         if(!SendByte(Slave+1))
  129.         return 0;
  130.         for(i=0;i<N-1;i++)
  131.         {
  132.         Buffer[i]=RecByte();
  133.         ACK();
  134.         }
  135.         Buffer[N-1]=RecByte();
  136.         NO_ACK();        
  137.         Stop();
  138.         return 1;
  139. }
  140. bit LCD_Busy_Check(void)
  141. {
  142.         bit result;
  143.         LCD_RS=0;                                                
  144.         LCD_RW=1;
  145.         LCD_EN=1;                                                        
  146.         Delay4us();
  147.         result=(bit)(P0&0x80);                                 
  148.         LCD_EN=0;                                                           
  149.         return result;
  150. }
  151. void Write_LCD_Command (unsigned char cmd)
  152. {   
  153.         while(LCD_Busy_Check()==1);                  
  154.         LCD_RS=0;                                                  
  155.         LCD_RW=0;   
  156.         LCD_EN=0;                                          
  157.         _nop_();
  158.         _nop_();                                       
  159.         P0=cmd;                                                   
  160.         Delay4us();                                             
  161.         LCD_EN=1;                                   
  162.         Delay4us();                                               
  163.         LCD_EN=0;                                                
  164. }
  165. void Write_LCD_Data(uchar dat)
  166. {
  167.         while(LCD_Busy_Check()==1);  
  168.         LCD_RS=1;                                   
  169.         LCD_RW=0;
  170.         LCD_EN=0;                                    
  171.         P0=dat;
  172.         Delay4us();                                       
  173.         LCD_EN=1;                                          
  174.         Delay4us();                                       
  175.         LCD_EN=0;                                            
  176. }

  177. void Set_LCD_POS(uchar pos)
  178. {
  179.         Write_LCD_Command(pos|0x80);
  180. }

  181. void LcdInitiate(void)
  182. {
  183.         Delaynms(15);                       
  184.         Write_LCD_Command(0x38);            
  185.         Delaynms(5);                        
  186.         Write_LCD_Command(0x38);
  187.         Delaynms(5);                       
  188.         Write_LCD_Command(0x38);            
  189.         Delaynms(5);                       
  190.         Write_LCD_Command(0x0c);            
  191.         Delaynms(5);                       
  192.         Write_LCD_Command(0x06);     
  193.         Delaynms(5);               
  194.         Write_LCD_Command(0x01);   
  195.         Delaynms(5);                              
  196. }

  197. void Display_String(uchar *str,uchar LineNo)
  198. {        uchar k;
  199.         Set_LCD_POS(LineNo);
  200.         for(k=0;k<16;k++)
  201.         {
  202.         if(str[k]=='\0')
  203.         break;
  204.         Write_LCD_Data(str[k]);
  205.         Delaynms(1);
  206.         }
  207. }
  208. uchar Keys_Scan()
  209. {
  210.         uchar Tmp,KeyNo=0;
  211.         P2=0x0F;
  212.         Delaynms(1);
  213.         Tmp=P2^0x0F;
  214.         switch(Tmp)
  215.         {
  216.         case 1:KeyNo=0;break;                          
  217.         case 2:KeyNo=1;break;                                   
  218.         case 4:KeyNo=2;break;                                   
  219.         case 8:KeyNo=3;break;                           
  220.         default: KeyNo=16;
  221.           }
  222.         P2=0xF0;
  223.         Delaynms(1);
  224.         Tmp=P2>>4^0x0F;
  225.         switch(Tmp)
  226.         {
  227.         case 1:KeyNo+=0;break;                                   
  228.         case 2:KeyNo+=4;break;                           
  229.         case 4:KeyNo+=8;break;                           
  230.         case 8:KeyNo+=12;break;                          
  231.           }
  232.         return KeyNo;        
  233.         }               
  234. void Clear_Password()
  235. {        
  236.         uchar i;
  237.         for(i=0;i<16;i++)
  238.         {
  239.         UserPassword[i]=' ';
  240.         DSY_BUFFER[i]=' ';
  241.         }
  242. }
  243. void main()
  244. {
  245.         uchar         i = 0;
  246.         uchar         IS_Valid_User=0;
  247.         uchar         temp[1];
  248.         uchar         Flag[1]=0x55;
  249.         uchar         IIC_Password[10];
  250.         uchar        Secrect_code[ ]="123456";
  251.         P0=0xFF;     
  252.         P1=0xFF;
  253.         P2=0xFF;  
  254.         Delaynms(10);            
  255.         LcdInitiate();            
  256.         IIC_Init();                       
  257.         Display_String(Title_Text,0x00);
  258.         RecString(0xa0, 0xff , temp, 1);         
  259.         if(temp[0]!=0x55)                                       
  260.         {
  261.         SendString(0xa0,0,Secrect_code,6);
  262.         SendString(0xa0,0xff,Flag,1);         
  263.         }
  264.         RecString(0xa0,0,IIC_Password, 6);                           
  265.         IIC_Password[6] = '\0';
  266.         while(1)
  267.         {
  268.       P2 = 0xF0;
  269.       if(P2!= 0xF0)
  270.           KeyNo = Keys_Scan();                          
  271.       switch ( KeyNo )
  272.       {
  273.                 case 0:  case 1: case 2: case 3: case 4:
  274.                 case 5:  case 6: case 7: case 8: case 9:
  275.                 if ( i<= 5 )                             
  276.                 {
  277.                     if (i ==0)                        
  278.                         Display_String("                ",0x40);
  279.                     UserPassword[i]=KeyNo+'0';                                
  280.                     UserPassword[i+1]='\0';                                       
  281.                     DSY_BUFFER[i]='*';                                                
  282.                     DSY_BUFFER[i+1]='\0';                                       
  283.                     Display_String(DSY_BUFFER,0x40);               
  284.                     i++;
  285.                 }
  286.                 break;
  287.                 case 10:                 
  288.                 RecString(0xa0,0,IIC_Password,6);                  
  289.                 IIC_Password[6]='\0';
  290.                 if(strcmp(UserPassword,IIC_Password)==0)   
  291.                 {
  292.                    LED_OPEN=1;                           
  293.                    Clear_Password();                  
  294.                    Display_String(" OK                        Unlocked! ",0x40);
  295.                    IS_Valid_User=1;                                
  296.                 }
  297.                 else
  298.                 {
  299.                    LED_OPEN=0;                           
  300.                    Clear_Password();                  
  301.                    Display_String(" OK!  Unlocked! ",0x40);        
  302.                    IS_Valid_User=0;                        
  303.                 }
  304.                 i=0;                                                   
  305.                 break;
  306.                 case 11:                                         
  307.                 LED_OPEN =1;                                   
  308.                 Clear_Password();                        
  309.                 Display_String(Title_Text,0x00);
  310.                 Display_String("   Locked OK!   ",0x40);
  311.                 i=0;                       
  312.                 IS_Valid_User=0;                        
  313.                 break;
  314.                 case 12:                                         
  315.                 if(!IS_Valid_User )                 
  316.                 Display_String("   No Rights!   ",0x40);
  317.                 else
  318.                 {
  319.                    i = 0;                                                                           
  320.                    Display_String("New Password:   ",0x00);        
  321.                    Display_String("                ",0x40);        
  322.                  }
  323.                 break;                        
  324.                 case 13:                                                                        
  325.                 if (!IS_Valid_User)                                                
  326.                 Display_String("   No Rights!   ",0x40);        
  327.                 else
  328.                 {
  329.                    SendString(0xa0,0,UserPassword,6);                 
  330.                    RecString(0xa0,0,IIC_Password,6);                  
  331.                    IIC_Password[6]='\0';                        
  332.                    i=0;                                                                                
  333.                    Display_String(Title_Text,0x00);
  334.                    Display_String("Password Saved! ",0x40);        
  335.                  }               
  336.                 break;                        
  337.                 case 14:                                                                        
  338.                 i = 0;                                                                        
  339.                 Clear_Password();                                                        
  340.                 Display_String("                ",0x40);         
  341.                 }
  342.                 Delaynms(10);
  343.                 P2=0xF0;
  344.                 while(P2!=0xF0);   
  345.                 while(P2==0xF0);   
  346.    }
  347. }
复制代码

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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