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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2108|回復: 5
收起左側

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

[復制鏈接]
ID:327115 發表于 2018-10-24 19:03 | 顯示全部樓層 |閱讀模式
就是如果它一開始檢測到的數據讓他轉彎他就會一直轉彎,不會根據接下來的檢測而做出相關的反應

單片機源程序如下:
  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;//電機正轉
  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.         }
復制代碼



回復

使用道具 舉報

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

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

使用道具 舉報

ID:415098 發表于 2018-10-25 10:53 | 顯示全部樓層
看你的代碼中斷用了兩個定時器,考慮到用兩個中斷應該看看是否優先級有影響?
回復

使用道具 舉報

ID:327115 發表于 2018-10-25 17:36 | 顯示全部樓層
HC6800-ES-V2.0 發表于 2018-10-25 09:08
你沒有發電路圖出來,從程序上看,只能看到兩個電機,P0接的什么傳感器?怎樣尋跡的?
我的猜想:
你的檢 ...

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

使用道具 舉報

ID:327115 發表于 2018-10-25 17:37 | 顯示全部樓層
HC6800-ES-V2.0 發表于 2018-10-25 09:08
你沒有發電路圖出來,從程序上看,只能看到兩個電機,P0接的什么傳感器?怎樣尋跡的?
我的猜想:
你的檢 ...

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

使用道具 舉報

ID:327115 發表于 2018-10-25 21:54 | 顯示全部樓層
HC6800-ES-V2.0 發表于 2018-10-25 09:08
你沒有發電路圖出來,從程序上看,只能看到兩個電機,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;//電機正轉
         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;         
        }



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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久婷婷香蕉热狠狠综合 | 国产精品久久久久久 | 男女视频在线观看免费 | 在线91 | 亚洲第一区久久 | 最新av片 | 日韩综合一区 | 91精品国产乱码久久久久久久久 | 国产婷婷精品 | 国产成人免费视频 | 武道仙尊动漫在线观看 | www.久草.com | 国产熟熟 | 羞羞视频在线观看 | 亚洲一二三区精品 | 每日更新av | 日韩三 | 国产乱码一区 | 国产成人精品久久 | 国产一区二区免费电影 | 国产精品久久久久久久久图文区 | yiren22综合网成人 | 国产精品久久久久久婷婷天堂 | 国产精品免费av | 久操av在线 | 国产精品久久 | 国产日韩中文字幕 | 精品久久ai电影 | 九九综合| 亚洲 欧美 另类 综合 偷拍 | 色综合一区二区三区 | 欧美在线视频一区 | 成人免费视频久久 | 犬夜叉在线观看 | 国产美女久久 | 精品久久中文 | 男人的天堂亚洲 | 国产日韩欧美精品 | 视频一区二区中文字幕 | 亚洲精品成人 | 成人欧美一区二区三区色青冈 |