單片機源程序如下:
- #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
|