欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
藍(lán)牙循跡小車源程序
[打印本頁(yè)]
作者:
liujie1997
時(shí)間:
2017-12-26 19:32
標(biāo)題:
藍(lán)牙循跡小車源程序
單片機(jī)源程序如下:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit in1=P1^0;
sbit in2=P1^1;
sbit in3=P1^2;
sbit in4=P1^3;
sbit ENA=P1^4;
sbit ENB=P1^5;
sbit led=P2^3;
uchar count_flag=0; //當(dāng)?shù)?個(gè)字符接收完成后,置count_flag=1
uchar recv_flag=0; //當(dāng)3個(gè)字符全部接收完成后,置recv_flag=1,否則recv_flag=0
uchar count_data=0; //接收到的3個(gè)字符在數(shù)組中的下標(biāo),0、1、2
uchar buffer_data[3]=0; //存放接收到的3個(gè)字符,buffer_data[count_data]為數(shù)組中的一個(gè)字符
uint pwm_data=0; //PWM方波的計(jì)數(shù)變量
uint left_pwm=0; //表征左邊電機(jī)的占空比
uint right_pwm=0; //表征右邊電機(jī)的占空比
uint PWM_CYCLE=210; //PWM方波的周期
uint temp=0; //保存P3口輸入的循線信息
uint flag=0;
uint flagxun=0; //flagxun=0,藍(lán)牙狀態(tài);flagxun=1,循線狀態(tài)
/************************毫秒延時(shí)函數(shù)**********************************************/
void delay(uint x)
{
uint m,n;
for(m=0;m<x;m++)
for(n=0;n<15;n++);
}
/**************************端口初始化函數(shù)******************************************/
void com_init()
{
P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;
}
/**************************電機(jī)初始化函數(shù)******************************************/
void dian_init()
{
in1=1;
in2=0;
in3=1;
in4=0;
ENA=0;
ENB=0;
}
/**************************定時(shí)器初始化函數(shù)******************************************/
void timer_init(void)
{
TMOD=0x22; //T1為方式2,T0為方式2
TL1=0xfd; //11.0592M晶振,波特率為9600
TH1=0xfd;
TL0=0;
TH0=156; //計(jì)數(shù)100次溢出,即每隔100us進(jìn)入T0中斷
SCON=0x50;
PCON=0x00;
TR1=1;
ES=1;
EA=1;
ET0=1;
TR0=1;
}
/**************************驅(qū)動(dòng)輪方向與速度控制函數(shù)******************************************/
void forward1(uint x) //左輪前進(jìn)
{
in1=1;
in2=0;
left_pwm=x;
}
void forward2(uint x) //右輪前進(jìn)
{
in3=1;
in4=0;
right_pwm=x;
}
void back1(uint x) //左輪后退
{
in1=0;
in2=1;
left_pwm=x;
}
void back2(uint x) //右輪后退
{
in3=0;
in4=1;
right_pwm=x;
}
/**************************高速向前******************************************/
void bforw() //高速向前
{
in1=1;
in2=0;
in3=1;
in4=0;
left_pwm=140;
right_pwm=140;
}
void mforw() //中速向前
{
in1=1;
in2=0;
in3=1;
in4=0;
flag=0;
while((temp==0)&&(8000-flag))
{
left_pwm=105;
right_pwm=105;
flag++;
delay(10);
}
bforw();
flag=0;
}
void sforw() //保持原來(lái)方向,低速向前測(cè)黑線
{
left_pwm=35;
right_pwm=35;
}
void sright() //微調(diào)路徑,盡量減小小車左右擺動(dòng)
{
in1=1;
in2=0;
in3=1;
in4=0;
flag=0;
while(temp==64)
{
left_pwm=80-2*flag;//可調(diào)試
right_pwm=28-7*flag;//可調(diào)試
delay(30);
flag++;
if(flag>=4)flag=4;
}
flag=0;
}
void sleft()
{
in1=1;
in2=0;
in3=1;
in4=0;
flag=0;
while(temp==32)
{
right_pwm=80-2*flag;//可調(diào)試
left_pwm=28-7*flag;//可調(diào)試
delay(30);
flag++;
if(flag>=4)flag=4;
}
flag=0;
}
void mright() //二次調(diào)節(jié),減小左右擺動(dòng)
{
in1=1;
in2=0;
in3=1;
in4=0;
flag=0;
while(temp==192)
{
left_pwm=100-4*flag;//可調(diào)試
right_pwm=50-3*flag;//可調(diào)試
delay(2);
flag++;
if(flag>=10)flag=10;
}
flag=0;
}
void mleft()
{
in1=1;
in2=0;
in3=1;
in4=0;
flag=0;
while(temp==48)
{
right_pwm=100-4*flag;//可調(diào)試
left_pwm=50-3*flag;//可調(diào)試
delay(2);
flag++;
if(flag>=10)flag=10;
}
flag=0;
}
void bright() //后退,防止小車脫離賽道
{
flag=0;
in3=0;
in4=1;
while(temp==128)
{
flag++;
if(flag<16)
{
left_pwm=60+1*flag;//可調(diào)試
right_pwm=0;//可調(diào)試
delay(6);
}
if(flag>=16)
{
left_pwm=35+(flag-17)^2;//可調(diào)試
right_pwm=3*(flag-15);//可調(diào)試
delay(10);
}
if(flag>=25)flag=25;
}
flag=0;
}
void bleft()
{
flag=0;
in1=0;
in2=1;
while(temp==16)
{
flag++;
if(flag<16)
{
right_pwm=60+1*flag;//可調(diào)試
left_pwm=0;//可調(diào)試
delay(6);
}
if(flag>=16)
{
right_pwm=35+(flag-17)^2;//可調(diào)試
left_pwm=3*(flag-15);//可調(diào)試
delay(10);
}
if(flag>=25)flag=25;
}
flag=0;
}
void expe() //接收到未知數(shù)據(jù),保持原來(lái)方向
{
left_pwm=110;
right_pwm=110;
}
void stop() //停止
{
left_pwm=0;
right_pwm=0;
}
/**************************手機(jī)APP遙控函數(shù)*****************************************/
void bluetooth(void)
{
switch(buffer_data[2])
{
case 'A': forward1(80);forward2(80);break; //按下APP前進(jìn)鍵
case 'B': back1(80);back2(80);break; //按下APP后退鍵
case 'C': back1(50);forward2(50);break; //按下APP左轉(zhuǎn)鍵
case 'D': forward1(50);back2(50);break; //按下APP右轉(zhuǎn)鍵
case 'F': forward1(0);forward2(0);break; //松手
case '1': flagxun=~flagxun;break; //按下1,進(jìn)入循線狀態(tài)
default : ;
}
}
/**************************循線函數(shù)*****************************************/
void xunji(void)
{
P3=0xff;
temp=P3;
temp=temp&0xf0;
P0=temp;
switch(temp) //左1 左2 右3 右4
{
case 0:mforw();break; //全都沒檢測(cè)到黑線,中速前進(jìn)
case 16:bleft();break; //左1檢測(cè)到黑線,高速左轉(zhuǎn)
case 32:sleft();break; //左2檢測(cè)到黑線,低速左轉(zhuǎn)
case 64:sright();break; //右3檢測(cè)到黑線,低速右轉(zhuǎn)
case 128:bright();break; //右4檢測(cè)到黑線,高速右轉(zhuǎn)
case 96:sforw();break; //左2、右3檢測(cè)到黑線,低速前進(jìn)
case 48:mleft();break; //左1、左2檢測(cè)到黑線,中速左轉(zhuǎn)
case 192:mright();break; //右3、右4檢測(cè)到黑線,中速右轉(zhuǎn)
case 240:stop();break; //全都檢測(cè)到黑線,停止
default :expe();break; //接收到未知數(shù)據(jù),保持原來(lái)方向前進(jìn)
}
}
/*************************主函數(shù)***************************************************/
void main(void)
{
com_init(); //四組IO口初始化
dian_init(); //電機(jī)初始化
timer_init(); //定時(shí)器初始化
led=0;
flagxun=0;
while(!flagxun)
{
if(recv_flag==1) //recv_flag==1表明3個(gè)字符全部接收完畢
{
recv_flag=0; //清空3個(gè)字符全部接收完畢標(biāo)記位
bluetooth(); //手機(jī)APP遙控函數(shù)
}
while(flagxun)
xunji();
}
}
/**************************串口中斷服務(wù)函數(shù)****************************************/
void Serial(void) interrupt 4 //中斷接收3個(gè)字符
{
uchar temp_data; //temp_data用來(lái)存放接收到的字符
RI=0;
temp_data=SBUF;
if(temp_data=='O'&&(count_data==0)) //接收第一個(gè)字符串
{
buffer_data[count_data]=temp_data;
count_flag=1; //count_flag=1表示已經(jīng)接收到第1個(gè)字符
}
else
{
if(count_flag==1) //開始接收第2、3個(gè)字符
{
count_data++;
buffer_data[count_data]=temp_data;
if(count_data>=2) //count_data=2,表明已經(jīng)接收3個(gè)字符
{ //此時(shí)表明3個(gè)字符已接收完畢,開始執(zhí)行遙控程序
count_data=0;
count_flag=0; //清空標(biāo)記位
recv_flag=1 ; //數(shù)據(jù)接收完畢標(biāo)記位
}
}
}
}
/*************************定時(shí)器中斷函數(shù)*******************************************/
void Timer0(void) interrupt 1
{
pwm_data++;
if(pwm_data>PWM_CYCLE)
pwm_data=0;
if(pwm_data<=left_pwm)
ENA=1;
else
ENA=0;
if(pwm_data<=right_pwm)
ENB=1;
else
ENB=0;
P3=0xff;
temp=P3;
temp=temp&0xf0;
P0=temp;
}
復(fù)制代碼
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1