找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1349|回复: 0
收起左侧

51单片机AT89S52 LCD 24C02密码锁代码

[复制链接]
ID:674637 发表于 2022-5-14 01:32 | 显示全部楼层 |阅读模式
51单片机密码锁

单片机源程序如下:
  1. //包含头文件
  2. #include <REG51.h>
  3. #include<intrins.h>
  4. //宏定义
  5. #define LCM_Data  P0                  //将P0口定义为LCM_Data
  6. #define uchar unsigned char
  7. #define uint  unsigned int
  8. //1602的控制脚
  9. sbit lcd1602_rs=P2^5;
  10. sbit lcd1602_rw=P2^6;
  11. sbit lcd1602_en=P2^7;

  12. sbit Scl=P3^4;                        //24C02串行时钟
  13. sbit Sda=P3^5;                        //24C02串行数据

  14. sbit ALAM = P2^1;                //报警       
  15. sbit KEY = P3^6;                //开锁

  16. bit  pass=0;                        //密码正确标志
  17. bit  ReInputEn=0;                //重置输入允许标志       
  18. bit  s3_keydown=0;                //3秒按键标志位
  19. bit  key_disable=0;                //锁定键盘标志

  20. unsigned char countt0,second;        //t0中断计数器,秒计数器

  21. void Delay5Ms(void);                //声明延时函数

  22. unsigned char code a[]={0xFE,0xFD,0xFB,0xF7};                                 //控盘扫描控制表
  23. //液晶显示数据数组
  24. unsigned char code start_line[]        = {"password:       "};
  25. unsigned char code name[]                  = {"===Coded Lock==="};        //显示名称
  26. unsigned char code Correct[]         = {"     correct    "};                //输入正确
  27. unsigned char code Error[]           = {"      error     "};          //输入错误
  28. unsigned char code codepass[]        = {"      pass      "};
  29. unsigned char code LockOpen[]        = {"      open      "};                //OPEN
  30. unsigned char code SetNew[]         = {"SetNewWordEnable"};
  31. unsigned char code Input[]           = {"input:          "};                //INPUT
  32. unsigned char code ResetOK[]         = {"ResetPasswordOK "};
  33. unsigned char code initword[]        = {"Init password..."};
  34. unsigned char code Er_try[]                = {"error,try again!"};
  35. unsigned char code again[]                = {"input again     "};

  36. unsigned char InputData[6];                                                                        //输入密码暂存区
  37. unsigned char CurrentPassword[6]={0,0,0,0,0,0};                         //读取EEPROM密码暂存数组
  38. unsigned char TempPassword[6];
  39. unsigned char N=0;                                //密码输入位数记数
  40. unsigned char ErrorCont;                        //错误次数计数
  41. unsigned char CorrectCont;                        //正确输入计数
  42. unsigned char ReInputCont;                         //重新输入计数
  43. unsigned char code initpassword[6]={0,0,0,0,0,0};                        //输入管理员密码后将密码初始为000000
  44. unsigned char code adminpassword[6]={1,3,1,4,2,0};                        //输入管理员密码后将密码初始为000000


  45. //=====================5ms延时==============================
  46. void Delay5Ms(void)
  47. {
  48.         unsigned int TempCyc = 5552;
  49.         while(TempCyc--);
  50. }

  51. //===================400ms延时==============================
  52. void Delay400Ms(void)
  53. {
  54. unsigned char TempCycA = 5;
  55. unsigned int TempCycB;
  56. while(TempCycA--)
  57. {
  58.   TempCycB=7269;
  59.   while(TempCycB--);
  60. }
  61. }

  62. //=============================================================================================
  63. //================================24C02========================================================
  64. //=============================================================================================

  65. void mDelay(uint t) //延时
  66. {
  67.         uchar i;
  68.            while(t--)
  69.            {
  70.                    for(i=0;i<125;i++)
  71.                    {;}
  72.            }
  73. }
  74.    

  75. void Nop(void)                  //空操作
  76. {
  77.         _nop_();                  //仅作延时用一条语句大约1us
  78.         _nop_();
  79.         _nop_();
  80.         _nop_();
  81. }

  82. /*****24c02程序参照24c02时序图*****/
  83. /*起始条件*/

  84. void Start(void)
  85. {
  86.         Sda=1;
  87.         Scl=1;
  88.         Nop();
  89.         Sda=0;
  90.         Nop();
  91. }


  92. /*停止条件*/
  93. void Stop(void)
  94. {
  95.         Sda=0;
  96.         Scl=1;
  97.         Nop();
  98.         Sda=1;
  99.         Nop();
  100. }

  101. /*应答位*/
  102. void Ack(void)
  103. {
  104.         Sda=0;
  105.         Nop();
  106.         Scl=1;
  107.         Nop();
  108.         Scl=0;
  109. }

  110. /*反向应答位*/
  111. void NoAck(void)
  112. {
  113.         Sda=1;
  114.         Nop();
  115.         Scl=1;
  116.         Nop();
  117.         Scl=0;
  118. }

  119. /*发送数据子程序,Data为要求发送的数据*/
  120. void Send(uchar Data)
  121. {
  122.            uchar BitCounter=8;
  123.            uchar temp;
  124.            do
  125.            {
  126.                    temp=Data;                                           //将待发送数据暂存temp
  127.                    Scl=0;
  128.                    Nop();
  129.                    if((temp&0x80)==0x80)                   //将读到的数据&0x80
  130.                    Sda=1;
  131.                    else
  132.                    Sda=0;
  133.                    Scl=1;
  134.                    temp=Data<<1;                                   //数据左移
  135.                    Data=temp;                                           //数据左移后重新赋值Data
  136.                    BitCounter--;                                   //该变量减到0时,数据也就传送完成了
  137.            }
  138.            while(BitCounter);                                   //判断是否传送完成
  139.            Scl=0;
  140. }

  141. /*读一字节的数据,并返回该字节值*/
  142. uchar Read(void)
  143. {
  144.     uchar temp=0;
  145.         uchar temp1=0;
  146.         uchar BitCounter=8;
  147.         Sda=1;
  148.         do
  149.         {
  150.                 Scl=0;
  151.                 Nop();
  152.                 Scl=1;
  153.                 Nop();
  154.                 if(Sda)                                   //数据位是否为1
  155.                         temp=temp|0x01;           //为1 temp的最低位为1(|0x01,就是将最低位变为1)
  156.                 else                                   //如果为0
  157.                         temp=temp&0xfe;           //temp最低位为0(&0xfe(11111110)最低位就是0)
  158.                 if(BitCounter-1)           //BitCounter减1后是否为真
  159.                 {
  160.                         temp1=temp<<1;           //temp左移
  161.                         temp=temp1;
  162.                 }
  163.                 BitCounter--;                   //BitCounter减到0时,数据就接收完了
  164.         }
  165.         while(BitCounter);                   //判断是否接收完成
  166.         return(temp);
  167. }

  168. void WrToROM(uchar Data[],uchar Address,uchar Num)
  169. {
  170.   uchar i;
  171.   uchar *PData;
  172.   PData=Data;
  173.   for(i=0;i<Num;i++)
  174.   {
  175.   Start();
  176.   Send(0xa0);
  177.   Ack();
  178.   Send(Address+i);
  179.   Ack();
  180.   Send(*(PData+i));
  181.   Ack();
  182. ……………………

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

Keil代码与Proteus7.5仿真下载:
密码锁(AT89S52 LCD 24C02).zip (127.98 KB, 下载次数: 31)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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