标题:
基于51单片机的手机控制小车和机械臂程序
[打印本页]
作者:
晨晨晨晨晨晨
时间:
2019-10-10 22:50
标题:
基于51单片机的手机控制小车和机械臂程序
第一写帖子,不好的地方请大家指出
最近做了一辆小车,
具体功能如下:1、4个电机和两个驱动模块实现小车的运动
2、用蓝牙模块实现小车的通信问题,实现小车与手机的通信
3、机械臂的应用,用舵机实现机械臂的左右前后移动和夹东西(后来因为舵机的扭矩太小,失败了)
4 、用时钟配置pwm来控制小车速度
遇到的问题:1、蓝牙模块与手机的通信问题,解决:先要设置波特率,发送的信号是以16进制来发送的,安卓手机下载个串口助手
2、舵机的控制问题 :安装时,没有把舵机的方向调好 心得:在机械臂组装时,应把舵机转向正确的角度
单片机源程序如下:
#include <reg52.h>
#include <intrins.h>
#define uchar unsignrd char
#define uint unsigned int
unsigned char a,aa,b,c,d ;
uint t , count ,num;
sbit BIN1=P0^4; //后右端电机输入口 奇数等于1,为往前走
sbit BIN2=P0^5;
sbit BIN3=P0^6; //后左端电机输入口
sbit BIN4=P0^7;
sbit FIN1=P0^0; //前右端电机输入口
sbit FIN2=P0^1;
sbit FIN3=P0^2; //前左端电机输入口
sbit FIN4=P0^3;
sbit bi = P1^0; //蜂鸣器
sbit p11 = P1^1; //抓手舵机
sbit p12 = P1^2; //前后伸长舵机
sbit p13 = P1^3; //上下移动舵机
sbit p14 = P1^4; //底层旋转舵机
sbit P14=P1^3;//寻迹左
sbit P15=P1^2;//寻迹中
sbit P16=P1^1;//寻迹右
void delay_us(uint z)
{
uint j,k;
for(j=z;j>0;j--)
for(k=110;k>0;k--);
}
void delay_ms(uint q)
{
uint j,k;
for(j=q;j>0;j--)
for(k=10;k>0;k--);
}
/*****************小车前进*****************/
void forward()
{
if(num<=t)
{
BIN3=1;
BIN1=1;
FIN3=1;
FIN1=1;
}
else
{BIN3=0;
BIN1=0;
FIN3=0;
FIN1=0;}
}
/*****************小车后退*****************/
void back()
{
if (num<=t)
{FIN2=1;
FIN4=1;
BIN2=1;
BIN4=1;
}
else
{
BIN2=0;
FIN2=0;
BIN4=0;
FIN4=0;}
}
/*****************小车右转*****************/
void right()
{
if (num<=t)
{
FIN3 = 1;
BIN3 = 1;
}
else
{ FIN3 = 0;
BIN3 = 0;
}
if (num<=t/6)
{
FIN1 = 1;
BIN1 = 1;
}
else
{
FIN1 = 0;
BIN1 = 0;
}
}
/*****************小车左转*****************/
void left()
{
if (num<=t)
{
FIN1 = 1;
BIN1 = 1;
}
else
{
FIN1 = 0;
BIN1 = 0;
}
if (num<=t/6)
{
FIN3 = 1;
BIN3 = 1;
}
else
{
FIN3 = 0;
BIN3 = 0;
}
}
/*****************小车停止*****************/ void stop()
{
FIN1=0;
FIN2=0;
FIN3=0;
FIN4=0;
BIN1=0;
BIN2=0;
BIN3=0;
BIN4=0;
}
/*****************小车加速*****************/
void speed_add()
{
if (1<=t<20)
{t = t+2;}
if (t==20)
{ t = 20;}
delay_us(200);
}
/*****************小车减速*****************/
void speed_down()
{ if (1< t <=20)
{ t = t-2;}
if (t==1)
{ t = 1;}
delay_us(200);
}
/*****************小车循迹*****************/
void xunji()
{
if((P14==0&&P15==1&&P16==0)||(P14==1&&P15==1&&P16==1)) // 为零时,证明红外
探测到黑线
{ t = 15; forward(); }
if(P14==1&&P15==0&&P16==0)
{ t = 10; left(); } if(P14==0&&P15==0&&P16==1)
{ t =10; right();}
if(P14==0&&P15==0&&P16==0)
{stop(); }
}
void not_catch () //抓手控制
{
if(count <=4)
p11=1;
else
p11=0;
}
void catch()
{
if(count <=2)
p11=1;
else
p11=0;
}
void arm_forward()
{
if (a == 0x46)
{
delay_ms(2);
if(a == 0x45 && b<4)
{
b=b+1;
}
}
if (a==0x47)
{
delay_ms(2);
if(a == 0x45 && b>0)
{
b=b-1;
}
}
if(count <=b)
p12=1; else
p12=0;
}
void arm_turn()
{
if (a == 0x46)
{
delay_ms(2);
if (c<4&&a==0x45)
{c++;}
}
if (a== 0x47)
{
delay_ms(2);
if (c>0&&a==0x45)
{c--; }
}
if(count <=c)
p14=1;
else
p14=0;
}
void arm_up()
{
if (a == 0x46)
{
delay_ms(2);
if(a == 0x45 && d<4)
{
d=d+1;
}
}
if (a==0x47)
{
delay_ms(2);
if(a == 0x45 && d>0)
{ d=d-1;
}
}
if(count <=d)
p13=1;
else
p13=0;
}
void keep()
{
not_catch();
if(count <=d)
p13=1;
else
p13 = 1;
if(count <=c)
p14=1;
else
p14 = 1;
if(count <=b)
p12=1;
else
p12=0;
}
void choose_second()
{
while(a != 0x61) //退出
{
if (a != 0x60)
{
keep();
}
switch(a)
{
case 0x41: //机械臂前进与后退
//待修改
{
while (a!=0x50)
{arm_forward();
// not_catch();
keep(); }
break;
}
case 0x43 : //底盘左转与右转
{
while (a!=0x50)
{arm_turn();
//not_catch();
keep();
}
break;}
case 0x62: //关抓手
{not_catch();
break;}
case 0x60: //开抓手
{
catch();
keep();
break;
}
case 0x44: //向上与向下
{
while (a!=0x50)
{arm_up();
//not_catch();
keep();
}
break; }
}
}
}
/*****************蓝牙初始化*****************/
void UART_INIT()
{
TMOD |= 0x20; //8位自动重装模式
PCON = 0x00; TH1 = 0xfd;
TL1 = 0xfd; //9600波特率
SM0 = 0;
SM1 = 1; //串口工作方式1
REN = 1; //允许串口接收
RI = 0;
EA = 1; //开总中断
ES = 1; //开串口中断
TR1 = 1; //启动定时器1
}
void init()
{
num=0;
count =0; //给 num 赋初值
TMOD |= 0X01;
TH0=(65536-458)/256; //调整 t的值改变频率 50HZ
TL0=(65536-458)%256;
EA=1;
ET0=1;
TR0=1;
}
void chooce()
{ t = 4;
P0 = 0x00;
aa = 1;
b =0;
c = 0;
d = 0;
while(1)
{
keep();
switch(a)
{
case 0x41: //前进 //待修改
{forward();
break;}
case 0x42: //后退
{back();
break;}
case 0x43 : //左转 {left();
break;}
case 0x44: //右转
{right();
break;}
case 0x45: //停止
{stop();
break;}
case 0x46: //加速
{speed_add();
break; }
case 0x47: //减速
{speed_down();
break;}
// case 0x48: {break;} //空情况
case 0x49 : //蜂鸣器振动
{ bi =0;
break;}
case 0x50: //小车循迹
{ xunji();
break;}
case 0x51:
{bi = 1;
break;}
case 0x52:
{ choose_second();
break;
}
}
}
}
/*****************主程序*****************/
void main()
{
init();
UART_INIT(); //串口初始化
chooce(); //手机控制选择运动
}
/*****************串口中断*****************/
void UART_SER() interrupt 4
{
a = SBUF;
RI = 0; //清除接收标志
// SBUF = a; //将内容返回到手机端,可在手机查看发送内容
// while(!TI);
TI = 0; //写标志清零
}
void time0() interrupt 1 //中断函数
{
TH0=(65536-458)/256;
TL0=(65536-458)%256;
count ++;
if (count%2 == 0)
{num ++;}
if(num>21)
{ count = 0;
num=0;
}
}
复制代码
程序打包:
控制小车和机械臂程序.pdf
(202.28 KB, 下载次数: 57)
2019-10-10 22:49 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
51hei团团
时间:
2019-10-10 22:59
好东东啊 有原理图吗?
作者:
晨晨晨晨晨晨
时间:
2019-10-10 23:04
51hei团团 发表于 2019-10-10 22:59
好东东啊 有原理图吗?
过几天加上,还没完善这一部分
作者:
ascr50
时间:
2020-4-22 10:56
晨晨晨晨晨晨 发表于 2019-10-10 23:04
过几天加上,还没完善这一部分
楼主,请问有原理图吗?
作者:
热风的猫
时间:
2020-5-25 03:15
感谢分享
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1