开发者社区> 问答> 正文

单片机智能小车循迹延时

#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延时就不能用,电机不转,但是发错吱吱的声音!一去掉就可以!

展开
收起
a123456678 2016-03-23 12:00:16 3850 0
1 条回答
写回答
取消 提交回答
  • 简单看了下代码:
    左转和右转 应该是没有区别,
    虽然代码先后顺序变量,
    for循环时,我们在中间看,说不出先后。因此不会动。

    2019-07-17 19:10:43
    赞同 展开评论 打赏
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载