找回密码
 立即注册

QQ登录

只需一步,快速开始

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

新手写的单片机密码锁程序

  [复制链接]
跳转到指定楼层
楼主
功能:1,点击开锁后,输入密码,设置的初始密码为666666,LED灯亮
          2,点击上锁,密码锁锁上,LED灯关闭
          3,点击修改密码,先输入原密码,正确后输入新密码,屏幕显示save over,点击保存密码,密码保存在EEPROM中(因为不知道怎么在PROTEUS中使用EEPROM所以这个功能实现不了,但是要是在单片机开发板上就可以)
           4,开锁10秒后自动上锁
          5,串口可以使用虚拟串口,但由于学的不多,只能传入单个字符选择需要实现的功能,然后用键盘实现功能
          6,初学以来第一次做的比学单个功能时稍大一点的程序,可能有些地方考虑不周,可以交流一下嘛^-^.

电路原理图如下:


单片机源程序如下:
  1. #include<reg52.h>
  2. #include"lcd.h"
  3. #include"eeprom.h"
  4. #include"keyboard.h"
  5. #include"sounder.h"
  6. #include"led.h"

  7. #define u8 unsigned char
  8. #define u16 unsigned int
  9.         
  10. unsigned long pass=666666;
  11. unsigned int Timer0=0;
  12. unsigned char uartvalue=0;

  13. u8 code str1[]=" Password:      ";
  14. u8 code str2[]=" Close          ";
  15. u8 code str3[]=" Old Password:  ";
  16. u8 code str4[]="0123456789";
  17. u8 code str5[]=" OPEN           ";
  18. u8 code str6[]=" Password Lock  ";
  19. u8 code str7[]=" Wrong!         ";
  20. u8 code str8[]=" New Password:  ";
  21. u8 code str9[]="******";
  22. u8 code str10[]=" Change Over   ";
  23. u8 code str11[]=" Save Over     ";
  24. u8 code str12[]="修改密码";
  25. u8 code kong[]="                ";

  26. u8 strbuff[16];
  27. void E2init()//EEPROM初始值
  28. {
  29.         unsigned long num1,num2,num3,date1,date2,date3;
  30.         num1=pass/10000;
  31.         num2=pass/100%100;
  32.         num3=pass%100;
  33.         At24c02write(1,num1);
  34.         At24c02write(2,num2);
  35.         At24c02write(3,num3);
  36.         date1=At24c02read(1);
  37.         date2=At24c02read(2);
  38.         date3=At24c02read(3);
  39.         pass=(date1*10000+date2*100+date3);
  40. }
  41. void Lockinit()//最初屏显
  42. {
  43.         unsigned char i;
  44.         Write_cmd(0x80);
  45.         for(i=0;i<16;i++)
  46.         {
  47.                 Write_dat(str6[i]);
  48.         }
  49. }

  50. void clear(unsigned char j)//清屏
  51. {
  52.         unsigned char i;
  53.         if(j==0)
  54.         {
  55.                 Write_cmd(0x80);
  56.                 for(i=0;i<16;i++)
  57.                 {
  58.                         Write_dat(kong[i]);
  59.                 }
  60.         }
  61.         if(j==1)
  62.         {
  63.                 Write_cmd(0x80+0x40);
  64.                 for(i=0;i<16;i++)
  65.                 {
  66.                         Write_dat(kong[i]);
  67.                 }
  68.         }
  69. }
  70.                
  71. void open()//开锁
  72. {
  73.         unsigned char i=0,j=0;
  74.         unsigned long mima=0;
  75.         while(1)
  76.         {
  77.                 Keyvalue();
  78.                 if(keystate==1&&(value>=0&&value<=9||value==14))//输入密码
  79.                 {
  80.                         keystate=0;
  81.                         Write_cmd(0x80+0x40+j);
  82.                         Write_dat(str9[j]);
  83.                         j++;
  84.                         mima=mima*10+value;
  85.                         if(value==14)
  86.                         {
  87.                                 clear(1);
  88.                                 j=0;
  89.                                 mima=0;
  90.                         }
  91.                 }
  92.                 if(j==6)//密码输入完毕,判断
  93.                 {
  94.                         delay(50000);
  95.                         if(mima==pass)//正确
  96.                         {
  97.                                 Write_cmd(0x80);
  98.                                 for(i=0;i<16;i++)
  99.                                 {
  100.                                         Write_dat(str5[i]);
  101.                                 }
  102.                                 TR0=1;
  103.                                 clear(1);
  104.                                 LED=0;
  105.                         }
  106.                         else//错误
  107.                         {
  108.                                 Write_cmd(0x80);
  109.                                 for(i=0;i<16;i++)
  110.                                 {
  111.                                         Write_dat(str7[i]);
  112.                                 }
  113.                                 clear(1);
  114.                                 LED=1;
  115.                         }
  116.                         break;
  117.                 }
  118.         }
  119. }
  120.                                        
  121. void change()//修改密码
  122. {
  123.         unsigned char i,j=0;
  124.         unsigned long mima=0,changemima=0;
  125.         TR0=0;
  126.         Timer0=0;
  127.         while(1)
  128.         {
  129.                 Keyvalue();
  130.                 if(keystate==1&&(value>=0&&value<=9||value==14))//输入密码
  131.                 {
  132.                         keystate=0;
  133.                         Write_cmd(0x80+0x40+j);
  134.                         Write_dat(str4[value]);
  135.                         j++;
  136.                         mima=mima*10+value;
  137.                         if(value==14)
  138.                         {
  139.                                 clear(1);
  140.                                 j=0;
  141.                                 mima=0;
  142.                         }
  143.                 }
  144.                 if(j==6)//输入完毕,判断
  145.                 {
  146.                         delay(50000);
  147.                         clear(1);
  148.                         if(mima==pass)//密码正确
  149.                         {
  150.                                 Write_cmd(0x80);
  151.                                 for(i=0;i<16;i++)
  152.                                 {
  153.                                         Write_dat(str8[i]);
  154.                                 }
  155.                                 i=0;
  156.                                 while(1)
  157.                                 {
  158.                                         Keyvalue();
  159.                                         if(keystate==1&&(value>=0&&value<=9||value==14))//输入需要修改的密码
  160.                                         {
  161.                                                 keystate=0;
  162.                                                 Write_cmd(0x80+0x40+i);
  163.                                                 Write_dat(str4[value]);
  164.                                                 changemima=changemima*10+value;
  165.                                                 i++;
  166.                                                 if(value==14)
  167.                                                 {
  168.                                                         clear(1);
  169.                                                         i=0;
  170.                                                         changemima=0;
  171.                                                 }
  172.                                         }
  173.                                         if(i==6)//输入完毕,保存
  174.                                         {
  175.                                                 delay(50000);
  176.                                                 pass=changemima;
  177.                                                 Write_cmd(0x80);
  178.                                                 for(i=0;i<16;i++)
  179.                                                 {
  180.                                                         Write_dat(str10[i]);
  181.                                                 }
  182.                                                 clear(1);
  183.                                                 break;
  184.                                         }
  185.                                 }
  186.                         }
  187.                         else//旧密码输入错误
  188.                         {
  189.                                 Write_cmd(0x80);
  190.                                 for(i=0;i<16;i++)
  191.                                 {
  192.                                         Write_dat(str7[i]);
  193.                                 }
  194.                                 clear(1);
  195.                                 LED=1;
  196.                         }
  197.                         break;
  198.                 }
  199.         }               
  200. }
  201. void save()//保存密码
  202. {
  203.         unsigned char i;
  204.         unsigned long num1,num2,num3;
  205.         TR0=0;
  206.         Timer0=0;
  207.         num1=pass/10000;
  208.         num2=pass/100%100;
  209.         num3=pass%100;
  210.         At24c02write(1,num1);
  211.         At24c02write(2,num2);
  212.         At24c02write(3,num3);
  213.         Write_cmd(0x80);
  214.         for(i=0;i<16;i++)
  215.         {
  216.                 Write_dat(str11[i]);
  217.         }
  218.         clear(1);
  219. }
  220. void KeyBoard()//键值功能
  221. {
  222.         unsigned char i=0;
  223.         unsigned char keylock = 0;
  224.         
  225.         while(1)
  226.         {
  227.                 Keyvalue();
  228.                 if(value==10)//开锁
  229.                 {
  230.                         keystate=0;
  231.                         Write_cmd(0x80);
  232.                         for(i=0;i<16;i++)
  233.                         {
  234.                                 Write_dat(str1[i]);
  235.                         }
  236.                         keylock=1;
  237.                 }
  238.                 if(value==11)//上锁
  239.                 {
  240.                         keystate=0;
  241.                         Write_cmd(0x80);
  242.                         for(i=0;i<16;i++)
  243.                         {
  244.                                 Write_dat(str2[i]);
  245.                         }
  246.                         clear(1);
  247.                         LED=1;
  248.                         break;
  249.                 }
  250.                 if(value==12)//修改密码
  251.                 {
  252.                         keystate=0;
  253.                         Write_cmd(0x80);
  254.                         for(i=0;i<16;i++)
  255.                         {
  256.                                 Write_dat(str3[i]);
  257.                         }
  258.                         keylock=2;
  259.                 }
  260.                 if(value==13)//保存密码
  261.                 {
  262.                         keystate=0;
  263.                         keylock=3;
  264.                 }
  265.                 switch(keylock)
  266.                 {
  267.                         case 1:keylock = 0;open();value=15;break;
  268.                         case 2:keylock = 0;change();value=15;break;
  269.                         case 3:keylock = 0;save();value=15;break;
  270.                         default:break;
  271.                 }
  272.         }
  273. }


  274. void main()
  275. {
  276.         TMOD=0X21;         //定时器1方式2,定时器0方式1
  277.         SCON=0X50;                   //串口设置
  278.         PCON=0X80;                   //波特率加倍
  279.         TH1=0XFA;                   //设置波特率为9600
  280.         TL1=0XFA;
  281.         TH0=0XF8;                   //定时2ms
  282.         TL0=0XCC;
  283.         EA=1;
  284.         ES=1;
  285.         ET0=1;
  286.         TR1=1;
  287.         Lcdinit();                        //LCD1602初始化
  288.         Lockinit();                        
  289.         E2init();               
  290.         while(1)
  291.         {
  292.                 KeyBoard();
  293.         }
  294. }

  295. void ledonoff() interrupt 1
  296. {
  297.         unsigned char i;
  298.         TH0=0XF8;
  299.         TL0=0XCC;
  300.         if(LED==0)
  301.         {
  302.                 Timer0++;
  303.         }
  304.         if(Timer0==5000)
  305.         {
  306.                 LED=1;
  307.                 Timer0=0;
  308.                 Write_cmd(0x80);
  309.                 for(i=0;i<16;i++)
  310.                 {
  311.                         Write_dat(str2[i]);
  312.                 }
  313.                 TR0=0;
  314.         }
  315. }

  316. void Uart() interrupt 4
  317. {
  318.         unsigned char UART_buff;
  319.         if(RI)
  320.         {
  321.                 UART_buff=SBUF;
  322.                 if(UART_buff=='0') value=10;
  323.                 if(UART_buff=='1') value=11;
  324.                 if(UART_buff=='2') value=12;
  325.                 if(UART_buff=='3') value=13;
  326.                 SBUF=UART_buff;
  327.         }
  328.         if(TI)
  329.         {
  330.                 TI=0;
  331.         }
  332. }
复制代码

源程序51hei下载,但是没有仿真,求大神分享个仿真图啊:
test_23,门禁.zip (72.98 KB, 下载次数: 50)

评分

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

查看全部评分

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

使用道具 举报

来自 2#
ID:554216 发表于 2020-8-29 13:12 | 只看该作者
额,这是很早做的了,仿真已经删除了,但是上面我贴的图就是仿真图嘛,可以根据那个画一个
回复

使用道具 举报

板凳
ID:435715 发表于 2020-4-12 14:18 | 只看该作者
hhh附件里好像没有仿真。
回复

使用道具 举报

地板
ID:769672 发表于 2020-6-4 22:41 | 只看该作者
附件里没有仿真。。。。。。
回复

使用道具 举报

5#
ID:89286 发表于 2020-8-31 07:36 | 只看该作者
thanks for sharing
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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