標(biāo)題:
stc15單片機(jī)4足仿生機(jī)器人源程序
[打印本頁(yè)]
作者:
崔振男
時(shí)間:
2018-9-29 09:34
標(biāo)題:
stc15單片機(jī)4足仿生機(jī)器人源程序
單片機(jī)源程序如下:
#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 //接收到兩個(gè)字節(jié)中間的最大間隔 單位是中斷個(gè)數(shù)
#define duo_ji_shu 18 //舵機(jī)數(shù)
#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]={ //動(dòng)作數(shù)組-向前走
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]={ //動(dòng)作數(shù)組-向后走
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]={ //動(dòng)作數(shù)組-向右轉(zhuǎn)
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]={ //動(dòng)作數(shù)組-向左轉(zhuǎn)
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]={ //動(dòng)作數(shù)組-跳舞
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]; //現(xiàn)在設(shè)定值
uchar xinzhi[duo_ji_shu]; //新角度
bit jieshou=0; //接收成功標(biāo)志
bit jk=0;//測(cè)試
bit jk2=0;//測(cè)試
uchar len=0; //數(shù)據(jù)長(zhǎng)度
uchar ml=0; //要執(zhí)行的命令
uchar shuju[max];
uint jishu_jg=0;
bit shijian_l=0;
bit wancheng=0;
bit zhi_xing=0; //開(kāi)始執(zhí)行標(biāo)志
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)); //設(shè)置波特率重裝值
T2H = (65536 - (FOSC/4/BAUD))>>8;
AUXR = 0x14; //T2為1T模式, 并啟動(dòng)定時(shí)器2
AUXR |= 0x01; //選擇定時(shí)器2為串口1的波特率發(fā)生器
AUXR |= 0x80;
TMOD &= 0xF0;
TL0 = di;
TH0 = gao;
TF0 = 0;
TR0 = 1;
ET0=0;
ES=1;
EA=1;
AUXR &= 0xdf; //定時(shí)器時(shí)鐘12T模式
TMOD &= 0x0F; //設(shè)置定時(shí)器模式
TF1 = 0; //清除TF1標(biāo)志
TR1 = 0; //定時(shí)器1開(kāi)始計(jì)時(shí)
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;//清零時(shí)間間隔變量
shijian_l=1;
}
}
// if(TI)TI=0;
}
void zhongduan() interrupt 1 //中斷服務(wù)
{
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;//間隔時(shí)間到就說(shuō)明接收到一個(gè)完整的字符串
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中斷用來(lái)掃描數(shù)碼管和計(jì)800MS啟動(dòng)模塊
{
TX=1; //800MS 啟動(dòng)一次模塊
_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); //當(dāng)RX為零時(shí)等待
TR1=1; //開(kāi)啟計(jì)數(shù)
while(RX); //當(dāng)RX為1計(jì)數(shù)并等待
TR1=0; //關(guān)閉計(jì)數(shù)
time=TH1*256+TL1;
TH1=0;
TL1=0;
S=(time*2.0)/1000; //算出來(lái)是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")) //判斷是否握手成功,如果不成功延時(shí)一會(huì),再發(fā)送AT握手指令
{
len=0;
qingkong();
send("AT\r\n",4); //發(fā)送聯(lián)機(jī)指令
yanshi_ms(1000);
}
qingkong();
while(!Hand("OK"))
{
len=0;
qingkong();
send("AT+CWMODE=2\r\n",13); //設(shè)置為AP模式 讓手機(jī)鏈接wifi
yanshi_ms(1000);
}
qingkong();
while(!Hand("OK"))
{
len=0;
qingkong();
send("AT+CIPMUX=1\r\n",13); //設(shè)置為多連接模式
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; //初始化完成 置標(biāo)志位
}
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() //執(zhí)行遙控命令
{
uchar i=0;
if(zhi_xing)
{
switch(ml)
{
case 18:
qianjin(); //前進(jìn)
break;
case 19:
houtui(); //后退
break;
case 20:
zuozhuan();//左轉(zhuǎn)
break;
case 21:
youzhuan();//右轉(zhuǎn)
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]);//取出數(shù)據(jù)長(zhǎng)度
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 是設(shè)定單個(gè)舵機(jī)角度值
{
sheding[ml]=to_uchar(shuju[pian_yi+2],shuju[pian_yi+3]);//把接收來(lái)的角度值賦給相應(yīng)的舵機(jī)
}else
{
zhi_xing=1; //命令大于17 是遙控指令 置執(zhí)行標(biāo)志 執(zhí)行相應(yīng)的遙控動(dòng)作
}
}
jieshou=0;
len=0;
qingkong();
}
zhixing(); //調(diào)用執(zhí)行子程序
}
}
復(fù)制代碼
所有資料51hei提供下載:
4足仿生機(jī)器人.zip
(167.91 KB, 下載次數(shù): 14)
2018-9-29 09:34 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
admin
時(shí)間:
2018-9-29 17:42
補(bǔ)全原理圖或者詳細(xì)說(shuō)明一下電路連接即可獲得100+黑幣
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1