声音导引小车程序.docx
《声音导引小车程序.docx》由会员分享,可在线阅读,更多相关《声音导引小车程序.docx(16页珍藏版)》请在冰点文库上搜索。
声音导引小车程序
#include//包含51相关的头文件
typedefunsignedcharuchar;//重定义char数据类型
typedefunsignedintuint;//重定义int数据类型
#defineShowPortP2//定义数码管显示端口
ucharcodeLedShowData[]={0x03,0x9F,0x25,0x0D,0x99,//定义数码管显示数据
0x49,0x41,0x1F,0x01,0x19};//0,1,2,3,4,5,6,7,8,9
staticunsignedintRecvData;//定义接收红外数据变量
staticunsignedcharCountData;//定义红外个数计数变量
staticunsignedcharAddData;//定义自增变量
staticunsignedintLedFlash;//定义闪动频率计数变量
unsignedcharHeardData;//定义接收到数据的高位变量
bitRunFlag=0;//定义运行标志位
bitEnableLight=0;//定义指示灯使能位
/***********完成基本数据变量定义**************/
sbitS1State=P1^0;//定义S1状态标志位
sbitS2State=P1^1;//定义S2状态标志位
sbitB1State=P1^2;//定义B1状态标志位
sbitIRState=P1^3;//定义IR状态标志位
sbitRunStopState=P1^4;//定义运行停止标志位
//sbitFontIRState=P1^5;//定义FontIR状态标志位
//sbitLeftIRState=P1^6;//定义LeftIR状态标志位
//sbitRightIRState=P1^7;//定义RightIRState状态标志位
/*************完成状态指示灯定义*************/
sbitS1=P3^2;//定义S1按键端口外部中断0
sbitS2=P3^4;//定义S2按键端口定时器0的外部输入
/*************完成按键端口的定义*************/
//sbitLeftLed=P2^0;//定义前方左侧指示灯端口
//sbitRightLed=P0^7;//定义前方右侧指示灯端口
/*************完成前方指示灯端口定义*********/
//sbitLeftIR=P3^5;//定义前方左侧红外探头
//sbitRightIR=P3^6;//定义前主右侧红外探头
//sbitFontIR=P3^7;//定义正前方红外探头
/*************完成红外探头端口定义***********/
sbitM1A=P0^0;//定义电机1正向端口
sbitM1B=P0^1;//定义电机1反向端口
sbitM2A=P0^2;//定义电机2正向端口
sbitM2B=P0^3;//定义电机2反向端口
/*************完成电机端口定义***************/
//sbitB1=P0^4;//定义话筒传感器端口
//sbitRL1=P0^5;//定义光敏电阻端口
sbitSB1=P0^6;//定义蜂鸣端口
/*********完成话筒,光敏电阻,蜂鸣器.端口定义**/
sbitIR1=P3^3;//定义红外接收端口
/*********完成红外接收端口的定义*************/
voidDelay()//定义延时子程序
{uintDelayTime=30000;//定义延时时间变量
while(DelayTime--);//开始进行延时循环
return;//子程序返回
}
/*voiddelaysb1()//3ms
{
uintdelaysb1=3000;
while(delaysb1--);
return;
}*/
voidControlCar(ucharCarType)//定义小车控制子程序
{
M1A=0;//将电机1正向电平置低
M1B=0;//将电机1反向电平置低
M2A=0;//将电机2正向电平置低
M2B=0;//将电机2反向电平置低
//LeftLed=1;//关闭前方左侧指示灯
//RightLed=1;//关闭前方右侧指示灯
Delay();//将此状态延时一段时间
switch(CarType)//判断小车控制指令类型
{case1:
//前进//判断是否是前进
{M1A=1;//将电机1正向端口置高
M2A=1;//将电机2正向端口置高
//delaytime();
//SB1=~SB1
ShowPort=LedShowData[1];//数码管显示前进状态
break;//退出判断
}
case2:
//后退//判断是否是后退
{M1B=1;//将电机1反向端口置高
M2B=1;//将电机2反向端口置高
ShowPort=LedShowData[2];//数码管显示后退状态
//RightLed=0;//将前方右侧指示灯置低(亮)
//LeftLed=0;//将前方左侧指示灯置低(亮)
break;//退出判断
}
case3:
//左转//判断是否是左转
{M1B=1;//将电机1反向端口置高
M2A=1;//将电机2正向端口置高
ShowPort=LedShowData[3];//数码管显示左转状态
SB1=1;
ET1=0;
//LeftLed=0;//将前方左侧指示灯置低(亮)
break;//退出判断
}
case4:
//右转//判断是否是右转
{M1A=1;//将电机1正向端口置高
M2B=1;//将电机2反向端口置高
ShowPort=LedShowData[4];//数码管显示右转状态
//RightLed=0;//将前方右侧指示灯置低(亮)
break;//退出判断
}
default:
//默认情况下的判断
{
break;//直接退出判断
}
}
}
voidTimer0_IR1()interrupt1using3//定义红外定时器子程序26us
{
TH0=0xFF;//向定时器定时间寄存器填入高八位值
TL0=0x19;//向定时器定时间寄存器填入低八位值
AddData++;//自增变量加1
}
voidTime1_SB1()interrupt3
{
//uinttemptime=3000;
TMOD=0x01;//设置定时/计数器模式T1为16位定时器
TH1=0xFC;//给定时器1高八位初始化初值
TL1=0x18;//给定时器1低八位初始化初值时间为100us
TR1=0;
//while(temptime--);
SB1=~SB1;
TR1=1;
}
voidInt1_IR1()interrupt2//定义红外接收中断子程序外部中断
{
TR1=0;//将定时/计数器1关闭
IRState=!
IRState;//将红外接收指示灯状态取反
if(4==AddData)//0//判断接收到的数据是0
{
RecvData=RecvData|0;//判断到0就将当前位写0
RecvData=RecvData<<1;//将当前位向左移动1位
}
elseif(8==AddData)//1//判断接收到的数据是1
{
RecvData=RecvData|1;//将当前位写1
RecvData=RecvData<<1;//将当前位向左移动1位
}
CountData++;//将红外接收位计数器加1
if(CountData==8)//判断是否接收到8位数据
{
HeardData=RecvData;//是8位数据时,则将数据暂存到高位变量中
}
elseif(CountData==16)//判断是否接收到16位数据
{
ET0=0;//关闭红外定时器0
EX1=0;//关闭红外外部中断1
TR1=1;//打开定时/计数器1
AddData=0;//定时时间间隔变量清零
if(HeardData==226||HeardData==112)//判断用户码是否正确
{
HeardData=RecvData;//取出接收到的低八位数据
switch(HeardData)//判断低八位数据的值下列那一位
{
case32:
//电源//说明按下了电源键
{//在这里填写你自己的代码//根据你的功能自己写
ControlCar(8);//将小车停止
RunFlag==1;//将运行标志位置1
break;//返回
}
case46:
//TV/AV//说明按下了TV/AV键
{//在这里填写你自己的代码//根据你的功能自己写
break;//返回
}
case0:
//1//说明按下数字1键
{ShowPort=LedShowData[1];//数码管显示数字1
ControlCar
(1);//将小车置于前进状态
break;//返回
}
case8:
//2//说明按下了数字2键
{ShowPort=LedShowData[2];//数码管显示数字2
ControlCar
(2);//将小车置于后退状态
break;//返回
}
case4:
//3//说明按下了数字3键
{ShowPort=LedShowData[3];//数码管显示数字3
ControlCar(3);//将小车置于左转状态
SB1=1;
ET1=0;
//EA=0;
break;//返回
}
case12:
//4//说明按下了数字4键
{ShowPort=LedShowData[4];//数码管显示数字4
ControlCar(4);//将小车置于右转状态
break;//返回
}
case2:
//5//说明按下了数字5键
{ShowPort=LedShowData[5];//数码管显示数字5
break;//返回
}
case10:
//6//说明按下了数字6键
{ShowPort=LedShowData[6];//数码管显示数字6
break;//返回
}
case6:
//7//说明按下了数字7键
{ShowPort=LedShowData[7];//数码管显示数字7
break;//返回
}
case14:
//8//说明按下了数字8键
{ShowPort=LedShowData[8];//数码管显示数字8
break;//返回
}
case64:
//9//说明按下了数字9键
{ShowPort=LedShowData[9];//数码管显示数字9
break;//返回
}
case72:
//0/30//说明按下0/30键
{ShowPort=LedShowData[0];//数码管显示数字0
break;//返回
}
case68:
//10+//说明按下10+键
{//在这里填写你自己的代码//根据你的功能写代码
break;//返回
}
case76:
//20+//说明按下了20+键
{//在这里填写你自己的代码//根据你的功能写代码
break;//返回
}
case36:
//CH-//说明按下了CH-键
{//在这里填写你自己的代码//根据你的功能写代码
break;//返回
}
case40:
//CH+//说明按下了CH+键
{//在这里填写你自己的代码//根据你的功能写代码
break;//返回
}
}
}
RecvData=0;//将接收到的数据清零
CountData=0;//将接收计数器清零
HeardData=0;//将接收高低数据变量清零
return;//返回
}
AddData=0;//将定时器计数器清零
ET0=1;//打开定时器中断
}
/*voidComBreak()interrupt4//定义串口通信子程序
{unsignedcharRecvData;//定义串口数据接收变量
if(RI==1)//判断是否接收数据
{RecvData=SBUF;//将接收到的数据放入暂时变量
if(RecvData<10)//判断接收到的数据是否小于10
{
ShowPort=LedShowData[RecvData];//将接收到的数据通过数码管显示出来
ControlCar(RecvData);//将串口数据置于小于状态
}
SBUF=RecvData;//向电脑返回当前接收到的数据
RI=0;//清除接收中断标志位
}
if(TI==1)//判断是否是发送中断
{
TI=0;//清除发送中断标志位
}
}**/
voidmain(void)//主程序入口
{
bitExeFlag=0;//定义可执行标志位变量
RecvData=0;//将接收变量数值初始化
CountData=0;//将计数器变量数值初始化
AddData=0;//将定时器计数器初始化
HeardData=0;//将高低计数器初始化
LedFlash=1000;//对闪灯数据进行初始化
TMOD=0x01;//选择定时器0为两个16位定时器
TH0=0xFF;//对定时器进行计数值进行初始化
TL0=0x19;//同上,时间大约为25uS
TR0=1;//同意开始定时器0
EX1=1;//同意开启外部中断1
IT1=1;//设定外部中断1为低边缘触发类型
ET0=0;//,,,,,,,,,,,,,,,禁止T0中断
//SCON=80;//设置串口模式为8位数据
TMOD=0x01;//设置定时/计数器模式T1为16位定时器
TH1=0xFC;//给定时器1高八位初始化初值
TL1=0x18;//给定时器1低八位初始化初值时间为100us
TR1=1;//开启定时器1
//ES=1;//开启串口通信功能
//REN=1;*///开启接收中断标志
EA=1;
ET1=1;//总中断开启
ControlCar
(1);//将小车置于前进状态
ShowPort=LedShowData[0];//数码管显示数字0
while
(1)//程序主循环
{
while(LedFlash--)//闪灯总延时
{
/*if(RL1==0)//判断光敏电阻的状态
{RightLed=1;//将前方右侧指示灯点亮
LeftLed=1;//将前方左侧指示灯点亮
}
else//在光敏电阻为不通的状态下
{
RightLed=0;//将前方右侧指示灯熄灭
LeftLed=0;//将前方左侧指示灯熄灭
}*/
if(IR1==0)//判断延时期间是否有红外信号输入
{ExeFlag=1;//将可执行标志位置1
}
if(S1==0)//判断是否有S1按下
{
ControlCar(8);//将小车置于停止状态
RunFlag==1;//改变小车运行状态标志位
S1State=!
S1State;//改变S1按键标志位
gotoNextRun;//跳转到NextRun标签
}
if(S2==0)//判断是否有S2按下
{
ControlCar
(1);//将小车置于前进状态
RunFlag==0;//改变小车运行状态标志位
S2State=!
S2State;//改变S2按键标志位
gotoNextRun;//跳转到NextRun标签
}
/*FontIRState=FontIR;//前方红外指示灯显示正前方红外探头状态
LeftIRState=LeftIR;//左侧红外指示灯显示前方左侧红外探头状态
RightIRState=RightIR;*///右侧红外指示灯显示前主右侧红外探头状态
/*if(FontIR==0||LeftIR==1||RightIR==1)//判断正前方,前左侧,前右侧红外探头状态
{ControlCar
(2);//改变小车状态为后退
SB1=!
SB1;//将蜂鸣器取反
Delay();//调用延时子程序
SB1=!
SB1;//将蜂鸣器取反
Delay();//调用延时子程序
SB1=!
SB1;//将蜂鸣器取反
Delay();//调用延时子程序
SB1=!
SB1;//将蜂鸣器取反
Delay();//调用延时子程序
SB1=!
SB1;//将蜂鸣器取反
Delay();//调用延时子程序
SB1=!
SB1;//将蜂鸣器取反
Delay();//调用延时子程序
SB1=!
SB1;//将蜂鸣器取反
ControlCar(3);//改变小车左转状态
Delay();//调用延时子程序
SB1=!
SB1;//将蜂鸣器取反
Delay();//调用延时子程序
SB1=!
SB1;//将蜂鸣器取反
Delay();//调用延时子程序
SB1=!
SB1;//将蜂鸣器取反
Delay();//调用延时子程序
SB1=!
SB1;//将蜂鸣器取反
Delay();//调用延时子程序
SB1=!
SB1;//将蜂鸣器取反
ControlCar
(1);//改变小车为前进状态
SB1=1;//关闭蜂鸣器声音
}*/
/*if(B1==0)//判断是否有话筒信号输入
{if(RunFlag==0)//判断小车当前的运行标志位
{ControlCar(8);//将小车置于停止状态
RunFlag=1;//改变小车运行标志位
}
else
{ControlCar
(1);//将小车置于前进状态
RunFlag=0;//改变小车运行标志位
}
B1State=!
B1State;//将话筒信号指示灯取反
}*/
}
NextRun:
//跳转标签
if(RunFlag==0)//判断运行标志位
{
RunStopState=!
RunStopState;//改变小车运行停止状态标志位
}
else
{
RunStopState=1;//将运行停止状态标志位置1
}
LedFlash=1000;//运行闪动时间重设定
if(ExeFlag==0)//判断可执行标志位
{
EX1=1;//开启外部中断1
TR1=1;//开启定时/计数器1
}
ExeFlag=0;//可执行标志位置0
}
}