标题: 单片机电子存包柜程序,功能增加不成功 [打印本页]

作者: 祈樹    时间: 2020-4-1 18:39
标题: 单片机电子存包柜程序,功能增加不成功
各位大佬你们好,是这样的,我之前在论坛上看到一位大佬上传了他的作品——电子存包柜的实现,我很感兴趣,就下载下来想自己研究一下,然后我就想给他在原有的基础上增加空柜显示,就是用8个led代表8个柜子,然后更改程序,让他能存八个密码,我的想法是新建[8][4]的二维数组,每次按存键会生成一个4位密码。然后存到数组里,当存满八个时, lcd 显示 full。按取键,开始输入密码,只要与二维数组中的一个对上,就打开对应的柜子。
我现在的想法是,用switch语句,将存包的情况全都写出来 单片机源程序如下:
  1. switch (gui)                                                                                                
  2.                         
  3.                 {
  4.                                         case 0:
  5.                                         case 2:
  6.                                         case 4:
  7.                                         case 8:
  8.                                         case 16:
  9.                                         case 32:
  10.                                         case 64:
  11.                                         case 128:
  12.                                         case 130:
  13.                                         case 132:
  14.                                         case 136:
  15.                                         case 144:
  16.                                         case 160:
  17.                                         case 192:
  18.                                         case 194:
  19.                                         case 196:
  20.                                         case 200:
  21.                                         case 208:
  22.                                         case 224:
  23.                                         case 226:
  24.                                         case 228:
  25.                                         case 232:
  26.                                         case 240:
  27.                                         case 242:
  28.                                         case 244:
  29.                                         case 248:
  30.                                         case 250:
  31.                                         case 252:
  32.                                         case 254:
  33.                     gui = gui + 1;
  34.                      m = 0;
  35.                
  36.                     display3(); //显示关门提示语        -- "close door!"
  37.                                break;

  38.                case 1:
  39.                            case 5:
  40.                            case 9:
  41.                            case 17:
  42.                            case 33:
  43.                            case 65:
  44.                            case 129:
  45.                            case 133:
  46.                            case 137:
  47.                            case 145:
  48.                            case 161:
  49.                            case 193:
  50.                            case 197:
  51.                            case 201:
  52.                            case 209:
  53.                            case 225:
  54.                            case 229:
  55.                            case 233:
  56.                            case 241:
  57.                            case 245:
  58.                            case  249:
  59.                            case 253:
  60.                     gui = gui + 2;
  61.                      m = 1;
  62.                     
  63.                     display3();
  64.                 break;

  65.                 case 3:
  66.                                 case 11:
  67.                                 case 19:
  68.                                 case 35:
  69.                                 case 67:
  70.                                 case 131:
  71.                                 case 139:
  72.                                 case 147:
  73.                                 case 163:
  74.                                 case 195:
  75.                                 case 203:
  76.                                 case 211:
  77.                                 case 227:
  78.                                 case 235:
  79.                                 case 243:
  80.                                 case 251:
  81.                                 
  82.                     gui = gui + 4;
  83.                      m = 2;
  84.                     
  85.                     display3();
  86.                      break;
  87.                           case 23:
  88.                           case 39:
  89.                           case 71:
  90.                           case 135:
  91.                           case 55:
  92.                           case 87:
  93.                           case 151:
  94.                           case 119:
  95.                           case 215:
  96.                           case 247:
  97.               case 7:
  98.                     gui = gui + 8;
  99.                     m = 3;
  100.                   
  101.                     display3();
  102.                 break;

  103.                                 case 207:
  104.                                 case 239:
  105.                                 case 143:
  106.                                 case 79:
  107.                                 case 47:
  108.                 case 15:
  109.                     gui = gui + 16;
  110.                     m = 4;
  111.                   
  112.                     display3();
  113.                 break;

  114.                                 case 223:
  115.                                 case 159:
  116.                                 case 95:
  117.                 case 31:
  118.                     gui = gui + 32;
  119.                      m = 5;
  120.                   
  121.                     display3();
  122.                 break;
  123.                                 case  63:
  124.                 case  191:
  125.                     gui = gui + 64;
  126.                     m = 6;
  127.                   
  128.                     display3();
  129.                 break;

  130.                                 case 127:
  131.                     gui = gui + 128;
  132.                      m = 7;
  133.                     
  134.                     display3();
  135.                 break;

  136.                 case 255:
  137.                
  138.                     display5();
  139.                     delay(1900);
  140.                     clear();
  141.                                   }
复制代码

