久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2128|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 二区久久 | 日日天天| 精品九九九 | 一区二区三区精品视频 | a a毛片| 电影91久久久 | 麻豆精品国产91久久久久久 | 日韩中文字幕在线视频观看 | 九色网址| 一区二区三区免费观看 | 日韩高清国产一区在线 | 亚洲天天 | 欧美性久久久 | 一级在线观看 | 亚洲日韩中文字幕一区 | 伊人成人免费视频 | 国产在线精品一区二区 | 国产乱码精品一区二区三区忘忧草 | 欧美激情一区二区三级高清视频 | 成年人黄色一级片 | av手机在线看 | 一区二区免费视频 | 99成人精品 | 色婷婷一区二区三区四区 | 在线观看免费av网站 | 日韩欧美成人一区二区三区 | 成人一区二区三区 | 999热精品| 国产精品毛片久久久久久久 | av资源在线看 | 国产欧美在线一区二区 | 99视频在线播放 | 久久久久久国产一区二区三区 | 国产精品久久久久久久久久久新郎 | 视频一区二区三区中文字幕 | 亚洲成人免费视频在线 | 精品国产黄色片 | 国产在线精品一区二区三区 | 欧洲一区视频 | 一级毛片网 | 99视频在线看 |