标题:
51单片机小车控制系统源代码
[打印本页]
作者:
彭晓彬
时间:
2020-2-10 20:47
标题:
51单片机小车控制系统源代码
#include <STC15F2K60S2.H>
#include "stdio.h"
#include "intrins.h"
sbit DJ1=P2^4;//L298N IN1
sbit DJ2=P2^5;//L298N IN2
sbit DJ3=P2^6;//L298N IN3
sbit DJ4=P2^7;//L298N IN4
sbit tirg=P0^5;//超声波
sbit tur=P0^6;//舵机
sbit echo=P0^7;//超声波
void forward(){ //直走
DJ1=1;DJ2=0;
DJ3=0;DJ4=1;
}
void back(){ //直走
DJ1=0;DJ2=1;
DJ3=1;DJ4=0;
}
void stop(){ //停止
DJ1=1;DJ2=1;
DJ3=1;DJ4=1;
}
void right(){ //右转
DJ1=1;DJ2=0;
DJ3=1;DJ4=1;
}
void D_right(){ //大右转
DJ1=1;DJ2=0;
DJ3=1;DJ4=0;
}
void left(){ //左转
DJ1=1;DJ2=1;
DJ3=0;DJ4=1;
}
void D_left(){ //大左转
DJ1=0;DJ2=1;
DJ3=0;DJ4=1;
}
void UartInit(void) //9600bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
ES=1;
EA=1;
}
void timer0_init()
{
TMOD=0x05;
TH0=0;
TL0=0;
TR0=1;
}
void Timer2Init(void) //0微秒@11.0592MHz
{
AUXR &= 0xFB; //定时器时钟12T模式
T2L = 0x00; //设置定时初值
T2H = 0x00; //设置定时初值
AUXR |= 0x10; //定时器2开始计时
IE2 |= 0x04;
EA=1;
}
unsigned char refresh=0;
unsigned short x;
bit sendflags=1;
void senddata(unsigned short datt,unsigned short distance)//数据包发送
{
sendflags=1;
SBUF=1;
while(sendflags);
sendflags=1;
SBUF=2;
while(sendflags);
sendflags=1;
SBUF=3;
while(sendflags);
sendflags=1;
SBUF=4;
while(sendflags);
sendflags=1;
SBUF=datt;
while(sendflags);
sendflags=1;
SBUF=datt;
while(sendflags);
sendflags=1;
SBUF=distance;
while(sendflags);
sendflags=1;
SBUF=(distance>>8);
while(sendflags);
}
//void timer4_3_init()
//{
// T4T3M=0x8c;//timer4 定时器 timer3 计数器
// T4H=0;
// T4L=0;
// T3H=0;
// T3L=0;
//}
void Delay250ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 11;
j = 130;
k = 111;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay22us() //@11.0592MHz
{
unsigned char i;
_nop_();
i = 58;
while (--i);
}
bit isback=0;//后退标志位
unsigned short motorturnround()//超声波测距函数
{
unsigned int j=0;
unsigned short distance;
AUXR &= 0x7f; //定时器2关闭
T2L = 0x00; //设置定时初值
T2H = 0x00; //设置定时初值
tirg=1;
Delay22us();
tirg=0;
while(!echo)
{
j++;
if(j>32000)
{
return 0;
}
}
j=0;
AUXR |= 0x10; //定时器2开始计时
while(echo)
{
j++;
if(j>32000)
{
return 0;
}
}
distance=(T2H*256.0f+T2L)*17.0f/921.6f;//计算距离
return distance;
}
void Delay100us() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 2;
j = 15;
do
{
while (--j);
} while (--i);
}
unsigned char movaue=5;
void turn()//舵机转动
{
unsigned char i;
tur=1;
for(i=0;i<movaue;i++)
{
Delay100us();
}
tur=0;
}
void main()
{
unsigned short datt=0;
timer0_init();
Timer2Init();
UartInit();
tirg=0;
tur=0;
while(1)
{
if(refresh)
{
datt=motorturnround();
// Delay250ms();
x=x*13;
if(isback)
{
x=x|0x80;
}
senddata(x,datt);
refresh=0;
TH0=0;
TL0=0;
TR0=1;
T2L = 0x00; //设置定时初值
T2H = 0x00; //设置定时初值
AUXR |= 0x10; //定时器2开始计时
turn();
}
}
}
char state=0;
char iscontrolmode=1;//是否是控制模式不循迹可以不管
char headercheck=0;
void uart() interrupt 4
{
if(RI==1)
{
if(iscontrolmode)
{
if(!headercheck)
{
switch(state)//状态解码
{
case 0:
if(SBUF==1)
{
state++;
}
break;
case 1:
if(SBUF==2)
{
state++;
}
else
{
state=0;
}
break;
case 2:
if(SBUF==3)
{
state++;
}
else
{
state=0;
}
break;
case 3:
if(SBUF==4)
{
state=0;
headercheck=1;
}
else
{
state=0;
}
break;
}
}
else
{
switch(SBUF)
{
case 66:
forward();
isback=0;
break;
case 62:
back();
isback=1;
break;
case 44:
D_left();
isback=0;
break;
case 47:
D_right();
isback=0;
break;
case 18:
stop();
isback=0;
break;
}
headercheck=0;
}
if(SBUF==6)//舵机相关
{
if(movaue<24)
{
movaue++;
}
}
else
{
if(SBUF==5)//舵机相关
{
if(movaue>5)
{
movaue--;
}
}
}
}
RI=0;
}
if(TI==1)
{
TI=0;
sendflags=0;
}
}
//67.22mm
void t2_isr() interrupt 12 using 1//读取计数值(用于测量速度)
{
TR0=0;
x=TH0;
x=(x<<8)+TL0;
refresh=1;
}
复制代码
蓝牙遥控小车.7z
2020-2-15 20:19 上传
点击文件名下载附件
下载积分: 黑币 -5
1.73 MB, 下载次数: 12, 下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1