刘虾 2015-06-30 12:41 采纳率: 85.7%
浏览 3240
已结题

单片机智能小车循迹延时

#include

#define uchar unsigned char
#define uint unsigned int

sbit IN1=P1^0;

sbit IN2=P1^1;

sbit IN3=P1^2;

sbit IN4=P1^3;

sbit EN1=P1^4; // 左电机使能

sbit EN2=P1^5; // 右电机使能

////定义两路循迹灯////
sbit z=P2^3;
sbit y=P2^4;
sbit m=P2^5;
uint i,j;

#define left_qianmoto_go {EN1=1,IN1=0,IN2=1;} //前左电机向前走

#define left_qianmoto_back {EN1=1,IN1=1,IN2=0;} //前左边电机向后转
#define left_qianmoto_stop {EN1=0;} //前左边电机停转

#define right_qianmoto_go {EN2=1,IN3=1,IN4=0;} //前右边电机向前走
#define right_qianmoto_back {EN2=1,IN3=0,IN4=1;} //前右边电机向后走

#define right_qianmoto_stop {EN2=0;} //前右边电机停转

uchar left_zkb; //定义左电机占空比
uchar right_zkb; //定义右电机占空比
uchar t; //定义定时器中断计数器

void xunji(); //循迹程序
void run(); //前进函数

void right(); //右转函数
void left(); //左转函数
void stop();
void back();

void t0_init(); //定时器0初始化函数

void main() //主函数
{
t0_init(); //定时器初始化

while(1)
{
    xunji();    //不断调用循迹子程序
}

}

/*********************循迹程序***********************************/
void xunji()
{
////////0亮灯 表示 接收到 信号,代表没有处于黑线/////////////
////////1灭灯 表示 没接收 到信号,代表处于黑线中///////////
if(z==1&&m==1&&y==1)//十字路口,左
{

                    run();
                for(i=1000;i>0;i--) 
            for(j=110;j>0;j--);

            left();
                            for(i=1000;i>0;i--) 
            for(j=110;j>0;j--);
            }
 if(z==0&&m==1&&y==0)//循迹
    {

            run();
}
}               

/*********中断服务函数产生占空比方波用于占空比调速****************/
/* PWM产生118次中断,每次中断为100us,即T约等于11.8ms */

void timer0 () interrupt 1
{
TH0= 0XFF; //100us定时
TL0= 0X9c; //100us定时
t++;
if(t>=200) //限定周期 118次中断以后清空
t=0;
/*********左电机PWM调速********/
if(t<left_zkb)

{EN1=1; }

else
{EN1=0;}

/********右电机PWM调速**********/
if(t<right_zkb)

{EN2=1;}

else
{EN2=0;}

}

void run(void) //前进函数
{
left_zkb=14;
right_zkb=14;
left_qianmoto_go;

left_zkb=14;
right_zkb=14;
right_qianmoto_go;}

void left(void) //左转函数
{left_zkb=14;
right_zkb=14;
right_qianmoto_back;

left_zkb=14;
right_zkb=14;
left_qianmoto_go; }

void right(void) //右转函数
{ left_zkb=14;
right_zkb=14;
right_qianmoto_go;

left_zkb=14;
right_zkb=14;
left_qianmoto_back;}
void stop(void)
{left_qianmoto_stop; right_qianmoto_stop;}
void back(void)//返回函数
{left_zkb=14;
right_zkb=14;
left_qianmoto_back;
left_zkb=14;
right_zkb=14;
right_qianmoto_back;}
void t0_init() //定时器初始化函数
{
TMOD=0x01;
TH0= 0XFF; //100us定时
TL0= 0X9c; //100us定时
EA=1;
ET0=1;
TR0=1;

}
为什么一加for延时就不能用,电机不转,但是发错吱吱的声音!一去掉就可以!

  • 写回答

3条回答 默认 最新

  • kongslly 2015-07-01 05:23
    关注

    高低电平切换,测量一下引脚的电压值吧,看看波形

    评论

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!