基于51单片机的坦克循迹 计时测速程序

  • 格式:docx
  • 大小:13.23 KB
  • 文档页数:3

下载文档原格式

  / 9
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include

unsigned inti=0;

sbit P36=P3^6;

sbit P10=P1^0; //循迹口

sbit P11=P1^1;

sbit P12=P1^2;

sbit P14=P1^4; //电机口

sbit P15=P1^5;

sbit P16=P1^6;

sbit P17=P1^7;

unsigned char j,time;

unsigned intkop,dr;

unsigned char a[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; unsigned char c[4]={0xff,0xff,0xff,0xff},d[4];

void delay(unsigned char z) //延时子程序

{

unsigned char j;

while(z--)

for(j=123;j>0;j--);

}

void main()

{

TMOD=0x15; // 打开定时器和计数器

TH0=0x00;

TL0=0x00;

TH1=0XFc; //1ms

TL1=0X18;

EA = 1;

ET0=1;

ET1=1;

TR1 = 1;

TR0 = 1;

while(1)

{

if(P10==0&&P11==0&&P12==0)

{

TR0=0; //显示时间停

P0=d[0];

P2=0XFE;

delay(1);

P0=d[3];

P2=0XFB;

delay(3);

P0=d[2]; //显示测速停

P2=0XFD;

delay(3);

P0=d[3];

P2=0XF7;

delay(3);

P14=1;P15=1;P16=1; P17=1;

}

}

}

void timer1() interrupt 3 //中断服务程序

{

unsigned intqq=0,ww=0;

TH1=0XFc;

TL1=0X18;//1ms

i++;

switch(i%4)

{

case 0:P0=c[0],P2=0XFE;d[0]=c[0];break;

case 1:P0=c[1],P2=0XFD;d[1]=c[1];break;

case 2:P0=c[2],P2=0XFB;d[2]=c[2]; break;

case 3:P0=c[3],P2=0XF7;d[3]=c[3]; break; default:break;

}

P14=1;P15=1;P16=1; P17=1;

if(P10==0&&P11==0&&P12==0) //全测到

dr=0;

if(P10==1&&P11==0&&P12==1) //中间测到

dr=1;

if(P10==0&&P11==1&&P12==1) //左边测到dr=2;

if(P10==1&&P11==1&&P12==0) //右边测到dr=3;

if(P10==0&&P11==0&&P12==1) //左两测到dr=4;

if(P10==1&&P11==0&&P12==0) //右两测到dr=5;

switch(dr)

{

case 0:P14=1,P15=1,P16=1,P17=1,TR1=0;break; //全测到停

case 1:P14=0,P15=1,P16=0,P17=1;break; //直走

case 2:P14=1,P15=1,P16=0,P17=1,ww=1;break; //左拐

case 3:P14=0,P15=1,P16=1,P17=1,qq=1;break; //右拐

case 4:P14=1,P15=0,P16=0,P17=1,ww=1;break; //左两测到左拐

case 5:P14=0,P15=1,P16=1,P17=0,qq=1;break; //右两测到右拐

}

/*跑出跑道外记忆回到跑道内*/

if(dr==2&&ww==1||dr==4&&ww==1) //单边或双边测到跑出去{

qq=0;

P14=1;P15=1;P16=0;P17=1;

}

if(dr==3&&qq==1||dr==5&&qq==1)

{

ww=0;

P14=0;P15=1;P16=1;P17=1;

}

if(i==1000) //1s

{

kop=TH0;//计数器计入脉冲

kop=kop<<8;

kop=kop+TL0;

kop=kop*15;

c[3]=a[kop/10];

c[2]=a[kop%10];

time++;

c[1]=a[time/10];

c[0]=a[time%10];

i=0;

TH0=0;

TL0=0;

}

}