#include <STC89C5xRC.H>
typedef unsigned char u8;
typedef unsigned int u16;
sbit PWM1 = P3^3; //左电机控制信号
sbit PWM2 = P3^4;
sbit PWM3 = P3^5; //右电机控制信号
sbit PWM4 = P3^6;
sbit Lin = P2^7; //左红外模块
sbit Rin = P2^5; //右红外模块
sbit K1 = P1^0; //功能按键
sbit LED= P1^2;
u8 connt=2; //调速周期/10ms/100hz
u8 COM = 0; //功能控制位
bit Q_J=0; //前进标志
bit H_T=0; //后退标志
bit Z_Z=0; //左转标志
bit Y_Z=0; //右转标志
void delay( u16 k ) //延时1ms
{
u16 i,j;
for(i=k;i>0;i--)
for(j=120;j>0;j--);
}
void time0() //T0初始化函数
{
TMOD = 0x01; //定时器模式
TL0 = 0x18; //定时初始值
TH0 = 0xFC;
TF0 = 0; //清除TF0标志
ET0 = 1; //打开计时器中断
TR0 = 1; //启动计时器
}
void SC()
{
Q_J=0; H_T=0;
Z_Z=0; Y_Z=0;
PWM1=0; PWM2=0; //刹车
PWM3=0; PWM4=0;
}
void QJ() //前进
{
H_T=0; Z_Z=0; Y_Z=0;
Q_J=1;
}
void HT() //后退
{
Z_Z=0; Y_Z=0; Q_J=0;
H_T=1;
}
void ZZ() //左转
{
Y_Z=0; Q_J=0; H_T=0;
Z_Z=1;
}
void YZ() //右转
{
Q_J=0; H_T=0; Z_Z=0;
Y_Z=1;
}
void lin1() //寻迹功能程序
{
if( Lin && Rin ) //左右=1,小车前进
{
QJ();
delay(100);
SC();
delay(150);
}
if( !Lin && !Rin ) //左右=0,小车停止
{
SC(); //待机
}
if( !Lin && Rin ) //左=0,右=1,小车左转
{
SC();
delay(100);
ZZ();
delay(100);
}
if( Lin && !Rin ) //右=0,左=1,小车右转
{
SC();
delay(100);
YZ();
delay(100);
}
}
//void lin2() //手势程序
//{
//if( Lin && Rin ) //两探头=1,小车前进
//{
//QJ();
//}
//if( !Lin && !Rin ) //两探头=0,小车后退
//{
//HT();
//}
//}
void konzi() //控制
{
if( K1 == 0 )
{
delay(10);
COM++;
while( !K1 );
delay(10);
}
if( COM >=2)COM = 0;
}
void main () //主函数
{
time0(); //T0初始化
EA = 1; //打开总中断
SC(); //待机
while(1)
{
konzi();
switch(COM) //功能选择
{
case 0: SC(); break;
case 1: lin1();break; //寻迹
case 2: lin2();break; //手势控制
}
}
}
void Timer0Interrupt() interrupt 1 //T0中断函数1ms
{
static u8 PWM_Cnt =0;
static u16 S =0;
TL0 = 0x18;
TH0 = 0xFC;
S++;
PWM_Cnt++;
/******************************/
if(Q_J) //前进
{
PWM4 = 0;
PWM2 = 0;
if(PWM_Cnt<=connt)
{
PWM1 = 1;
PWM3 = 1;
}
else
{
PWM1 = 0;
PWM3 = 0;
}
}
/******************************/
if(H_T) //后退
{
PWM1 = 0;
PWM3 = 0;
if(PWM_Cnt<=connt)
{
PWM2 = 1;
PWM4 = 1;
}
else
{
PWM2 = 0;
PWM4 = 0;
}
}
/******************************/
if(Z_Z) //左转
{
PWM1 = 0;
PWM2 = 0;
PWM4 = 0;
if(PWM_Cnt<=connt)
{
PWM3 = 1;
}
else
{
PWM3 = 0;
}
}
/******************************/
if(Y_Z) //右转
{
PWM2 = 0;
PWM3 = 0;
PWM4 = 0;
if(PWM_Cnt<=connt)
{
PWM1 = 1;
}
else
{
PWM1 = 0;
}
}
if(PWM_Cnt>=10)PWM_Cnt = 0;
if(S>=1000) //秒脉冲
{
LED=~LED;
S=0;
}
}
|