找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机的自动停车装置程序(自行车)

[复制链接]
跳转到指定楼层
楼主
ID:189311 发表于 2019-6-9 22:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
参加比赛的作品,智能停车装置,实物图片没了。只剩下程序了

单片机源程序如下:
  1. #include"key.h"
  2. #include"12864.h"
  3. #include"delay.h"
  4. #include"bjdj.h"
  5. #define uchar unsigned char
  6. #define uint unsigned int
  7. unsigned char TL0_temp;         /*暂存TL0的初值*/
  8. unsigned char TH0_temp,count;         /*暂存TH0的初值*/
  9. #define CRY_FREQUENCY 11059200 /*CRY_FREQUENCY为晶振频率,单位为Hz*/
  10. #define INT_CLOCK 100    /*INT_CLOCK为定时值,单位为ms ,此处定义为10ms*/
  11. uchar nmm[6]; //每次MCU采集到的密码输入
  12. uchar wei,key;
  13. unsigned char count1,count2,jd1,jd2;       //0.5ms次数标识
  14. uchar tcw1[6]={0,0,0,0,0,0};
  15. uchar tcw2[6]={0,0,0,0,0,0};
  16. uchar tcw3[6]={0,0,0,0,0,0};
  17. uchar tcw4[6]={0,0,0,0,0,0};
  18. uchar tcw5[6]={0,0,0,0,0,0};
  19. uchar tcw6[6]={0,0,0,0,0,0};
  20. uchar tcw[6]={0,0,0,0,0,0};
  21. bit allow,genggai,ok,wanbi,retry,close,cbw;         //各个状态位
  22. uchar global_state = 0;
  23. uchar count_num = 0;  //输入的数字个数
  24. sbit dula=P2^6;
  25. sbit pwm1=P1^1;
  26. sbit pwm2=P1^2;  
  27. sbit wela = P2^7;  //代表锁控的继电器IO   高电平关锁,低电平开锁
  28. //sbit LEDRED = P3^3;  //代表密码输入错误的红灯IO  高电平熄灭,低电平点亮
  29. //sbit LEDGREEN = P3^4;  //代表密码输入正确的绿灯IO  高电平熄灭,低电平点亮
  30. uchar genPasswd[6];           //存储生成的四位随机数密码
  31. uchar inpPasswd[6];           //存储取包时输入的四位密码

  32. void Timer0_init()                                                                                          
  33. {
  34.         unsigned long T0_temp;                                     /*暂存T0的初始值        */
  35.         T0_temp = 65536-((INT_CLOCK *CRY_FREQUENCY /1000)/12);    /*T0初始值计算公式,参考教科书*/
  36.         TL0_temp = T0_temp & 0xff;
  37.         TH0_temp = T0_temp >> 8;
  38.         TL0 = TL0_temp;
  39.         TH0 = TH0_temp;
  40.         TMOD |= 0x01;
  41.         TR0 = 1;                        /*开定时器0中断*/
  42.         ET0 = 1;  
  43.         EA = 1;                    /*开总中断*/                                       

  44. }
  45. void Time1_Init()
  46. {
  47.         TMOD |= 0x10;
  48.         ET1=1;
  49.         TH1 = 0x0FF;
  50.     TL1 = 0x0A4;
  51.         TR1=1;
  52. }


  53. void main()
  54. {

  55. uchar i,z,bl,b2;
  56.     uint passwd;
  57.     uchar tcwa,tcwb,tcwc,tcwd,tcwe,tcwf,tcwz;
  58.            uchar key_value = 0;
  59.         uchar temp_key_value = 0xff;
  60.         jd1=13;
  61.         jd2=30;
  62.         count1=0;
  63.         count2=0;
  64.         xa=0;
  65.         xb=0;
  66.         xc=0;
  67.         xd=0;
  68.         ya=0;
  69.         yb=0;
  70.         yc=0;                                                                                                               
  71.         yd=0;
  72.         Timer0_init();        //定时器初始化
  73.         Time1_Init();
  74.         lcd_init();        //LCD12864初始化
  75.         while(1)        //进入不断循环
  76.         {
  77.                 temp_key_value = Calkey_scan();          //读取矩阵按键的键值
  78.                 if(temp_key_value != 0xff)
  79.                 {
  80.                         key_value = temp_key_value;
  81.                 }

  82.                 switch(global_state)
  83.                 {
  84.                         case 0:         //初始化状态
  85.                                 display(2,1,"    欢迎使用    "); //显示欢迎语句        -- "welcome"
  86.                                 display(3,1,"自行车智能停车库");
  87.                                                 for(i = 0;i < 6;i++)
  88.                         inpPasswd[i] = ' ';  //清除刚刚输入的密码
  89.                                 if(key_value == 13)  //存包按键被按下
  90.                                 {
  91.                                     key_value = 0xff;  //将按键值清除
  92. //                                        Lock = 0;    //开锁
  93.                                         for(i=0;i<6;i++)
  94.                                         {
  95.                                                 if(tcw[i]==0) break;
  96.                                         }
  97.                                         passwd =TL0;  //采用定时器寄存器的值作为密码
  98.                                         genPasswd[0] = passwd%100/10+0X30;                  //存储密码
  99.                                         genPasswd[1] = passwd%10+0X30;
  100.                                         passwd =TL0;  //采用定时器寄存器的值作为密码
  101.                                         genPasswd[2] = passwd%100/10+0X30;
  102.                                         genPasswd[3] = passwd%10+0X30;
  103.                                         passwd =TH0;  //采用定时器寄存器的值作为密码
  104.                                         genPasswd[4] = passwd%100/10+0X30;
  105.                                         genPasswd[5] =  passwd%10+0X30;
  106.                                         write_com(0x01);
  107.                                         delay_ms(5);
  108.                                         switch(i)
  109.                                         {
  110.                                                 case 0: for(z=0;z<6;z++)
  111.                                                                 {
  112.                                                                         tcw1[z]=genPasswd[z];
  113.                                                                 }
  114.                                                                 tcw[i]=1+0x30;
  115.                                                                         global_state = 1;   //切换运行状态
  116.                                                                 bl=1;
  117.                                                                 break;
  118.                                                 case 1: for(z=0;z<6;z++)
  119.                                                                 {
  120.                                                                         tcw2[z]=genPasswd[z];
  121.                                                                 }
  122.                                                                 tcw[i]=1+0x30;
  123.                                                                         global_state = 1;   //切换运行状态
  124.                                                                 bl=2;
  125.                                                                 break;
  126.                                                 case 2: for(z=0;z<6;z++)
  127.                                                                 {
  128.                                                                         tcw3[z]=genPasswd[z];
  129.                                                                 }
  130.                                                                 tcw[i]=1+0x30;
  131.                                                                         global_state = 1;   //切换运行状态
  132.                                                                 bl=3;
  133.                                                                 break;
  134.                                                 case 3: for(z=0;z<6;z++)
  135.                                                                 {
  136.                                                                         tcw4[z]=genPasswd[z];
  137.                                                                 }
  138.                                                                 tcw[i]=1+0x30;
  139.                                                                         global_state = 1;   //切换运行状态
  140.                                                                 bl=4;
  141.                                                                 break;
  142.                                                 case 4: for(z=0;z<6;z++)
  143.                                                                 {
  144.                                                                         tcw5[z]=genPasswd[z];
  145.                                                                 }
  146.                                                                 tcw[i]=1+0x30;
  147.                                                                         global_state = 1;   //切换运行状态
  148.                                                                 bl=5;
  149.                                                                 break;
  150.                                                 case 5: for(z=0;z<6;z++)
  151.                                                                 {
  152.                                                                         tcw6[z]=genPasswd[z];
  153.                                                                 }
  154.                                                                 tcw[i]=1+0x30;
  155.                                                                         global_state = 1;   //切换运行状态
  156.                                                                 bl=6;
  157.                                                                 break;
  158.                                                 case 6: display(2,3,"车位已满");
  159.                                                                 global_state = 0;
  160.                                                                 delay_ms(1900);
  161.                                                                 break;
  162.                                         }
  163.                                         //display(1,1,"正在停车");   //显示关门提示语        -- "正在停车"
  164.                                     //delay_ms(1900);    //等待关门 大约3秒
  165. //                                        Lock = 1;   //关门
  166.                                
  167.                                 }
  168.                                 if(key_value == 14)  //取包按键被按下
  169.                                 {
  170.                                     key_value = 0xff;  //将按键值清除
  171.                                         global_state = 2;  //切换运行状态
  172.                                         count_num = 0;   //清除数字按键变量
  173.                                         write_com(0x01);
  174.                                         delay_ms(5);
  175.                                         display(2,2,"请输入密码");  //显示输入密码界面
  176.                                         //display(2,1,"          ");
  177.                                         for(i = 0;i < 6;i++)  //清空输入的密码数组
  178.                                             inpPasswd[i] = ' ';
  179.                                 }
  180.                         break;
  181.                         case 1:                //密码生成状态
  182.                                    write_com(0x01);
  183.                                 delay_ms(5);
  184.                                 display(2,2,"请牢记密码");         //显示密码生成界面Passwd
  185.                                 display(3,3,genPasswd);
  186.                                 switch(bl)
  187.                                 {
  188.                                         case 3:         jd1=10;
  189.                                                         jd2=33;
  190.                                                         zuobiaojy(140);
  191.                                                    gaodu2(35);
  192.                                                         zuobiaox(92);
  193.                                                         gaodu1(35);
  194.                                                         jd1=21;
  195.                                                         jd2=22;
  196.                                                         gaodu2(35);
  197.                                                         zuobiaojx(92);
  198.                                                         jd1=13;
  199.                                                         jd2=30;
  200.                                                         gaodu1(35);
  201.                                                         zuobiaoy(142);         
  202.                                         break;
  203.                                         case 4: jd1=10;
  204.                                                         jd2=33;
  205.                                                         zuobiaojy(132);
  206.                                                         gaodu2(35);
  207.                                                         zuobiaojx(88);
  208.                                                         gaodu1(35);
  209.                                                         jd1=21;
  210.                                                         jd2=22;
  211.                                                         gaodu2(35);         
  212.                                                         zuobiaox(88);
  213.                                                         jd1=13;
  214.                                                         jd2=30;
  215.                                                         gaodu1(35);
  216.                                                         zuobiaoy(132);
  217.                                                         break;
  218.                                         case 1: jd1=10;
  219.                                                         jd2=33;
  220.                                                         zuobiaojy(137);
  221.                                                    gaodu2(150);
  222.                                                         zuobiaox(95);
  223.                                                         gaodu1(27);
  224.                                                         jd1=21;
  225.                                                         jd2=22;
  226.                                                         gaodu2(27);
  227.                                                         zuobiaojx(95);
  228.                                                         jd1=13;
  229.                                                         jd2=30;
  230.                                                         gaodu1(150);
  231.                                                         zuobiaoy(190);
  232.                                                          break;
  233.                                         case 2:  jd1=10;
  234.                                                         jd2=33;
  235.                                                         zuobiaojy(125);
  236.                                                         gaodu2(148);
  237.                                                         zuobiaojx(93);
  238.                                                         gaodu1(23);
  239.                                                         jd1=21;
  240.                                                         jd2=22;
  241.                                                         gaodu2(23);         
  242.                                                         zuobiaox(93);
  243.                                                         jd1=13;
  244.                                                         jd2=30;
  245.                                                         gaodu1(148);
  246.                                                         zuobiaoy(180);
  247.                                                         break;
  248.                                         case 5:  jd1=10;

  249.                                                         jd2=33;
  250.                                                         zuobiaojy(394);
  251.                                                         gaodu2(148);
  252.                                                         zuobiaojx(88);
  253.                                                         gaodu1(23);
  254.                                                         jd1=21;
  255.                                                         jd2=22;
  256.                                                         gaodu2(23);         
  257.                                                         zuobiaox(88);
  258.                                                         jd1=13;
  259.                                                         jd2=30;
  260.                                                         gaodu1(148);
  261.                                                         zuobiaoy(394);
  262.                                                         break;
  263.                                         case 6:   jd1=10;
  264.                                                         jd2=33;
  265.                                                         zuobiaojy(394);
  266.                                                         gaodu2(148);
  267.                                                         zuobiaojx(88);
  268.                                                         gaodu1(23);
  269.                                                         jd1=21;
  270.                                                         jd2=22;
  271.                                                         gaodu2(23);         
  272.                                                         zuobiaox(88);
  273.                                                         jd1=13;
  274.                                                         jd2=30;
  275.                                                         gaodu1(148);
  276.                                                         zuobiaoy(394);
  277.                                                         break;
  278.                                 }
  279.                                 bl=0;
  280.                                 write_com(0x01);
  281.                                 delay_ms(5);
  282.                                 global_state = 0;  //返回到初始界面
  283.                                
  284.                         break;
  285.                         case 2:          //输入密码状态
  286.                           
  287.                           display(3,3,inpPasswd);           //显示输入密码界面
  288.                            if((key_value >= 0) && (key_value <= 9))          //如果按下的为0-9的数字按键
  289.                            {
  290.                                
  291.                                 if(count_num <= 5)         //如果按键次数小于6次
  292.                                         {
  293.                                         inpPasswd[count_num] = key_value+0X30; //将按键值存入数组,并显示
  294.                                                    count_num++;
  295.                                     }
  296.                                          key_value = 0xff;  //将按键值清除
  297.                            }
  298.                            if(key_value == 15) //清除按键被按下
  299.                            {
  300.                                 key_value = 0xff;  //将按键值清除
  301.                                    count_num=0;
  302.                                            for(i = 0;i < 6;i++)
  303.                                           inpPasswd[i] = ' ';  //清除刚刚输入的密码
  304.                            }
  305.                            if(key_value == 16) //确认按键被按下
  306.                            {
  307.                                 key_value = 0xff;  //将按键值清除
  308.                                     for(tcwa = 0;tcwa < 6;tcwa++)                        //判断密码是否正确,判断车辆位置
  309.                                         {
  310.                                                 if(tcw1[tcwa] != inpPasswd[tcwa])
  311.                                                         break;
  312.                                         }
  313.                                         for(tcwb = 0;tcwb < 6;tcwb++)
  314.                                         {
  315.                                                 if(tcw2[tcwb] != inpPasswd[tcwb])
  316.                                                         break;
  317.                                         }
  318.                                         for(tcwc = 0;tcwc < 6;tcwc++)
  319.                                         {
  320.                                                 if(tcw3[tcwc] != inpPasswd[tcwc])
  321.                                                         break;
  322.                                         }
  323.                                         for(tcwd = 0;tcwd < 6;tcwd++)
  324.                                         {
  325.                                                 if(tcw4[tcwd] != inpPasswd[tcwd])
  326.                                                         break;
  327.                                         }
  328.                                         for(tcwe = 0;tcwe < 6;tcwe++)
  329.                                         {
  330.                                                 if(tcw5[tcwe] != inpPasswd[tcwe])
  331.                                                         break;
  332.                                         }
  333.                                         for(tcwf = 0;tcwf < 6;tcwf++)
  334.                                         {
  335.                                                 if(tcw6[tcwf] != inpPasswd[tcwf])
  336.                                                         break;
  337.                                         }
  338.                                         write_com(0x01);
  339.                                         delay_ms(5);
  340.                                         if(tcwa==6)
  341.                                         {
  342.                                                 tcwz=1;
  343.                                                 tcw[1]=0;
  344.                                                 display(2,1,"一号车位已出车  ");
  345.                                                 b2=1;
  346.                                         }
  347.                                         if(tcwb==6)
  348.                                         {
  349.                                                 tcwz=2;
  350.                                                 tcw[2]=0;
  351.                                                 display(2,1,"二号车位已出车  ");
  352.                                                 b2=2;
  353.                                         }
  354.                                         if(tcwc==6)
  355.                                         {
  356.                                                 tcwz=3;
  357.                                                 tcw[3]=0;
  358.                                                 display(2,1,"三号车位已出车  ");
  359.                                                 b2=3;
  360.                                         }                                               
  361.                                         if(tcwd==6)
  362.                                         {
  363.                                                 tcwz=4;
  364.                                                 tcw[4]=0;
  365.                                                 display(2,1,"四号车位已出车  ");
  366.                                                 b2=4;
  367.                                         }
  368.                                         if(tcwe==6)
  369.                                         {
  370.                                                 tcwz=5;
  371.                                                 tcw[5]=0;
  372.                                                 display(2,1,"五号车位已出车  ");
  373.                                                 b2=5;
  374.                                         }
  375.                                         if(tcwf==6)
  376.                                         {
  377.                                                 tcwz=6;
  378.                                                 tcw[6]=0;
  379.                                                 display(2,1,"六号车位已出车  ");
  380.                                                 b2=6;
  381.                                         }
  382.                                         if(tcwz==0)
  383.                                         {
  384.                                                 display(2,3,"密码错误");
  385.                                                 delay_ms(2000);
  386.                                         }
  387.                                         switch(b2)
  388.                                 {
  389.                                         case 3:       
  390.                                                         zuobiaojy(140);
  391.                                                    gaodu2(35);
  392.                                                    jd1=21;
  393.                                                         jd2=22;
  394.                                                         zuobiaox(92);
  395.                                                         gaodu1(35);
  396.                                                          jd1=10;
  397.                                                         jd2=33;
  398.                                                        
  399.                                                         gaodu2(35);
  400.                                                         zuobiaojx(92);
  401.                                                        
  402.                                                         gaodu1(35);
  403.                                                         zuobiaoy(142);
  404.                                                         jd1=13;
  405.                                                         jd2=30;         
  406.                                         break;
  407.                                         case 4:
  408.                                                         zuobiaojy(132);
  409.                                                         gaodu2(35);
  410.                                                         jd1=21;
  411.                                                         jd2=22;
  412.                                                         zuobiaojx(88);
  413.                                                         gaodu1(35);
  414.                                                         jd1=10;
  415.                                                         jd2=33;
  416.                                                         gaodu2(35);         
  417.                                                         zuobiaox(88);
  418.                                                         gaodu1(35);
  419.                                                         zuobiaoy(132);
  420.                                                         jd1=13;
  421.                                                         jd2=30;
  422.                                                         break;
  423.                                         case 1: zuobiaojy(137);
  424.                                                    gaodu2(150);
  425.                                                         jd1=21;
  426.                                                         jd2=22;
  427.                                                         zuobiaox(95);
  428.                                                         gaodu1(27);
  429.                                                         jd1=10;
  430.                                                         jd2=33;
  431.                                                         gaodu2(27);
  432.                                                         zuobiaojx(95);
  433.                                                         gaodu1(150);
  434.                                                         zuobiaoy(190);
  435.                                                         jd1=13;
  436.                                                         jd2=30;
  437.                                                          break;
  438.                                         case 2:
  439.                                                         zuobiaojy(125);
  440.                                                         gaodu2(148);
  441.                                                          jd1=21;
  442.                                                         jd2=22;
  443.                                                         zuobiaojx(93);
  444.                                                         gaodu1(23);
  445.                                                         jd1=10;
  446.                                                         jd2=33;
  447.                                                         gaodu2(23);         
  448.                                                         zuobiaox(93);
  449.                                                         gaodu1(148);
  450.                                                         zuobiaoy(180);
  451.                                                         jd1=13;
  452.                                                         jd2=30;
  453.                                                         break;
  454.                                         case 5:
  455.                                                         zuobiaojy(394);
  456.                                                         gaodu2(148);
  457.                                                         jd1=21;
  458.                                                         jd2=22;
  459.                                                         zuobiaojx(88);
  460.                                                         gaodu1(23);
  461.                                                          jd1=10;
  462.                                                         jd2=33;
  463.                                                        
  464.                                                         gaodu2(23);         
  465.                                                         zuobiaox(88);
  466.                                                
  467.                                                         gaodu1(148);
  468.                                                         zuobiaoy(394);
  469.                                                                 jd1=13;
  470.                                                         jd2=30;
  471.                                                         break;
  472.                                         case 6:
  473.                                                         zuobiaojy(394);
  474.                                                         gaodu2(148);
  475.                                                                 jd1=21;
  476.                                                         jd2=22;
  477.                                                         zuobiaojx(88);
  478.                                                         gaodu1(23);
  479.                                                           jd1=10;
  480.                                                         jd2=33;
  481.                                                
  482.                                                         gaodu2(23);         
  483.                                                         zuobiaox(88);
  484.                                                        
  485.                                                         gaodu1(148);
  486.                                                         zuobiaoy(394);
  487.                                                         jd1=13;
  488.                                                         jd2=30;
  489.                                                         break;
  490.                                 }
  491.                                 b2=0;
  492.                                         global_state = 0;  //返回到初始界面
  493.                                         write_com(0x01);
  494.                                         delay_ms(5);
  495.                            }
  496.                           
  497.                         break;       
  498.                 }
  499.         }
  500. }
  501. void T0_interrupt(void) interrupt 1         
  502. {
  503.         TH0 += TH0_temp;
  504.         TL0 += TL0_temp;
  505. }
  506. void Time1_Int()interrupt 3
  507. {
  508.           TH1 = 0x0FF;
  509.     TL1 = 0x0A4;
  510.         if(count1<jd1)
  511.                 pwm1=1;
  512.         else
  513.                 pwm1=0;
  514.         if(count2<jd2)
  515.                 pwm2=1;
  516.         else
  517.                 pwm2=0;
  518.         count1=(count1+1);
  519.         count1=count1%200;                   //对40取余是为了保持20ms周期
  520.                 count2=(count2+1);
  521.         count2=count2%200;                   //对40取余是为了保持20ms周期
  522. }
复制代码

所有程序51hei提供下载:
智能停车.zip (105.14 KB, 下载次数: 7)


评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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