久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5844|回復(fù): 1
收起左側(cè)

單片機WiFi小車源程序

[復(fù)制鏈接]
ID:193320 發(fā)表于 2017-4-25 10:37 | 顯示全部樓層 |閱讀模式
單片機WiFi小車源程序
0.png

  1. #include<reg52.h>
  2. #include<math.h>
  3. #include<intrins.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. P0M1=0X00;
  7. P0M0=0XFF;//設(shè)置P0 為強推挽輸出


  8. uchar Buffer =0;      //從串口接收的數(shù)據(jù)
  9. uint URTAReceivedCount=0,n=1;
  10. uchar data Tempdatatable[5],CommandDatatable[5];//數(shù)據(jù)包


  11. uchar serVal[2];
  12. uint pwm[]={1120,1190,1382,1382,1382,1382,1382,500}; //初始90度,(實際是1382.4,取整得1382)
  13. uchar pwm_flag=0;
  14. uint code ms0_5Con=461; //0.5ms計數(shù) (實際是460.8,取整得461)461
  15. uint code ms2_5Con=2304; //2.5ms計數(shù)2304


  16. bit key_stime_ok;
  17. sbit StatusLight=P2^0; //狀態(tài)燈
  18. sbit MainLight=P2^1; //主大燈
  19. sbit servo0=P0^0;  //舵機控制
  20. sbit servo1=P0^1;
  21. sbit servo2=P0^2;
  22. sbit servo3=P0^3;
  23. sbit servo4=P0^4;
  24. sbit servo5=P0^5;
  25. sbit servo6=P0^6;
  26. sbit servo7=P0^7;
  27. sbit P1_0=P1^0;
  28. sbit P1_1=P1^1;
  29. sbit P1_2=P1^2;
  30. sbit P1_3=P1^3;
  31. /********************************************************************
  32. * 名稱 : Delay_1ms()
  33. * 功能 : 延時子程序,延時時間為 1ms * x
  34. * 輸入 : x (延時一毫秒的個數(shù))
  35. * 輸出 : 無
  36. ***********************************************************************/
  37. void Delay_1ms(uint i)//1ms延時
  38. {
  39. uint x,j;//uchar x,j;
  40. for(j=0;j<i;j++)
  41. for(x=0;x<=148;x++);
  42. }

  43. void TurnOnStatusLight()
  44. {   
  45.    StatusLight=0;
  46. }
  47. /********************************************************************
  48. * 名稱 : Send_Data()
  49. * 功能 : 向上位機傳送字符
  50. * 輸入 : 無
  51. * 輸出 : 無
  52. ***********************************************************************/
  53. void Send_Data(uchar type,uchar cmd,uchar dat)
  54. {
  55.    uchar data Buffer[5];//構(gòu)建數(shù)據(jù)包
  56.    uchar *p;
  57.    uint Send_Count=0;
  58.    p = Buffer;
  59.    Buffer[0]=0XFF;
  60.    Buffer[1]=type;
  61.    Buffer[2]=cmd;
  62.    Buffer[3]=dat;
  63.    Buffer[4]=0XFF;     
  64.   while(1)
  65.      {
  66.       if(*p==0XFF)
  67.         {
  68.          Send_Count++;  //0XFF標志統(tǒng)計位
  69.         }
  70.       SBUF = *p;  //發(fā)送
  71.       while(!TI)  //如果發(fā)送完畢,硬件會置位TI,等待發(fā)送完畢
  72.            {
  73.              _nop_();
  74.            }
  75.       p++;
  76.       TI = 0;
  77.       if(Send_Count == 2)  //當統(tǒng)計到兩次出現(xiàn)0XFF,則認為一個數(shù)據(jù)包發(fā)送完畢,跳出循環(huán)
  78.         {
  79.          TI = 0;
  80.          break;
  81.         }  
  82.      }
  83. }
  84. /********************************************************************
  85. 協(xié)議規(guī)定:
  86. 包頭  類型位  數(shù)據(jù)位 數(shù)據(jù)位   結(jié)束位
  87. 0XFF   0X**   OX**   0X**      0XFF
  88. 各命令說明:
  89. 類型位   數(shù)據(jù)位  數(shù)據(jù)位  功能

  90. 0X00       0X02  0X00    前進
  91. 0X00       0X01  0X00    后退
  92. 0X00       0X03  0X00    左轉(zhuǎn)
  93. 0X00       0X04  0X00    右轉(zhuǎn)
  94. 0X00       0X00  0X00    停止

  95. 0X01       0X01  角度    舵機1
  96. 0X01       0X02    .     舵機2
  97. 0X01       0X01    .     舵機3
  98. 0X01       0X02    .     舵機4
  99. 0X01       0X01    .     舵機5
  100. 0X01       0X02    .     舵機6
  101. 0X01       0X01    .     舵機7
  102. 0X01       0X02  數(shù)據(jù)    舵機8

  103. 0X02       0X01     車燈亮
  104. 0X02       0X02     車燈滅

  105. 0X03      雷達數(shù)據(jù)   發(fā)送雷達數(shù)據(jù)
  106. ***********************************************************************/
  107. /********************************************************************
  108. * 名稱 : Com_Int()
  109. * 功能 : 串口中斷子函數(shù)
  110. ***********************************************************************/
  111. void Com_Int(void) interrupt 4
  112. {
  113. uchar temp;
  114. ES=0; //關(guān)串口中斷
  115. RI=0; //軟件清除接收中斷
  116. temp=SBUF;
  117.   if(temp==0XFF && URTAReceivedCount<3)
  118.      {
  119.        Tempdatatable[0]==0XFF;  //包頭
  120.        URTAReceivedCount++;
  121.      }
  122.   else
  123.      {
  124.        Tempdatatable[n]=temp;
  125.        n++;
  126.            if(URTAReceivedCount==0&&n==2)
  127.            n=1;
  128.      }

  129.   if(URTAReceivedCount==2)//包尾
  130.     {
  131.        Tempdatatable[0]=0XFF;
  132.        Tempdatatable[4]=0XFF;
  133.        n=1;
  134.        URTAReceivedCount=0;  //組包完畢
  135.        temp="";
  136.       // Send_Data(Tempdatatable[1],Tempdatatable[2],Tempdatatable[3]);  //發(fā)送組成的數(shù)據(jù)包回去
  137.     }

  138.   CommandDatatable[0]=Tempdatatable[0];
  139.   CommandDatatable[1]=Tempdatatable[1];
  140.   CommandDatatable[2]=Tempdatatable[2];
  141.   CommandDatatable[3]=Tempdatatable[3];
  142.   CommandDatatable[4]=Tempdatatable[4];

  143.   ES=1;//開串口中斷
  144.   

  145. }

  146. /********************************************************************
  147. * 名稱 : Com_Init()
  148. * 功能 : 串口初始化,晶振11.0592,波特率9600,使能了串口中斷
  149. ***********************************************************************/
  150. void Com_Init(void)
  151. {
  152.      TMOD = 0x21;
  153.      PCON = 0x00;
  154.      SCON = 0x50;   
  155.      TH1 = 0xFd;    //設(shè)置波特率 9600
  156.      TL1 = 0xFd;
  157.      TR1 = 1;  //啟動定時器1
  158.      ES = 1;  //開串口中斷
  159.      EA = 1;  //開總中斷
  160.      IT0=0;
  161.      EX0=1;
  162. }

  163. /********************************************************************
  164. * 名稱 :Moto_Forward()
  165. * 功能 : 電機1、2啟動,都是前進,整車表現(xiàn)為前進。
  166. ***********************************************************************/
  167. void Moto_Forward()
  168. {  
  169.    P1_0=0;
  170.    P1_1=1;
  171.    P1_2=1;
  172.    P1_3=0;
  173.    Delay_1ms(100);
  174. }
  175. /********************************************************************
  176. * 名稱 :Moto_Backward()
  177. * 功能 : 電機1、2啟動,都是后退,整車表現(xiàn)為后退。
  178. ***********************************************************************/
  179. void Moto_Backward()
  180. {
  181.   P1_0=1;
  182.   P1_1=0;
  183.   P1_2=0;
  184.   P1_3=1;
  185.   Delay_1ms(100);
  186. }

  187. /********************************************************************
  188. * 名稱 :Moto_TurnLeft()
  189. * 功能 : 前輪左轉(zhuǎn),后輪停止,整車表現(xiàn)為左轉(zhuǎn)。
  190. ***********************************************************************/
  191. void Moto_TurnLeft()
  192. {
  193.    P1_0=1;
  194.    P1_1=0;
  195.    P1_2=1;
  196.    P1_3=0;
  197.    Delay_1ms(100);
  198. }
  199. /********************************************************************
  200. * 名稱 :Moto_TurnRight()
  201. * 功能 : 前輪右轉(zhuǎn),后輪停止,整車表現(xiàn)為右轉(zhuǎn)。
  202. ***********************************************************************/
  203. void Moto_TurnRight()
  204. {
  205.   P1_0=0;
  206.   P1_1=1;
  207.   P1_2=0;
  208.   P1_3=1;
  209.   Delay_1ms(100);
  210. }
  211. /********************************************************************
  212. * 名稱 :Moto_L_F()
  213. * 功能 : 前輪左轉(zhuǎn),后輪前進,整車表現(xiàn)為左前。
  214. ***********************************************************************/
  215. void Moto_L_F()
  216. {
  217.   P1_0=0;
  218.   P1_1=1;
  219.   Delay_1ms(100);
  220. }
  221. /********************************************************************
  222. * 名稱 :Moto_R_F()
  223. * 功能 : 前輪右轉(zhuǎn),后輪前進,整車右前
  224. ***********************************************************************/
  225. void Moto_R_F()
  226. {
  227.   P1_2=1;
  228.   P1_3=0;
  229.   Delay_1ms(100);
  230. }
  231. /********************************************************************
  232. * 名稱 :Moto_L_B()
  233. * 功能 :前輪左轉(zhuǎn),后輪后退,整車左后
  234. ***********************************************************************/
  235. void Moto_L_B()
  236. {
  237.   P1_0=1;
  238.   P1_1=0;
  239.   Delay_1ms(100);
  240. }
  241. /********************************************************************
  242. * 名稱 :Moto_R_B()
  243. * 功能 : 前輪右轉(zhuǎn),后輪后退,整車右后
  244. ***********************************************************************/
  245. void Moto_R_B()
  246. {
  247.   P1_2=0;
  248.   P1_3=1;
  249.   Delay_1ms(100);
  250. }
  251. /********************************************************************
  252. * 名稱 :Moto_Stop()
  253. * 功能 : 電機1停止,電機2停止,整車表現(xiàn)為停止。
  254. ***********************************************************************/
  255. void Moto_Stop()
  256. {

  257.    P1_0=1;
  258.    P1_1=1;
  259.    P1_2=1;
  260.    P1_3=1;
  261.    Delay_1ms(100);
  262. }
  263. /********************************************************************
  264. * 功能 : 舵機PWM中斷初始化
  265. ***********************************************************************/
  266. void Timer0Init()
  267.   {
  268.       /*0度=0.5ms, 45度=1ms, 90度=1.5ms, 135度=2ms, 180度=2.5ms
  269.       /.5 ms初始值 F700, (12n/11059200=2.5/1000, n=2304, X=65536-2304=63232 > F700)*/  
  270.         TMOD |= 0x01;          //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響               
  271.         TH0=-ms2_5Con>>8;              //給定初值,17ms中斷
  272.         TL0=-ms2_5Con;
  273.         EA=1;            //總中斷打開
  274.         ET0=1;           //定時器0中斷打開
  275.         TR0=1;           //定時器0開關(guān)打開                                   
  276.   }
  277. /********************************************************************
  278. * 功能 : 舵機PWM中斷, //舵機控制函數(shù) 周期為20ms 一個循環(huán)20MS  = 8*2.5ms
  279. ***********************************************************************/
  280. void SteeringGear() interrupt 1
  281. {
  282.     switch(pwm_flag)
  283.     {
  284.         case 1:  servo0=1; TH0=-pwm[0]>>8; TL0=-pwm[0]; break;
  285.         case 2:  servo0=0; TH0=-(ms2_5Con-pwm[0])>>8; TL0=-(ms2_5Con-pwm[0]); break;
  286.                 case 3:  servo1=1; TH0=-pwm[1]>>8; TL0=-pwm[1]; break;
  287.         case 4:  servo1=0; TH0=-(ms2_5Con-pwm[1])>>8; TL0=-(ms2_5Con-pwm[1]); break;   
  288.                 case 5:  servo2=1; TH0=-pwm[2]>>8; TL0=-pwm[2]; break;
  289.         case 6:  servo2=0; TH0=-(ms2_5Con-pwm[2])>>8; TL0=-(ms2_5Con-pwm[2]); break;
  290.                 case 7:  servo3=1; TH0=-pwm[3]>>8; TL0=-pwm[3]; break;
  291.         case 8:  servo3=0; TH0=-(ms2_5Con-pwm[3])>>8; TL0=-(ms2_5Con-pwm[3]); break;
  292.                 case 9:  servo4=1; TH0=-pwm[4]>>8; TL0=-pwm[4]; break;
  293.         case 10: servo4=0; TH0=-(ms2_5Con-pwm[4])>>8; TL0=-(ms2_5Con-pwm[4]); break;
  294.         case 11: servo5=1; TH0=-pwm[5]>>8; TL0=-pwm[5]; break;
  295.         case 12: servo5=0; TH0=-(ms2_5Con-pwm[5])>>8; TL0=-(ms2_5Con-pwm[5]); break;
  296.                 case 13: servo6=1;TH0=-pwm[6]>>8; TL0=-pwm[6]; break;                     
  297.         case 14: servo6=0;TH0=-(ms2_5Con-pwm[6])>>8; TL0=-(ms2_5Con-pwm[6]); break;  
  298.         case 15: servo7=1;TH0=-pwm[7]>>8;  TL0=-pwm[7]; break;      
  299.         case 16: servo7=0;TH0=-(ms2_5Con-pwm[7])>>8; TL0=-(ms2_5Con-pwm[7]); break;
  300.                 default: TH0=0xff; TL0=0x80; pwm_flag=0;         
  301.   }
  302.     pwm_flag++;
  303. }

  304.   void SetSteeringGear(uchar i, uchar val)
  305. {
  306.         uint a = (val+46)*10;
  307.     if(a<ms0_5Con)
  308.                 a=ms0_5Con;
  309.         if(a>ms2_5Con)
  310.                 a=ms2_5Con;
  311.         pwm[i]=a;
  312.         CommandDatatable[2]=0xff; //清除緩存
  313. }

  314. /********************************************************************
  315. * 功能 : 串口中斷接收數(shù)據(jù)
  316. ***********************************************************************/


  317. /*********************************************************************************
  318. ** 函數(shù)功能 : 主函數(shù)
  319. *********************************************************************************/

  320. void main()
  321. {   
  322.   
  323.     MainLight=0;
  324.     Delay_1ms(6000);
  325.     Com_Init();//串口初始化
  326.     Timer0Init();//舵機PWM中斷初始化   
  327.   while(1)
  328.   {
  329.   
  330.    if(CommandDatatable[0]==0XFF && CommandDatatable[4]==0XFF)
  331.       {
  332.            switch (CommandDatatable[1])      //根據(jù)鍵值不同,執(zhí)行不同的內(nèi)容
  333.              {
  334.               case 0X00:  //類型位0X00,表明是控制數(shù)據(jù)包,進入控制數(shù)據(jù)case
  335.                   switch(CommandDatatable[2])  //根據(jù)數(shù)據(jù)位的值來進行選擇執(zhí)行不同的動作
  336.                            {
  337.                              case 0X00:Moto_Stop();break;
  338.                              case 0X01:Moto_Forward();break;
  339.                              case 0X02:Moto_Backward();break;
  340.                              case 0X03:Moto_TurnLeft();break;
  341.                              case 0X04:Moto_TurnRight();break;
  342.                                                          case 0X05:Moto_R_F();break;
  343.                                                          case 0X06:Moto_L_F();break;
  344.                                                          case 0X07:Moto_R_B();break;
  345.                                                          case 0X08:M0to_L_B();break;
  346.                                                          default :  break;
  347.                            }
  348.                          break;
  349.               case 0X01:    //類型位0X01,表明是舵機數(shù)據(jù)包,進入舵機case  
  350.                   switch(CommandDatatable[2])
  351.                  {         
  352.                         case 0x01:SetSteeringGear(0,CommandDatatable[3]);break;
  353.                             case 0x02:SetSteeringGear(1,CommandDatatable[3]);break;
  354.                             case 0x03:SetSteeringGear(2,CommandDatatable[3]);break;
  355.                             case 0x04:SetSteeringGear(3,CommandDatatable[3]);break;
  356.                             case 0x05:SetSteeringGear(4,CommandDatatable[3]);break;
  357.                             case 0x06:SetSteeringGear(5,CommandDatatable[3]);break;
  358.                                         case 0x07:SetSteeringGear(6,CommandDatatable[3]);break;
  359.                             case 0x08:SetSteeringGear(7,CommandDatatable[3]);break;
  360.                                          default :  break;
  361.                       }
  362.                      break;
  363.               case 0X02:  //類型位0X02,表明是大燈數(shù)據(jù)包,進入大燈case
  364.                   switch(CommandDatatable[2])
  365.                            

  366. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

下載:
51版wifi小車程序.rar (3.46 KB, 下載次數(shù): 44)

回復(fù)

使用道具 舉報

ID:404498 發(fā)表于 2019-3-25 21:47 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产欧美日韩在线视频 | 女人高潮特级毛片 | 人人澡人人干 | 六月丁香综合 | 日韩有码av| 午夜在线影院 | 欧美一级片免费 | 国产精品二区一区二区aⅴ污介绍 | 天堂中文字幕免费一区 | 操欧美女人 | 久草视频观看 | 一本一道久久a久久精品蜜桃 | 波多野结衣久久 | 日韩欧美亚洲 | 免费成人黄色 | 国产在线视频网站 | 亚洲欧美日韩一区 | 久草香蕉视频 | 51av视频| 欧美区在线 | 在线精品一区 | www.黄色在线| 国产激情在线 | 私人午夜影院 | 成人午夜视频在线观看 | 丰满少妇高潮无套内谢 | 国产午夜影院 | 中文在线免费观看 | 成年人小视频 | 99久久视频 | 一级黄片毛片 | 久久久在线 | 日本不卡视频在线观看 | 午夜成人在线视频 | 99精品久久久久久中文字幕 | 一区二区三区黄色 | 色视频www在线播放国产人成 | 久久亚洲国产精品 | www.亚洲视频 | 午夜视频网 | 91爱爱网站 |