#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;
}
}
|