📄 robot.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 + -