|TRIG接 times New Roman">P0.1 ECH0 接P0.2| L298N接线: |1A1----P2.5 |1A2-----P2.6| |2A1----P2.3 |2A2-----P2.2| #include <reg52.h> //器件配置文件#include <intrins.h>sbit RX=P0^1; //接受端口sbit TX=P0^0; //发射端口 //驱动引脚定义sbit IN1=P2^6;//M2sbit IN2=P2^5;sbit IN3=P2^3;//M1sbit IN4=P2^2; unsigned int time=0; unsigned long S=0,num=0; bit flag =0; int m=0; uS延时函数大致延时void DelayUs2x(unsigned char t){ while(--t);}/*--------------------------------- mS延时函数---------------------------------*/void DelayMs(unsigned char t){ while(t--) { //大致延时1mS DelayUs2x(245); DelayUs2x(245); }}void delay(void)//{ DelayMs(200);DelayMs(200); DelayMs(200);DelayMs(200); DelayMs(200);DelayMs(200);}/*********驱动模块********************/forword()//前进{ IN1=1; IN2=0; IN3=1; IN4=0;}turn_left()//左拐{ IN1=1; IN2=0; IN3=0; IN4=0;}/*turn_right()//右拐{ IN1=0; IN2=0; IN3=1; IN4=0;} */stop()//停止{ IN1=0; IN2=0; IN3=0; IN4=0; }/*****T0中断用来计数器溢出,超过测距范围******/void zd0() interrupt 1 { flag=1; //中断溢出标志 }/*********启动超生波模块*****************/void StartModule() { TX=1; //启动一次模块 DelayUs2x(8); //延时大概20us TX=0; while(!RX); //当RX为零时等待 TR0=1; //开启计数 while(RX); //当RX为1计数并等待 TR0=0; //关闭计数} unsigned int count(){ time=TH0*256+TL0; TH0=0; TL0=0;S=(time*1.7)/100; //算出来是CM if((S>=30)||flag==1) //超出测量范围 { flag=0;S=1; } else S=0; DelayMs(80);//80MS return S; }//定时器T1溢出中断一定时间启动一次测距模块void time1() interrupt 3{ ET1=0;TR1=0; TH1=(65536-15536)/256; TL1=(65536-15536)%256; StartModule(); num=count(); switch (S){ case 1:{ turn_left(); delay(); delay(); stop(); m=1; break; } case 0: { m=2; break; }} ET1=1;TR1=1;}/**************主函数*********************/void main(){ unsigned int i=0; TMOD=0x11; //设T0为方式1,GATE=1; TH0=0; TL0=0; ET0=1; //允许T0中断 TH1=(65536-15536)/256; TL1=(65536-15536)%256; ET1=1; //允许T1中断 TR1=1; EA=1; //开启总中 forword(); while(1) { if(m==1) { m=0; ET1=1;TR1=1;} if(m==2) { m=0; forword(); ET1=1;TR1=1; }}}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>