标题:
基于51单片机的蓝牙循迹小车设计源程序
[打印本页]
作者:
till_valhalla
时间:
2019-9-30 11:43
标题:
基于51单片机的蓝牙循迹小车设计源程序
渣渣为了凑积分,发一个以前做过的小玩意
单片机源程序如下:
#include<reg51.h>
#include<intrins.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 RSEN1=P2^1;
sbit RSEN2=P2^2;
sbit LSEN1=P2^3;
sbit LSEN2=P2^4;
/*****使能A、B*****/
sbit ENA=P1^4;
sbit ENB=P1^5;
/*****电机驱动*****/
#define Left_moto_go {IN1=1,IN2=0;}
#define Left_moto_back {IN1=0,IN2=1;}
#define Right_moto_go {IN3=1,IN4=0;}
#define Right_moto_back {IN3=0,IN4=1;}
#define Left_moto_s {IN1=0,IN2=0;}
#define Right_moto_s {IN3=0,IN4=0;}
uchar M; //从串口接收的数据
uchar pwm_val_left =0;//变量定义
uchar push_val_left=4; //左电机占空比N/20
uchar pwm_val_right =0;
uchar push_val_right=4;//右电机占空比N/20
bit Right_moto_stop=1;
bit Left_moto_stop =1;
/********************************************
毫秒延时函数
**********************************************/
void Delay_ms(uint x) //12.000MHz
{
uchar a,b;
for(a=x;a>0;a--)
for(b=199;b>0;b--);
}
/*****延时*****/
void delay50ms(void) //误差 0us
{
unsigned char a,b;
for(b=173;b>0;b--)
for(a=143;a>0;a--);
}
/********************************************************************
* 名称 : Com_Init()
* 功能 : 串口初始化,晶振12,波特率2400,使串口中断
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Com_Init(void)
{
PCON &= 0x00; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
//AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
//AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xF3; //设定定时初值
TH1 = 0xF3; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
SM0 = 0;
SM1 = 1;
REN = 1;
EA = 1;
ES = 1;
}
/*****前进*****/
void go()
{
Left_moto_go ;
Right_moto_go ;
}
/*****后退*****/
void back()
{
Left_moto_back ;
Right_moto_back ;
}
/*****左转*****/
void turn_left()
{
Left_moto_back;
Right_moto_go ;
}
/*****右转*****/
void turn_right()
{
Left_moto_go;
Right_moto_back;
}
/*****急停*****/
void stop()
{
Left_moto_s;
Right_moto_s;
}
/*****PWM左电机*****/
void pwm_out_left_moto(void)
{
if(Left_moto_stop)
{
if(pwm_val_left<=push_val_left)
ENA=1;
else
ENA=0;
if(pwm_val_left>=20)
pwm_val_left=0;
}
else ENA=0;
}
/*****PWM右电机*****/
void pwm_out_right_moto(void)
{
if(Right_moto_stop)
{
if(pwm_val_right<=push_val_right)
ENB=1;
else
ENB=0;
if(pwm_val_right>=20)
pwm_val_right=0;
}
else ENB=0;
}
/********************************************************************
* 名称 : Com_Int()
* 功能 : 串口中断子函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Com_Int(void) interrupt 4
{
EA = 0;
if(RI) //当硬件接收到一个数据时,RI会置位
{
M = SBUF;
RI = 0;
}
EA = 1;
}
/*TIMER0中断服务子函数产生PWM信号*/
void timer0()interrupt 1 using 2
{
TH0=0XFC; //1ms定时
TL0=0X18;
pwm_val_left++;
pwm_val_right++;
pwm_out_left_moto();
pwm_out_right_moto();
}
/*****循迹函数*****/
void xunji()
{
uchar flag;
if((RSEN1==0)&&(RSEN2==0)&&(LSEN1==0)&&(LSEN2==0))
{ flag=0; }//*******直行*******//
else if((RSEN1==0)&&(RSEN2==1)&&(LSEN1==0)&&(LSEN2==0))
{ flag=1;} //***右偏,左转***//
else if((RSEN1==0)&&(RSEN2==0)&&(LSEN1==1)&&(LSEN2==0))
{ flag=2;} //***左偏,右转***//
else if((RSEN1==1)&&(RSEN2==0)&&(LSEN1==0)&&(LSEN2==0))
{ flag=1;} //***右偏,左转***//
else if((RSEN1==0)&&(RSEN2==0)&&(LSEN1==0)&&(LSEN2==1))
{ flag=2;} //***左偏,右转***//
else if((RSEN1==1)&&(RSEN2==1)&&(LSEN1==0)&&(LSEN2==0))
{ flag=1;} //***右偏,左转***//
else if((RSEN1==0)&&(RSEN2==0)&&(LSEN1==1)&&(LSEN2==1))
{ flag=2;} //***左偏,右转***//
else if((RSEN1==1)&&(RSEN2==1)&&(LSEN1==1)&&(LSEN2==1))
{ flag=3; }//*******急停*******//
switch (flag)
{
case 0:go();break;
case 1:turn_left();delay50ms();break;
case 2:turn_right();delay50ms();break;
case 3:stop();delay50ms();break;
default: break;
}
}
/********循迹模式*******/
void tracing()
{
while(1)
{
TMOD|=0X01;
TH0=0XFC;//1ms定时
TL0=0X18;
TR0=1;
ET0=1;
EA =1;
if(M == '1')
break;
while(1)/*无限循环*/
{
xunji();
if(M == '1')
break;
}
}
}
void main()
{
Delay_ms(100);
Com_Init();//串口初始化
while(1)
{
switch(M)
{
case 'A': go();Delay_ms(100); break;
case 'B': back();Delay_ms(100); break;
case 'C': turn_left();Delay_ms(100); break;
case 'D': turn_right();Delay_ms(100); break;
case 'F': stop();Delay_ms(100); break;
case '2': tracing(); break;
case '3': push_val_left =4;push_val_right =4; break;
case '4': push_val_left =10;push_val_right =10; break;
case '5': push_val_left =20;push_val_right =20; break;
default:break;
}
}
}
复制代码
所有资料51hei提供下载:
蓝牙寻迹终极.zip
(1.86 KB, 下载次数: 20)
2019-9-30 11:43 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
admin
时间:
2019-9-30 16:54
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1