找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1827|回复: 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.         }
复制代码



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

使用道具 举报

沙发
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波控制速度的没看明白就将就着用着,,,,这个程序就是不能改变运动状态,好像确实是只检测了一遍,也试过了把检测数据函数加到主函数里面,但是只能直走,后来也试过,一直开关定时器,但是也不行
回复

使用道具 举报

5#
ID:327115 发表于 2018-10-25 17:37 | 只看该作者
HC6800-ES-V2.0 发表于 2018-10-25 09:08
你没有发电路图出来,从程序上看,只能看到两个电机,P0接的什么传感器?怎样寻迹的?
我的猜想:
你的检 ...

如果有更好的方法控制步进电机可以和我说一下,谢谢
回复

使用道具 举报

6#
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 单片机教程网

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