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

📄 finish.c

📁 能完成对小车的往返
💻 C
字号:
#include "HeadFile.h"
/**************************************************************************
函 数 名:Delay()
调用函数:无
参    数:time
返 回 值:无
函数功能:延时
***************************************************************************/

void Delay(uchar time)
{
    while (time--)
	{
	    _nop_();
	}
}


/**************************************************************************
函 数 名:SomeNOP()
调用函数:无
参    数:time
返 回 值:无
函数功能:延时time个机器周期
***************************************************************************/

void SomeNOP(uint time)
{
    while (time--)
	{
	    _nop_();
	}
}


/**************************************************************************
函 数 名:Show()
调用函数:无
参    数:number, index
返 回 值:无
函数功能:在指定位置显示一个数字
***************************************************************************/

void Show(uint number, uchar index)
{
    uchar *p_Address[8];  //指针数组保存8个数码管的地址

	p_Address[0] = HC574_0;  //对指针数组的初始化

	p_Address[1] = HC574_1;  //对指针数组的初始化

	p_Address[2] = HC574_2;  //对指针数组的初始化

	p_Address[3] = HC574_3;  //对指针数组的初始化

	p_Address[4] = HC574_4;  //对指针数组的初始化

	p_Address[5] = HC574_5;  //对指针数组的初始化

	p_Address[6] = HC574_6;  //对指针数组的初始化

	p_Address[7] = HC574_7;  //对指针数组的初始化

    if (number == 0)  
	{
	    *p_Address[index] = NumTab[0];
	}/*end if*/

	while (number > 0)
	{
	    *p_Address[index] = NumTab[number%10];

		index++;

		if (index > 7)
		{
		     index = 0;

			 *p_Address[index] = NumTab[number%10]; 
		}/*end if*/

		number /= 10;
	}/*end while*/

}


/**************************************************************************
函 数 名:InitialLED()
调用函数:无
参    数:无
返 回 值:无
函数功能:将LED全部清零
***************************************************************************/

void InitialLED(void)
{
    uchar i;

    uchar *p_Address[8];

	p_Address[0] = HC574_0;

	p_Address[1] = HC574_1;

	p_Address[2] = HC574_2;

	p_Address[3] = HC574_3;

	p_Address[4] = HC574_4;

	p_Address[5] = HC574_5;

	p_Address[6] = HC574_6;

	p_Address[7] = HC574_7;

	for (i=0; i<8;i++)
	{
	    *p_Address[i] = 0xff;  //将所有的数码管都清零
	}
}


/**************************************************************************
函 数 名:CheckStatus()
调用函数:无
参    数:无
返 回 值:0或1
函数功能:检测小车是否离开缓冲区
***************************************************************************/

uchar CheckStatus(void)
{
   // ET0 = 1;  //开定时器1中断

    if (g_PulseCount==4 | g_PulseCount==10)  //到第四个或者是第十个黑线处跳出
	{
		g_Time08sFLAG = 0;

        if (g_PulseCount == 5)
		{
		    g_PulseCount = 4;
		}

		else if (g_PulseCount == 11)
		{
		    g_PulseCount = 10;
		}

	    return 1;
	}
    else if (g_Time08sFLAG > 8)  //如果在缓冲区的时间大于8秒也跳出缓冲区
	{
		g_Time08sFLAG = 0;

	    return 1;   
	}
	else return 0;
}

/**************************************************************************
函 数 名:FastForward()
调用函数:无
参    数:无
返 回 值:无
函数功能:向前快速前进
***************************************************************************/

void FastForward(void)
{
    p14 = 0;

	p15 = 1;
}

/**************************************************************************
函 数 名:FastReverse()
调用函数:无
参    数:无
返 回 值:无
函数功能:向后快速前进
***************************************************************************/

void FastReverse(void)
{
    p14 = 1;

	p15 = 0;
}


/**************************************************************************
函 数 名:SlowForward()
调用函数:CheckStatus()
参    数:无
返 回 值:无
函数功能:向前慢速前进
***************************************************************************/

void SlowForward(void)
{
    p15 = 1;

	while (1)
	{
	    p14 = ~p14;

		Delay(50);

		if (CheckStatus())  //检测状态当满足条件时跳出
		{
		    break;
		}
	}
}

/**************************************************************************
函 数 名:SlowReverse()
调用函数:CheckStatus()
参    数:无
返 回 值:无
函数功能:向后慢速前进
***************************************************************************/

void SlowReverse(void)
{
    p14 = 1;

	while (1)
	{
	    p15 = ~p15;

		Delay(100);

		if (CheckStatus())  //检测状态当满足条件时跳出
		{
		    break;
		}
	}
}

/**************************************************************************
函 数 名:Stop()
调用函数:无
参    数:无
返 回 值:无
函数功能:停止前进
***************************************************************************/
void Stop(void)
{
    p14 = 1;

	p15 = 1;
}


/**************************************************************************
函 数 名:DetectPort0()
调用函数:SomeNOP()
参    数:无
返 回 值:1或者0
函数功能:用来检p10口测脉冲宽度是否达到要求
***************************************************************************/

uchar DetectPort0(void)
{
    uchar i;

    uchar count = 0;  //计数变量用来计算脉冲的宽度是否满足条件

	for (i=0; i<10; i++)
	{
	    if (p10 == 0)
	    {
	        count++;

		    SomeNOP(200);
	    }
	}

	if (count>4)
	{
	    return 1;
	}
	else return 0;
}

/**************************************************************************
函 数 名:DetectPort1()
调用函数:SomeNOP()
参    数:无
返 回 值:1或者0
函数功能:用来检p11口测脉冲宽度是否达到要求
***************************************************************************/

