|
下面是代碼,還有注釋哦~
#include <reg52.h> //
#include <intrins.h>
#include <math.h>
#include <stdio.h>
/**************1602端口****************/
sbit lcden = P3^2;
sbit lcdrs = P3^3;
/***********調(diào)試程序端口**********/
sbit led = P2^0;
/*********模式選擇端口************/
sbit key = P2^4;
/*********************超聲波端口*********************/
sbit trig = P1^0;
sbit echo = P1^1;
/*****************藍(lán)牙端口******************/
sbit rxd = P3^0; //接受端
sbit tdx = P3^1;
/*****************測速端口****************/
sbit speed = P3^4;
/***********************電機(jī)端口***********************/
/*使能端*/
sbit em1 = P1^4; //左后
sbit em2 = P1^7; //右后
sbit em3 = P2^7; //右前
sbit em4 = P2^3; //左前
/*電機(jī)口*/
sbit in1 = P1^2; //左后
sbit in2 = P1^3;
sbit in3 = P1^5; //右后
sbit in4 = P1^6;
sbit in5 = P3^6; //右前
sbit in6 = P3^7;
sbit in7 = P2^1; //左前
sbit in8 = P2^2;
/******************尋跡IO口聲明********************/
/*白線為0,黑線為1*/
sbit trace1 = P3^5; /*1路*/
sbit trace2 = P2^5; /*2路*/
sbit trace3 = P2^6; /*3路*/
/**********************定義全局變量***********************/
unsigned char code table[] = "0123456789"; //1602顯示距離數(shù)字
unsigned char code table1[] = "Distance:(cm)";
char code str[] = "收到指令,向前\n"; //藍(lán)牙數(shù)據(jù)
char code str1[] = "收到指令,向后\n";
char code str2[] = "收到指令,向左\n";
char code str3[] = "收到指令,向右\n";
char code str4[] = "收到指令,停止\n";
char code str5[] = "收到指令,加速\n"
char code str6[] = "收到指令,減速\n"
/************************宏定義****************************/
/*藍(lán)牙軟件*/
#define left 3
#define right 4
#define forword 1
#define reverse 2
#define accelerate 5
#define decelerate 0
/***************函數(shù)聲明************/
void Stop();
void Forward();
void Reverse();
void Turn_left();
void Turn_right();
unsigned int meas_distance();
/*************************延時(shí)函數(shù)*****************************/
void Delay(unsigned int z)
{
unsigned int x, y;
for(x = z; x > z; x--)
for(y = 110; y > 0; y--);
}
/*其他類的延時(shí)函數(shù)*/
/**********************初始化模塊**************************/
/*************1602寫的格式*************/
void writecom(unsigned char com)
{
P0 = com;
lcdrs = 0;
lcden = 0;
Delay(10);
lcden = 1;
Delay(10);
lcden = 0;
}
/*初始化1602*/
void init1602()
{
writecom(0x38);
Delay(20);
writecom(0x0c);
Delay(20);
writecom(0x06);
Delay(20);
writecom(0x01);
Delay(20);
}
/*初始化超聲波*/
void init_UltraSound()
{
trig = 0; //
echo = 0;
}
/*初始化電機(jī)*/
void init_EM()
{
em1 = 1;
em2 = 1;
em3 = 1;
em4 = 1;
}
/*初始化中斷0*//*超聲波用*/
void init_T0()
{
TMOD = 0x01;
TH0 = 0;
TL0 = 0;
EA = 1;
ET0 = 1;
}
/*初始化中斷4*//*藍(lán)牙用*/
void init_T4()
{
TMOD = 0x20;
TH1 = 0xFd; //11.0592M晶振,9600波特率
TL1 = 0xFd;
SCON = 0x50;
PCON = 0x00;
TR1 = 1;
ES = 1;
EA = 1;
}
/***********************1602操作****************************/
/*************寫的內(nèi)容**************/
void writedata(unsigned char date)
{
P0 = date;
lcdrs = 1;
lcden = 0;
Delay(10);
lcden = 1;
Delay(10);
lcden = 0;
}
/**********1602顯示距離,單位(cm)(此處初始化1602)***************/
void lcd_show()
{
unsigned int distance;
unsigned char qian, bai, shi, ge;
unsigned char num, a;
init1602();
writecom(0x80 + 17);
Delay(20);
for (num = 0; num < 13; num++)
{
writedata(table1[num]);
Delay(25);
}
writecom(0xc0 + 17);
Delay(50);
distance = meas_distance();
qian = distance / 1000;
bai = (distance / 100) % 10;
shi = (distance / 10) % 10;
ge = distance % 10;
writedata(table[qian]);Delay(25);
writedata(table[bai]);Delay(25);
writedata(table[shi]);Delay(25);
writedata(table[ge]);Delay(25);
for(a = 0; a < 16; a++)
{
writecom(0x18);
Delay(200);
}
while(1);
}
/***********測量距離***************/
unsigned int meas_distance()
{
unsigned int distance_data, a;
trig = 1;
Delay(20);
trig = 0;
init_T0();
TR0 = 1; //
while(echo); //返回信息
distance_data = TH0; //計(jì)算距離,通過echo高電平的時(shí)間進(jìn)行計(jì)算
distance_data <<= 8; //
distance_data = distance_data|TL0; //
distance_data *= 12; //
a = distance_data / 58; //
return a;
}
/**********超聲波中斷返回距離**************/
void Time1() interrupt 1 //
{
if(a != 0)
{
TR0 = 0;
TL0 = 0x00;
TH0 = 0x00;
}
}
/********************PWM調(diào)速函數(shù)**********************/
void set_pwm()
{
unsigned int velocity_factor = 10;
/*藍(lán)牙發(fā)送指令調(diào)速*/
if() //加速
else if() //減速
else //空語句
{
}
}
/********************電機(jī)轉(zhuǎn)動(dòng)************************/
void Forward() //前進(jìn)
{
in1 = 1;
in2 = 0;
in3 = 1;
in4 = 0;
in5 = 1;
in6 = 0;
in7 = 1;
in8 = 0;
}
void Stop() //停止
{
in1 = 0;
in2 = 0;
in3 = 0;
in4 = 0;
in5 = 0;
in6 = 0;
in7 = 0;
in8 = 0;
}
void Reverse() //倒車
{
in1 = 0;
in2 = 1;
in3 = 0;
in4 = 1;
in5 = 0;
in6 = 1;
in7 = 0;
in8 = 1;
}
void Turn_left() //左轉(zhuǎn)
{
in1 = 0;
in2 = 1;
in3 = 1;
in4 = 0;
in5 = 1;
in6 = 0;
in7 = 0;
in8 = 1;
}
void Turn_right() //右轉(zhuǎn)
{
in1 = 0;
in2 = 1;
in3 = 0;
in4 = 1;
in5 = 0;
in6 = 1;
in7 = 0;
in8 = 1;
}
/***************************尋跡函數(shù)****************************/
void Trace()
{
if((trace1 == 0) && (trace2 == 0) && (trace3 == 0)) //前進(jìn)
{
Delay(10);
Forward();
while(1)
{
Forward();
if(trace1 == 0 && trace3 == 1) //一直左轉(zhuǎn)到傳感器檢測不到為止
{
Delay(20);
Turn_right();
break; //跳出循環(huán)
}
else if(trace1 == 1 && trace3 == 0)
{
Delay(20);
Turn_left();
break; //跳出循環(huán)
}
else
{
Delay(20);
Forward();
break;
}
}
}
if((trace1 == 0) && (trace2 == 0) && (trace3 == 1)) //右轉(zhuǎn)
{
Delay(10);
Turn_right();
while(1)
{
Turn_right();
if(trace1 == 1 && trace3 == 1) //一直左轉(zhuǎn)到傳感器檢測不到為止
{
Delay(20);
Forward();
break; //跳出循環(huán)
}
else if(trace1 == 1 && trace3 == 0)
{
Delay(20);
Turn_left();
break; //跳出循環(huán)
}
else
{
Delay(20);
Forward();
break;
}
}
}
if((trace1 == 0) && (trace2 == 1) && (trace3 == 0)) //前進(jìn)
{
Delay(10);
Forward();
while(1)
{
Forward();
if(trace1 == 1 && trace3 == 1) //一直左轉(zhuǎn)到傳感器檢測不到為止
{
Delay(20);
Forward();
break; //跳出循環(huán)
}
else if(trace3 == 1 && trace2 == 0)
{
Delay(20);
Turn_right();
break; //跳出循環(huán)
}
else if(trace1 == 1 && trace2 == 0)
{
Delay(20);
Turn_left();
break; //跳出循環(huán)
}
else
{
Delay(20);
Forward();
break;
}
}
}
if((trace1 == 0) && (trace2 == 1) && (trace3 == 1)) //右轉(zhuǎn)
{
Delay(10);
Turn_right();
while(1)
{
Turn_right();
if(trace1 == 0 && trace3 == 1) //一直左轉(zhuǎn)到傳感器檢測不到為止
{
Delay(20);
Turn_right();
break; //跳出循環(huán)
}
else if(trace1 == 1 && trace3 == 0)
{
Delay(20);
Turn_left();
break; //跳出循環(huán)
}
else
{
Delay(20);
Forward();
break;
}
}
}
if((trace1 == 1) && (trace2 == 0) && (trace3 == 0)) //左轉(zhuǎn)
{
Delay(10);
Turn_left();
while(1)
{
Turn_left();
if(trace1 == 1 && trace3 == 1) //一直左轉(zhuǎn)到傳感器檢測不到為止
{
Delay(20);
Forward();
break; //跳出循環(huán)
}
else if(trace1 == 0 && trace3 == 1)
{
Delay(20);
Turn_right();
break; //跳出循環(huán)
}
else
{
Delay(20);
Forward();
break;
}
}
}
if((trace1 == 1) && (trace2 == 0) && (trace3 == 1)) //前進(jìn)
{
Delay(10);
Forward();
while(1)
{
Forward();
if(trace1 == 0 && trace3 == 1) //一直左轉(zhuǎn)到傳感器檢測不到為止
{
Delay(20);
Turn_right();
break; //跳出循環(huán)
}
else if(trace3 == 0 && trace1 == 1)
{
Delay(20);
Turn_left();
break; //跳出循環(huán)
}
else
{
Delay(20);
Forward();
break;
}
}
}
if((trace1 == 1) && (trace2 == 1) && (trace3 == 0)) //左轉(zhuǎn)
{
Delay(10);
Turn_left();
while(1)
{
Turn_left();
if(trace3 == 1 ) //一直左轉(zhuǎn)到傳感器檢測不到為止
{
break; //跳出循環(huán)
}
}
Delay(20);
Forward();
}
if((trace1 == 1)&&(trace2 == 1)&&(trace3 == 1)) //前進(jìn)
{
Delay(10);
Forward();
while(1)
{
Forward();
if(trace1 == 0 && trace3 == 1) //一直左轉(zhuǎn)到傳感器檢測不到為止
{
Delay(20);
Turn_right();
break; //跳出循環(huán)
}
else if(trace3 == 0 && trace1 == 1)
{
Delay(20);
Turn_left();
break; //跳出循環(huán)
}
else
{
Delay(20);
Forward();
break;
}
}
}
}
/**********************藍(lán)牙類函數(shù)**********************/
void send_str( )// 傳送字串
{
unsigned char i = 0;
while(str[i] != '\0')
{
SBUF = str[i];
while(!TI); // 等特?cái)?shù)據(jù)傳送
TI = 0; // 清除數(shù)據(jù)傳送標(biāo)志
i++; // 下一個(gè)字符
}
}
void send_str1( )
{
unsigned char i = 0;
while(str1[i] != '\0')
{
SBUF = str1[i];
while(!TI); // 等特?cái)?shù)據(jù)傳送
TI = 0; // 清除數(shù)據(jù)傳送標(biāo)志
i++; // 下一個(gè)字符
}
}
void send_str2( )
// 傳送字串
{
unsigned char i = 0;
while(str2[i] != '\0')
{
SBUF = str2[i];
while(!TI); // 等特?cái)?shù)據(jù)傳送
TI = 0; // 清除數(shù)據(jù)傳送標(biāo)志
i++; // 下一個(gè)字符
}
}
void send_str3()
// 傳送字串
{
unsigned char i = 0;
while(str3[i] != '\0')
{
SBUF = str3[i];
while(!TI); // 等特?cái)?shù)據(jù)傳送
TI = 0; // 清除數(shù)據(jù)傳送標(biāo)志
i++; // 下一個(gè)字符
}
}
void send_str4()
// 傳送字串
{
unsigned char i = 0;
while(str4[i] != '\0')
{
SBUF = str4[i];
while(!TI); // 等特?cái)?shù)據(jù)傳送
TI = 0; // 清除數(shù)據(jù)傳送標(biāo)志
i++; // 下一個(gè)字符
}
}
void Bluetooth()
{
init_T4();
while(1) /*無限循環(huán)*/
{
if(flag_REC == 1) //
{
flag_REC = 0;
if(buff[0] == 'O' && buff[1] == 'N') //第一個(gè)字節(jié)為O,第二個(gè)字節(jié)為N,第三個(gè)字節(jié)為控制碼
switch(buff[2])
{
case up : // 前進(jìn)
send_str(); Forward();
break;
case down: // 后退
send_str1(); Reverse();
break;
case left: // 左轉(zhuǎn)
send_str2(); Turn_left();
break;
case right: // 右轉(zhuǎn)
send_str3(); Turn_right();
break;
case stop: // 停止
send_str4(); Stop();
break;
case:
}
}
}
}
void Time4() interrupt 4 //藍(lán)牙函數(shù)最開始啟動(dòng)中斷
{
if(RI) //是否接收中斷
{
RI = 0;
dat = SBUF;
if(dat == 'O' && (i == 0)) //接收數(shù)據(jù)第一幀
{
buff[i] = dat;
flag = 1; //開始接收數(shù)據(jù)
}
else if(flag == 1)
{
i++;
buff[i] = dat;
if(i >= 2)
{i = 0; flag = 0; flag_REC = 1;} // 停止接收
}
}
}
///********************測速函數(shù)******************/
//void meas_velocity()
//{
// init_T3();
// while(1)
// {
// if (P34 == 1)
// {
// led = 0;
// }
// display();
// Delay(1);
// }
//}
//
//void Time3() interrupt 3 //定時(shí)器中斷時(shí)間到,就讀取計(jì)數(shù)器值
//{
// TH1 = 0X3C;
// TL1 = 0XB0;
// i++;
// if(i == 20) //1s才進(jìn)行技術(shù)脈沖值顯示,即每秒更新一次速度
// {
// kop = TH0;//計(jì)數(shù)器計(jì)入脈沖,每來一個(gè)矩形脈沖計(jì)數(shù)值加1
// kop = kop << 8; //
// kop = (( kop + TL0) / 20 * (2.5) * (3.14)); //直徑
//
// qian = kop / 1000; //
// bai = kop / 100; //
// shi = kop / 10; //
// ge = kop;//
//
// i = 0;
// TH1 = 0;//計(jì)數(shù)器速度獲取后清零,進(jìn)行下次獲取
// TL1 = 0;
//
// }
//}
/***********************檢測模式*****************************/
bit Check_key()
{
bit check_flag = 0;
if(key == 0)
{
return check_flag;
}
else
{
check_flag = 1;
return check_flag;
}
}
/*主函數(shù)*/
void main()
{
bit pattern_flag;
init_UltraSound();
init_EM();
while(1)
{
pattern_flag = Check_key();
if(pattern_flag == 0)
{
Delay(100);
Forward(); //最開始是向前走
while(1)
{
lcd_show(); //1602已經(jīng)初始化
Delay(10);
init_UltraSound();
Delay(60);
}
}
else
{
Delay(100);
Forward();
while(1)
{
Trace(); //否則尋跡
}
}
}
}
|
|