标题:
stc15单片机4足仿生机器人源程序
[打印本页]
作者:
崔振男
时间:
2018-9-29 09:34
标题:
stc15单片机4足仿生机器人源程序
单片机源程序如下:
#include "stc15.H"
#include "stdio.h"
#include <string.h>
#include <intrins.h>
#include "类型.h"
#define dingshi 0xfd46 //20us中断一次
#define gao (dingshi>>8)
#define di dingshi
//#define FOSC 11059200L
//#define FOSC 22118400L
#define FOSC 27000000L
//#define BAUD 115200
#define BAUD 1200
#define S1_S0 0x40 //P_SW1.6
#define S1_S1 0x80 //P_SW1.7
#define max 20
#define jiange 2000 //接收到两个字节中间的最大间隔 单位是中断个数
#define duo_ji_shu 18 //舵机数
#define su_du 3000
#define qian1 0x45
#define qian2 0x39
#define qian3 0x2b
#define qian4 0x2b
#define hou1 0x33
#define hou2 0x29
#define hou3 0x3b
#define hou4 0x3b
#define shang1 0x29
#define shang2 0x55
#define shang3 0x29
#define shang4 0x55
#define xia1 0x39
#define xia2 0x3f
#define xia3 0x39
#define xia4 0x43
#define jiaozhun1 5
#define jiaozhun2 5
#define jiaozhun3 5
sbit DJ1=P0^5;
sbit DJ2=P0^6;
sbit DJ3=P0^7;
sbit DJ4=P1^0;
sbit DJ5=P1^1;
sbit DJ6=P4^7;
sbit DJ7=P1^2;
sbit DJ8=P1^3;
sbit DJ9=P1^4;
sbit DJ10=P1^5;
sbit DJ11=P1^5;
sbit DJ12=P1^5;
sbit DJ13=P1^5;
sbit DJ14=P1^5;
sbit DJ15=P1^5;
sbit DJ16=P1^5;
sbit DJ17=P1^5;
sbit DJ18=P1^5;
sbit RX=P4^3;
sbit TX=P4^4;
code uchar qian[8*6]={ //动作数组-向前走
hou1,shang1,qian2,xia2,hou3,shang3,qian4,xia4,
qian1,shang1,hou2,xia2,qian3,shang3,hou4,xia4,
qian1,xia1,hou2,xia2,qian3,xia3,hou4,xia4,
qian1,xia1,hou2,shang2,qian3,xia3,hou4,shang4,
hou1,xia1,qian2,shang2,hou3,xia3,qian4,shang4,
hou1,xia1,qian2,xia2,hou3,xia3,qian4,xia4
};
code uchar hou[8*6]={ //动作数组-向后走
hou1,xia1,qian2,xia2,hou3,xia3,qian4,xia4,
hou1,xia1,qian2,shang2,hou3,xia3,qian4,shang4,
qian1,xia1,hou2,shang2,qian3,xia3,hou4,shang4,
qian1,xia1,hou2,xia2,qian3,xia3,hou4,xia4,
qian1,shang1,hou2,xia2,qian3,shang3,hou4,xia4,
hou1,shang1,qian2,xia2,hou3,shang3,qian4,xia4
};
code uchar you[8*6]={ //动作数组-向右转
hou1,shang1,qian2,xia2,qian3,shang3,hou4,xia4,
qian1,shang1,hou2,xia2,hou3,shang3,qian4,xia4,
qian1,xia1,hou2,xia2,hou3,xia3,qian4,xia4,
qian1,xia1,hou2,shang2,hou3,xia3,qian4,shang4,
hou1,xia1,qian2,shang2,qian3,xia3,hou4,shang4,
hou1,xia1,qian2,xia2,qian3,xia3,hou4,xia4
};
code uchar zuo[8*6]={ //动作数组-向左转
hou1,xia1,qian2,xia2,qian3,xia3,hou4,xia4,
hou1,xia1,qian2,shang2,qian3,xia3,hou4,shang4,
qian1,xia1,hou2,shang2,hou3,xia3,qian4,shang4,
qian1,xia1,hou2,xia2,hou3,xia3,qian4,xia4,
qian1,shang1,hou2,xia2,hou3,shang3,qian4,xia4,
hou1,shang1,qian2,xia2,qian3,shang3,hou4,xia4,
};
code uchar tiao[8*6]={ //动作数组-跳舞
hou1,xia1,qian2,xia2,qian3,xia3,hou4,xia4,
hou1,xia1,qian2,shang2,qian3,xia3,hou4,shang4,
qian1,xia1,hou2,shang2,hou3,xia3,qian4,shang4,
qian1,xia1,hou2,xia2,hou3,xia3,qian4,xia4,
qian1,shang1,hou2,xia2,hou3,shang3,qian4,xia4,
hou1,shang1,qian2,xia2,qian3,shang3,hou4,xia4,
};
uchar sheding[duo_ji_shu]; //现在设定值
uchar xinzhi[duo_ji_shu]; //新角度
bit jieshou=0; //接收成功标志
bit jk=0;//测试
bit jk2=0;//测试
uchar len=0; //数据长度
uchar ml=0; //要执行的命令
uchar shuju[max];
uint jishu_jg=0;
bit shijian_l=0;
bit wancheng=0;
bit zhi_xing=0; //开始执行标志
bit MS_1=0;
unsigned int time=0;
unsigned int timer=0;
float S=0;
bit flag =0;
void Delay1ms() //@27.000MHz
{
unsigned char i, j;
;
;
i = 7;
j = 141;
do
{
while (--j);
} while (--i);
}
void yanshi_ms(uint m)
{
while(m--)Delay1ms();
}
void fu_wei()
{
uchar i=0;
sheding[0]=0x33;
sheding[1]=0x3d;//1f
sheding[2]=0x37;
sheding[3]=0x43;
sheding[4]=0x2f;
sheding[5]=0x39;
sheding[6]=0x3b;
sheding[7]=0x41;
}
void chushihua(void) //初始化20us中断22.1184MHz
{
uchar i=0;
ACC = P_SW1;
ACC &= ~(S1_S0 | S1_S1); //S1_S0=0 S1_S1=0
P_SW1 = ACC; //(P3.0/RxD, P3.1/TxD)
SCON = 0x50; //8位可变波特率
T2L = (65536 - (FOSC/4/BAUD)); //设置波特率重装值
T2H = (65536 - (FOSC/4/BAUD))>>8;
AUXR = 0x14; //T2为1T模式, 并启动定时器2
AUXR |= 0x01; //选择定时器2为串口1的波特率发生器
AUXR |= 0x80;
TMOD &= 0xF0;
TL0 = di;
TH0 = gao;
TF0 = 0;
TR0 = 1;
ET0=0;
ES=1;
EA=1;
AUXR &= 0xdf; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TF1 = 0; //清除TF1标志
TR1 = 0; //定时器1开始计时
fu_wei();
}
void yanshi(uint m)
{
while(m--)
{
if(!zhi_xing)break;
}
}
void send(uchar *j,l)
{
uchar i=0;
for(i=0;i<l;i++)
{
SBUF=*(j+i);
while(!TI);
TI=0;
}
yanshi(40000);
yanshi(40000);
yanshi(40000);
yanshi(40000);
}
bit Hand(unsigned char *a) //是否包含文本
{
if(strstr(shuju,a)!=NULL)
return 1;
else
return 0;
}
void Uart() interrupt 4
{
if (RI)
{
RI = 0;
if(len<max)
{
shuju[len++]=SBUF;
jishu_jg=0;//清零时间间隔变量
shijian_l=1;
}
}
// if(TI)TI=0;
}
void zhongduan() interrupt 1 //中断服务
{
uchar i=0;
static int jishu=0;
// static uchar MS=0;
ET0=0;
// DJ1=!DJ1;
if(shijian_l)
{
jishu_jg++;
if(jishu_jg>jiange)
{
jieshou=1;//间隔时间到就说明接收到一个完整的字符串
shijian_l=0;
}
}
if(jishu++==900)
{
jishu=0;
}
DJ1=(jishu<sheding[0]);
DJ2=(jishu<sheding[1]);
DJ3=(jishu<sheding[2]);
DJ4=(jishu<sheding[3]);
DJ5=(jishu<sheding[4]);
DJ6=(jishu<sheding[5]);
DJ7=(jishu<sheding[6]);
DJ8=(jishu<sheding[7]);
DJ9=(jishu<sheding[8]);
DJ10=(jishu<sheding[9]);
DJ11=(jishu<sheding[10]);
DJ12=(jishu<sheding[11]);
DJ13=(jishu<sheding[12]);
DJ14=(jishu<sheding[13]);
DJ15=(jishu<sheding[14]);
DJ16=(jishu<sheding[15]);
DJ17=(jishu<sheding[16]);
DJ18=(jishu<sheding[17]);
TL0 = di;
TH0 = gao;
ET0=1;
}
void StartModule() //T1中断用来扫描数码管和计800MS启动模块
{
TX=1; //800MS 启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
float juli()
{
StartModule();
TH1=0;
TL1=0;
while(!RX); //当RX为零时等待
TR1=1; //开启计数
while(RX); //当RX为1计数并等待
TR1=0; //关闭计数
time=TH1*256+TL1;
TH1=0;
TL1=0;
S=(time*2.0)/1000; //算出来是CM
if(flag==1)
{
flag=0;
S=1000;
}
return S;
}
void qingkong() //清空接收缓存
{
uchar i=0;
for(i=0;i<max;i++)
{
shuju[i]=0;
}
}
void WIFI()
{
while(!Hand("OK")) //判断是否握手成功,如果不成功延时一会,再发送AT握手指令
{
len=0;
qingkong();
send("AT\r\n",4); //发送联机指令
yanshi_ms(1000);
}
qingkong();
while(!Hand("OK"))
{
len=0;
qingkong();
send("AT+CWMODE=2\r\n",13); //设置为AP模式 让手机链接wifi
yanshi_ms(1000);
}
qingkong();
while(!Hand("OK"))
{
len=0;
qingkong();
send("AT+CIPMUX=1\r\n",13); //设置为多连接模式
yanshi_ms(1000);
}
qingkong();
send("AT+CIPSERVER=1,8349\r\n",21);
yanshi_ms(1000);
send("AT+CIPSERVER=1,8349\r\n",21);
yanshi_ms(1000);
send("AT+CIPSERVER=1,8349\r\n",21);
qingkong();
len=0;
yanshi_ms(1000);
wancheng=1; //初始化完成 置标志位
}
uchar to_uchar(uchar g,uchar d)
{
if(g>=97)
{
g=g-87;
}
else
{
if(g<=57)
{
g=g-48;
}
}
if(d>=97)
{
d=d-87;
}
else
{
if(d<=57)
{
d=d-48;
}
}
return (g<<4)|d;
}
void qianjin()
{
uchar j=0;
static uchar i=0;
static uint y=0;
if(zhi_xing)
{
if(y++>su_du)
{
y=0;
for(j=0;j<8;j++)
{
sheding[j]=qian[i*8+j];
}
if(i++==5)i=0;
}
}
}
void houtui()
{
uchar j=0;
static uchar i=0;
static uint y=0;
if(zhi_xing)
{
if(y++>su_du)
{
y=0;
for(j=0;j<8;j++)
{
sheding[j]=hou[i*8+j];
}
if(i++==5)i=0;
}
}
}
void zuozhuan()
{
uchar j=0;
static uchar i=0;
static uint y=0;
if(zhi_xing)
{
if(y++>su_du)
{
y=0;
for(j=0;j<8;j++)
{
sheding[j]=zuo[i*8+j];
}
if(i++==5)i=0;
}
}
}
void youzhuan()
{
uchar j=0;
static uchar i=0;
static uint y=0;
if(zhi_xing)
{
if(y++>su_du)
{
y=0;
for(j=0;j<8;j++)
{
sheding[j]=you[i*8+j];
}
if(i++==5)i=0;
}
}
}
void tiaowu()
{
uchar j=0;
static uchar i=0;
static uint y=0;
if(zhi_xing)
{
if(y++>su_du)
{
y=0;
for(j=0;j<8;j++)
{
sheding[j]=tiao[i*8+j];
}
if(i++==5)i=0;
}
}
}
void zhixing() //执行遥控命令
{
uchar i=0;
if(zhi_xing)
{
switch(ml)
{
case 18:
qianjin(); //前进
break;
case 19:
houtui(); //后退
break;
case 20:
zuozhuan();//左转
break;
case 21:
youzhuan();//右转
break;
case 22:
tiaowu();//跳舞
break;
case 88: //遥控按键抬起
zhi_xing=0;
break;
}
}else fu_wei();
}
void main()
{
uchar k=0,chang=0,i=0,pian_yi=0;
bit jj=0;
chushihua();//初始化
yanshi(40000);
yanshi(40000);
yanshi(40000);
yanshi(40000);
yanshi(40000);
yanshi(40000);
yanshi(40000);
yanshi(40000);
WIFI();
yanshi(40000);
jk=1;
ET0=1;
// while(1)
// {
// sheding[0]=0x18;
// }
while(1)
{
if(jieshou)
{
if(Hand("+IPD"))
{
k=(uchar)strstr(shuju,"+IPD");
if(shuju[10]==':')//+IPD,2,9:123456789 +IPD,2,12:123456789012
{
chang=to_uchar('0',shuju[7]);//取出数据长度
pian_yi=11;
}else if (shuju[9]==':')
{
chang=to_uchar(shuju[7],shuju[8]);
pian_yi=10;
}else if (shuju[8]==':')
{
pian_yi=9;
}
ml=to_uchar(shuju[pian_yi],shuju[pian_yi+1]); //保存命令
if(ml<18)//命令小于18 是设定单个舵机角度值
{
sheding[ml]=to_uchar(shuju[pian_yi+2],shuju[pian_yi+3]);//把接收来的角度值赋给相应的舵机
}else
{
zhi_xing=1; //命令大于17 是遥控指令 置执行标志 执行相应的遥控动作
}
}
jieshou=0;
len=0;
qingkong();
}
zhixing(); //调用执行子程序
}
}
复制代码
所有资料51hei提供下载:
4足仿生机器人.zip
(167.91 KB, 下载次数: 14)
2018-9-29 09:34 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
admin
时间:
2018-9-29 17:42
补全原理图或者详细说明一下电路连接即可获得100+黑币
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1