⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 newcar.c

📁 一个可沿地面黑线行走
💻 C
字号:
#include <at89x52.h>

data unsigned int i=0,j=0,k=0,dispStep=0;                //循环变量
data unsigned long timeNum=0;                                   //8位定时器累加计数
data bit how=0,what=0,set=0,flash=0,enable=0,goBack=0;                   //判断位
data char cm=0,m=5,step=0,runStep=0;                                             //米/厘米存储
data char num1=0,num2=0,num3=0,num4=0,num5=0,num6=0,num7=0,num8=0,num=0;                    //拆字码
data char disp1=0xc0,disp2=0xc0,disp3=0xc0,disp4=0xc0,disp=0xc0;//字形码
data unsigned long howLong=0;//,howSpeed=0,run=0;                    //脉冲计数值/实时显示路程
data float run=0.0,howSpeed=0.0;
//拆字模块//
void setNum(void)
{
	num1=m/10;
	num2=m-num1*10;
	num3=cm/10;
	num4=cm-num3*10;

	return;
}
//取字形码模块//
char setDisp(num)                                               
{
	switch(num)
	{
		case 0:disp=0xc0;
			break;
		case 1:disp=0xf9;
			break;
		case 2:disp=0xa4;
			break;
		case 3:disp=0xb0;
			break;
		case 4:disp=0x99;
			break;
		case 5:disp=0x92;
			break;
		case 6:disp=0x82;
			break;
		case 7:disp=0xf8;
			break;
		case 8:disp=0x80;
			break;
		case 9:disp=0x90;
			break;
	}

	return disp;
}

