找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2133|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

大佬們幫忙看一下,為什么這個單片機循跡程序初始運動狀態(tài)不能隨著檢測的燈而更改

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:327115 發(fā)表于 2018-10-24 19:03 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
就是如果它一開始檢測到的數(shù)據(jù)讓他轉(zhuǎn)彎他就會一直轉(zhuǎn)彎,不會根據(jù)接下來的檢測而做出相關(guān)的反應(yīng)

單片機源程序如下:
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit DIRl=P1^0; //方向信號
  5. sbit PUIl=P1^1; //脈沖信號
  6. sbit DIRr=P1^2;
  7. sbit PUIr=P1^3;

  8. uchar temp,signal;


  9. void Timer0Init()
  10. {
  11.         TMOD|=0X01;//選擇為定時器0模式,工作方式1,僅用TR0打開啟動。

  12.          TH0=0XFF;        //給定時器賦初值,定時0.2ms
  13.      TL0=0X38;
  14.         ET0=1;//打開定時器0中斷允許
  15.         EA=1;//打開總中斷
  16.         TR0=1;//打開定時器                       
  17. }

  18. void Timer1Init()
  19. {
  20.         TMOD|=0X10;//選擇為定時器1模式,工作方式1,僅用TR1打開啟動。
  21.         TH1=0XFF;        //給定時器賦初值,定時0.2ms
  22.         TL1=0X38;      
  23.         ET1=1;//打開定時器1中斷允許
  24.         EA=1;//打開總中斷
  25.         TR1=1;//打開定時器                       
  26. }

  27. void main()
  28. {
  29.      temp=P0;
  30.          signal=temp&0xff;
  31.          
  32.      DIRl=0;
  33.      DIRr=1;//電機正轉(zhuǎn)
  34.          Timer0Init();  //定時器0初始化
  35.          Timer1Init();  //定時器1初始化
  36.          while(1);
  37.          
  38.             
  39. }

  40. void timer0() interrupt 1
  41. {
  42.       
  43.         if(signal==0X87)//10000111
  44.                 {TH0=0XFF;        //給定時器賦初值,定時0.22ms
  45.              TL0=0X24;
  46.             }
  47.         if(signal==0X3F)//11100001         
  48.         {TH0=0XFF;        //給定時器賦初值,定時0.18ms
  49.          TL0=0X4C;
  50.         }
  51.         //******************
  52.         if(signal==0X0F)//00001111
  53.      {
  54.             TH0=0XFF;        //給定時器賦初值,定時0.25ms
  55.            TL0=0X06;
  56.           }
  57.         if(signal==0XF0)//11110000         
  58.         {
  59.         TH0=0XFF;        //給定時器賦初值,定時0.15ms
  60.           TL0=0X6A;  
  61.         }
  62.         //******************
  63.         if(signal==0XFC)//11111100
  64.                 {TH0=0XFF;        //給定時器賦初值,定時0.1ms
  65.              TL0=0X9C;
  66.             }
  67.         if(signal==0X3F)//00111111         
  68.         {TH0=0XFE;        //給定時器賦初值,定時0.3ms
  69.          TL0=0XD4;
  70.         }
  71.         //*****

  72.         if(signal==0X1F)//00011111         
  73.         {
  74.           TH0=0XFF;        //給定時器賦初值,定時0.25ms
  75.           TL0=0X06;
  76.         }
  77.         if(signal==0XF8)//11111000         
  78.         {
  79.           TH0=0XFF;        //給定時器賦初值,定時0.15ms
  80.           TL0=0X6A;
  81.         }
  82.         //********

  83.          if(signal==0x3c)
  84.           {
  85.               TH0=0XFF;        //給定時器賦初值,定時0.2ms,直走
  86.              TL0=0X38;
  87.            }
  88.     PUIl=~PUIl;

  89.    }
  90. //**********************************************************
  91. void Timer1() interrupt 3
  92. {
  93.         if(signal==0X87)//10000111
  94.         {TH1=0XFF;        //給定時器賦初值,定時0.18ms
  95.          TL1=0X4C;
  96.         }
  97.         if(signal==0X3F)//11100001         
  98.         {TH1=0XFF;        //給定時器賦初值,定時0.22ms
  99.          TL1=0X24;
  100.         }
  101.         //********           左邊4個燈亮 ******************
  102.         if(signal==0X0F)//00001111         
  103.         {
  104.           TH1=0XFF;        //給定時器賦初值,定時0.15ms
  105.           TL1=0X6A;
  106.         }
  107.         if(signal==0XF0)//11110000         
  108.         {
  109.           TH1=0XFF;        //給定時器賦初值,定時0.25ms
  110.           TL1=0X06;
  111.         }
  112.         //***********  最左邊3個燈亮 *******************
  113.         if(signal==0X1F)//00011111         
  114.         {
  115.           TH1=0XFF;        //給定時器賦初值,定時0.15ms
  116.           TL1=0X6A;
  117.         }
  118.         if(signal==0XF8)//11111000         
  119.         {
  120.           TH1=0XFF;        //給定時器賦初值,定時0.25ms
  121.           TL1=0X06;
  122.         }
  123.         //*********** 最左邊2個燈亮************************
  124.         if(signal==0X3F)//00111111
  125.         {TH1=0XFF;        //給定時器賦初值,定時0.1ms
  126.          TL1=0X9C;
  127.         }
  128.         if(signal==0XFC)//11111100
  129.         {   TH1=0XFE;        //給定時器賦初值,定時0.3ms
  130.             TL1=0XD4;
  131.          }
  132.          //*******

  133.          if(signal==0x3c)
  134.           {
  135.               TH1=0XFF;        //給定時器賦初值,定時0.2ms,直走
  136.               TL1=0X38;
  137.               }
  138.     PUIr=~PUIr;         
  139.         }
