超声波避障小车c程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#include
sbit K1=P1^0;
sbit K2=P1^1;
sbit TX=P3^0; //触发信号引脚
sbit PWM1=P3^6; //pwm信号输出
sbit PWM2=P3^7;
static char click=0;
unsigned char ZK1,ZK2;
unsigned int time=0;
unsigned int timer=0;
unsigned char posit=0;
unsigned long S=0;
bit flag =0;
unsigned char const discode[] ={ ~0xC0,~0xF9,~0xA4,~0xB0,~0x99,~0x92,~0x82,~0xF8,~0x80,~0x90};
unsigned char const positon[3]={ 0x7f,0xbf,0xdf};
unsigned char disbuff[4] ={ 0,0,0,0,};
void delay(void) //误差 0us
{
unsigned char a,b;
for(b=215;b>0;b--)
for(a=45;a>0;a--);
}
void Display(void)
{
{P0=discode[disbuff[posit]];}
P2=positon[posit];
if(++posit>=3)
posit=0;
}
void Conut(void)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.7)/100;
disbuff[0]=S%1000/100;
disbuff[1]=S%1000%100/10;
disbuff[2]=S%1000%10 %10;
}
void Timer2Interrupt()
{
RCAP2H=0x0fe;
RCAP2L=0x33;
ET2=1; // 允许T2定时器中断
EA=1; // 打开总中断
TR2=1; // 启动T2定时器
}
void zd0() interrupt 1
{
flag=1;
}
void zd3() interrupt 3 //T1中断用来扫描数码管和计800MS启动模块
{
TH1=0x0f8;
TL1=0x30;
Display();
timer++;
if(timer>=400)
{
timer=0;
TX=1; //800MS 启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
}
void Timer2(void) interrupt 5
{
TF2=0; // T2定时器发生溢出中断时,需要用户自己清除溢出标记
RCAP2H=0x0fe;
RCAP2L=0x33; /*恢复定时器初始值*/
++click;
if (click>=100) click=0;
if (click<=ZK1)
PWM1=0;
else
PWM1=1;
if (click<=ZK2)
PWM2=0;
else
PWM2=1;
}
void main( void )
{
TMOD=0x19; //设T0为方式1,GATE=1;
TH0=0;
TL0=0;
TH1=0x0f8; //2MS定时
TL1=0x30;
ET0=1; //允许T0中断
ET1=1; //允许T1中断
TR1=1; //开启定时器
Timer2Interrupt();
EA=1; //开启总中断
ZK1=20;
ZK2=20;
while(1)
{
while(INT0==0); //当RX为零时等待
TR0=1;
while(INT0==1); //当RX为1计数并等待
TR0=0; //关闭计数
Conut(); //计算
if (S>40) //控制加速
{
P1=0xaf;
ZK1=ZK1-10;
ZK2=ZK2-10;
}
else
if((S<30)&(K1==0)&(K2==0)) //控制转向
{
ZK1=ZK1+10;
ZK2=ZK2+10;
P1=0X8F;
delay();
}
else
if((S<30)&(K1==1)&
(K2==0))
{
ZK1=ZK1+10;
ZK2=ZK2+10;
P1=0X4F;
delay();
}
else
if((S<30)&(K1==0)&(K2==1))
{
ZK1=ZK1+10;
ZK2=ZK2+10;
P1=0X8F;
delay();
}
else
if((S<30)&(K1==1)&(K2==1))
{
ZK1=ZK1+10;
ZK2=ZK2+10;
P1=0X5F;
delay();
}
if (ZK1>99) ZK1=1;
if (ZK1<1) ZK1=99;
if (ZK2>99) ZK2=1;
if (ZK2<1) ZK2=99;
}
}