灭火小车程序,能指点我一下流程图思路不,谢谢。
#include "STC12C5A.h" #include "Cartest.h"
#define BIT0 0x01
#define BIT1 0x02
#define BIT2 0x04
#define BIT3 0x08
#define BIT4 0x10
sbit Flame1=P0^0; //从左到右 依次为1--5;
sbit Flame2=P0^1;
sbit Flame3=P0^2;
sbit Flame4=P0^3;
sbit Flame5=P0^4;
sbit SPK=P0^7;
volatile int BeepTime; //全局变量控制时间
volatile int Half_BeepTime; //全局变量控制时间
/*------------------------------------------------
设定蜂鸣器发声时间长度
------------------------------------------------*/
void Set_Beep( int Time)
{
BeepTime=Time;//设定时间长度
Half_BeepTime= Time/4*3;
}
/*------------------------------------------------
初始化定时器
------------------------------------------------*/
void InitTimer()
{
TMOD = 0x01; //set timer0 as mode1 (16-bit)
TL0 = 0; //initial timer0 low byte
TH0 = 0xff; //initial timer0 high byte
TR0 = 1; //timer0 not start running
ET0 = 1; //enable timer0 interrupt
EA = 1; //open global interrupt switch
}
/***********************************************************************/
// 函数名称 void main (void) //
// 返回值: 无 //
// 功能: 小车寻找火源 //
// 使用资源: 电机控制 定时器 蜂鸣器 火焰传感器 //
// 作者:南京雍异电子科技有限公司 刘江凯 //
/***********************************************************************/
void main (void)
{
char FlameConter1=0,FlameConter2,FlameConter3,FlameConter4,FlameConter5;
P1=0xff; //电机使能部分
Set_Beep(7000);//发声的频率
InitTimer();
while(1)
{
CarLittleLeft();
while(((Flame1)|(Flame2)|(Flame3)|(Flame4)|(Flame5))==1) //只要有火1
{
/***********************************************************************
1偏离火焰纠正航向
**********************************************************************/
//最两边的有火 调整头朝向蜡烛
if(Flame1==1)//发现火焰在最左边
{
while((Flame3|Flame2)==0) CarTurnLeft(); //向左转 直至中间看到
}
if(Flame5==1) // 发现火焰在最右边
{
while((Flame3|Flame4)==0) CarTurnRight();// 向右转 直至中间看到
}
//靠近中间的侧面有火
if(Flame2==1)//发现火焰在左边
{
while((Flame3|Flame4)==0) {CarLittleLeft(); } //向左转 直至中间看到
}
if(Flame4==1)// 发现火焰在右边
{
while((Flame3|Flame2)==0) {CarLittleRight(); }// 向右转 直至中间看到
}
//侧面有火
while (((Flame1&Flame2)==1)&&((Flame4|Flame5)==0) ) {CarTurnLeft(); }
while (((Flame4&Flame5)==1)&&((Flame1|Flame2)==0) ) {CarTurnRight(); }
/***********************************************************************
2前进
**********************************************************************/
CarGo();//发现火焰在中间 前进
Delayms(50);
/***********************************************************************
3修正蜂鸣器部分
**********************************************************************/
{
FlameConter1=Flame1;FlameConter2=Flame2;FlameConter3=Flame3;
FlameConter4=Flame4;FlameConter5=Flame5;
}//便于数值计算 赋值
//控制蜂鸣器发声的频率
switch (FlameConter1+FlameConter2+FlameConter3+FlameConter4+FlameConter5)
{
case 0: Set_Beep(7000); break;
case 1: Set_Beep(6000); break;
case 2: Set_Beep(5000); break;
case 3: Set_Beep(4000); break;
case 4: Set_Beep(3000); break;
case 5: Set_Beep(900); break;//找到火了报警
default: break;
}
/***********************************************************************
4发现火源
**********************************************************************/
if(((Flame2&Flame3&Flame4&Flame5&Flame1)==1))
{
CarGo();
Delayms(100);
CarStop(); //找到火了报警
while(1);
}
}
}
}
/*------------------------------------------------
定时器中断函数 如果 时间没有到
就将喇叭每隔250us取反一次(频率)重装定时器
发声时间长度为BeepTime*250us
------------------------------------------------*/
void tm0_isr() interrupt 1 using 1
{
static int Counter=0,Half_Counter;
Counter--;
if(Counter>Half_Counter)
{
TL0 = 0; //reload timer0 low byte
TH0 = 0xff; //reload timer0 high byte
SPK=!SPK;
}
else if(Counter>0) //响完了 该沉默了
{
TL0 = 0; //reload timer0 low byte
TH0 = 0xff; //reload timer0 high byte
SPK=0;
}
else {Counter=BeepTime; Half_Counter=Half_BeepTime;}
}