下面是代码,还有注释哦~
#include <reg52.h> //
#include <intrins.h>
#include <math.h>
#include <stdio.h>
/**************1602端口****************/
sbit lcden = P3^2;
sbit lcdrs = P3^3;
/***********调试程序端口**********/
sbit led = P2^0;
/*********模式选择端口************/
sbit key = P2^4;
/*********************超声波端口*********************/
sbit trig = P1^0;
sbit echo = P1^1;
/*****************蓝牙端口******************/
sbit rxd = P3^0; //接受端
sbit tdx = P3^1;
/*****************测速端口****************/
sbit speed = P3^4;
/***********************电机端口***********************/
/*使能端*/
sbit em1 = P1^4; //左后
sbit em2 = P1^7; //右后
sbit em3 = P2^7; //右前
sbit em4 = P2^3; //左前
/*电机口*/
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显示距离数字
unsigned char code table1[] = "Distance:(cm)";
char code str[] = "收到指令,向前\n"; //蓝牙数据
char code str1[] = "收到指令,向后\n";
char code str2[] = "收到指令,向左\n";
char code str3[] = "收到指令,向右\n";
char code str4[] = "收到指令,停止\n";
char code str5[] = "收到指令,加速\n"
char code str6[] = "收到指令,减速\n"
/************************宏定义****************************/
/*蓝牙软件*/
#define left 3
#define right 4
#define forword 1
#define reverse 2
#define accelerate 5
#define decelerate 0
/***************函数声明************/
void Stop();
void Forward();
void Reverse();
void Turn_left();
void Turn_right();
unsigned int meas_distance();
/*************************延时函数*****************************/
void Delay(unsigned int z)
{
unsigned int x, y;
for(x = z; x > z; x--)
for(y = 110; y > 0; y--);
}
/*其他类的延时函数*/
/**********************初始化模块**************************/
/*************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;
}
/*初始化电机*/
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*//*蓝牙用*/
void init_T4()
{
TMOD = 0x20;
TH1 = 0xFd; //11.0592M晶振,9600波特率
TL1 = 0xFd;
SCON = 0x50;
PCON = 0x00;
TR1 = 1;
ES = 1;
EA = 1;
}
/***********************1602操作****************************/
/*************写的内容**************/
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; //计算距离,通过echo高电平的时间进行计算
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调速函数**********************/
void set_pwm()
{
unsigned int velocity_factor = 10;
/*蓝牙发送指令调速*/
if() //加速
else if() //减速
else //空语句
{
}
}
/********************电机转动************************/
void Forward() //前进
{
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() //左转
{
in1 = 0;
in2 = 1;
in3 = 1;
in4 = 0;
in5 = 1;
in6 = 0;
in7 = 0;
in8 = 1;
}
void Turn_right() //右转
{
in1 = 0;
in2 = 1;
in3 = 0;
in4 = 1;
in5 = 0;
in6 = 1;
in7 = 0;
in8 = 1;
}
/***************************寻迹函数****************************/
void Trace()
{
if((trace1 == 0) && (trace2 == 0) && (trace3 == 0)) //前进
{
Delay(10);
Forward();
while(1)
{
Forward();
if(trace1 == 0 && trace3 == 1) //一直左转到传感器检测不到为止
{
Delay(20);
Turn_right();
break; //跳出循环
}
else if(trace1 == 1 && trace3 == 0)
{
Delay(20);
Turn_left();
break; //跳出循环
}
else
{
Delay(20);
Forward();
break;
}
}
}
if((trace1 == 0) && (trace2 == 0) && (trace3 == 1)) //右转
{
Delay(10);
Turn_right();
while(1)
{
Turn_right();
if(trace1 == 1 && trace3 == 1) //一直左转到传感器检测不到为止
{
Delay(20);
Forward();
break; //跳出循环
}
else if(trace1 == 1 && trace3 == 0)
{
Delay(20);
Turn_left();
break; //跳出循环
}
else
{
Delay(20);
Forward();
break;
}
}
}
if((trace1 == 0) && (trace2 == 1) && (trace3 == 0)) //前进
{
Delay(10);
Forward();
while(1)
{
Forward();
if(trace1 == 1 && trace3 == 1) //一直左转到传感器检测不到为止
{
Delay(20);
Forward();
break; //跳出循环
}
else if(trace3 == 1 && trace2 == 0)
{
Delay(20);
Turn_right();
break; //跳出循环
}
else if(trace1 == 1 && trace2 == 0)
{
Delay(20);
Turn_left();
break; //跳出循环
}
else
{
Delay(20);
Forward();
break;
}
}
}
if((trace1 == 0) && (trace2 == 1) && (trace3 == 1)) //右转
{
Delay(10);
Turn_right();
while(1)
{
Turn_right();
if(trace1 == 0 && trace3 == 1) //一直左转到传感器检测不到为止
{
Delay(20);
Turn_right();
break; //跳出循环
}
else if(trace1 == 1 && trace3 == 0)
{
Delay(20);
Turn_left();
break; //跳出循环
}
else
{
Delay(20);
Forward();
break;
}
}
}
if((trace1 == 1) && (trace2 == 0) && (trace3 == 0)) //左转
{
Delay(10);
Turn_left();
while(1)
{
Turn_left();
if(trace1 == 1 && trace3 == 1) //一直左转到传感器检测不到为止
{
Delay(20);
Forward();
break; //跳出循环
}
else if(trace1 == 0 && trace3 == 1)
{
Delay(20);
Turn_right();
break; //跳出循环
}
else
{
Delay(20);
Forward();
break;
}
}
}
if((trace1 == 1) && (trace2 == 0) && (trace3 == 1)) //前进
{
Delay(10);
Forward();
while(1)
{
Forward();
if(trace1 == 0 && trace3 == 1) //一直左转到传感器检测不到为止
{
Delay(20);
Turn_right();
break; //跳出循环
}
else if(trace3 == 0 && trace1 == 1)
{
Delay(20);
Turn_left();
break; //跳出循环
}
else
{
Delay(20);
Forward();
break;
}
}
}
if((trace1 == 1) && (trace2 == 1) && (trace3 == 0)) //左转
{
Delay(10);
Turn_left();
while(1)
{
Turn_left();
if(trace3 == 1 ) //一直左转到传感器检测不到为止
{
break; //跳出循环
}
}
Delay(20);
Forward();
}
if((trace1 == 1)&&(trace2 == 1)&&(trace3 == 1)) //前进
{
Delay(10);
Forward();
while(1)
{
Forward();
if(trace1 == 0 && trace3 == 1) //一直左转到传感器检测不到为止
{
Delay(20);
Turn_right();
break; //跳出循环
}
else if(trace3 == 0 && trace1 == 1)
{
Delay(20);
Turn_left();
break; //跳出循环
}
else
{
Delay(20);
Forward();
break;
}
}
}
}
/**********************蓝牙类函数**********************/
void send_str( )// 传送字串
{
unsigned char i = 0;
while(str[i] != '\0')
{
SBUF = str[i];
while(!TI); // 等特数据传送
TI = 0; // 清除数据传送标志
i++; // 下一个字符
}
}
void send_str1( )
{
unsigned char i = 0;
while(str1[i] != '\0')
{
SBUF = str1[i];
while(!TI); // 等特数据传送
TI = 0; // 清除数据传送标志
i++; // 下一个字符
}
}
void send_str2( )
// 传送字串
{
unsigned char i = 0;
while(str2[i] != '\0')
{
SBUF = str2[i];
while(!TI); // 等特数据传送
TI = 0; // 清除数据传送标志
i++; // 下一个字符
}
}
void send_str3()
// 传送字串
{
unsigned char i = 0;
while(str3[i] != '\0')
{
SBUF = str3[i];
while(!TI); // 等特数据传送
TI = 0; // 清除数据传送标志
i++; // 下一个字符
}
}
void send_str4()
// 传送字串
{
unsigned char i = 0;
while(str4[i] != '\0')
{
SBUF = str4[i];
while(!TI); // 等特数据传送
TI = 0; // 清除数据传送标志
i++; // 下一个字符
}
}
void Bluetooth()
{
init_T4();
while(1) /*无限循环*/
{
if(flag_REC == 1) //
{
flag_REC = 0;
if(buff[0] == 'O' && buff[1] == 'N') //第一个字节为O,第二个字节为N,第三个字节为控制码
switch(buff[2])
{
case up : // 前进
send_str(); Forward();
break;
case down: // 后退
send_str1(); Reverse();
break;
case left: // 左转
send_str2(); Turn_left();
break;
case right: // 右转
send_str3(); Turn_right();
break;
case stop: // 停止
send_str4(); Stop();
break;
case:
}
}
}
}
void Time4() interrupt 4 //蓝牙函数最开始启动中断
{
if(RI) //是否接收中断
{
RI = 0;
dat = SBUF;
if(dat == 'O' && (i == 0)) //接收数据第一帧
{
buff[i] = dat;
flag = 1; //开始接收数据
}
else if(flag == 1)
{
i++;
buff[i] = dat;
if(i >= 2)
{i = 0; flag = 0; flag_REC = 1;} // 停止接收
}
}
}
///********************测速函数******************/
//void meas_velocity()
//{
// init_T3();
// while(1)
// {
// if (P34 == 1)
// {
// led = 0;
// }
// display();
// Delay(1);
// }
//}
//
//void Time3() interrupt 3 //定时器中断时间到,就读取计数器值
//{
// TH1 = 0X3C;
// TL1 = 0XB0;
// i++;
// if(i == 20) //1s才进行技术脉冲值显示,即每秒更新一次速度
// {
// kop = TH0;//计数器计入脉冲,每来一个矩形脉冲计数值加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;//计数器速度获取后清零,进行下次获取
// TL1 = 0;
//
// }
//}
/***********************检测模式*****************************/
bit Check_key()
{
bit check_flag = 0;
if(key == 0)
{
return check_flag;
}
else
{
check_flag = 1;
return check_flag;
}
}
/*主函数*/
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已经初始化
Delay(10);
init_UltraSound();
Delay(60);
}
}
else
{
Delay(100);
Forward();
while(1)
{
Trace(); //否则寻迹
}
}
}
}
|