gui是定义的P2,具体仿真图可以看下面


emmm,有点偏题了  但是我现在的话就是我编写的程序没法运行成功,现在就是 长按存键,led会亮,但是是密码验证出现了问题,我没法验证密码,同时亮起的led灯也无法灭掉,而且我想设计的是,密码对应的柜子灭灯,所以我设置了一个m,用它来标识第几个柜子,但是没有成功,我不会将存包时的m值,传到取包时的m值,emmm,希望有大佬能帮帮我,毕竟我第一次,觉得单片机挺有意思的,不想轻易放弃。
因为原作者只放了一个main.c,所以我也只放一个main,毕竟源文件下载还是要黑币的呢。真心求教。而且这个显示柜子是否为空后,我还想要用38译码器实现对应柜门的开关,但是这个解决不了,没法继续下去啊

  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. #define gui P2

  10. //sbit w1 = P3^3;
  11. //sbit w2 = P3^4;
  12. //sbit w3 = P3^4;
  13. sbit jingao = P3^7;  //连接蜂鸣器,报警用
  14. sbit Lock = P3^6; //可用来确定门是否关闭
  15. uchar genPasswd[8][4];           //存储生成的四位随机数密码        ,最多有8个
  16. uchar inpPasswd[4];           //存储取包时输入的四位密码
  17. uchar code welcome[8]="welcome";  //开机显示的欢迎标语
  18. uchar code set[7]="Passwd";    //显示生成的密码标题
  19. uchar code  close[12]="close door!";   //提示关门
  20. uchar code         input[13] = "input passwd";   //提示请输入密码
  21. uchar code  full[6] = "Full!";

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





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


  46. /************************************
  47. 显示密码生成界面
  48. ************************************/

  49. /************************************
  50. 显示请关门界面
  51. ************************************/

  52. void display3()
  53. {
  54.      unsigned char i;
  55.    for(i = 0;i < 11;i++)
  56.    {
  57.                    wr_com(0x83+i);
  58.                 wr_dat(close[i]);
  59.    }

  60. }


  61. /************************************
  62. 显示密码输入界面
  63. ************************************/
  64. void display4()
  65. {
  66.    unsigned char i;
  67.    for(i = 0;i < 12;i++)
  68.    {
  69.                    wr_com(0x82+i);
  70.                 wr_dat(input[i]);
  71.    }
  72.    for(i = 0;i < 4;i++)
  73.    {
  74.                    wr_com(0xc6+i);
  75.                 wr_dat(inpPasswd[i]+0x30);
  76.                
  77.    }

  78. }
  79.         
  80. /************************************
  81. 显示柜已满
  82. ************************************/

  83. void display5()
  84. {
  85.      unsigned char i;
  86.    for(i = 0;i < 5;i++)
  87.    {
  88.                    wr_com(0x83+i);
  89.                 wr_dat(full[i]);
  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. uchar panmen = 0;
  112. void main()
  113. {  
  114.    
  115.    uchar i;
  116.    uchar j;
  117.    uchar k;
  118.   
  119.    uchar passwd;
  120.    
  121.            uchar key_value = 0;
  122.         uchar temp_key_value = 0xff;
  123.         gui = 0;
  124.         Lock = 1;  //刚上电 锁是需要保持闭合
  125.         Timer0_init();        //定时器初始化
  126.          lcd_init();        //LCD1602初始化
  127.    
  128.         while(1)        //进入不断循环
  129.         {
  130.          uchar   m ;//用来标记存在第几个柜子
  131.                    temp_key_value = Calkey_scan();          //读取矩阵按键的键值
  132.                 if(temp_key_value != 0xff)
  133.                 {
  134.                         key_value = temp_key_value;
  135.                 }
  136.                 switch(global_state)
  137.                 {
  138.                         case 0:         //初始化状态
  139.                                 display1();         //显示欢迎语句        -- "welcome"
  140.                                 delay(1900);
  141.                                 clear()  ;
  142.                                  
  143.                                 if(key_value == 13)  //存包按键被按下
  144.                                 {
  145.                                     key_value = 0xff;  //将按键值清除
  146.                                 switch (gui)                                                                                                
  147.                         
  148.                 {
  149.                                         case 0:
  150.                                         case 2:
  151.                                         case 4:
  152.                                         case 8:
  153.                                         case 16:
  154.                                         case 32:
  155.                                         case 64:
  156.                                         case 128:
  157.                                         case 130:
  158.                                         case 132:
  159.                                         case 136:
  160.                                         case 144:
  161.                                         case 160:
  162.                                         case 192:
  163.                                         case 194:
  164.                                         case 196:
  165.                                         case 200:
  166.                                         case 208:
  167.                                         case 224:
  168.                                         case 226:
  169.                                         case 228:
  170.                                         case 232:
  171.                                         case 240:
  172.                                         case 242:
  173.                                         case 244:
  174.                                         case 248:
  175.                                         case 250:
  176.                                         case 252:
  177.                                         case 254:
  178.                     gui = gui + 1;
  179.                      m = 0;
  180.                
  181.                     display3(); //显示关门提示语        -- "close door!"
  182.                                break;

  183.                case 1:
  184.                            case 5:
  185.                            case 9:
  186.                            case 17:
  187.                            case 33:
  188.                            case 65:
  189.                            case 129:
  190.                            case 133:
  191.                            case 137:
  192.                            case 145:
  193.                            case 161:
  194.                            case 193:
  195.                            case 197:
  196.                            case 201:
  197.                            case 209:
  198.                            case 225:
  199.                            case 229:
  200.                            case 233:
  201.                            case 241:
  202.                            case 245:
  203.                            case  249:
  204.                            case 253:
  205.                     gui = gui + 2;
  206.                      m = 1;
  207.                     
  208.                     display3();
  209.                 break;

  210.                 case 3:
  211.                                 case 11:
  212.                                 case 19:
  213.                                 case 35:
  214.                                 case 67:
  215.                                 case 131:
  216.                                 case 139:
  217.                                 case 147:
  218.                                 case 163:
  219.                                 case 195:
  220.                                 case 203:
  221.                                 case 211:
  222.                                 case 227:
  223.                                 case 235:
  224.                                 case 243:
  225.                                 case 251:
  226.                                 
  227.                     gui = gui + 4;
  228.                      m = 2;
  229.                     
  230.                     display3();
  231.                      break;
  232.                           case 23:
  233.                           case 39:
  234.                           case 71:
  235.                           case 135:
  236.                           case 55:
  237.                           case 87:
  238.                           case 151:
  239.                           case 119:
  240.                           case 215:
  241.                           case 247:
  242.               case 7:
  243.                     gui = gui + 8;
  244.                     m = 3;
  245.                   
  246.                     display3();
  247.                 break;

  248.                                 case 207:
  249.                                 case 239:
  250.                                 case 143:
  251.                                 case 79:
  252.                                 case 47:
  253.                 case 15:
  254.                     gui = gui + 16;
  255.                     m = 4;
  256.                   
  257.                     display3();
  258.                 break;

  259.                                 case 223:
  260.                                 case 159:
  261.                                 case 95:
  262.                 case 31:
  263.                     gui = gui + 32;
  264.                      m = 5;
  265.                   
  266.                     display3();
  267.                 break;
  268.                                 case  63:
  269.                 case  191:
  270.                     gui = gui + 64;
  271.                     m = 6;
  272.                   
  273.                     display3();
  274.                 break;

  275.                                 case 127:
  276.                     gui = gui + 128;
  277.                      m = 7;
  278.                     
  279.                     display3();
  280.                 break;

  281.                 case 255:
  282.                
  283.                     display5();
  284.                     delay(1900);
  285.                     clear();
  286.                                   }

  287.                                 k=m;
  288.                 delay(1900);   //等待关门 大约5秒
  289.                 if (Lock != 1) //未闭合柜门,报警
  290.                 {
  291.                     jingao = 1;
  292.                     delay(1900);
  293.                     jingao = 0;
  294.                 }
  295.                                        
  296.                                         clear();                 //清屏,准备下一屏的显示
  297.                                         global_state = 1;   //切换运行状态
  298.                                         passwd = TL0;  //采用定时器寄存器的值作为密码
  299.                                         genPasswd[m][0] = passwd/100;                  //存储密码
  300.                                         genPasswd[m][1] = passwd%100/10;
  301.                                         genPasswd[m][2] = passwd%10;
  302.                                         genPasswd[m][3] = (genPasswd[m][1]+genPasswd[m][2])%10;
  303.                                 }
  304.                                 if(key_value == 14)  //取包按键被按下
  305.                                 {
  306.                                     key_value = 0xff;  //将按键值清除
  307.                                         clear();    //清屏,准备下一屏的显示
  308.                                         global_state = 2;  //切换运行状态
  309.                                         count_num = 0;   //清除数字按键变量
  310.                                         for(i = 0;i < 4;i++)  //清空输入的密码数组
  311.                                             inpPasswd[i] = ' '-0x30;
  312.                                 }
  313.                         break;
  314.                         case 1:                //密码生成状态
  315.                                    
  316.              for (i = 0; i < 6; i++)
  317.             {
  318.             wr_com(0x85 + i);
  319.              wr_dat(set[i]);
  320.              }
  321.            for (i = 0; i < 4; i++)
  322.            {
  323.             wr_com(0xc6 + i);
  324.             wr_dat(genPasswd[m][i] + 0x30);
  325.            }

  326.                                 delay(1900);    //等待大约3秒
  327.                                 global_state = 0;  //返回到初始界面
  328.                                 clear();        //清屏,准备下一屏的显示
  329.                                 
  330.                         break;
  331.                         case 2:          //输入密码状态
  332.                            display4();           //显示输入密码界面
  333.                            if((key_value >= 0) && (key_value <= 9))          //如果按下的为0-9的数字按键
  334.                            {
  335.                               
  336.                                 if(count_num <= 3)         //如果按键次数小于4次
  337.                                         {
  338.                                         inpPasswd[count_num] = key_value; //将按键值存入数组,并显示
  339.                                                    count_num++;
  340.                                     }
  341.                                          key_value = 0xff;  //将按键值清除
  342.                            }
  343.                            if(key_value == 15) //清除按键被按下
  344.                            {
  345.                                 key_value = 0xff;  //将按键值清除
  346.                                            for(i = 0;i < 4;i++)
  347.                                           inpPasswd[i] = ' '-0x30;  //清除刚刚输入的密码
  348.                            }
  349.                            if(key_value == 16) //确认按键被按下
  350.                            {
  351.                                 key_value = 0xff;  //将按键值清除
  352.                                         for(j=0;j<8;j++)
  353.                                         {
  354.                                            for(i = 0;i < 4;i++)
  355.                                         {
  356.                                                 if(inpPasswd[i] != genPasswd[j][i])
  357.                                                    break;
  358.                                         }
  359.                                         }
  360.                                         if(i == 4)          //密码输入正确
  361.                                         {
  362.                                                 switch (j)
  363.                     {
  364.                     case 1:
  365.                         gui = gui - 1;
  366.                        
  367.                         display3();
  368.                         break;

  369.                     case 2:
  370.                         gui = gui - 2;
  371.                        
  372.                         display3();
  373.                         break;

  374.                     case 3:
  375.                         gui = gui - 4;
  376.                         
  377.                         display3();
  378.                         break;

  379.                     case 4:
  380.                         gui = gui - 8;
  381.                         
  382.                         display3();
  383.                         break;

  384.                     case 5:
  385.                         gui = gui - 16;
  386.                         
  387.                         display3();
  388.                         break;

  389.                     case 6:
  390.                         gui = gui - 32;
  391.                        
  392.                         display3();
  393.                         break;

  394.                     case 7:
  395.                         gui = gui - 64;
  396.                        
  397.                         display3();
  398.                         break;

  399.                     case 8:
  400.                         gui = gui - 128;
  401.                         
  402.                         display3();
  403.                         break;
  404.                     }
  405.                                         }
  406.                                         else   //密码输入错误
  407.                                         {
  408.                                                 delay(700);
  409.                                                 jingao = 1;
  410.                                                 delay(1900);   
  411.                                                 jingao = 0;  
  412.                                         }
  413.                                         clear();           //清屏,准备下一屏的显示
  414.                                         global_state = 0;  //返回到初始界面

  415.                            }
  416.                         break;        
  417.                 }
  418.         }
  419. }

  420. void T0_interrupt(void) interrupt 1         
  421. {
  422.         TH0 += TH0_temp;
  423.         TL0 += TL0_temp;

  424. }



  425.         




复制代码

http://www.51hei.com/bbs/dpj-77180-1.html这个网址是原帖



作者: 祈樹    时间: 2020-4-1 18:41
http://www.51hei.com/bbs/dpj-77180-1.html

这是原帖
作者: man1234567    时间: 2020-4-2 14:02
“因为原作者只放了一个main.c,所以我也只放一个main,.......”看来问题就出在这里啊
人家是有染坊后给你点颜色,你是只有点颜色就想开染坊。
作者: 祈樹    时间: 2020-4-3 00:36
man1234567 发表于 2020-4-2 14:02
“因为原作者只放了一个main.c,所以我也只放一个main,.......”看来问题就出在这里啊
人家是有染 ...

没有的  他的下载链接里又全部的,但是他只免费了main。c   我如果全放出来那不就是坑他吗




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1