⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 robot.c

📁 寻迹机器人c语言程序
💻 C
字号:
/*******************机器人主程序*************************************/
/*          接法 输入的传感器  
                           左4--P0.7   右4--P0.3
                           左3--P0.6   右3--P0.2
                           左2--P0.5   右2--P0.1
                           左1--P0.4   右1--P0.0
                           
                  看门狗        :      WDT---P1.0
                  电机 PWM 控制 :      左轮--P2.0
                  电机 PWM 控制 :      右轮--P2.1
                 
  本程序采用4层判断,共用8个传感器。
  由外层到内层扫描。
  先判断右边传感器状态,如两侧传感器都触到黑线仍是右转。
                               
*/

#include<reg52.h>
#include<absacc.h>
#include<intrins.h>
#define nop _nop_()
#define uchar unsigned char
#define uint  unsigned int
extern void pwm(uchar way);
void timeInit();
void WDT();
bit Fround4(void);         //前方第4环扫描
bit Fround3(void);         //前方第3环扫描
bit Fround2(void);         //前方第2环扫描
bit Fround1(void);         //前方第1环扫描
bit Mround2(void);         //中间第1环扫描
void Mround1(void);         //中间第1环扫描

sbit WDTFlag=P1^0;
sbit sw3=P2^7;
sbit sw2=P2^6;
sbit sw1=P2^5;

uchar pwmValue[9];        //前方
uchar MpwmValue[4];

void main()
{
    bit guaiwan;
    timeInit();
    WDTFlag=0;
    nop;
    pwm(2);
    nop;
    
    if(sw3&&sw2&&sw1)       //111--7
    {
        pwmValue[8]=55;
        pwmValue[7]=56;
        
        pwmValue[6]=57;
        pwmValue[5]=58;
        
        pwmValue[4]=51;
        pwmValue[3]=52;
        
        pwmValue[2]=51;
        pwmValue[1]=52;
        pwmValue[0]=4;
        
        MpwmValue[3]=51;
        MpwmValue[2]=55;
        
        MpwmValue[1]=61;
        MpwmValue[0]=62;
        
    }

    if(sw3&&sw2&&~sw1)       //110--6
    {
        pwmValue[8]=53;
        pwmValue[7]=54;
        
        pwmValue[6]=55;
        pwmValue[5]=56;
        
        pwmValue[4]=51;
        pwmValue[3]=52;
        
        pwmValue[2]=49;
        pwmValue[1]=50;
        pwmValue[0]=4;
        
        MpwmValue[3]=55;
        MpwmValue[2]=56;
        
        MpwmValue[1]=53;
        MpwmValue[0]=54;
    }

    if(sw3&&~sw2&&sw1)       //101--5    
    {
        pwmValue[8]=55;
        pwmValue[7]=56;
        
        pwmValue[6]=39;
        pwmValue[5]=40;
        
        pwmValue[4]=23;
        pwmValue[3]=24;
        
        pwmValue[2]=19;
        pwmValue[1]=20;
        pwmValue[0]=1;
        
        MpwmValue[3]=39;
        MpwmValue[2]=40;
        
        MpwmValue[1]=53;
        MpwmValue[0]=54;
    }

    if(sw3&&~sw2&&~sw1)       //100--4
    {
        pwmValue[8]=57;
        pwmValue[7]=58;
        
        pwmValue[6]=53;
        pwmValue[5]=54;
        
        pwmValue[4]=49;
        pwmValue[3]=50;
        
        pwmValue[2]=41;
        pwmValue[1]=42;
        pwmValue[0]=3;
        
        MpwmValue[3]=53;
        MpwmValue[2]=54;
        
        MpwmValue[1]=57;
        MpwmValue[0]=58;
    }
    
    
    if(~sw3&&sw2&&sw1)       //011--3
    {
        pwmValue[8]=55;
        pwmValue[7]=56;
        
        pwmValue[6]=57;
        pwmValue[5]=58;
        
        pwmValue[4]=51;
        pwmValue[3]=52;
        
        pwmValue[2]=49;
        pwmValue[1]=50;
        pwmValue[0]=3;
        
        MpwmValue[3]=47;
        MpwmValue[2]=48;
        
        MpwmValue[1]=55;
        MpwmValue[0]=56;
    }
    
    if(~sw3&&sw2&&~sw1)       //010--2
    {
        pwmValue[8]=53;
        pwmValue[7]=54;
        
        pwmValue[6]=57;
        pwmValue[5]=58;
        
        pwmValue[4]=51;
        pwmValue[3]=52;
        
        pwmValue[2]=49;
        pwmValue[1]=50;
        pwmValue[0]=4;
        
        MpwmValue[3]=51;
        MpwmValue[2]=52;
        
        MpwmValue[1]=49;
        MpwmValue[0]=50;
    }
    
    if(~sw3&&~sw2&&sw1)       //001--1
    {
        pwmValue[8]=57;
        pwmValue[7]=58;
        
        pwmValue[6]=55;
        pwmValue[5]=56;
        
        pwmValue[4]=61;
        pwmValue[3]=62;
        
        pwmValue[2]=49;
        pwmValue[1]=50;
        pwmValue[0]=4;
        
        MpwmValue[3]=51;
        MpwmValue[2]=52;
        
        MpwmValue[1]=49;
        MpwmValue[0]=50;
    }  

    if(~sw3&&~sw2&&~sw1)       //000--0
    {
        pwmValue[8]=57;
        pwmValue[7]=58;
        
        pwmValue[6]=55;
        pwmValue[5]=56;
        
        pwmValue[4]=61;
        pwmValue[3]=62;
        
        pwmValue[2]=61;
        pwmValue[1]=62;
        pwmValue[0]=60;
        
        MpwmValue[3]=57;
        MpwmValue[2]=58;
        
        MpwmValue[1]=55;
        MpwmValue[0]=56;
    }     
    
    
    while(1)
    {
        WDT();                    //喂狗
        
        guaiwan=Fround4();         //扫描前方第4环
        if(guaiwan)continue;
        
        guaiwan=Fround3();         //扫描前方第3环
        if(guaiwan)continue;
        
        guaiwan=Fround2();         //扫描前方第2环
        if(guaiwan)continue;
        
        guaiwan=Fround1();                //扫描前方第1环
        if(guaiwan)continue;
        
        guaiwan=Mround2();                //扫描中间第2环
        if(guaiwan)continue;
        
        Mround1();                         //扫描中间第1环
        
     
    }   
}


