/***********************************************************************/
void UartInit() //9600bps@11.0592MHz
{
SCON=0x50; //设置为工作方式1
TMOD=0x11; //设置计数器工作方式2
PCON=0x00; //SMOD=1,波特率不加倍
TH1=0; //计数器设置初值
TL1=0;
TH0=0xfe;
TL0=0x33; //11.0592MZ晶振,0.5ms
/*IE=0x9A; */
ES=1;
ET1=1;
ET0=1;
EA=1;
TR0=1; //定时器开始
}
/************************************************************************************/
void UartInit2() //9600bps@11.0592MHz
{
SCON=0x50; //设置为工作方式1
TMOD=0x20; //设置计数器工作方式2
PCON=0x00; //SMOD=1,波特率不加倍
TH1=0xfd; //计数器设置初值
TL1=0xfd;
ES=1;
EA=1;
TR1=1;
}
/***********************************************************************/
void Time0_Int() interrupt 1 //T0中断程序
{
TH0=0xfe; //重新赋值
TL0=0x33;
if(count< jd) //判断0.5ms次数是否小于角度标识
pwm=1; //确实小于,PWM输出高电平
else
pwm=0; //大于则输出低电平
count=(count+1); //0.5ms次数加1
count=count%40; //次数始终保持为40 即保持周期为20ms
}
/*********************************************************************/
void timer0() interrupt 3 //T1中断
{
}
/***********************************************************************/
void Count1() //计算左侧超声波距离的函数
{
while(!RX1); //当RX1为零时等待
TR1=1; //开启计数
while(RX1); //当RX1为1计数并等待
TR1=0; //关闭计数
time=TH1*256+TL1;
TH1=0;
TL1=0;
s1=(time*1.7)/100; //算出来是CM
}
/***********************************************************************/
void delay(int i)//延时
{
int j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
/***********************************************************************/
/*void keyscan() //按键扫描
{
if(jia==0) //角度增加按键是否按下
{
delay(10); //按下延时,消抖
if(jia==0) //确实按下
{
jd=jd+2; //角度标识加1
count=0; //按键按下 则20ms周期从新开始
if(jd==7)
jd=5; //已经是180度,则保持
while(jia==0); //等待按键放开
}
}
if(jian==0) //角度减小按键是否按下
{
delay(10);
if(jian==0)
{
jd=jd-2; //角度标识减1
count=0;
if(jd==-1)
jd=1; //已经是0度,则保持
while(jian==0);
}
}
} */
/************************************************************************/
void cej()
{
TX1=1; /*开启超声波1探测*/
delay(1);
TX1=0;
Count1(); //测距
}
void main()
{
jd=3;
count=0;
delay(10);
while(1)
{
if(P27==0)
{
delay(10);
if(P27==0)
{
UartInit();
delay(10000);
while(1)
{
cej();
if(s1<=16)
{
tingz();
delay(10);
jd=5;
delay(10000);
cej();
s2=s1;
jd=1;
delay(10000);
cej();
s3=s1;
if(s2>=s3)
{
zuoz();
}
if(s2<s3) youz();
delay(50000);
jd=3;
delay(10000);
}
if(s1>10)
{
qianj();//前进
}
if(P26==0)
{
delay(10);
if(P26==0) break;
}
}
}
}
if(P26==0)
{
delay(10);
if(P26==0)
{
UartInit2();
delay(1000);
while(1)
{
if(a==zhuanhuan)
{
if(P33==0&&P34==1) zuoz();
else if(P33==1&&P34==0) youz();
else if(P33==0||P34==0) qianj();
}
if(a==Go) qianj();//前进
if(a==Back) hout();//后退
if(a==Left) zuoz();//左转
if(a==Right) youz();//右转
if(a==Stop) tingz();//停止
if(P27==0)
{
delay(10);
if(P27==0) break;
}
jd=3;
}
}
}
}
}
|