#include
#define uint unsigned int
#define uchar unsigned char
ucharzkb_left1,zkb_right1,zkb_left2,zkb_right2,i1,j1,i2,j2; //占空比标志
sbit IN1=P1^0; //电机控制端口
sbit IN2=P1^1;
sbit IN3=P1^2;
sbit IN4=P1^3;
此内容由EEWORLD论坛网友jinshenf7533967原创,如需转载或用于商业用途需征得作者同意并注明出处
sbit IN5=P1^4;
sbit IN6=P1^5;
sbit IN7=P1^6;
sbit IN8=P1^7;
sbit hw1=P2^4; //红外传感器端口
sbit hw2=P2^3;
sbit zkba=P0^0; //占空比控制端
sbit zkbb=P0^1;
sbit zkbc=P0^2; //占空比控制端
sbit zkbd=P0^3;
void delay_ms(uint z) //延时函数
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void init() //初始化函数
{
TMOD=0x01;
TH0=(65536-100)/256;
TL0=(65536-100)%256 ;
EA=1;
ET0=1;
TR0=1;
zkba=1;
zkbb=1;
zkbc=1;
zkbd=1;
}
void time0() interrupt 1 //中断服务函数
{
i1++;j1++;i2++;j2++; //进入中断i,j自加1
if(i1如果i小于设定值,使能端置1,否则置0
else zkbb=0;
if(i1==40) {zkbb=~zkbb;i1=0;} //如果i加到40;使能端取反,i置0
if(j1
else zkba=0;
if(j1==40) {zkba=~zkba;j1=0;}
if(i2如果i小于设定值,使能端置1,否则置0
else zkbd=0;
if(i2==40) {zkbd=~zkbd;i2=0;} //如果i加到40;使能端取反,i置0
if(j2
else zkbc=0;
if(j2==40) {zkbc=~zkbc;j2=0;}
TH0=(65536-100)/256; //定时器0重装初值
TL0=(65536-100)%256;
}
void go() //前进函数
{
zkb_left1=8;
zkb_right1=8;
zkb_left2=8;
zkb_right2=8;
IN1=1; IN2=0;
IN3=1; IN4=0;
IN5=1; IN6=0;
IN7=1; IN8=0;
}
void back() //后退函数
{
zkb_left1=8;
zkb_right1=8;
zkb_left2=8;
zkb_right2=8;
IN1=0; IN2=1;
IN3=0; IN4=1;
IN5=0; IN6=1;
IN7=0; IN8=1;
}
void left() //左转弯函数,
{
zkb_left1=10; //设置一个速度
zkb_right1=10;
zkb_left2=10;
zkb_right2=10;
IN1=0; IN2=1; //
IN3=1; IN4=0;
IN5=0; IN6=1;
IN7=1; IN8=0;
}
void right() //右转弯函数
{
zkb_left1=10; //设置一个速度
zkb_right1=10;
zkb_left2=10;
zkb_right2=10;
IN1=1; IN2=0; //
IN3=0; IN4=1;
IN5=1; IN6=0; //
IN7=0; IN8=1;
}
void stop() //停止函数
{
IN1=0; IN2=0;
IN3=0; IN4=0;
IN5=0; IN6=0;
IN7=0; IN8=0;
}
void gensui() //
{
ucharflag; //定义一个标志位,用于状态判断
if(hw1==1 &hw2==1) //
{flag=0;}
elseif(hw1==0 & hw2==0) //
{flag=1;}
elseif(hw1==1 & hw2==0) //
{flag=2;}
elseif(hw1==0 & hw2==1) //
{flag=3;}
else flag=4; //其他情况标志位置0
switch (flag)
{
case 0: go(); break; //情况0,前进
case 1: stop(); break; //情况1,前进
case 2: left(); break; //情况2,左转
case 3: right(); break; //
case 4: stop(); break; //情况4,右转
default: stop(); break; //
}
}
void main()
{
init();
delay_ms(1);
while(1)
{
gensui();
}
}
暂无评论,赶紧抢沙发吧