#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延时就不能用,电机不转,但是发错吱吱的声音!一去掉就可以!
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。