智能小车源代码Word下载.docx
《智能小车源代码Word下载.docx》由会员分享,可在线阅读,更多相关《智能小车源代码Word下载.docx(16页珍藏版)》请在冰豆网上搜索。
sbitKey_A=P2^0;
//B键信号端对应D0
sbitKey_B=P2^1;
//D键信号端对应D1
sbitKey_C=P2^2;
//C键信号端对应D2
sbitKey_D=P2^3;
//C键信号端
voiddelay0(inta);
voiddelay15us(void);
voiddelay1ms(intz);
voiddi();
//蜂鸣器函数声明
unsignedinttime;
//用于存放定时器时间值
unsignedintS;
//用于存放距离的值
charflag=0;
//量程溢出标志位
charf1,f2,f3,f4,n0;
inta;
intn;
//运行次数判断标志
ints_left,s_right;
voidDelay10us(unsignedchari)
{
unsignedcharj;
do{
j=10;
_nop_();
}while(--j);
}while(--i);
}
/*********************************************************************************************/
/*****************电机程序********************/
/********************************************************************************************/
voidloop()
{
IN1=1;
//左电机
IN2=0;
IN3=1;
//右电机
IN4=0;
}
voidrunfront()
IN3=0;
IN4=1;
//小车后退函数
voidrunback()
IN1=0;
IN2=1;
//小车左转
voidrunleft()
//小车右转
voidrunright()
////小车左后转
//voidrunbackleft()
//{
//IN1=0;
//IN2=0;
//IN3=0;
//IN4=1;
//}
////小车右后转
//voidrunbackright()
//IN1=1;
//IN4=0;
//小车停止函数
voidstop()
/***********蓝牙程序************/
voiddelay(unsignedinta)
unsignedintb;
for(;
a>
0;
a--)
for(b=3;
b>
b--);
//左电机转
voidleft_motor_runfront(unsignedinta)
delay(a);
delay(100-a);
voidright_motor_runfront(unsignedinta)
voidleft_motor_back(unsignedinta)
voidright_motor_back(unsignedinta)
voidleft_motor_stop()
voidright_motor_stop()
//PWM调速
voidPWM_RUNFRONT(unsignedinta,unsignedintb)//a属于0~100
left_motor_runfront(a);
right_motor_runfront(b);
voidPWM_RUNBACK(unsignedinta,unsignedintb)//a属于0~100
left_motor_back(a);
right_motor_back(b);
voidPWM_RUNLEFT(unsignedinta)//a属于0~100
right_motor_runfront(a);
left_motor_stop();
voidPWM_RUNRIGHT(unsignedinta)//a属于0~100
right_motor_stop();
voidbluestop()
left_motor_stop();
right_motor_stop();
voidUsartConfiguration()
SCON=0X50;
//设置为工作方式1
TMOD=TMOD|0x21;
//设置计数器工作方式2
PCON=0X80;
//波特率加倍
TH1=0XFA;
//计数器初始值设置,注意波特率就是4800的
TL1=0XFA;
ES=1;
//打开接收中断
EA=1;
//打开总中断
TR1=1;
TH0=0;
TL0=0;
ET0=1;
//打开计数器
/*******************************************************************************
*函数名:
Delay(unsignedinti)
*函数功能:
延时函数
*输入:
无
*输出:
*******************************************************************************/
voidUsart()interrupt4
receiveData=SBUF;
//出去接收到的数据
RI=0;
//清除接收中断标志位
if(receiveData==0x66)
{
low_velosity=1;
high_velosity=0;
//write_com(0x80);
}
if(receiveData==0x77)
low_velosity=0;
high_velosity=1;
/***********舵机程序************/
voiddelayx(intt)
charj;
t>
t--)
for(j=19;
j>
j--);
voiddegree0()
inti;
for(i=0;
i<
10;
i++)
PWM=1;
delayx(10);
//1ms
PWM=0;
delayx(390);
//19ms
voiddegree90()
delayx(24);
//50
delayx(376);
//18、5ms
voiddegree180()
15;
delayx(40);
//1、5ms
delayx(360);
/**************超声波程序**************/
/****A键被按下后,前进*****/
voidCount1(void)
time=TH1*256+TL1;
TH1=0;
TL1=0;
S=(time*1、7)/100;
n++;
if(S<
=30&
&
n==1)
{
led1=0;
stop();
degree0();
di();
if(S>
30&
n==1)
led1=1;
runfront();
n=0;
if(n==2)
s_left=S;
degree180();
if(n==3)
s_right=S;
degree90();
//标志位清零
if(s_left>
s_right)
{
led2=1;
delay1ms(50);
led2=0;
runright();
delayx(1250);
}
else
led3=1;
delay(800);
led3=0;
delay(500);
runleft();
/********超声波高电平脉冲宽度计算程序***************/
voidTimer_Count(void)
//开启计数
while(RX);
//当RX为1计数并等待
TR1=0;
//关闭计数
//Count1();
//计算
/********************************************************/
voidStartModule()//启动模块
TX=1;
//启动一次模块
Delay10us
(2);
TX=0;
/********************主程序*******************/
voidmain(void)
UsartConfiguration();
while
(1)
if(k1==0&
n0==0)
delay1ms(20);
if(k1==0)
{
n0++;
}
}
elseif(k1==0&
n0==1)
n0--;
if(n0==0)
if(Key_B==0&
Key_D==0&
Key_C==0&
Key_A==1)//A键被按下
f1=1;
f2=0;
f3=0;
f4=0;
elseif(Key_A==0&
Key_B==1&
Key_C==0)//B键被按下
f1=0;
f2=1;
elseif(Key_B==0&
Key_A==0&
Key_C==1)//C键被按下
{
f3=1;
elseif(Key_D==1&
Key_B==0&
Key_C==0)//D键被按下
f4=1;
if(f1)
StartModule();
for(a=951;
if(RX==1)
{
Timer_Count();
Count1();
}
if(f2)
runback();
if(f3)
loop();
if(f4)
stop();
if(n0==1)
if(low_velosity)
switch(receiveData)
caseleftdata:
PWM_RUNLEFT(30);
break;
caserightdata:
PWM_RUNRIGHT(30);
caseforwarddata:
PWM_RUNFRONT(64,70);
casebackdata:
PWM_RUNBACK(64,70);
casestopdata:
bluestop();
if(high_velosity)
PWM_RUNLEFT(50);
PWM_RUNRIGHT(50);
PWM_RUNFRONT(94,100);
PWM_RUNBACK(94,100);
stop();
/*****************蜂鸣器*********************/
voiddi()
150;
Beep=1;
delay0(20);
Beep=0;
voiddelay0(inta)
inti;
for(i=a;
i>
0;
i--)
for(j=200;
j>
j--);
voiddelay1ms(intz)//延时1ms
intx,y;
for(x=z;
x>
x--)
for(y=110;
y>
y--);