📄 finish.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 + -