復(fù)制代碼



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:164602 發(fā)表于 2018-10-25 09:08 | 只看該作者
你沒有發(fā)電路圖出來,從程序上看,只能看到兩個電機,P0接的什么傳感器?怎樣尋跡的?
我的猜想:
你的檢測數(shù)據(jù)只給了一次,所以會是現(xiàn)在的實驗結(jié)果。
在主循環(huán)前,你給了一次檢測數(shù)據(jù)
     temp=P0;
         signal=temp&0xff;
以后就再沒給數(shù)據(jù)了,所以,小車只能按第一次(也是最后一次)的數(shù)據(jù)進行運動了。
建議:在主循環(huán)中,加入檢測數(shù)據(jù)的賦值,中斷會改變小車的運動。

另外:你這種通過改變定時器定時周期的方法改變電機轉(zhuǎn)動的快慢,我還是第一次看到,它的可靠性我不知道。不過,我也學(xué)習(xí)到你的新的一種控制電機PWM方法,雖然覺得有點麻煩。
回復(fù)

使用道具 舉報

板凳
ID:415098 發(fā)表于 2018-10-25 10:53 | 只看該作者
看你的代碼中斷用了兩個定時器,考慮到用兩個中斷應(yīng)該看看是否優(yōu)先級有影響?
回復(fù)

使用道具 舉報

地板
ID:327115 發(fā)表于 2018-10-25 17:36 | 只看該作者
HC6800-ES-V2.0 發(fā)表于 2018-10-25 09:08
你沒有發(fā)電路圖出來,從程序上看,只能看到兩個電機,P0接的什么傳感器?怎樣尋跡的?
我的猜想:
你的檢 ...

這個是感應(yīng)磁場然后循跡的,直接感應(yīng)高低電平來確定小車的位置,然后根據(jù)位置進行直行或者轉(zhuǎn)彎。
我剛剛接觸沒多久這個,根據(jù)發(fā)脈沖讓步進電機轉(zhuǎn)動想到了這個,然后網(wǎng)上搜了一下pwm波控制速度的沒看明白就將就著用著,,,,這個程序就是不能改變運動狀態(tài),好像確實是只檢測了一遍,也試過了把檢測數(shù)據(jù)函數(shù)加到主函數(shù)里面,但是只能直走,后來也試過,一直開關(guān)定時器,但是也不行
回復(fù)

使用道具 舉報

5#
ID:327115 發(fā)表于 2018-10-25 17:37 | 只看該作者
HC6800-ES-V2.0 發(fā)表于 2018-10-25 09:08
你沒有發(fā)電路圖出來,從程序上看,只能看到兩個電機,P0接的什么傳感器?怎樣尋跡的?
我的猜想:
你的檢 ...

