找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2013|回复: 1
收起左侧

单片机存包柜的程序 怎么把它改成八个密码锁用led灯表示锁,以及存包时每个密码锁随机

[复制链接]
ID:718110 发表于 2020-4-9 14:42 | 显示全部楼层 |阅读模式
看到一个大佬写了一个存包柜的程序,想问问大佬们怎么把它改成八个密码锁用led灯表示锁,以及存包时每个密码锁随机生成一个密码
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include<absacc.h>
  6. #include "lcd1602.h"
  7. #include "main.h"
  8. #include "key.h"


  9. sbit Lock = P3^7;  //代表锁控的继电器IO   高电平关锁,低电平开锁
  10. sbit LEDRED = P3^3;  //代表密码输入错误的红灯IO  高电平熄灭,低电平点亮
  11. sbit LEDGREEN = P3^4;  //代表密码输入正确的绿灯IO  高电平熄灭,低电平点亮
  12. uchar genPasswd[4];           //存储生成的四位随机数密码
  13. uchar inpPasswd[4];           //存储取包时输入的四位密码
  14. uchar code welcome[8]="welcome";  //开机显示的欢迎标语
  15. uchar code set[7]="Passwd";    //显示生成的密码标题
  16. uchar code  close[12]="close door!";   //提示关门
  17. uchar code         input[13] = "input passwd";   //提示请输入密码


  18. /****************定时器设置相关的变量***********************/
  19. unsigned char TL0_temp;         /*暂存TL0的初值*/
  20. unsigned char TH0_temp;         /*暂存TH0的初值*/
  21. #define INT_CLOCK 10    /*INT_CLOCK为定时值,单位为ms ,此处定义为10ms*/
  22. #define CRY_FREQUENCY 11059200 /*CRY_FREQUENCY为晶振频率,单位为Hz*/










  23. /*延时程序*/
  24. void delay(uint z)               
  25. {
  26.         unsigned int i,j;
  27.    for(i=0;i<z;i++)
  28.     for(j=0;j<100;j++);
  29. }
  30. /******************************
  31. 显示首页 welcome
  32. ******************************/
  33. void display1()
  34. {
  35.    unsigned char i;
  36.    for(i = 0;i < 7;i++)
  37.    {
  38.                    wr_com(0x85+i);
  39.                 wr_dat(welcome[i]);[/i][i]
  40.    }
  41. }




  42. /************************************
  43. 显示密码生成界面
  44. ************************************/
  45. void display2()
  46. {
  47.    unsigned char i;
  48.    
  49.    for(i = 0;i < 6;i++)
  50.    {
  51.                    wr_com(0x85+i);
  52.                 wr_dat(set[i]);[/i][i]
  53.    }
  54.    for(i = 0;i < 4;i++)
  55.    {
  56.                    wr_com(0xc6+i);
  57.                 wr_dat(genPasswd[i]+0x30);[/i][i]
  58.                
  59.    }
  60. }


  61. /************************************
  62. 显示请关门界面
  63. ************************************/


  64. void display3()
  65. {
  66.      unsigned char i;
  67.    for(i = 0;i < 11;i++)
  68.    {
  69.                    wr_com(0x83+i);
  70.                 wr_dat(close[i]);[/i][i]
  71.    }


  72. }




  73. /************************************
  74. 显示密码输入界面
  75. ************************************/
  76. void display4()
  77. {
  78.    unsigned char i;
  79.    for(i = 0;i < 12;i++)
  80.    {
  81.                    wr_com(0x82+i);
  82.                 wr_dat(input[i]);[/i][i]
  83.    }
  84.    for(i = 0;i < 4;i++)
  85.    {
  86.                    wr_com(0xc6+i);
  87.                 wr_dat(inpPasswd[i]+0x30);[/i][i]
  88.                
  89.    }


  90. }
  91.         








  92. /***********************************
  93. 定时器0初始化
  94. ***********************************/
  95. void Timer0_init()
  96. {
  97.         unsigned long T0_temp;                                     /*暂存T0的初始值        */
  98.         T0_temp = 65536-((INT_CLOCK *CRY_FREQUENCY /1000)/12);    /*T0初始值计算公式,参考教科书*/
  99.         TL0_temp = T0_temp & 0xff;
  100.         TH0_temp = T0_temp >> 8;
  101.         TL0 = TL0_temp;
  102.         TH0 = TH0_temp;
  103.         TMOD |= 0x01;
  104.         TR0 = 1;                        /*开定时器0中断*/
  105.         ET0 = 1;  
  106.         EA = 1;                    /*开总中断*/                                       


  107. }












  108. /*主函数*/
  109. uchar global_state = 0;
  110. uchar count_num = 0;  //输入的数字个数
  111. void main()
  112. {  
  113.    uchar i;
  114.    uchar passwd;
  115.    
  116.            uchar key_value = 0;
  117.         uchar temp_key_value = 0xff;
  118.         Lock = 1;  //刚上电 锁是需要保持闭合
  119.         Timer0_init();        //定时器初始化
  120.          lcd_init();        //LCD1602初始化
  121.    
  122.         while(1)        //进入不断循环
  123.         {
  124.                    temp_key_value = Calkey_scan();          //读取矩阵按键的键值
  125.                 if(temp_key_value != 0xff)
  126.                 {
  127.                         key_value = temp_key_value;
  128.                 }
  129.                 switch(global_state)
  130.                 {
  131.                         case 0:         //初始化状态
  132.                                 display1();         //显示欢迎语句        -- "welcome"
  133.                         


  134.                                 if(key_value == 13)  //存包按键被按下
  135.                                 {
  136.                                     key_value = 0xff;  //将按键值清除
  137.                                         Lock = 0;    //开锁
  138.                                        
  139.                                         display3();    //显示关门提示语        -- "close door!"
  140.                                     delay(1900);    //等待关门 大约3秒
  141.                                         Lock = 1;   //关门
  142.                                         clear();                 //清屏,准备下一屏的显示
  143.                                         global_state = 1;   //切换运行状态
  144.                                         passwd = TL0;  //采用定时器寄存器的值作为密码
  145.                                         genPasswd[0] = passwd/100;                  //存储密码
  146.                                         genPasswd[1] = passwd%100/10;
  147.                                         genPasswd[2] = passwd%10;
  148.                                         genPasswd[3] = (genPasswd[1]+genPasswd[2])%10;
  149.                                 }
  150.                                 if(key_value == 14)  //取包按键被按下
  151.                                 {
  152.                                     key_value = 0xff;  //将按键值清除
  153.                                         clear();    //清屏,准备下一屏的显示
  154.                                         global_state = 2;  //切换运行状态
  155.                                         count_num = 0;   //清除数字按键变量
  156.                                         for(i = 0;i < 4;i++)  //清空输入的密码数组
  157.                                             inpPasswd[i] = ' '-0x30;[/i][i]
  158.                                 }
  159.                         break;
  160.                         case 1:                //密码生成状态
  161.                                    display2();         //显示密码生成界面
  162.                                 delay(1900);    //等待大约3秒
  163.                                 global_state = 0;  //返回到初始界面
  164.                                 clear();        //清屏,准备下一屏的显示
  165.                                 
  166.                         break;
  167.                         case 2:          //输入密码状态
  168.                            display4();           //显示输入密码界面
  169.                            if((key_value >= 0) && (key_value <= 9))          //如果按下的为0-9的数字按键
  170.                            {
  171.                               
  172.                                 if(count_num <= 3)         //如果按键次数小于4次
  173.                                         {
  174.                                         inpPasswd[count_num] = key_value; //将按键值存入数组,并显示
  175.                                                    count_num++;
  176.                                     }
  177.                                          key_value = 0xff;  //将按键值清除
  178.                            }
  179.                            if(key_value == 15) //清除按键被按下
  180.                            {
  181.                                 key_value = 0xff;  //将按键值清除
  182.                                            for(i = 0;i < 4;i++)
  183.                                           inpPasswd[i] = ' '-0x30;  //清除刚刚输入的密码[/i][i]
  184.                            }
  185.                            if(key_value == 16) //确认按键被按下
  186.                            {
  187.                                 key_value = 0xff;  //将按键值清除
  188.                                            for(i = 0;i < 4;i++)
  189.                                         {
  190.                                                 if(inpPasswd[i] != genPasswd[i])[/i][/i][i][i]
  191.                                                    break;
  192.                                         }
  193.                                         if(i == 4)          //密码输入正确
  194.                                         {
  195.                                                 LEDRED = 1;         //红灯熄灭
  196.                                                 LEDGREEN = 0;  //绿灯亮
  197.                                                 Lock = 1;  //开锁
  198.                                                 delay(1900);    //等待大约3秒
  199.                                                 Lock = 0;  //关锁
  200.                                                 LEDGREEN = 1;  //绿灯熄灭
  201.                                         }
  202.                                         else   //密码输入错误
  203.                                         {
  204.                                                 LEDRED = 0;         //红灯亮
  205.                                                 LEDGREEN = 1;  //绿灯熄灭
  206.                                                 Lock = 0;  //关锁
  207.                                                 delay(1900);    //等待大约3秒
  208.                                                 LEDRED = 1;  //红灯熄灭
  209.                                         }
  210.                                         clear();           //清屏,准备下一屏的显示
  211.                                         global_state = 0;  //返回到初始界面


  212.                            }
  213.                         break;        
  214.                 }
  215.         }
  216. }




  217. void T0_interrupt(void) interrupt 1         
  218. {
  219.         TH0 += TH0_temp;
  220.         TL0 += TL0_temp;


  221. }

复制代码
回复

使用道具 举报

ID:584814 发表于 2020-4-15 11:31 | 显示全部楼层
你比较适合当老师
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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