找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1408|回复: 2
收起左侧

这个循迹程序的循迹为什么只能进去一次

[复制链接]
ID:327115 发表于 2018-10-28 17:02 | 显示全部楼层 |阅读模式
#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;         
        }





这个是步进电机   用定时器t0,t1来控制他的速度     但是循迹只进去了一次   只能检测最开始的状态  
回复

使用道具 举报

ID:222948 发表于 2018-10-28 21:38 | 显示全部楼层
一直在while程序里面出不来,一直循环,就只能循迹一次
回复

使用道具 举报

ID:164602 发表于 2018-10-29 08:46 | 显示全部楼层
你将每个if内的
temp=P0;
         signal=temp&0xff;
现金条语句取出,放在所有if语句完的后成试试,就是这样——

if(signal==0X87)//10000111
             {L_flag=2;R_flag=2;
                 }
         if(signal==0X3F)//11100001
             {L_flag=2;R_flag=2;
                 }

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

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

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

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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