智能小车源代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include<reg51.H>之阳早格格创做
#include <intrins.h>
//#include"lcd.h"
sbit TX=P2^7;
sbit RX=P2^6;
sbit PWM=P1^4;
sbit Beep=P3^7;
sbit led1=P3^3;
sbit led2=P3^4;
sbit led3=P3^5;
/***********蓝牙切换按键**********/
sbit k1=P3^6;
/***自定义一些数据,注意那些数据对于应“51智能车蓝牙无线遥控.exe”硬件上的数据树立**/
#define leftdata 0x11
#define rightdata 0x22
#define forwarddata 0x33
#define backdata 0x44
#define stopdata 0x55
#define uchar unsigned char
#define uint unsigned int
unsigned char receiveData,high_velosity,low_velosity;
void UsartConfiguration();
/***********电机端心定义************************/ sbit IN1=P1^0; //为下电通常,左电机后转sbit IN2=P1^1; //为下电通常,左电机正转
sbit IN3=P1^2; //为下电通常,左电机正转
sbit IN4=P1^3; //为下电通常,左电机后转
/**************无线遥控模块定义****************/ sbit Key_A = P2^0; //B键旗号端对于应D0
sbit Key_B = P2^1; //D键旗号端对于应D1
sbit Key_C = P2^2; //C键旗号端对于应D2
sbit Key_D = P2^3; //C键旗号端
void delay0(int a);
void delay15us(void);
void delay1ms(int z);
void di(); //蜂鸣器函数声明
unsigned int time;//用于存搁定时器时间值
unsigned int S; //用于存搁距离的值
char flag =0; //量程溢出标记位
char f1,f2,f3,f4,n0;
int a;
int n;//运止次数推断标记
int s_left,s_right;
void Delay10us(unsigned char i)
{
unsigned char j;
do{
j = 10;
do{
_nop_();
}while(--j);
}while(--i);
}
/*************************************************** ******************************************/ /*****************电机步调********************/ /*************************************************** *****************************************/
void loop()
{
IN1=1; //左电机
IN2=0;
IN3=1; //左电机
IN4=0;
}
void runfront()
{
IN1=1; //左电机IN2=0;
IN3=0; //左电机IN4=1;
}
//小车退却函数void runback()
{
IN1=0; //左电机IN2=1;
IN3=1; //左电机IN4=0;
}
//小车左转
void runleft()
{
IN1=0; //左电机IN2=0;
IN3=0; //左电机IN4=1;
}
//小车左转
void runright()
{
IN1=1; //左电机IN2=0;
IN3=0; //左电机IN4=0;
}
////小车左后转
//void runbackleft() //{
// IN1=0; //左电机// IN2=0;
// IN3=0; //左电机// IN4=1;
//}
////小车左后转
//void runbackright() //{
// IN1=1; //左电机// IN2=0;
// IN3=0; //左电机
// IN4=0;
//}
//小车停止函数
void stop()
{
IN1=0; //左电机
IN2=0;
IN3=0; //左电机
IN4=0;
}
/*************************************************** ******************************************/
/***********蓝牙步调************/
/*************************************************** *****************************************/
void delay(unsigned int a)
{
unsigned int b;
for(;a>0;a--)
for(b=3;b>0;b--);
}
//左电机转
void left_motor_runfront(unsigned int a) {
IN1=1; //左电机
IN2=0;
delay(a);
IN1=0;
IN2=0;
delay(100-a);
}
void right_motor_runfront(unsigned int a) {
IN3=0; //左电机
IN4=1;
delay(a);
IN3=0;
IN4=0;
delay(100-a);
}
void left_motor_back(unsigned int a)
{
IN1=0; //左电机
IN2=1;
delay(a);
IN1=0;
IN2=0;
delay(100-a);
}
void right_motor_back(unsigned int a) {
IN3=1; //左电机
IN4=0;
delay(a);
IN3=0;
IN4=0;
delay(100-a);
}
void left_motor_stop()
{
IN1=0; //左电机
IN2=0;
}
void right_motor_stop()
{
IN3=0; //左电机
IN4=0;
}
//PWM调速
void PWM_RUNFRONT(unsigned int a,unsigned int b) //a属于0~100
{
left_motor_runfront(a);
right_motor_runfront(b);
}
void PWM_RUNBACK(unsigned int a,unsigned int b) //a属于0~100
{
left_motor_back(a);
right_motor_back(b);
}
void PWM_RUNLEFT(unsigned int a) //a属于0~100
{
right_motor_runfront(a);
left_motor_stop();
}
void PWM_RUNRIGHT(unsigned int a) //a属于0~100
{
right_motor_stop();
left_motor_runfront(a);
}
void bluestop()
{
left_motor_stop() ;
right_motor_stop() ;
}
void UsartConfiguration()
{
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(unsigned int i)
* 函数功能: 延时函数
* 输进: 无
* 输出: 无
*************************************************** ****************************/
void Usart() interrupt 4
{
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;
}
}
/*************************************************** ******************************************/
/***********舵机步调************/
/*************************************************** *****************************************/
void delayx(int t)
{
char j;
for(;t>0;t--)
for(j=19;j>0;j--);
}
void degree0()
{
int i;
for(i=0;i<10;i++)
{
PWM=1;
delayx(10);//1ms
PWM=0;
delayx(390);//19ms
}
}
void degree90()
{
int i;
for(i=0;i<10;i++)
{
PWM=1;
delayx(24);//50
PWM=0;
}
}
void degree180()
{
int i;
for(i=0;i<15;i++)
{
PWM=1;
PWM=0;
}
}
/*************************************************** ******************************************/
/**************超声波步调**************/
/*************************************************** ******************************************/
/****A键被按下后,前进*****/
void Count1(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();di();
}
if(n==3)
{
s_right=S;
degree90();di();
n=0; //标记位浑整
if(s_left>s_right)
{
led2=1;delay1ms(50);led2=0;delay1ms(50); runright();
delayx(1250);
}
else
{
led3=1;delay(800);led3=0;delay(500);
runleft();
delayx(1250);
}
}
}
/********超声波下电仄脉冲宽度估计步调***************/
void Timer_Count(void)
{
TR1=1; //开开计数
while(RX); //当RX为1计数并等待
TR1=0; //关关计数
//Count1(); //估计
}
/*************************************************** *****/
void StartModule() //开用模块
{
TX=1; //开用一次模块
Delay10us(2);
TX=0;
}
/*************************************************** ******************************************/
/********************主步调*******************/
/*************************************************** ******************************************/
void main(void)
{
UsartConfiguration();
while(1)
{
if(k1==0&&n0==0)
{
delay1ms(20);
if(k1==0)
{
n0++;
}
}
else if(k1==0&&n0==1)
{
delay1ms(20);
if(k1==0)
{
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;di();
}
else
if(Key_A==0&&Key_D==0&&Key_B==1&&Key_C==0) //B键被按下
{
f1=0;f2=1;f3=0;f4=0;di();
}
else
if(Key_B==0&&Key_D==0&&Key_A==0&&Key_C==1) //C键被按下
f1=0;f2=0;f3=1;f4=0;di();
}
else
if(Key_D==1&&Key_B==0&&Key_A==0&&Key_C==0) //D键被按下
{
f1=0;f2=0;f3=0;f4=1;di();
}
if(f1)
{
StartModule();
for(a=951;a>0;a--)
{
if(RX==1)
{
Timer_Count();
Count1();
}
}
}
if(f2)
runback();
}
if(f3)
{
loop();
}
if(f4)
{
stop();
}
}
if(n0==1)
{
if(low_velosity)
{
switch(receiveData)
{
case leftdata: PWM_RUNLEFT(30); break;
case rightdata: PWM_RUNRIGHT(30); break;
case forwarddata: PWM_RUNFRONT(64,70); break;
case backdata: PWM_RUNBACK(64,70); break;
case stopdata: bluestop(); break;
}
}
if(high_velosity)
{
switch(receiveData)
{
case leftdata: PWM_RUNLEFT(50); break;
case rightdata: PWM_RUNRIGHT(50); break;
case forwarddata: PWM_RUNFRONT(94,100); break;
case backdata: PWM_RUNBACK(94,100); break;
case stopdata: stop(); break;
}
}
}
}
}
/*****************蜂鸣器*********************/
void di()
{
int i;
for(i=0;i<150;i++)
{
Beep= 1;
delay0(20);
}
Beep=0;
}
void delay0(int a)
{
char j;int i;
for(i=a; i > 0; i--)
for(j = 200; j > 0; j--);
}
void delay1ms(int z) //延时1ms {
int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}。

相关文档
最新文档