/*********************前方第4环扫描**********************************/
bit Fround4(void)
{
    bit turningFlag=0;
    if(P0&0x08)                //此处“1”表示黑线,右边触到黑线应该右拐
    {
         pwm(pwmValue[8]);        
         turningFlag=1;
    }   
    else  
    {
   
        if(P0&0x80)            //左边触到黑线应该左拐      
        {
            pwm(pwmValue[7]);             
            turningFlag=1;
        }    
    }
    return(turningFlag);
}




/*********************前方第3环扫描**********************************/
bit Fround3(void)
{
    bit turningFlag=0;
    if(P0&0x04)                //此处“1”表示黑线,右边触到黑线应该右拐
    {
         pwm(pwmValue[6]);            
         turningFlag=1;
    }   
    else  
    {
   
        if(P0&0x40)            //左边触到黑线应该左拐      
        {
            pwm(pwmValue[5]);             
            turningFlag=1;
        }    
    }
    return(turningFlag);
}




/*********************前方第2环扫描**********************************/
bit Fround2(void)
{
    bit turningFlag=0;
    if(P0&0x02)                //此处“1”表示黑线,右边触到黑线应该右拐
    {
         pwm(pwmValue[4]);           
         turningFlag=1;
    }   
    else  
    {
   
        if(P0&0x20)            //左边触到黑线应该左拐      
        {
            pwm(pwmValue[3]);            
            turningFlag=1;
        }    
    }
    return(turningFlag);
}





/*********************前方第1环扫描**********************************/
bit Fround1(void)
{
    bit turningFlag=0;
    if(P0&0x01)                //此处“1”表示黑线,右边触到黑线应该 右拐
    {
         pwm(pwmValue[2]);           
         turningFlag=1; 
    }   
    else  
    {
   
        if(P0&0x10)            //左边触到黑线应该 左拐      
        {
            pwm(pwmValue[1]);             
            turningFlag=1;
        }  
    }
    return(turningFlag);
}

/*********************中间第2环扫描**********************************/
bit Mround2(void)
{
    bit turningFlag=0;
    if(P1&0x40)                //此处“1”表示黑线,右边触到黑线应该右拐
    {
         pwm(MpwmValue[3]);            //右转
         turningFlag=1;
    }   
    else  
    {
   
        if(P1&0x20)            //左边触到黑线应该左拐      
        {
            pwm(MpwmValue[2]);             //左转
            turningFlag=1;
        }    
    }
    return(turningFlag);
}

/*********************中间第1环扫描**********************************/
void Mround1(void)
{
    if(P1&0x10)                //此处“1”表示黑线,右边触到黑线应该右拐
    {
         pwm(MpwmValue[1]);            //右转(急转)    再增加转弯幅度用pwm(3)  
    }   
    else  
    {
   
        if(P1&0x04)            //左边触到黑线应该左拐      
        {
            pwm(MpwmValue[0]);             //左转(急转),再增加转弯幅度用pwm(10)
        }  
        else
        {
            pwm(pwmValue[0]);              //左右传感器都未触到黑线则快速前进
        }   
    }
}

/*************************喂看门狗**********************************/
void WDT()
{
    WDTFlag=1;
    nop;
    nop;
    WDTFlag=0;
}


/*************************定时器初始化**********************************/
void timeInit()
{
     TMOD=0x11;
     TH0=0xff;      //低速占空比75%
     TL0=0x9c;
     TH1=0xff;     //高速75%占空比
     TL1=0x9c;
     TR0=1;
     ET0=1;
     ET1=1;
     TR1=1;

     EA=1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -