2812|8

6

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

52单片机控制小车,但编程出现问题,求高手解决 [复制链接]

我想让小车在检测到第三条黑线时左拐,再检测三条,左拐,最后再检测两条,然后原地打转。可实际运行时,小车检测到第三条黑线后就不停的左转,我怀疑是T0  T1 定时计数器发生冲突。以下是相关程序,也不知哪里错了,求高手指点!
#include
#include
#define uint unsigned int
#define uchar unsigned char
uchar speed_left,speed_right,a,b,c,d,i,j;
sbit P00=P0^0;
sbit P01=P0^1;
sbit P02=P0^2;//控制右电机
sbit P03=P0^3;//控制右电机
sbit P04=P0^4;//寻迹左
sbit P05=P0^5;//寻迹中
sbit P06=P0^6;//寻迹右
sbit P07=P0^7;
sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
sbit P14=P1^4;
sbit P15=P1^5;
sbit P16=P1^6;
sbit P17=P1^7;
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
sbit P24=P2^4;
sbit P25=P2^5;
sbit P26=P2^6;
sbit P27=P2^7;
sbit P36=P3^6;





void init()                                           //为变量赋值
{
        PT0=1;                                          //T0中断设为最高优先级
        TMOD=0x51;                                           // 01010001
        TH0=(65536-100)/256;                  //PWM的定时器设定
    TL0=(65536-100)%256;
        EA=1;
        ET0=1;
        TR0=1;
       
        TH1=0xFF;
        TL1=0xFD;                                          //出发,拐弯计数器设定
        ET1=1;
        TR1=1;
       
        a=0;                              //用变量a控制小车转弯次数
       
        P04=1;
        P05=1;
        P00=0;
        P01=1;
        P02=0;
        P03=1;
        P06=0;
        P07=0;
       
        P10=1;
        P11=1;
        P12=1;
        P13=1;       
}


void delay (uint z)                           //延时函数 z
{
        uint x;
        uint y;
                for(x=z;x>0;x--)
                        for(y=1000;y>0;y--);
}

void straight()                                                  
{
        speed_left=70;
        speed_right=70;
}
void left1()
{
        speed_left=15;
        speed_right=50;
        delay(15);
}
void left0()
{
        P00=1;P01=0;P02=0;P03=1;
        speed_left=-40;
        speed_right=40;
}
void right1()
{
        speed_left=50;
        speed_right=15;
        delay(15);
}
void right0()
{       
        P00=0;P01=1;P02=1;P03=0;
        speed_left=40;
        speed_right=40;

}
void stop()
{
        speed_left=0;
        speed_right=0;
}




void main()                                  
{
        EX0=1;
        IT0=1;
        init();
        while(1)                               
        {       
                   //通过条件判断,让车跨黑线行驶       
          
                if((P14==0&&P15==1&&P16==0)||(P14==1&&P15==1&&P16==1)||(P14==1&&P15==0&&P16==1)||(P14==0&&P15==0&&P16==0))
                {               
                        straight();
                }         
                if((P14==1&&P15==0&&P16==0)||(P14==0&&P15==1&&P16==1))
                {       
                        left1();
                }
                if((P14==0&&P15==0&&P16==1)||(P14==1&&P15==1&&P16==0))
                {                                                                 
                        right1();
                }               
        }                                               
}

void zuozhuan() interrupt 3                  
{       
        a++;
        TH1=0xFF;
        TL1=0xFD;
        if(a==2)
        {
                TH1=0xFF;
                TL1=0xFE;       
                left0();
                delay(25);                                                               
        }
        else if(a==3)
        {
               
                TR1=0;                                           //到达场地中央,转圈寻火焰,并停止计数器工作
                left0();
                delay(1000);
                a++;                                               
        }                 
        else
        {                                                          
        left0();
        delay(30);       
        }                                
}

void time0(void) interrupt  1                                  //PWM定时器中断程序
{
   i++;
   j++;
   if(i<=speed_right)
  {
     P04=1;
  }
   else P04=0;
  if(i==100)
  {
   i=0;
   }
  if(j<=speed_left)
  {
   P05=1;
   }
   else P05=0;
   if(j==100)
   {
    j=0;
        }
   
  TH0=(65536-100)/256;
  TL0=(65536-100)%256;
}
此帖出自单片机论坛

最新回复

希望楼主能分享一下自己的经验。自己分析一个问题原因,好让其他人有所借鉴  详情 回复 发表于 2012-8-11 00:05
点赞 关注
 

回复
举报

6

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
打错了,P04,P05是左右电机的使能端
此帖出自单片机论坛
 
 

回复

3404

帖子

6

TA的资源

裸片初长成(初级)

板凳
 
不明白你的具体情况,问题在哪儿也想不来,不过定时器之前的不会相互冲突的。你这种情况更多的可能是逻辑不清晰造成的。别的帮不上了
此帖出自单片机论坛

点评

谢谢!  详情 回复 发表于 2012-8-8 21:45
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(中级)

4
 

回复 板凳 jishuaihu 的帖子

谢谢!
此帖出自单片机论坛
 
 
 

回复

3404

帖子

6

TA的资源

裸片初长成(初级)

5
 
问题解决了吗!
此帖出自单片机论坛

点评

明白了!! 在前面每个控制小车方向的子函数中,将P0到P3口对应的值写入就没问题了!  详情 回复 发表于 2012-8-10 17:43
:Cry: 还是没找到原因啊:Cry:  详情 回复 发表于 2012-8-10 17:20
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(中级)

6
 

回复 5楼 jishuaihu 的帖子

还是没找到原因啊
此帖出自单片机论坛
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(中级)

7
 

回复 5楼 jishuaihu 的帖子

明白了!!
在前面每个控制小车方向的子函数中,将P0到P3口对应的值写入就没问题了!
此帖出自单片机论坛
 
 
 

回复

3404

帖子

6

TA的资源

裸片初长成(初级)

8
 
希望楼主能分享一下自己的经验。自己分析一个问题原因,好让其他人有所借鉴
此帖出自单片机论坛
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(中级)

9
 
额 其实这也不算什么经验
既然知道发生问题的环节,我就用Keil软件进行IO口状态模拟,发现当执行完第一次计数中断后,P0到P3口的值为1001(原地左转),之后返回主程序。但主程序中控制方向的子函数并没有将1001冲掉,从而导致车不停地左转。只要将P0到P3口对应的值重新写入就好了。
此帖出自单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表