|
这是我用单片机做的第二个东西,所以设计上有蛮多错误的地方,比如发光二极管直接接到了12V电源上,上电后就直接烧了,比如功能按键上竟然没有接指示灯,搞的我每次试几次才能转成不同的功能,比如我电池竟然用了两组,而当时没想到可以将12V电源压降到5V给单片机供电,并且5V电池内阻过大,导致机械手臂基本残废,比如我的散热片竟然没跟L298放到一起,致使散热片成为一个摆设,比如L298我用了两个,比如。。。但是幸运的是虽然错误很多,但是基本功能都可以实现,我知道这里大神多,请勿喷
以下是下位机的源程序,由于本人非常讨厌英文,所以程序中参数基本都是拼音设置的,通俗易懂,哈哈,程序只是实现了我的基本功能,基本上谈不上优化,漏洞估计不少,仅供参考哈。。。
#include<reg52.h>
#include<intrins.h>
#include<stdlib.h>
#include<math.h>
#define uint unsigned int
#define uchar unsigned char
sbit Trig=P2^7; //超声波输入输出
sbit Echo=P3^2;
sbit duoji=P2^6;
sbit zuohong=P1^1; //红外循迹定义
sbit youhong=P1^2;
sbit key1=P1^3;
sbit key2=P1^4;
sbit key3=P1^5;
sbit youlun=P2^3; //电动机位定义
sbit zuolun=P2^1; //前轮,后轮等于一正转等于零反转
sbit enyou=P2^2; //轮胎使能低电平有效
sbit enzuo=P2^0;
uchar a[5]={0};
uchar flag,pcflag,receivecontrol=0,numpc=0,ashouji;
uchar num,shujupc;
uint th0,tl0,distance,time,n[3],i=0,xuanze; //超声波定时器0计时
uchar chaoshengboflag; //超声波
/****************延时函数*********************/
void delayms(uint x) //延时x毫秒
{
uint i,j;
for(j=0;j<x;j++)
for(i=0;i<110;i++);
}
void delay20us() //延时20us
{
uchar a;
for(a=0;a<100;a++);
}
void delayus(uint xms) //延时0.xms
{
uint i,j;
for(i=xms;i>0;i--)
for(j=11;j>0;j--);
}
void init()
{
TMOD=0x20;
TL1=0xfd;
TH1=0xfd;
TR1=1;
SM0=0;
SM1=1;
REN=1;
EA=1;
ES=1;
}
/****************舵机*********************/
void degree45() //舵机正45度
{
uchar i;
for(i=0;i<15;i++)
{
duoji=1;
delayus(9); //延时1ms
duoji=0;
delayus(191); //延时19ms
}
}
void degree_45() //舵机负45度
{
uchar i;
for(i=0;i<15;i++)
{
duoji=1;
delayus(20); //延时1ms
duoji=0;
delayus(180); //延时19ms
}
}
void degree0() //舵机0度
{
uchar i;
for(i=0;i<15;i++)
{
duoji=1;
delayus(15); //延时1ms
duoji=0;
delayus(185); //延时19ms
}
}
/*-----------------电机运动程序------------------------*/
void initmada() //驱动初始化
{
enzuo=0;
enyou=0;
zuolun=1;
youlun=1;
}
void qianjin() //前进
{
uint t;
zuolun=1;
youlun=1;
delayms(5);
for (t=0;t<10;t++)
{
enzuo=1;
enyou=1;
delayms(20);
enzuo=0;
enyou=0;
delayms(20);
}
}
void houtui() //后退
{
uint t;
zuolun=0;
youlun=0;
delayms(5);
for (t=0;t<13;t++)
{
enzuo=1;
enyou=1;
delayms(20);
enzuo=0;
enyou=0;
delayms(20);
}
}
void zuozhuan() //左转
{
uint t;
zuolun=0;
youlun=1;
for(t=0;t<10;t++)
{
enzuo=1;
enyou=1;
delayms(20);
enzuo=0;
enyou=0;
delayms(20);
}
}
void youzhuan() //右转
{
uint t;
zuolun=1;
youlun=0;
for(t=0;t<10;t++)
{
enzuo=1;
enyou=1;
delayms(20);
enzuo=0;
enyou=0;
delayms(20);
}
}
void stop() //停止
{
enzuo=0;
enyou=0;
}
/*-----------------红外电机运动程序------------------------*/
void qianjinhong() //前进
{
uint t;
zuolun=1;
youlun=1;
delayms(5);
for (t=0;t<10;t++)
{
enzuo=1;
enyou=1;
delayms(10);
enzuo=0;
enyou=0;
delayms(30);
}
}
void zuozhuanhong() //左转
{
uint t;
zuolun=0;
youlun=1;
for(t=0;t<5;t++)
{
enzuo=1;
enyou=1;
delayms(10);
enzuo=0;
enyou=0;
delayms(30);
}
}
void youzhuanhong() //右转
{
uint t;
zuolun=1;
youlun=0;
for(t=0;t<5;t++)
{
enzuo=1;
enyou=1;
delayms(10);
enzuo=0;
enyou=0;
delayms(30);
}
}
/****************舵机超声波避障*********************/
void bijiao()
{
degree45(); //右边
delayms(400);
delayms(400);
EA=0;
chaoshengboflag=0;
TL0=0;
TH0=0;
Trig=1;
delay20us();
Trig=0;
while(Echo==0);
EA=1;
TR0=1;
EX0=1;
delayms(60);
EX0=0;
TR0=0;
if(chaoshengboflag==1)
{
time=th0*256+tl0;
distance=time*0.172; //毫米
if(distance>400)
n[1]=1;
else
n[1]=0;
}
else
{
n[1]=1;
}
/******************/
degree_45(); //左边
delayms(400);
delayms(400);
EA=0;
chaoshengboflag=0;
TL0=0;
TH0=0;
Trig=1;
delay20us();
Trig=0;
while(Echo==0);
EA=1;
TR0=1;
EX0=1;
delayms(60);
EX0=0;
TR0=0;
if(chaoshengboflag==1)
{
time=th0*256+tl0;
distance=time*0.172; //毫米
if(distance>400)
n[2]=1;
else
n[2]=0;
}
else
{
n[2]=1;
}
if((n[0]||n[1]||n[2])==0)
{
houtui();
youzhuan();
degree0();
delayms(400);
delayms(400);
}
if((n[2]==1)&&(n[1]==0))
{
zuozhuan();
degree0();
delayms(400);
delayms(400);
}
if((n[1]==1)&&(n[2]==0))
{
youzhuan();
degree0();
delayms(400);
delayms(400);
}
if(n[0]==1)
{
qianjin();
degree0();
delayms(400);
delayms(400);
}
if((n[0]==0)&&(n[1]==1)&&(n[2]==1))
{
youzhuan();
degree0();
delayms(400);
delayms(400);
}
}
/*****************超声波*****************************/
void bizhang()
{
EA=0;
chaoshengboflag=0;
TL0=0;
TH0=0;
Trig=1;
delay20us();
Trig=0;
while(Echo==0);
EA=1;
TR0=1;
EX0=1;
delayms(60);
EX0=0;
TR0=0;
if(chaoshengboflag==1)
{
time=th0*256+tl0;
distance=time*0.172; //毫米
if(distance>400)
{
qianjin();
}
else
{
n[0]=0;
bijiao();
}
}
if(chaoshengboflag==0)
{
qianjin(); // 2
}
}
/*************红外循迹*******************/
void xunji()
{
uchar zuo,you;
zuo=zuohong;
you=youhong;
if((zuo==1)&&(you==0))
{
zuozhuanhong();
}
else if((zuo==0)&&(you==1))
{
youzhuanhong();
}
else {
qianjinhong();
}
}
/**********电脑远程遥控***************/
void xuanzelanya(uchar a)
{
uchar aa;
aa=a;
switch(a)
{
case 0x02: qianjin();break;
case 0x01: houtui(); break;
case 0x03: zuozhuan(); break;
case 0x04: youzhuan(); break;
case 0x05: degree45(); break;
case 0x06: degree_45(); break;
case 0x07: degree0(); break;
default: stop(); break;
}
}
/************手机蓝牙遥控*********************/
void shoujilanya(uchar b)
{
uchar bb;
bb=b;
switch(bb)
{
case 15: qianjin();break;
case 16: houtui(); break;
case 17: zuozhuan(); break;
case 18: youzhuan(); break;
case 9: degree45(); break;
case 7: degree_45(); break;
case 8: degree0(); break;
default: stop(); break;
}
}
/****************主函数***************************/
void main()
{
init();
initmada();
delayms(20);
while(1)
{
//电脑远程遥控
if(key3==0)
{
delayms(10);
if(key3==0)
{
while(1)
{
if(pcflag==1)
{
xuanzelanya(shujupc);
pcflag=0;
}
}
}
}
if(key2==0)
{
delayms(10);
if(key2==0)
{
EA=0; //超声波避障
TMOD=0x01;
TR0=0;
EX0=0;
ET0=1;
while(1)
{
bizhang();
}
}
}
if(key1==0)
{
delayms(10);
if(key1==0) //手机蓝牙遥控
{
while(1)
{
if(flag==1)
{
shoujilanya(ashouji);
flag=0;
}
}
}
}
if((key1==1)&&(key2==1)&&(key3==1)) //红外循迹
{
delayms(10);
if((key1==1)&&(key2==1)&&(key3==1))
{
while(1)
{
xunji();
}
}
}
}
}
/******************中断函数******************/
void exter() interrupt 0 //外部中断0
{
th0=TH0;
tl0=TL0;
chaoshengboflag=1;
EX0=0;
}
void T0_time() interrupt 1 //定时器中断
{
TH0=0;
TL0=0;
}
void chuankou() interrupt 4 //串口中断
{
uchar a;
ES=0;
if(key3==0)
{
while(RI==0);
RI=0;
a=SBUF;
if((a==0xff)&&(receivecontrol<2))
{
receivecontrol++;
numpc++;
}
else {
numpc++;
}
if(numpc==3)
{
shujupc=a;
}
if((receivecontrol==2)&&(a=0xff))
{
numpc=0;
receivecontrol=0;
}
pcflag=1;
if(numpc>5)
{
numpc=0;
}
ES=1;
}
if(key1==0)
{
while(RI==0);
a=SBUF;
if(a<63)
{
ashouji=a-48;
}
if(a>63)
{
ashouji=a-50;
}
RI=0;
flag=1;
ES=1;
}
}
|
|