void main(void)
{
	EA=1;
        TMOD=0x20;

	ET0=1;
	TH0=0xec;
	TL0=0x78;
	TR0=1;

        ET1=1;
        TH1=0x00;
        TL1=0x00;

        IT0=1;

firstRun:P2=0x0f;
         P1_1=0;
		 P1_2=0;
		 P1_3=1;
		 P1_4=1;

         enable=1;
		 timeNum=0;
         how=0;
		 what=0;
		 goBack=0;
		 howLong=0;
		 howSpeed=0.0;
		 run=0.0;
		 k=0;

//独立式键盘检测//
        while(P2_0!=0)
	{
		if(P2_3==0)
		{
			for(i=0;i<1000;i++){;}
			if(P2_3==0)
			{
				while(P2_3==0){;}

				if(how==0)
				{
					m++;
					if(m>10){m=5;}
				}
				else
				{
                                        if(m!=10)
                                        {
                                                cm++;
					        if(cm>99){cm=0;}
                                        }
				}

				continue;
			}
		}

		if(P2_2==0)
		{
			for(i=0;i<1000;i++){;}
			if(P2_2==0)
			{
			        while(P2_2==0){;}
                                
				if(how==0)
				{
					m--;
					if(m<5){m=10;}
				}
				else
				{
                                        if(m!=10)
                                        {
                                                cm--;
					        if(cm<0){cm=99;}
                                        }
				}

				continue;
			}
		}

		if(P2_1==0)
		{
			for(i=0;i<1000;i++){;}
			if(P2_1==0)
			{
				while(P2_1==0){;}

				if(how==0)
				{
					how=1;
				}
				else
				{
					how=0;
				}

				continue;
			}
		}

		ET0=0;
                
                set=0;
		setNum();
		disp1=setDisp(num1);
		disp2=setDisp(num2);
		disp3=setDisp(num3);
		disp4=setDisp(num4);
                
		ET0=1;
	}
//确定键是否按下//
        for(i=0;i<1000;i++){;}
        if(P2_0==0)
        {
	       while(P2_0==0){;}
	       goto runGo;
        }
        else
        {
                goto firstRun;
        }

runGo:  enable=0;
        howLong=(m*100.0+cm)/1.55;

//等待声音信号//        	
        while(P1_5==1){;}
        
        //disp1=0xc0;disp2=0xc0;disp3=0xc0;disp4=0xc0;
		disp1=0xbf;disp2=0xbf;disp3=0xbf;disp4=0xbf;
        EX0=1;
        TR1=1;
//寻迹黑线模块//
        while(howLong>10)
        {
//启动//
		/*if(k<500)
		{
			P1_3=1;
			P1_4=0;
			k++;
			goto fullSpeed;
		}*/
//PWM调速//       
		//P1_3=1;
		//P1_4=0;
		//===================================
		if(howLong<25)
		{
			P1_3=1;
			P1_4=1;
		}
		else
		{
			if(runStep<1)
       		{
             	P1_3=1;
             	P1_4=1;
        	}
        	else if(runStep>=1)
        	{
             	P1_3=1;
             	P1_4=0;
        	}
		}

				if((P3_4==0)&&(P3_5==0))
                {
                        P1_1=0;
                        P1_2=0;
						goBack=0;
						continue;
                }

				if((P3_4==1)&&(P3_5==1))
				{
						/*if(goBack==0)
						{
							P1_1=~P1_1;
							goBack=1;
						}*/

						continue;
				}
		
				if(P3_4==1)
                {
                        P1_1=0;
                        P1_2=1;
						goBack=0;
                }
				else if(P3_5==1)
                {
                        P1_1=1;
                        P1_2=1;
						goBack=0;
                }
        }

		P1_3=1;
        P1_4=1;
		P1_1=0;
		P1_2=0;
        //P1_0=0;
		
		EX0=0;
		TR1=0;
		howSpeed=run/(timeNum*0.256/1000.0)*10.0;
		EX0=1;

//急停/亮灯
        for(i=0;i<20000;i++)
        {
                P1_3=0;
                P1_4=1;
        }

		
		//EX0=0;
		//==========================
        //howLong=(m*100.0+cm)/1.55;
        //m=howLong*1.55/100.0;
        //cm=howLong*1.55-m*100.0;
//===============================================================================
        //howSpeed=howLong/(timeNum*0.256/1000.0)*1.55*10;
		
        //timeNum=0;
        
//交替闪烁显示路程/速度//

/*num1=run/1000;
num2=(run-num1*1000)/100;
num3=(run-num1*1000-num2*100)/10;
num4=run-num1*1000-num2*100-num3*10;*/

num5=howSpeed/1000;
num6=(howSpeed-num5*1000)/100;
num7=(howSpeed-num5*1000-num6*100)/10;
num8=howSpeed-num5*1000-num6*100-num7*10;

P1_3=1;
P1_4=1;
P1_0=0;

dispNum:while(P2_1!=0)
        {
                if(what==1)
                {
                        what=0;
                }
                else
                {
                        what=1;
                }

                if(what==0)
                {
                        ET0=0;
                        
                        set=0;
		        //setNum();
//==================================================================
				set=0;

		        disp1=setDisp(num1);
		        disp2=setDisp(num2);
		        disp3=setDisp(num3);
		        disp4=setDisp(num4);

		        ET0=1;
                }
                else
                {
                        ET0=0;
                        
                        set=1;

                disp1=setDisp(num5);
		        disp2=setDisp(num6);
		        disp3=setDisp(num7);
		        disp4=0xbf;

                        ET0=1;
                }

                for(i=0;i<32800;i++)
                {
                        if(P2_1==0){break;}
                }

				//=================================================================
				if(EX0!=0)
				{
					EX0=0;
					run+=4.65;
					num1=run/1000;
					num2=(run-num1*1000)/100;
					num3=(run-num1*1000-num2*100)/10;
					num4=run-num1*1000-num2*100-num3*10;
				}
        }
//重新开始//
        for(i=0;i<1000;i++){;}
	if(P2_1==0)
	{
		while(P2_1==0){;}
		m=5;cm=0;
                P1_0=1;
                goto firstRun;
	}
        else
        {
                goto dispNum;
        }

	return;
}
//显示程序//
void display(void) interrupt 1 using 1
{
	ET0=0;

	if(step<3)
	{
		step++;
	}
	else
	{
		step=0;
	}
//闪烁定时//       
        if(dispStep<500)
        {
                dispStep++;
        }
        else
        {
                dispStep=0;
                
                if(flash==0)
                {
                        flash=1;
                }
                else
                {
                        flash=0;
                }
        }
//扫描显示//
	switch(step)
	{
		case 0:       P2_7=0;
				P2_6=1;
				P2_5=1;
				P2_4=1;
				P0=disp1;
                                if(set==1){P0_7=0;}
				break;

		case 1:P2_7=1;
				P2_6=0;
				P2_5=1;
				P2_4=1;
				P0=disp2;
                                if(set==0){P0_7=0;}
				break;

		case 2:P2_7=1;
				P2_6=1;
				P2_5=0;
				P2_4=1;
				P0=disp3;
				break;

		case 3:P2_7=1;
				P2_6=1;
				P2_5=1;
				P2_4=0;
				P0=disp4;
				break;
	}
//闪烁判断//
        if(enable==1)
        {
                if(flash==1)
                {
                        if(how==0)
                        {
                                P2_7=1;
                                P2_6=1;
                        }
                        else
                        {
                                P2_5=1;
                                P2_4=1;
                        }
                }
        }
        
        TH0=0xec;
	TL0=0x78;
	TR0=1;
        ET0=1;

	return;
}
//路程检测//
void goRun(void) interrupt 0 using 2
{
        EX0=0;

        if(howLong!=0){howLong--;}
        
        set=0;
        //run=all-howLong*1.55;
//============================================================
		run+=1.55;
        /*num1=run/1000;
        num2=(run-num1*1000)/100;
        num3=(run-num1*1000-num2*100)/10;
        num4=run-num1*1000-num2*100-num3*10;
        
        disp1=setDisp(num1);
	disp2=setDisp(num2);
	disp3=setDisp(num3);
	disp4=setDisp(num4);*/

        EX0=1;

        return;
}
//行进时间累计//
void setSpeed(void) interrupt 3 using 3
{
        ET1=0;

		if(runStep<9)
		{
			runStep++;
		}
		else
		{
			runStep=0;
		}

        timeNum++;

        ET1=1;

        return;
}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -