[原创] 电机随红外同部的方法

jinshenf7533967   2018-12-11 00:34 楼主
#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++;                 //进入中断ij自加1
       if(i1如果i小于设定值,使能端置1,否则置0
        else zkbb=0;
       if(i1==40)        {zkbb=~zkbb;i1=0;}  //如果i加到40;使能端取反,i0
       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;使能端取反,i0
       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();
        }
}

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复