如果有更好的方法控制步進電機可以和我說一下,謝謝
回復(fù)

使用道具 舉報

6#
ID:327115 發(fā)表于 2018-10-25 21:54 | 只看該作者
HC6800-ES-V2.0 發(fā)表于 2018-10-25 09:08
你沒有發(fā)電路圖出來,從程序上看,只能看到兩個電機,P0接的什么傳感器?怎樣尋跡的?
我的猜想:
你的檢 ...

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit DIRl=P1^0; //方向信號
sbit PUIl=P1^1; //脈沖信號
sbit DIRr=P1^2;
sbit PUIr=P1^3;

uchar temp,signal,L_flag,R_flag;

//extern L_flag,R_flag;

void Timer0Init()
{
        TMOD|=0X01;//選擇為定時器0模式,工作方式1,僅用TR0打開啟動。

         TH0=0XFF;        //給定時器賦初值,定時0.2ms
     TL0=0X38;
        ET0=1;//打開定時器0中斷允許
        EA=1;//打開總中斷
        TR0=1;//打開定時器                       
}

void Timer1Init()
{
        TMOD|=0X10;//選擇為定時器1模式,工作方式1,僅用TR1打開啟動。
        TH1=0XFF;        //給定時器賦初值,定時0.2ms
        TL1=0X38;       
        ET1=1;//打開定時器1中斷允許
        EA=1;//打開總中斷
        TR1=1;//打開定時器                       
}

void main()
{
     temp=P0;
         signal=temp&0xff;
         
     DIRl=0;
     DIRr=1;//電機正轉(zhuǎn)
         Timer0Init();  //定時器0初始化
         Timer1Init();  //定時器1初始化
         while(1)
         {
           if(signal==0X87)//10000111
             {L_flag=2;R_flag=2;
                 temp=P0;
         signal=temp&0xff;
                 }
         if(signal==0X3F)//11100001
             {L_flag=2;R_flag=2;
                   temp=P0;
         signal=temp&0xff;
                 }

     if(signal==0X0F)//00001111
                 {L_flag=1;R_flag=3;
                   temp=P0;
         signal=temp&0xff;
                 }
        if(signal==0XF0)//11110000
                 {L_flag=3;R_flag=1;
                  temp=P0;
         signal=temp&0xff;
                 }

        if(signal==0X1F)//00011111
             {L_flag=1;R_flag=3;
                  temp=P0;
         signal=temp&0xff;
                 }
        if(signal==0XF8)//11111000
                 {L_flag=3;R_flag=1;
                   temp=P0;
         signal=temp&0xff;
                 }

        if(signal==0XFC)//11111100
                 {L_flag=3;R_flag=1;
                  temp=P0;
         signal=temp&0xff;
                 }
         if(signal==0X3F)//00111111
                  {L_flag=1;R_flag=3;
                 temp=P0;
         signal=temp&0xff;
                 }

         if(signal==0xC3)
         {L_flag=2;R_flag=2;
           temp=P0;
         signal=temp&0xff;
         }
         }
         
            
}

void timer0() interrupt 1
{
       
        if(L_flag==1)
                {TH0=0XFE;        //給定時器賦初值,定時0.3ms
             TL0=0XD4;
            }
        if(L_flag==2)//11100001         
        {     TH0=0XFF;        //給定時器賦初值,定時0.2ms
             TL0=0X38;
        }
        if(L_flag==3)
     {
          TH0=0XFF;        //給定時器賦初值,定時0.1ms
             TL0=0X9C;
          }
    PUIl=~PUIl;
  
   }
//**********************************************************
void Timer1() interrupt 3
{
                if(R_flag==1)
                {TH1=0XFE;        //給定時器賦初值,定時0.3ms
             TL1=0XD4;
            }
        if(R_flag==2)//11100001         
        {     TH1=0XFF;        //給定時器賦初值,定時0.2ms
             TL1=0X38;
        }
        //******************
        if(R_flag==3)
     {
          TH1=0XFF;        //給定時器賦初值,定時0.1ms
             TL1=0X9C;
          }
    PUIr=~PUIr;         
        }



我又改進了一下程序,大佬幫忙看看羅,謝謝了
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表