找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于c51单片机的LCD1602电子锁仿真

[复制链接]
跳转到指定楼层
楼主
基于c51的led电子锁仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include<reg51.h>
  2. #include<stdio.h>
  3. unsigned char password[6]={0,1,2,3,4,5,};//初始密码
  4. sbit LED1=P1^3;
  5. sbit LED2=P1^4;
  6. sbit LED3=P1^5;
  7. sbit Beep=P0^5;
  8. sbit RS = P1^0;  
  9. sbit RW = P1^1;
  10. sbit EN = P1^2;
  11. #define CHECK_BUSY
  12. #define RS_CLR RS=0
  13. #define RS_SET RS=1
  14. #define RW_CLR RW=0
  15. #define RW_SET RW=1
  16. #define EN_CLR EN=0
  17. #define EN_SET EN=1
  18. #define DataPort P3
  19. void LCD_Write_Com(unsigned char com) ;
  20. void LCD_Write_Data(unsigned char Data) ;
  21. void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) ;
  22. void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) ;
  23. void LCD_Init(void) ;
  24. /*------------------------------------------------
  25. uS延时函数,含有输入参数 unsigned char t,无返回值
  26. ------------------------------------------------*/
  27. void DelayUs2x(unsigned char t)
  28. {   
  29. while(--t);
  30. }
  31. void DelayMs(unsigned char t)
  32. {
  33.      
  34. while(t--)
  35. {
  36.      //大致延时1mS
  37.      DelayUs2x(245);
  38.          DelayUs2x(245);
  39. }
  40. }

  41. unsigned char KeyScan(void)  
  42. {
  43.   unsigned  n,key,key_r,key_c;
  44.                    n=0;
  45.               P2=0x70;
  46.            key_c=P2;
  47.            key_c=key_c & 0x70;
  48.            if(key_c!=0x70)
  49.                   {
  50.                       DelayMs(30);
  51.                           if(key_c!=0x70)
  52.                           {
  53.                                     key_c=key_c | 0x07;
  54.                                   P2=key_c;
  55.                                   key_r=P2;
  56.                                   key_r=key_r & 0x07;
  57.                                   key_c=key_c & 0x70;
  58.                                   key=key_c+key_r;
  59.                                   key=key & 0x77;
  60.                                   P2=0x70;                                 //等待本次按键结束
  61.                                   while(P2!=0x70);                                 
  62.                                   return key;
  63.                           }                          
  64.                   }
  65.    return 0x70;
  66. }
  67. /*------------------------------------------------
  68. 按键值处理函数,返回扫键值
  69. ------------------------------------------------*/
  70. unsigned char KeyPro(void)
  71. {
  72.   int n=9;
  73. switch(KeyScan())
  74. {
  75.                            {
  76.                                      case 0x66: n=0;break;
  77.                                   case 0X56: n=1;break;
  78.                                   case 0X36: n=2;break;
  79.                                   case 0X65: n=3;break;
  80.                                   case 0X55: n=4;break;
  81.                                   case 0X35: n=5;break;
  82.                                   case 0X63: n=6;break;
  83.                                   case 0X53: n=7;break;
  84.                                   case 0X33: n=8;break;
  85.                                   default :  break;
  86.                            }
  87.                               DelayMs(20);
  88. }
  89. return n;
  90. }
  91. /*------------------------------------------------
  92.               写入命令函数
  93. ------------------------------------------------*/
  94. void LCD_Write_Com(unsigned char com)
  95. {  
  96.          DelayMs(5);
  97.          RS_CLR;
  98.          RW_CLR;
  99.          EN_SET;
  100.          DataPort= com;
  101.          ;
  102.          EN_CLR;
  103. }
  104. /*------------------------------------------------
  105.               写入数据函数
  106. ------------------------------------------------*/
  107. void LCD_Write_Data(unsigned char Data)
  108. {
  109.          DelayMs(5);
  110.          RS_SET;
  111.          RW_CLR;
  112.          EN_SET;
  113.          DataPort= Data;
  114.          ;
  115.          EN_CLR;
  116. }
  117. /*------------------------------------------------
  118.               写入字符串函数
  119. ------------------------------------------------*/
  120. void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
  121. {     
  122.          while (*s)
  123.          {     
  124.                  LCD_Write_Char(x,y,*s);     
  125.                  s ++;  x++;   
  126.          }
  127. }
  128. /*------------------------------------------------
  129.               写入字符函数
  130. ------------------------------------------------*/
  131. void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
  132. {     
  133.          if (y == 0)
  134.          {     
  135.                  LCD_Write_Com(0x80 + x);     
  136.          }   
  137.          else
  138.          {     
  139.                  LCD_Write_Com(0xC0 + x);     
  140.          }        
  141.          LCD_Write_Data( Data);  
  142. }
  143. /*------------------------------------------------
  144.               初始化函数
  145. ------------------------------------------------*/
  146. void LCD_Init(void)
  147. {
  148.    LCD_Write_Com(0x38);  
  149.    LCD_Write_Com(0x08);    /*显示关闭*/
  150.    LCD_Write_Com(0x01);    /*显示清屏*/
  151.    LCD_Write_Com(0x06);    /*显示光标移动设置*/
  152.    LCD_Write_Com(0x0C);    /*显示开及光标设置*/
  153. }

  154. main()
  155. {
  156. unsigned char num,j;  
  157. int i=0,a=0,value=9;               
  158. unsigned char temp[6];
  159. bit Flag;

  160. LCD_Init();         //初始化液晶屏
  161. DelayMs(10);        //延时用于稳定,可以去掉
  162. LCD_Write_String(0,0,"   chose mode   ");    //写入第一行信息,主循环中不再更改此信息,所以在while之前写入
  163. LCD_Write_String(0,1," input 6or7or8  ");    //写入第二行信息

  164. while (1)         //主循环
  165.   {

  166.   
  167. num=KeyPro();  //扫描键盘
  168. if(num!=9)  //如果扫描是按键有效值则进行处理
  169.    {
  170.     if(num==8)      
  171.         {
  172.            LCD_Write_String(0,0,"password:       ");
  173.            LCD_Write_String(0,1,"                ");
  174.            LED1=0;
  175.            LED2=1;
  176.            LED3=1;
  177.         }
  178.         if(num==7)
  179.         {
  180.           i--;
  181.           LCD_Write_Char(i,1,' ');          
  182.         }

  183.         if(num==6)
  184.         {
  185.             LCD_Write_String(0,0,"Set    password!");
  186.                 LCD_Write_String(0,1,"                ");
  187.                 LED1=1;
  188.                 LED2=0;
  189.                 LED3=1;
  190.                 for(j=0;j<6;j++)
  191.                 {
  192.                         while(value==9)
  193.                         {
  194.                            value        = KeyPro();
  195.                         }
  196.                         password[j]= value ;
  197.                         value=9;
  198.                        
  199.                         LCD_Write_Char(j,1,        password[j]+'0');       
  200.                 }

  201.             LCD_Write_String(0,0,"Set    sucessd!");
  202.                 LCD_Write_String(0,1,"               ");

  203.         }


  204.     if(num<6)     //密码是6位,大于6位时不再输入按键值
  205.          {
  206.      temp[i]=num;
  207.      LCD_Write_Char(i,1,num+'0');
  208.          i++;   //输入数值累加
  209.          }

  210.         if(i==6)//6位后的按键不输入数值,相当于确认按键(任意按键即可)
  211.           {
  212.           i=0;  //计数器复位
  213.           Flag=1;//先把比较位置1
  214.           for(j=0;j<6;j++)//循环比较6个数值,如果有一个不等 则最终Flag值为0
  215.              Flag=Flag&&(temp[j]==password[j]);//比较输入值和已有密码

  216.       if(Flag)//如果比较全部相同,标志位置1
  217.            {
  218.         LCD_Write_String(0,1,"Right Open!");//密码正确显示的信息
  219.                 }
  220.           else
  221.             {
  222.                 LCD_Write_String(0,1,"Wrong Retry!");//密码错误,提示重新输入
  223.                            DelayMs(255);
  224.                                DelayMs(255);
  225.                                    DelayMs(255);
  226.                                    DelayMs(255);
  227.                 LCD_Write_String(0,1,"            ");
  228.                 a++;
  229.                 if(a>=3)
  230.                 {
  231.                     LCD_Write_String(0,0,"not allow input");
  232.                          LCD_Write_String(0,1,"Wrong Waring!");
  233.                         LED1=1;LED2=1;LED3=0;
  234.                         Beep=0;
  235.                         while(1);
  236. ……………………

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

所有资料51hei提供下载:
led电子锁.rar (19.42 KB, 下载次数: 114)





评分

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

查看全部评分

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

使用道具 举报

沙发
ID:387102 发表于 2018-8-17 08:11 | 只看该作者
不需要24C02吗
回复

使用道具 举报

板凳
ID:407120 发表于 2018-10-9 17:08 | 只看该作者
感觉好高大上
回复

使用道具 举报

地板
ID:646452 发表于 2019-11-21 12:52 | 只看该作者
谢谢分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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