uchar DetectPort1(void)
{
    uchar i;

    uchar count = 0;  //计算脉冲宽度是否满足条件

	for (i=0; i<10; i++)
	{
	    if (p11 == 0)
	    {
	        count++;

		    SomeNOP(70);
	    }
	}

	if (count>4)
	{
	    return 1;
	}
	else return 0;
}

/*============================================================================
                              主函数
==============================================================================*/
void main(void)
{
	InitialLED();  //将数码管全部熄灭

	TMOD = 0X51;  //定时器的工作方式

    ET0 = 1;      //开定时器0

	TR0 = 1;

	ET1 = 1;      //开定时器1
	
	TR1 = 1;

	TH1 = 0XFF;    //计数器1的计数初值

	TL1 = 0XFF;

	TH0 = 0X3C;    //计数器0的计数初值

	TL0 = 0XB0;

	EX0 = 1;      //外部中断0打开

	IT0 = 1;      //外部中断0采用下降沿触发方式

	EX1 = 1;    //外部中断1打开

	IT1 = 1;     //外部中断1采用下降沿触发方式

	PX1 = 1;     //外部中断1的优先级最高

	EA = 1;         //总中断打开

    while (g_PulseCount < 3)  //到达缓冲区前快速前进
	{
	    FastForward();
	}

	SlowForward();  //到了缓冲区慢速前进

	while (g_PulseCount < 6)  //出了缓冲区快速前进
	{
	    FastForward();
	}

	while (g_Time010sFLAG != 10)  //到了终点停留10秒
	{
	    Stop();

		if (g_PulseCount > 6)
		{
		    break;
		}
	}

	while (g_PulseCount < 9)  //到达缓冲区前快速后退
	{
	    FastReverse();
	}

	SlowReverse();  //到达缓冲区慢速后退

	while (g_PulseCount < 12)
	{
	    FastReverse();
	}

	Stop();  //到起跑线处停止

	ET0 = 0;


    while (1)
    {
        ;
    }
}

/**************************************************************************
函 数 名:Extern0Interrupt()
调用函数:无
参    数:无
返 回 值:无
函数功能:外部中断0
***************************************************************************/

void Extern0Interrupt(void) interrupt 0
{
    EX0 = 0;

	EA = 0;

	if (DetectPort1())  //如果脉冲宽度满足要求
	{
	    g_TirePulseCount++;
	}
//	Show(g_TirePulseCount, 4);  //显示脉冲个数,最后将去掉这句

	EX0 = 1;

	EA = 1;


}

/**************************************************************************
函 数 名:Time0Interrupt()
调用函数:无
参    数:无
返 回 值:无
函数功能:定时中断0
***************************************************************************/

void Time0Inerrupt(void) interrupt 1 
{
    static uchar count;  //用于记数

	uchar low_second;  //秒的低位

	uchar high_second;  //秒的高位

	uchar minute;  //分

	ET0 = 0;

	EA = 0;	

	count++;

	if (count == 10)
	{
	    *HC574_2 = 0XF6;  //半秒钟时显示两点
	}

	if (count == 20)  //到一秒时
	
	{	    
	    count = 0;

		low_second++;

		if (g_PulseCount == 3 | g_PulseCount == 9)  //如果到了缓冲区8秒定时器就开始计时
		{
		    g_Time08sFLAG++;
		}

		if (g_PulseCount == 4 | g_PulseCount == 10)  //如果出了缓冲区就停止计时并将计数器标志清零
		{
		    g_Time08sFLAG = 0;
		}

		if (g_PulseCount == 6)  //如果到了终点线则10秒计时器开始计时
		{
		    g_Time010sFLAG++;
		}

		if (low_second == 10)  //秒低位满十
		{
		    low_second = 0;

			high_second++;

			if (high_second == 6)  //秒高位满六
			{
			    high_second = 0;

				minute++;

				if (minute == 10)  //计满十分钟
				{
				    minute = 0;
				}/*if*/
			}/*if*/
		}/*if*/

		Show(low_second, 0);  //显示秒低位

 	    Show(high_second, 1);  //显示秒高位

	    Show(minute, 3);  //显示分

		*HC574_2 = 0XFF;  //将半秒送出的两点清除
		
	}/*if*/

	TH0 = 0x3c;  //初值重载
	TL0 = 0xb0;  //初值重载

	ET0 = 1;   

	EA = 1;
}/*Time0Interrupt()*/

/**************************************************************************
函 数 名:Extern1Interrupt()
调用函数:无
参    数:无
返 回 值:无
函数功能:外部中断1
***************************************************************************/

void Extern1Interrupt(void) interrupt 2
{
    EX1 = 0;

	EA = 0;

	p12 = 0;  //检测到挡板就转向

	p13 = 1;

	g_Time010sFLAG++;

	Show(g_Time010sFLAG, 7);

	SomeNOP(5000);

	p12 = 1;

	p13 = 1;

	EX1 = 1;

	EA = 1;
}

/**************************************************************************
函 数 名:Time1Interrupt()
调用函数:无
参    数:无
返 回 值:无
函数功能:计数中断1
***************************************************************************/

void Time1Interrupt(void) interrupt 3
{
    ET1 = 0;

	EA = 0;

	if (DetectPort0())  //如果脉冲宽度满足要求
	{
	    g_PulseCount++;  //脉冲个数加一 
	}

//	Show(g_PulseCount, 4);  //显示脉冲个数

	TH1 = 0XFF;  //初值重载

	TL1 = 0XFF;  //初值重载

	ET1 = 1;

	EA = 1;
}








⌨️ 快捷键说明

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