找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11855|回复: 25
收起左侧

基于51单片机的电子密码锁proteus仿真加源程序

  [复制链接]
ID:187822 发表于 2017-4-10 21:44 | 显示全部楼层 |阅读模式
(1)设置6位密码,密码通过键盘输入,若密码正确,则将锁打开,初始化密码为(123456)。
(2)密码可以由用户自己修改设定(支持6位密码),锁打开后才能修改密码。修改密码之前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作。
(3)报警、锁定键盘功能。密码输入错误数码显示器会出现错误提示,若密码输入错误次数超过4次,蜂鸣器报警并且锁定键盘。
(4)密码修改后有存储功能。
(5)一键恢复初始密码功能。

仿真图

仿真图


源程序:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. typedef unsigned char uchar;
  4. typedef unsigned int  uint;
  5. sbit beep=P2^4;//蜂鸣器接口
  6. sbit D1=P2^2;//开锁信号
  7. sbit k1=P3^2;//恢复初始密码按键
  8. sbit RS=P2^7;//数据命令选择
  9. sbit RW=P2^6;//读写控制
  10. sbit E=P2^5;//液晶使能
  11. sbit SDA=P2^1; //数据线接口
  12. sbit SCL=P2^0;//时钟线接口  
  13. uchar idata table1[6]={1,2,3,4,5,6}; //初始密码
  14. uchar dd;
  15. uchar aa;//存放密码错误的次数,够三次报警
  16. uchar bb;
  17. uchar cc;
  18. //延时子函数
  19. void delay1(uint z)
  20. {
  21.         uint x,y;
  22.         for(x=0;x<z;x++)
  23.                 for(y=0;y<110;y++);
  24. }
  25. void delay2()
  26. {
  27.         ;;
  28. }
  29. //总线初始化子函数
  30. void i2cinit()
  31. {
  32.         SDA=1;
  33.         delay2();
  34.         SCL=1;
  35.         delay2();
  36. }
  37. //启动信号子函数
  38. void start()
  39. {
  40.         SDA=1;
  41.         SCL=1;
  42.         delay2();
  43.         SDA=0;
  44.         delay2();
  45. }
  46. //停止信号子函数
  47. void stop()
  48. {
  49.         SDA=0;
  50.         delay2();
  51.         SCL=1;
  52.         delay2();
  53.         SDA=1;
  54.         delay2();
  55. }
  56. //应答信号子函数
  57. void respons()
  58. {
  59.         uchar i=0;
  60.         SCL=1;
  61.         delay2();
  62.         while(SDA==1&&i<255)//等待应答,过一段时间不应答退出循环
  63.                 i++;
  64.         SCL=0;
  65.         delay2();
  66. }
  67. //写一个字节子函数
  68. void writebyte(uchar date)
  69. {
  70.         uchar i,temp;
  71.         temp=date;
  72.         for(i=0;i<8;i++)
  73.         {
  74.                 temp<<=1;//temp左移一位后高位进CY
  75.                 SCL=0;
  76.                 delay2();
  77.                 SDA=CY;
  78.                 delay2();
  79.                 SCL=1;
  80.                 delay2();
  81.         }       
  82.         SCL=0;//应答信号中SCL = 1,所以这里要置0
  83.         delay2();
  84.         SDA=1;//用完要释放数据总线
  85.         delay2();
  86. }
  87. //读一个字节子函数
  88. uchar readbyte()
  89. {
  90.         uchar i,k;
  91.         SCL=0;
  92.         delay2();
  93.         SDA=1;
  94.         for(i=0;i<8;i++)
  95.         {
  96.                 SCL=1;       
  97.                 delay2();
  98.                 k=(k<<1)|SDA; //和最低位或,一位位送到K
  99.                 SCL=0;
  100.                 delay2();
  101.         }
  102.         delay2();
  103.         return k;
  104. }
  105. //向地址写一个字节数据子函数
  106. void write_add(uchar address,uchar date)
  107. {
  108.         start();
  109.         writebyte(0xa0);//A0,A1,A2接地,AT24C02芯片地址为1010,送控制字为1010A2A1A0R/~W
  110.         respons();
  111.         writebyte(address);
  112.         respons();
  113.         writebyte(date);
  114.         respons();
  115.         stop();
  116. }
  117. //向地址读一个字节数据子函数
  118. uchar read_add(uchar address)
  119. {
  120.         uchar date;
  121.         start();
  122.         writebyte(0xa0);//A0,A1,A2接地,AT24C02芯片地址为1010,送控制字为1010A2A1A0R/~W
  123.         respons();
  124.         writebyte(address);
  125.         respons();
  126.         start();
  127.         writebyte(0xa1);//A0,A1,A2接地,AT24C02芯片地址为1010,送控制字为1010A2A1A0R/~W
  128.         respons();
  129.         date=readbyte();
  130.         stop();
  131.         return date;
  132. }
  133. //向地址写n个字节数据子函数
  134. void write_n_add(uchar *p,uchar address,uchar n)
  135. {
  136.         uchar i;
  137.         for(i=0;i<n;i++)
  138.         {
  139.                 write_add((address+i),*(p+i));
  140.                 delay1(20);//一定要适当延时,不然写不进去
  141.         }
  142. }
  143. //向地址读n个字节数据子函数
  144. void read_n_add(uchar *p,uchar address,uchar n)
  145. {
  146.         uchar i;
  147.         for(i=0;i<n;i++)
  148.         {
  149.                 *(p+i)=read_add(address+i);       
  150.         }
  151. }
  152. //LCD1602液晶读忙子函数
  153. bit LCD1602_busy()
  154. {                          
  155.     bit a;
  156.     RS=0;
  157.     RW=1;
  158.     E=1;
  159.     _nop_();
  160.     _nop_();
  161.     a=(bit)(P0&0x80);
  162.     E=0;
  163.     return a;
  164. }
  165. //LCD1602液晶写命令子函数
  166. void write_com(uchar com)
  167. {
  168.         while(LCD1602_busy());
  169.     RW=0;
  170.         RS=0;
  171.     E=0;
  172.         P0=com;
  173.         delay1(5);
  174.     E=1;
  175.         delay1(5);
  176.     E=0;
  177. }
  178. //LCD1602液晶写数据子函数
  179. void write_date(uchar date)
  180. {
  181.         while(LCD1602_busy());
  182.     RW=0;
  183.           RS=1;
  184.     E=0;
  185.           P0=date;
  186.         delay1(5);
  187.     E=1;
  188.         delay1(5);
  189.     E=0;         
  190. }
  191. //写一个字符子函数
  192. void write_1_char(uchar zifu)
  193. {
  194.         write_date(zifu);       
  195. }
  196. //向液晶写n个字符子函数
  197. void write_n_char(uchar zifu[])
  198. {
  199.         uchar i;
  200.         for(i=0;;i++)
  201.         {
  202.                 write_1_char(zifu[i]);
  203.                 if(zifu[i+1]=='\0')
  204.                         break;
  205.         }
  206. }
  207. //设置液晶显示位置子函数
  208. void LCD1602_pos(uchar x,uchar y)
  209. {
  210.         uchar pos;
  211.         if(x==0)
  212.                 x=0x80;
  213.         else if(x==1)
  214.                 x=0x80+0x40;
  215.         pos=x+y;
  216.         write_com(pos);
  217. }
  218. //LCD1602液晶初始化子函数
  219. void LCD1602_init()
  220. {
  221.     E=0;
  222.     write_com(0x38);//设置16x2显示,5x7点阵,8位数据口
  223.     write_com(0x0c);//设置开显示,不显示光标
  224.     write_com(0x06);//写一个字符后地址指针加1
  225.         write_com(0x01);//显示清0,数据指针清0         
  226. }
  227. //报警子函数
  228. void baojing1()
  229. {
  230.         int i;
  231.         for(i=0;i<5;i++)
  232.         {
  233.                 beep=1;
  234.                 D1=0;
  235.                 delay1(5);
  236.                 beep=0;
  237.                 D1=1;
  238.                 delay1(5);       
  239.         }
  240. }
  241. void baojing2()
  242. {
  243.         uchar i;
  244.         for(i=0;i<10;i++)
  245.         {
  246.                 baojing1();
  247.         }
  248. }
  249. //矩阵按键扫描子函数
  250. uchar keyscan()
  251. {
  252.         uchar temp,key;
  253.         key=0xff;
  254.         P1=0xfe; //将第一行线置低电平
  255.         temp=P1;//读JPJK的当前状态到 temp
  256.         temp&=0xf0;// temp = temp & 0xf0 按位与
  257.         if(temp!=0xf0)
  258.         {
  259.                 delay1(10);//延时去抖
  260.                 temp=P1;
  261.                 temp&=0xf0;
  262.                    if(temp!=0xf0)//第一行有键被按下
  263.                 {
  264.                         temp=P1;//读被按下的键
  265.                         baojing1();
  266.                         switch(temp)
  267.                         {
  268.                                 case 0xee:         key=1;
  269.                                                         break;
  270.                                 case 0xde:         key=2;
  271.                                                         break;
  272.                                 case 0xbe:         key=3;
  273.                                                         break;
  274.                                 case 0x7e:         key=0x0a;
  275.                                                         break;
  276.                         }
  277.                         while(temp!=0xf0)//等待按键释放
  278.                         {
  279.                                 temp=P1;
  280.                                 temp&=0xf0;
  281.                         }
  282.                 }
  283.         }
  284.         P1=0xfd; //将第二行线置低电平
  285.         temp=P1;//读JPJK的当前状态到 temp
  286.         temp&=0xf0;// temp = temp & 0xf0
  287.         if(temp!=0xf0)
  288.         {
  289.                 delay1(10);//延时去抖
  290.                 temp=P1;
  291.                 temp&=0xf0;
  292.                    if(temp!=0xf0)//第二行有键被按下
  293.                 {
  294.                         temp=P1;//读被按下的键
  295.                         baojing1();
  296.                         switch(temp)
  297.                         {
  298.                                 case 0xed:         key=4;
  299.                                                         break;
  300.                                 case 0xdd:         key=5;
  301.                                                         break;
  302.                                 case 0xbd:         key=6;
  303.                                                         break;
  304.                                 case 0x7d:         key=0x0b;
  305.                                                         break;
  306.                         }
  307.                         while(temp!=0xf0)//等待按键释放
  308.                         {
  309.                                 temp=P1;
  310.                                 temp&=0xf0;
  311.                         }
  312.                 }
  313.         }
  314.         P1=0xfb; //将第 三行线置低电平
  315.         temp=P1;//读JPJK的当前状态到 temp
  316.         temp&=0xf0;// temp = temp & 0xf0
  317.         if(temp!=0xf0)
  318.         {
  319.                 delay1(10);//延时去抖
  320.                 temp=P1;
  321.                 temp&=0xf0;
  322.                    if(temp!=0xf0)//第三行有键被按下
  323.                 {
  324.                         temp=P1;//读被按下的键
  325.                         baojing1();
  326.                         switch(temp)
  327.                         {
  328.                                 case 0xeb:         key=7;
  329.                                                         break;
  330.                                 case 0xdb:         key=8;
  331.                                                         break;
  332.                                 case 0xbb:         key=9;
  333.                                                         break;
  334.                                 case 0x7b:         key=0x0c;
  335.                                                         break;
  336.                         }
  337.                         while(temp!=0xf0)//等待按键释放
  338.                         {
  339.                                 temp=P1;
  340.                                 temp&=0xf0;
  341.                         }
  342.                 }
  343.         }
  344.         P1=0xf7; //将第四行线置低电平
  345.         temp=P1;//读JPJK的当前状态到 temp
  346.         temp&=0xf0;// temp = temp & 0xf0
  347.         if(temp!=0xf0)
  348.         {
  349.                 delay1(10);//延时去抖
  350.                 temp=P1;
  351.                 temp&=0xf0;
  352.                    if(temp!=0xf0)//第四行有键被按下
  353.                 {
  354.                         temp=P1;//读被按下的键
  355.                         baojing1();
  356.                         switch(temp)
  357.                         {
  358.                                 case 0xe7:         key=0;
  359.                                                         break;
  360.                                 case 0xd7:         key=0;
  361.                                                         break;
  362.                                 case 0xb7:         key=0x0f;
  363.                                                         break;
  364.                                 case 0x77:         key=0x0d;
  365.                                                         break;
  366.                         }
  367.                         while(temp!=0xf0)//等待按键释放
  368.                         {
  369.                                 temp=P1;
  370.                                 temp&=0xf0;
  371.                         }
  372.                 }
  373.         }
  374.            return key; //返回按下的键
  375. }
  376. //比较密码子函数
  377. bit sfj1(uchar *string1,uchar *string2)
  378. {
  379.         uchar i;
  380.         for(i=0;i<6;i++)
  381.         {
  382.                 if(string1[i]!=string2[i])
  383.                         return 0;
  384.         }
  385.         return 1;
  386. }
  387. //选择输入密码或修改密码函数
  388. uchar step_choose()
  389. {
  390.         uchar key;
  391.         key=0xff;
  392.         write_com(0x06);//写一个字符后地址指针加 1
  393.     write_com(0x01);//显示清零,数据指针清零
  394.         LCD1602_pos(0,0);
  395.         write_n_char(" Input password ");
  396.         LCD1602_pos(1,0);
  397.         write_n_char("  Press key A  ");       
  398.         while((key!=0x0a)&&(key!=B))
  399.                 key=keyscan();       
  400.         return key;
  401. }
  402. //输入密码子函数
  403. bit input_mima(uchar * mima)
  404. {
  405.         uchar i,key;
  406.         LCD1602_pos(1,0);
  407.         for(i=0;i<7;i++)
  408.         {
  409.                 delay1(100);
  410.                 if(i<6)
  411.                 {
  412.                         do
  413.                         {
  414.                                 key=keyscan();
  415.                         }//扫描键盘
  416.                         while(key==0xff);
  417.                         if((key!=0x0f)&&(key!=0x0a)&&(key!=0x0c))//不是退格也不是确认键
  418.                         {
  419.                                 write_date('*');//是数字键显示*
  420.                                 mima[i]=key;
  421.                         }
  422.                         if(key==0x0f)//是退格键
  423.                         {
  424.                                 if(i>0)
  425.                                 {
  426.                                     LCD1602_pos(1,--i);//光标前移一位
  427.                                         write_date(' ');//清空一位
  428.                                         mima[i]=' ';//写空
  429.                                         LCD1602_pos(1,i);
  430.                                         i--;//密码计数器减一 ,因为循环后会+1,所以在这里要加1
  431.                                 }
  432.                         }
  433.                         if(key==0x0c)//没完成密码输入返回错误信息
  434.                         {
  435.                                 LCD1602_pos(0,0);
  436.                                 return(0);
  437.                         }
  438.                 }
  439.                 if(i==6)
  440.                 {
  441.                         do
  442.                         {
  443.                                 key=keyscan();
  444.                         }
  445.                         while((key!=0x0f)&&(key!=0x0c));
  446.                         if(key==0x0f)
  447.                         {
  448.                                 LCD1602_pos(1,--i);
  449.                                 write_date(' ');
  450.                                 mima[i]=' ';
  451.                                 LCD1602_pos(1,i);
  452.                                 i--;
  453.                         }
  454.                         if(key==0x0c)//密码位数正确
  455.                         {
  456.                                 return(1);//返回1正确信号
  457.                         }
  458.                 }
  459.         }       
  460. }
  461. //密码处理子函数
  462. void sfj2()
  463. {
  464.         uchar key,i;
  465.         uchar idata table2[6]={' ',' ',' ',' ',' ',' '};//存放密码缓冲区
  466.         uchar idata table3[6]={' ',' ',' ',' ',' ',' '};
  467.         uchar idata table4[6]={' ',' ',' ',' ',' ',' '};
  468.         key=step_choose();
  469.         if(key==0x0a)//A被按下,接收输入密码,处理
  470.         {
  471.                 read_n_add(table2,0x00,6);
  472.                 write_com(0x06);//写一个字符后地址指针加 1
  473.                 write_com(0x01);//显示清零,数据指针清零
  474.                 write_com(0x0f);//显示光标
  475.                 LCD1602_pos(0,0);
  476.                 write_n_char(" press password ");               
  477.                 if(input_mima(table3)) //处理输入密码
  478.                 {
  479.                         if(sfj1(table3,table2)) //密码正确
  480.                         {
  481.                                 LCD1602_pos(0,0);
  482.                                 write_com(0x0c);
  483.                         write_com(0x06);//写一个字符后地址指针加 1
  484.                          write_com(0x01);//显示清零,数据指针清零
  485.                                 write_n_char(" password right ");
  486.                                 aa=0; //清除密码错误次数
  487.                                 D1=0; //开锁
  488.                                 beep=1; //响一下
  489.                                 delay1(1000);
  490.                                 beep=0;
  491.                                 TR0=1;
  492.                                 cc=1;
  493.                                 while(key!=0x0d&&cc) //D没按下一直开
  494.                                 {                       
  495.                                         key=keyscan();
  496.                                 }
  497.                                 TR0=0;
  498.                                 D1=1;//D按下了关锁
  499.                         }
  500.                         else //密码 不正确
  501.                         {
  502.                                 LCD1602_pos(0,0);
  503.                                 write_com(0x0c); //关光标
  504.                                 write_com(0x06);//写一个字符后地址指针加 1
  505.                                 write_com(0x01);//显示清零,数据指针清零
  506.                                 write_n_char(" password wrong");
  507.                                 delay1(1000);
  508.                                 aa++;
  509.                                 if(aa==4)
  510.                                 {
  511.                                         aa=0;
  512.                                     i=20; //密码不正确报警
  513.                                         while(i--)
  514.                                                  baojing2();
  515.                                 }
  516.                         }
  517.                 }
  518.                 else //密码没有输入正确或完成
  519.                 {
  520.                         LCD1602_pos(0,0);
  521.                         write_com(0x0c); //关光标
  522.                            write_com(0x06);//写一个字符后地址指针加 1
  523.                            write_com(0x01);//显示清零,数据指针清零
  524.                         write_n_char(" password wrong");
  525.                         delay1(1000);
  526.                         aa++;
  527.                         if(aa==4)
  528.                         {
  529.                                 aa=0;
  530.                             i=20; //密码不正确报警
  531.                                 while(i--)
  532.                                          baojing2();
  533.                         }
  534.                 }
  535.         }
  536.         if(key==0x0b)//B被按下,修改密码
  537.         {
  538.                 read_n_add(table2,0x00,6);
  539.                 write_com(0x06);//写一个字符后地址指针加 1
  540.                 write_com(0x01);//显示清零,数据指针清零
  541.                 write_com(0x0f);//显示光标
  542.                 LCD1602_pos(0,0);
  543.                 write_n_char(" input password");               
  544.                 write_com(0x0f);//显示光标       
  545.                 if(input_mima(table3)) //处理输入密码
  546.                 {
  547.                         if(sfj1(table3,table2)) //密码正确
  548.                         {
  549.                                 LCD1602_pos(0,0);
  550.                                 write_com(0x0c);
  551.                               write_com(0x06);//写一个字符后地址指针加 1
  552.                               write_com(0x01);//显示清零,数据指针清零
  553.                                 write_n_char("password right ");
  554.                                 aa=0; //清除密码错误次数
  555.                                 delay1(1500);
  556.                                 dd=1;
  557.                                 while(dd) //下面开始修改密码
  558.                                 {
  559.                                         write_com(0x06);//写一个字符后地址指针加 1
  560.                                         write_com(0x01);//显示清零,数据指针清零
  561.                                         write_com(0x0f);//显示光标
  562.                                         LCD1602_pos(0,0);
  563.                                         write_n_char("In new password");
  564.                                         delay1(1500);
  565.                                         if(input_mima(table3)) //处理输入密码
  566.                                         {
  567.                                                 LCD1602_pos(0,0);
  568.                                                 write_com(0x0c);
  569.                                          write_com(0x06);//写一个字符后地址指针加 1
  570.                                          write_com(0x01);//显示清零,数据指针清零
  571.                                                 write_n_char("Input new pass"); //确定新密码
  572.                                                 LCD1602_pos(1,0);
  573.                                                 write_n_char("word again");
  574.                                                 delay1(2000);
  575.                                                 LCD1602_pos(0,0);
  576.                                                 write_com(0x0f);//显示光标
  577.                                          write_com(0x06);//写一个字符后地址指针加 1
  578.                                          write_com(0x01);//显示清零,数据指针清零
  579.                                                 write_n_char("In new password");                                               
  580.                                                 if(input_mima(table4)) //处理输入密码
  581.                                                 {
  582.                                                         if(sfj1(table3,table4)) //密码正确
  583.                                                         {
  584.                                                                 LCD1602_pos(0,0);
  585.                                                                 write_com(0x0c);
  586.                                                               write_com(0x06);//写一个字符后地址指针加 1
  587.                                                               write_com(0x01);//显示清零,数据指针清零
  588.                                                                 write_n_char("password has");
  589.                                                                 LCD1602_pos(1,0);
  590.                                                                 write_n_char("change already");
  591.                                                                 write_n_add(table4,0x00,6); //把修改的密码存进24C02
  592.                                                                 delay1(2000);
  593.                                                                 dd=0;
  594.                                                         }
  595.                                                         else //密码 不正确
  596.                                                         {
  597.                                                                 LCD1602_pos(0,0);
  598.                                                                 write_com(0x0c); //关光标
  599.                                                                 write_com(0x06);//写一个字符后地址指针加 1
  600.                                                                 write_com(0x01);//显示清零,数据指针清零
  601.                                                                 write_n_char("password wrong");
  602.                                                                 delay1(1000);
  603.                                                                 aa++;
  604.                                                                 if(aa==4)
  605.                                                                 {
  606.                                                                         aa=0;
  607.                                                                            i=20; //3次输入密码不正确报警
  608.                                                                         while(i--)
  609.                                                                                 baojing2();
  610.                                                                 }
  611.                                                                 dd=0;
  612.                                                         }
  613.                                                 }
  614.                                                 else //密码没有输入正确或完成
  615.                                                 {
  616.                                                         LCD1602_pos(0,0);
  617.                                                         write_com(0x0c); //关光标
  618.                                                            write_com(0x06);//写一个字符后地址指针加 1
  619.                                                         write_com(0x01);//显示清零,数据指针清零
  620.                                                         write_n_char(" password wrong");
  621.                                                         delay1(1000);
  622.                                                         aa++;
  623.                                                         if(aa==4)
  624.                                                         {
  625.                                                                 aa=0;
  626.                                                             i=20; //3次输入密码不正确报警
  627.                                                                 while(i--)
  628.                                                                         baojing2();
  629.                                                         }
  630.                                                 }       
  631.                                         }
  632.                                         else //密码没有输入正确或完成
  633.                                         {
  634.                                                 LCD1602_pos(0,0);
  635.                                                 write_com(0x0c); //关光标
  636.                                                    write_com(0x06);//写一个字符后地址指针加 1
  637.                                                    write_com(0x01);//显示清零,数据指针清零
  638.                                                 write_n_char("password wrong");
  639.                                                 delay1(1000);
  640.                                                 dd=0;
  641.                                                 aa++;
  642.                                                 if(aa==4)
  643.                                                 {
  644.                                                         aa=0;
  645.                                                     i=20; //3次输入密码不正确报警
  646.                                                         while(i--)
  647.                                                                  baojing2();
  648.                                                 }
  649.                                         }                                                                       
  650.                                 }
  651.                         }
  652.                         else //密码 不正确
  653.                         {
  654.                                 LCD1602_pos(0,0);
  655.                                 write_com(0x0c); //关光标
  656.                                 write_com(0x06);//写一个字符后地址指针加 1
  657.                                 write_com(0x01);//显示清零,数据指针清零
  658.                                 write_n_char("password wrong");
  659.                                 delay1(1000);
  660.                                 aa++;
  661.                                 if(aa==4)
  662.                                 {
  663.                                         aa=0;
  664.                                     i=20; //3次输入密码不正确报警
  665.                                         while(i--)
  666.                                                  baojing2();
  667.                                 }
  668.                         }
  669.                 }
  670.                 else //密码没有输入正确或完成
  671.                 {
  672.                         LCD1602_pos(0,0);
  673.                         write_com(0x0c); //关光标
  674.                            write_com(0x06);//写一个字符后地址指针加 1
  675.                            write_com(0x01);//显示清零,数据指针清零
  676.                         write_n_char("password wrong");
  677.                         delay1(1000);
  678.                         aa++;
  679.                         if(aa==4)
  680.                         {
  681.                                 aa=0;
  682.                             i=20; //3次输入密码不正确报警
  683.                                 while(i--)
  684.                                          baojing2();
  685.                         }
  686.                 }               
  687.         }
  688. }
  689. //主函数
  690. void main()
  691. {
  692.         LCD1602_init();//调用液晶初始化子函数
  693.         i2cinit();//调用24C02总线初始化子函数
  694.         beep=0;
  695.         D1=1; //关锁
  696.         TMOD=0x01;//选择定时器0方式1
  697.         EA=1;//打开总中断
  698.         ET0=1;//打开定时器0中断
  699.         EX0=1; //打开外部中断0
  700.         IT0=1;//下降沿触发
  701.         TR0=0;//关闭定时器
  702.         TH0=0x4c;//50ms装初值
  703.         TL0=0x00;
  704.         while(1)
  705.         {
  706.                   sfj2();//调用密码处理子函数
  707.         }
  708. }
  709. //外部中断0子函数
  710. void wb0() interrupt 0
  711. {
  712.         delay1(2000);
  713.         if(!k1)
  714.         {
  715.                 LCD1602_pos(0,0);
  716.                 write_com(0x0c); //关光标
  717.                    write_com(0x06);//写一个字符后地址指针加 1
  718.                 write_com(0x01);//显示清零,数据指针清零
  719.                 i2cinit();//24C02总线初始化
  720.                 write_n_add(table1,0x00,6);
  721.                 write_n_char("password renew");
  722.                 LCD1602_pos(1,0);
  723.                 write_n_char("already");
  724.                 delay1(1000);
  725.                 LCD1602_pos(0,0);
  726.                 write_com(0x0c); //关光标
  727.                    write_com(0x06);//写一个字符后地址指针加 1
  728.                 write_com(0x01);//显示清零,数据指针清零
  729.                 write_n_char("Input password");
  730.                 LCD1602_pos(1,0);
  731.                 write_n_char("Press key A");
  732.         }
  733. }
  734. //定时器0中断子函数
  735. void t0() interrupt 1
  736. {
  737.         TH0=0x4c;//50ms定时
  738.         TL0=0x00;
  739.         bb++;
  740.         if(bb==200)//10秒时间到
  741.         {
  742.                 bb=0;
  743.                 cc=0;
  744.         }
  745. }
  746.                                
复制代码

0.png

下载:
3、基于51单片机电子密码锁的设计.zip (108.29 KB, 下载次数: 456)

评分

参与人数 2黑币 +55 收起 理由
yinkun230 + 5 绝世好帖!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:202896 发表于 2017-5-21 11:28 | 显示全部楼层
很厉害哦
回复

使用道具 举报

ID:202308 发表于 2017-7-7 12:02 | 显示全部楼层
太棒了,谢谢哦。哈哈
回复

使用道具 举报

ID:252943 发表于 2017-11-24 09:27 | 显示全部楼层
谁能给我下载这个文件?
回复

使用道具 举报

ID:239014 发表于 2017-12-7 01:00 | 显示全部楼层
大神您这个程序为什么用Keil uVision4再次编译成HEX文件烧写到仿真里的时候。按下修改密码键没有任何的反应
回复

使用道具 举报

ID:239014 发表于 2017-12-7 01:25 | 显示全部楼层
谢谢分享!大神为什么你的程序重新生成HEX文件后在烧写到仿真图里面,修改密码的功能就不能使用是改过什么地方吗?
回复

使用道具 举报

ID:264408 发表于 2017-12-20 18:25 | 显示全部楼层
楼主很棒
回复

使用道具 举报

ID:268354 发表于 2018-1-4 10:46 | 显示全部楼层
logic contention detected on 是咋回事啊?
回复

使用道具 举报

ID:276184 发表于 2018-1-15 14:59 | 显示全部楼层
黑币不够,谁可以给我这个文件啊,名字是扣扣,红包奖励
回复

使用道具 举报

ID:276896 发表于 2018-1-17 10:52 | 显示全部楼层
这个帖子对我帮助很大,谢谢!!!
回复

使用道具 举报

ID:279123 发表于 2018-1-23 22:54 | 显示全部楼层
要怎么下载啊、
回复

使用道具 举报

ID:280066 发表于 2018-1-28 13:50 | 显示全部楼层
为什么总是仿真总是密码错误呢
回复

使用道具 举报

ID:321135 发表于 2018-5-3 12:28 | 显示全部楼层
非常有用!
回复

使用道具 举报

ID:333064 发表于 2018-5-18 15:55 | 显示全部楼层
怎么样啊
回复

使用道具 举报

ID:289867 发表于 2018-5-20 09:24 | 显示全部楼层
同上问题啊 再次生成新的hex文件烧写进去一直只能输入密码
回复

使用道具 举报

ID:334809 发表于 2018-5-21 13:57 来自手机 | 显示全部楼层
不知道都有啥元件,大神指示一下
回复

使用道具 举报

ID:336554 发表于 2018-5-23 19:23 | 显示全部楼层
厉害了。
回复

使用道具 举报

ID:346735 发表于 2018-6-7 11:14 | 显示全部楼层
不错我可以学习挺久时间啦

回复

使用道具 举报

ID:353571 发表于 2018-6-18 13:15 | 显示全部楼层
密码改了没反应
回复

使用道具 举报

ID:352849 发表于 2018-6-18 15:10 | 显示全部楼层
楼主厉害,谢谢共享
回复

使用道具 举报

ID:389243 发表于 2018-8-25 13:36 | 显示全部楼层
谢谢大佬,很厉害
回复

使用道具 举报

ID:394115 发表于 2018-9-12 12:31 | 显示全部楼层
为什么我打不开仿真文件
回复

使用道具 举报

ID:581593 发表于 2019-7-13 11:14 来自手机 | 显示全部楼层
不能修改密码
回复

使用道具 举报

ID:675192 发表于 2019-12-27 13:22 | 显示全部楼层
为什么运行代码有错误
回复

使用道具 举报

ID:758046 发表于 2020-5-22 17:16 | 显示全部楼层
很好很实用
回复

使用道具 举报

ID:739456 发表于 2020-6-5 17:01 | 显示全部楼层
密码修改不了怎么办
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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