#include "reg52.h"
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char zkb1=0;
unsigned char zkb2=0;
unsigned char t=0;
unsigned int time=0;
unsigned long S=0;
bit flag=0;
sbit Trig=P2^4;
sbit Echo=P2^5;
sbit ENA=P1^0;
sbit ENB=P1^5;
sbit P22=P1^1; //左电机
sbit P23=P1^2; //左电机
sbit P24=P1^3; //右电机
sbit P25=P1^4; //右电机
sbit P10=P0^0; //左1
sbit P11=P0^1; //左2
sbit P12=P0^2; //右2
sbit P13=P0^3; //右1
void delayms(unsigned int ms)
{
unsigned char i=100,j;
for(;ms;ms--)
{
while(--i)
{
j=10;
while(--j);
}
}
}
void init()
{
TMOD=0X11;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
EA=1;
ET0=1;
ET0=1;
TR0=1;
TH1=0;
TL1=0;
}
void TiaoSu()interrupt 1
{
TH0=(65536-100)/256;
TL0=(65536-100)%256;
if(t<zkb1)
ENA=1;
else
ENA=0;
if(t<zkb2)
ENB=1;
else
ENB=0;
t++;
if(t>=100)
{t=0;}
}
void qianjin() //直走
{
zkb1=100;
zkb2=100;
P23=0;
P25=0;
}
void turnleft1() //左边走大弯
{
zkb1=80;
zkb2=80;
P23=0;
P24=0;
}
void turnleft2() //左边走小弯
{
zkb1=80;
zkb2=80;
P22=0;
P25=0;
}
void turnright1() //右边走大弯
{
zkb1=80;
zkb2=80;
P22=0;
P25=0;
}
void turnright2() //右边走小弯
{
zkb1=80;
zkb2=80;
P23=0;
P24=0;
}
void stop() //停车
{
P22=0;
P23=0;
P24=0;
P25=0;
}
void xunji()
{
uchar flag;
if(P10==0&&P11==0&&P12==0&&P13==0) //全速前进
{flag=0;}
else if(P10==1&&P11==0&&P12==0&&P13==0) //右边走大弯
{flag=1;}
else if(P10==0&&P11==0&&P12==0&&P13==1) //左边走大弯
{flag=2;}
else if(P10==0&&P11==1&&P12==0&&P13==0) //左边走小弯
{flag=3;}
else if(P10==0&&P11==0&&P12==1&&P13==0) //右边走小弯
{flag=4;}
else if(P10==1&&P11==1&&P12==1&&P13==1) //停车
{flag=5;}
switch (flag)
{
case 0:qianjin();break;
case 1:turnright1();break;
case 2:turnleft1();break;
case 3:turnleft2();break;
case 4:turnright2();break;
case 5:stop();break;
default:break;
}
}
void Conut(void)
{
time=TH1*256+TL1;
S=(time*1.7)/100; //算出来是CM
if((S>=20)||flag==1) //超出测量范围
{
flag=0;
xunji();
}
if(S<=20)
{
zkb1=50;
zkb2=50;
P22=0;
P24=0;
delayms(1);
zkb1=100;
zkb2=100;
P23=0;
P24=0;
delayms(1);
xunji();
}
}
void CSB() interrupt 3 //T0中断用来计数器溢出,超过测距范围
{
flag=1; //中断溢出标志
}
void chaoshengbo() //启动模块
{
Trig=1; //启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Trig=0;
}
void main()
{
init();
P22=1;
P23=0;
P24=1;
P25=0;
ENA=1;
ENB=1;
while(1)
{
chaoshengbo();
xunji();
while(!Echo); //当RX为零时等待
TR1=1; //开启计数
while(Echo); //当RX为1计数并等待
TR1=0; //关闭计数
Conut(); //计算
}
}
//#include <reg52.h>
//#include <math.h>
//#define uchar unsigned char
//#define uint unsigned in
//sbit TRIG = P1^0 ;
//sbit ECHO = P1^1 ;
//sbit pwm = P1^7; //PWM信号输出口
//sbit in1 = P1^3;
//sbit in2 = P1^4;
//sbit in3 = P1^5;
//sbit in4 = P1^6;
//uchar n,count,angle,left,right; //距离标志位,0.5ms次数,角度标识
//float S; //距离变量
//
//void DelayUs2x(uchar t)
//{
//while(--t);
//}
//
//void DelayMs(uchar t)
//{
//while(t--) //大致延时1mS
//{
// DelayUs2x(245);
// DelayUs2x(245);
//}
//}
///*------------------------------------------------
// 定时器0初始化
//------------------------------------------------*/
//void TIM0init(void)
//{
//
// TMOD|= 0x11;//定时器1工作方式1 (超声波) 定时器0舵机
// TH1=0x00;
// TL1=0x00;
// TH0=0xff;
// TL0=0xa3; //11.0592MHz晶振,0.5ms
// ET1=1;
// ET0=1;
// EA=1;
// TR0=1; //定时器开始
// IE=0x82;
//}
//
// void chaoshengbo ()
// {
// TRIG=1; //触发信号是高电平脉冲,宽度大于10us
// DelayUs2x(10);
// TRIG=0;
// while(!ECHO); //等待高电平
// TR1=1;
// while(ECHO); //等待低电平
// TR1=0;
// S=TH1*256+TL1;//取出定时器值高8位和低8位合并
// S=S/58; //为什么除以58等于厘米, Y米=(X秒*344)/2
// // X秒=( 2*Y米)/344 -> X秒=0.0058*Y米 -> 厘米=微秒/58
// if(S>=25)
// {n=1;}
//
// if(S<25)
// {n=0;}
//
//
// TH1=0;
// TL1=0; //清除定时器0寄存器中的值
//
//
//
// }
///*------------------------------------------------
// 主函数
//------------------------------------------------*/
//main()
//{
// angle=12;
// count=0;
// TIM0init(); //初始化定时器
// while(1)
// {
// chaoshengbo();
// DelayMs(20);
// if(n==1)
// {go();}
// if (n==0)
// {
// stop();
// n=1;
// angle=5;
// count=0;
// DelayMs(400);
// chaoshengbo();
// DelayMs(20);
// right=n;
// n=1;
// angle=12;
// count=0;
// DelayMs(400);
// angle=19;
// count=0;
// DelayMs(400);
// chaoshengbo();
// DelayMs(20);
// left=n;
// angle=12;
// count=0;
// DelayMs(400);
// n=1;
//
// if(right==1)
// {
// turnright();
// DelayMs(450);
// }
// else if(right==0&&left==1)
// {
// turnleft();
// DelayMs(450);
// }
// else
// {
// back();
// DelayMs(500);
// turnleft();
// DelayMs(1000);
// }
|