找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1815|回复: 0
收起左侧

单片机矩阵键盘控制步进电机到达设定步距角 程序有问题 求帮助

[复制链接]
ID:507486 发表于 2021-4-8 20:32 | 显示全部楼层 |阅读模式
  1. #include <reg52.h>         
  2. #include <intrins.h>

  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. uchar display_digit[]={0,0,0};

  6. uchar code run[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};//A→AB→B→BC→C→CD→D→DA→A
  7. uchar  disbuf[4]={0,0,0,0};

  8. uchar code LED_0F[] =
  9. {
  10.         0x3f,0x06,0x5b,0x4f,0x66,0x6d, 0x7d,0x07,0x7f,0x6f,0x63
  11. };
  12. unsigned char K_Value=0;
  13. unsigned int key_temp1=0;
  14. unsigned int jiaodu=0;
  15. uchar num1=0,num2=0,num3=0,num4=0,leiji=0;
  16. sbit DIO = P0^1;                                //串行数据输入
  17. sbit RCLK = P0^2;                        //时钟脉冲信号——上升沿有效
  18. sbit SCLK = P0^0;                                //打入信号————上升沿有效
  19. bit Flag = 0;
  20. // 全局变量
  21. uchar LED[8];                //用于LED的8位显示缓存
  22. void delay(uint time)         
  23. {
  24.     uint x,y;                        
  25.                 for(x=time;x>0;x--)
  26.                 for(y=110;y>0;y--);        
  27. }

  28. void LED_OUT(uchar X)
  29. {
  30.         uchar i;
  31.         for(i=8;i>=1;i--)
  32.         {
  33.                 if (X&0x80) DIO=1; else DIO=0;
  34.                 X<<=1;
  35.                 SCLK = 0;
  36.                 SCLK = 1;
  37.         }
  38. }

  39. /**************************************************************************************
  40. * 描  述 : LED显示函数
  41. * 入  参 : 无
  42. * 返回值 : 无
  43. **************************************************************************************/
  44. void LED8_Display (void)
  45. {
  46.         uchar  *led_table;          // 查表指针
  47.         uchar i;
  48.         //显示第1位
  49.         led_table = LED_0F + LED[0];
  50.         i = *led_table;

  51.         LED_OUT(i);                        
  52.         LED_OUT(0xfe);               

  53.         RCLK = 0;
  54.         RCLK = 1;
  55.         //显示第2位
  56.         led_table = LED_0F + LED[1];
  57.         i = *led_table;

  58.         LED_OUT(i);               
  59.         LED_OUT(0xfd);               

  60.         RCLK = 0;
  61.         RCLK = 1;
  62.         //显示第3位
  63.         led_table = LED_0F + LED[2];
  64.         i = *led_table;

  65.         LED_OUT(i);                        
  66.         LED_OUT(0xfb);        

  67.         RCLK = 0;
  68.         RCLK = 1;
  69.         //显示第4位
  70.         led_table = LED_0F + LED[3];
  71.         i = *led_table;

  72.         LED_OUT(i);                        
  73.         LED_OUT(0xf7);               

  74.         RCLK = 0;
  75.         RCLK = 1;
  76.         //显示第6位
  77.         led_table = LED_0F + LED[5];
  78.         i = *led_table;

  79.         LED_OUT(i);                        
  80.         LED_OUT(0xdf);        

  81.         RCLK = 0;
  82.         RCLK = 1;
  83.         //显示第7位
  84.         led_table = LED_0F + LED[6];
  85.         i = *led_table;

  86.         LED_OUT(i);                        
  87.         LED_OUT(0xbf);        

  88.         RCLK = 0;
  89.         RCLK = 1;
  90.         //显示第8位
  91.         led_table = LED_0F + LED[7];
  92.         i = *led_table;

  93.         LED_OUT(i);                        
  94.         LED_OUT(0x7f);        

  95.         RCLK = 0;
  96.         RCLK = 1;
  97. }


  98. void zheng()
  99. {
  100.     static uchar i=0,k;
  101.           if(Flag == 1)
  102.                 {
  103.                         if(jiaodu<key_temp1)
  104.                         {
  105.                                         while(jiaodu<key_temp1)
  106.                                         {
  107.                                                 while(i<8)
  108.                                           {
  109.                                                         P2=run[i];
  110.                                                         delay(15);//转速调节
  111.                                                         if(++k>=2)//1个脉冲转一个步距角
  112.                                                         {
  113.                                                                 k = 0;
  114.                                                                 ++jiaodu;
  115.                                                                 if(jiaodu >= key_temp1)break;
  116.                                                         }
  117.                                                         if(++i>=8)i=0;
  118.                                                 }
  119.                                  }
  120.                                   k = 0;
  121.                                   if(i>=8)i=0;
  122.                                         while(i<8)
  123.                                         {
  124.                                                 if(++i>=8)i=0;
  125.                                                 P2=run[i];
  126.                                                 delay(15);//转速调节
  127.                                                 if(++k>=2)//1个脉冲转一个步距角
  128.                                                 {
  129.                                                         k = 0;
  130.                                                         break;
  131.                                                 }
  132.                                                 
  133.                                         }
  134.            }
  135.                   else if(jiaodu > key_temp1)
  136.                         {
  137.                                         while(jiaodu > key_temp1)
  138.                                         {
  139.                                                  while(i>=0)
  140.                                                  {
  141.                                                                
  142.                                                                 P2=run[i];
  143.                                                                 delay(15);//转速调节
  144.                                                                 if(++k >= 2)//1个脉冲转一个步距角
  145.                                                                 {
  146.                                                                         k = 0;
  147.                                                                         --jiaodu;
  148.                                                                         if(jiaodu <= key_temp1)break;
  149.                                                                 }
  150.                                                                
  151.                                                                 if(i-- <= 0)i=7;
  152.                                                  }
  153.                                   }
  154.                                   k = 0;
  155.                                   if(i < 0)i = 7;
  156.                                         while(i < 8)
  157.                                         {
  158.                                                 if(i-- <= 0)i=7;
  159.                                                 P2=run[i];
  160.                                                 delay(15);//转速调节
  161.                                                 if(++k>=2)//1个脉冲转一个步距角
  162.                                                 {
  163.                                                         k = 0;
  164.                                                         break;
  165.                                                 }
  166.                                                 
  167.                                         }
  168.            }
  169.             leiji=0;num2=0;num3=0;num4=0;
  170.                         Flag = 0;
  171.           }
  172. }

  173. void Init_Timer0(void)
  174. {
  175.         TMOD &= 0xF0;                //设置定时器模式
  176.         TMOD |= 0x01;                //设置定时器模式
  177.         TL0 = 0x30;                //设置定时初值
  178.         TH0 = 0xF8;                //设置定时初值
  179.         TF0 = 0;                //清除TF0标志
  180.         TR0 = 1;                //定时器0开始计时
  181.   ET0=1;           //定时器中断打开
  182.   EA=1;            //总中断打开
  183. }

  184. /******按键值处理函数********/
  185. void key(void)
  186. {
  187.                 switch(K_Value)
  188.                 {
  189.                 case 0:
  190.                 case 1:
  191.                 case 2:
  192.                 case 3:
  193.                 case 4:
  194.                 case 5:
  195.                 case 6:
  196.                 case 7:
  197.                 case 8:
  198.                 case 9:
  199.                                 num4=num3;
  200.                                 num3=num2;
  201.                                 num2=K_Value;
  202.                                 leiji++;//记录按下的次数
  203.                                 key_temp1=num4*100+num3*10+num2;
  204.                                 break;
  205.                 case 10://R
  206.                                 break;
  207.                 case 11://L
  208.                                 break;
  209.                 case 12://ENTER
  210.                         if(key_temp1)
  211.                                 Flag = 1;
  212.                                 break;
  213.                 }

  214. }
  215. void main()
  216. {
  217.     Init_Timer0();

  218.           while(1)
  219.                 {
  220.                          LED[0]=key_temp1/100%10;
  221.                          LED[1]=key_temp1/10%10;
  222.                          LED[2]=key_temp1%10;;
  223.                          LED[3]=10;
  224.                          LED[5]=jiaodu/100%10;
  225.                          LED[6]=jiaodu/10%10;
  226.                          LED[7]=jiaodu%10;
  227.                    zheng();
  228.                          if(leiji>2)//按下的次数大于3次时清零十位百位
  229.                    {leiji=0;num2=0;num3=0;num4=0;}

  230.                 }
  231. }

  232. void T0_OverFlow(void) interrupt 1 //定时器0溢出中断,2ms进入一次
  233. {
  234.                         static uint cnt = 0;
  235.             static uchar key_zt = 0;
  236.             unsigned char X,Y,Z;
  237.         
  238.                         TH0 = 0xf8; //12m  2000
  239.                         TL0 = 0x30;
  240.                         if(++cnt >= 5)
  241.             {
  242.                                   P1=0xff;
  243.                                   _nop_();_nop_();_nop_();
  244.                                   cnt = 0;
  245.                                   P1=0x0f;
  246.                             switch(key_zt)
  247.           {
  248.                                          case 0:
  249.                                                                 if(P1!=0x0f)
  250.                                                                         key_zt = 1;
  251.                                                                  else K_Value = 100;
  252.                                                  break;
  253.                                          
  254.                                          case 1:
  255.                                                     if(P1!=0x0f)
  256.                                                                 {
  257.                                                                           key_zt = 2;
  258.                                                                                 X=P1; //保存行扫描时有键按下时状态
  259.                                                                                 P1=0xf0; //列扫描
  260.                                                                                 Y=P1;    //保存列扫描时有键按下时状态
  261.                                                                                 Z=X|Y; //取出键值
  262.                                                                 /*********************************************************************/
  263.                                                                                         switch ( Z ) //判断键值(那一个键按下)
  264.                                                                                         {
  265.                                                                                                 case 0xee: K_Value=0; break; //对键值赋值
  266.                                                                                                 case 0xed: K_Value=1; break;
  267.                                                                                                 case 0xeb: K_Value=2; break;
  268.                                                                                                 case 0xe7: K_Value=3; break;
  269.                                                                                                 case 0xde: K_Value=4; break;
  270.                                                                                                 case 0xdd: K_Value=5; break;
  271.                                                                                                 case 0xdb: K_Value=6; break;
  272.                                                                                                 case 0xd7: K_Value=7; break;
  273.                                                                                                 case 0xbe: K_Value=8; break;
  274.                                                                                                 case 0xbd: K_Value=9; break;
  275.                                                                                                 case 0xbb: K_Value=10;break;
  276.                                                                                                 case 0xb7: K_Value=11;break;
  277.                                                                                                 case 0x7e: K_Value=12;break;
  278.                                                                                                 case 0x7d: K_Value=13;break;
  279.                                                                                                 case 0x7b: K_Value=14;break;
  280.                                                                                                 case 0x77: K_Value=15;break;
  281.                                                                                         }
  282.                                                                                         key();
  283.                                                                 }
  284.                                                                 else
  285.                                                                 {
  286.                                                                           K_Value = 100;
  287.                                                                           key_zt = 0;
  288.                                                                 }
  289.                                                 case 2:
  290.                                                                 if(P1 == 0x0f)
  291.                                                                         key_zt = 0;               
  292.                                                  break;
  293.                                         }
  294.                         }
  295.             LED8_Display();   //4位数码管显示:4 3 2 1
  296. }
复制代码

程序无法编译,仿真也不能运行,求大神指点: 矩阵键盘控制步进电机到达设定步距角.rar (147.17 KB, 下载次数: 5)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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