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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2377|回復: 1
打印 上一主題 下一主題
收起左側

wifi小車的單片機源碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:185181 發表于 2017-10-21 11:18 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
小車源碼,親測可用
所有資料51hei提供下載:
wifi車體控制 最初版.zip (40.52 KB, 下載次數: 10)

單片機源程序如下:
  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;//設置P0 為強推挽輸出


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


  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計數 (實際是460.8,取整得461)461
  15. uint code ms2_5Con=2304; //2.5ms計數2304


  16. bit key_stime_ok;
  17. sbit StatusLight=P2^0; //狀態燈
  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. sbit  P1_0=P1^0;
  33. sbit  P1_1=P1^1;
  34. sbit  P1_2=P1^2;
  35. sbit  P1_3=P1^3;
  36. sbit  P1_4=P1^4;
  37. sbit  P1_5=P1^5;
  38. sbit  P1_6=P1^6;
  39. sbit  P1_7=P1^7;
  40. /********************************************************************
  41. * 名稱 : Delay_1ms()
  42. * 功能 : 延時子程序,延時時間為 1ms * x
  43. * 輸入 : x (延時一毫秒的個數)
  44. * 輸出 : 無
  45. ***********************************************************************/
  46. void Delay_1ms(uint i)//1ms延時
  47. {
  48. uint x,j;//uchar x,j;
  49. for(j=0;j<i;j++)
  50. for(x=0;x<=148;x++);
  51. }

  52. void TurnOnStatusLight()
  53. {   
  54.    StatusLight=0;
  55. }
  56. /********************************************************************
  57. * 名稱 : Send_Data()
  58. * 功能 : 向上位機傳送字符
  59. * 輸入 : 無
  60. * 輸出 : 無
  61. ***********************************************************************/
  62. void Send_Data(uchar type,uchar cmd,uchar dat)
  63. {
  64.    uchar data Buffer[5];//構建數據包
  65.    uchar *p;
  66.    uint Send_Count=0;
  67.    p = Buffer;
  68.    Buffer[0]=0XFF;
  69.    Buffer[1]=type;
  70.    Buffer[2]=cmd;
  71.    Buffer[3]=dat;
  72.    Buffer[4]=0XFF;     
  73.   while(1)
  74.      {
  75.       if(*p==0XFF)
  76.         {
  77.          Send_Count++;  //0XFF標志統計位
  78.         }
  79.       SBUF = *p;  //發送
  80.       while(!TI)  //如果發送完畢,硬件會置位TI,等待發送完畢
  81.            {
  82.              _nop_();
  83.            }
  84.       p++;
  85.       TI = 0;
  86.       if(Send_Count == 2)  //當統計到兩次出現0XFF,則認為一個數據包發送完畢,跳出循環
  87.         {
  88.          TI = 0;
  89.          break;
  90.         }  
  91.      }
  92. }
  93. /********************************************************************
  94. 協議規定:
  95. 包頭  類型位  數據位 數據位   結束位
  96. 0XFF   0X**   OX**   0X**      0XFF
  97. 各命令說明:
  98. 類型位   數據位  數據位  功能

  99. 0X00       0X02  0X00    前進
  100. 0X00       0X01  0X00    后退
  101. 0X00       0X03  0X00    左轉
  102. 0X00       0X04  0X00    右轉
  103. 0X00       0X00  0X00    停止

  104. 0X01       0X01  角度    舵機1
  105. 0X01       0X02    .     舵機2
  106. 0X01       0X01    .     舵機3
  107. 0X01       0X02    .     舵機4
  108. 0X01       0X01    .     舵機5
  109. 0X01       0X02    .     舵機6
  110. 0X01       0X01    .     舵機7
  111. 0X01       0X02  數據    舵機8

  112. 0X02       0X01     車燈亮
  113. 0X02       0X02     車燈滅

  114. 0X03      雷達數據   發送雷達數據
  115. ***********************************************************************/
  116. /********************************************************************
  117. * 名稱 : Com_Int()
  118. * 功能 : 串口中斷子函數
  119. ***********************************************************************/
  120. void Com_Int(void) interrupt 4
  121. {
  122. uchar temp;
  123. ES=0; //關串口中斷
  124. RI=0; //軟件清除接收中斷
  125. temp=SBUF;
  126.   if(temp==0XFF && URTAReceivedCount<3)
  127.      {
  128.        Tempdatatable[0]==0XFF;  //包頭
  129.        URTAReceivedCount++;
  130.      }
  131.   else
  132.      {
  133.        Tempdatatable[n]=temp;
  134.        n++;
  135.            if(URTAReceivedCount==0&&n==2)
  136.            n=1;
  137.      }

  138.   if(URTAReceivedCount==2)//包尾
  139.     {
  140.        Tempdatatable[0]=0XFF;
  141.        Tempdatatable[4]=0XFF;
  142.        n=1;
  143.        URTAReceivedCount=0;  //組包完畢
  144.        temp="";
  145.       // Send_Data(Tempdatatable[1],Tempdatatable[2],Tempdatatable[3]);  //發送組成的數據包回去
  146.     }

  147.   CommandDatatable[0]=Tempdatatable[0];
  148.   CommandDatatable[1]=Tempdatatable[1];
  149.   CommandDatatable[2]=Tempdatatable[2];
  150.   CommandDatatable[3]=Tempdatatable[3];
  151.   CommandDatatable[4]=Tempdatatable[4];

  152.   ES=1;//開串口中斷
  153.   

  154. }

  155. /********************************************************************
  156. * 名稱 : Com_Init()
  157. * 功能 : 串口初始化,晶振11.0592,波特率9600,使能了串口中斷
  158. ***********************************************************************/
  159. void Com_Init(void)
  160. {
  161.      TMOD=0x21;
  162.      PCON=0x00;
  163.      SCON=0x50;   
  164.      TH1=0xFd;    //設置波特率 9600
  165.      TL1=0xFd;
  166.      TR1=1;  //啟動定時器1
  167.      ES= 1;  //開串口中斷
  168.      EA= 1;  //開總中斷
  169.      IT0=0;
  170.      EX0=1;
  171. }
  172. /***************************************************************/
  173. void  Moto_TurnLeft()
  174. {       
  175.         P1_0=0;
  176.         P1_1=1;
  177.         P1_2=0;
  178.         P1_3=1;
  179.         P1_4=1;
  180.         P1_5=0;
  181.         P1_6=1;
  182.         P1_7=0;                
  183. }
  184. void Moto_TurnRight()        //右轉函數
  185. {         P1_0=1;
  186.         P1_1=0;
  187.         P1_2=1;
  188.         P1_3=0;
  189.         P1_4=1;
  190.         P1_5=0;
  191.         P1_6=1;
  192.         P1_7=0;
  193. }
  194. void  Moto_Stop(void)
  195. {
  196.         P1_0=1;
  197.            P1_1=1;
  198.            P1_2=1;
  199.            P1_3=1;
  200.         P1_4=1;
  201.         P1_5=1;
  202.         P1_6=1;
  203.         P1_7=1;
  204. }
  205. void   Moto_Forward()
  206. {
  207.           P1_0=1;
  208.         P1_1=0;
  209.         P1_2=0;
  210.         P1_3=1;
  211.         P1_4=0;
  212.         P1_5=1;
  213.         P1_6=1;
  214.         P1_7=0;
  215. }
  216. void  Moto_Backward()
  217. {
  218.         P1_0=0;
  219.         P1_1=1;
  220.         P1_2=1;
  221.         P1_3=0;
  222.         P1_4=1;
  223.         P1_5=0;                                                               
  224.         P1_6=0;
  225.         P1_7=1;
  226. }
  227. /***********************************************************************/
  228. void Timer0Init()
  229.   {
  230.       /*0度=0.5ms, 45度=1ms, 90度=1.5ms, 135度=2ms, 180度=2.5ms
  231.       /.5 ms初始值 F700, (12n/11059200=2.5/1000, n=2304, X=65536-2304=63232 > F700)*/  
  232.         TMOD |= 0x01;          //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響               
  233.         TH0=-ms2_5Con>>8;              //給定初值,17ms中斷
  234.         TL0=-ms2_5Con;
  235.         EA=1;            //總中斷打開
  236.         ET0=1;           //定時器0中斷打開
  237.         TR0=1;           //定時器0開關打開                                   
  238.   }
  239. /********************************************************************
  240. * 功能 : 舵機PWM中斷, //舵機控制函數 周期為20ms 一個循環20MS  = 8*2.5ms
  241. ***********************************************************************/
  242. void SteeringGear() interrupt 1
  243. {
  244.     switch(pwm_flag)
  245.     {
  246.         case 1:  servo0=1; TH0=-pwm[0]>>8; TL0=-pwm[0]; break;
  247.         case 2:  servo0=0; TH0=-(ms2_5Con-pwm[0])>>8; TL0=-(ms2_5Con-pwm[0]); break;
  248.                 case 3:  servo1=1; TH0=-pwm[1]>>8; TL0=-pwm[1]; break;
  249.         case 4:  servo1=0; TH0=-(ms2_5Con-pwm[1])>>8; TL0=-(ms2_5Con-pwm[1]); break;   
  250.                 case 5:  servo2=1; TH0=-pwm[2]>>8; TL0=-pwm[2]; break;
  251.         case 6:  servo2=0; TH0=-(ms2_5Con-pwm[2])>>8; TL0=-(ms2_5Con-pwm[2]); break;
  252.                 case 7:  servo3=1; TH0=-pwm[3]>>8; TL0=-pwm[3]; break;
  253.         case 8:  servo3=0; TH0=-(ms2_5Con-pwm[3])>>8; TL0=-(ms2_5Con-pwm[3]); break;
  254.                 case 9:  servo4=1; TH0=-pwm[4]>>8; TL0=-pwm[4]; break;
  255.         case 10: servo4=0; TH0=-(ms2_5Con-pwm[4])>>8; TL0=-(ms2_5Con-pwm[4]); break;
  256.         case 11: servo5=1; TH0=-pwm[5]>>8; TL0=-pwm[5]; break;
  257.         case 12: servo5=0; TH0=-(ms2_5Con-pwm[5])>>8; TL0=-(ms2_5Con-pwm[5]); break;
  258.                 case 13: servo6=1;TH0=-pwm[6]>>8; TL0=-pwm[6]; break;                     
  259.         case 14: servo6=0;TH0=-(ms2_5Con-pwm[6])>>8; TL0=-(ms2_5Con-pwm[6]); break;  
  260.         case 15: servo7=1;TH0=-pwm[7]>>8;  TL0=-pwm[7]; break;      
  261.         case 16: servo7=0;TH0=-(ms2_5Con-pwm[7])>>8; TL0=-(ms2_5Con-pwm[7]); break;
  262.                 default: TH0=0xff; TL0=0x80; pwm_flag=0;         
  263.   }
  264.    pwm_flag++;
  265. }

  266.   void SetSteeringGear(uchar i, uchar val)
  267. {
  268.         uint a = (val+46)*10;
  269.     if(a<ms0_5Con)
  270.                 a=ms0_5Con;
  271.         if(a>ms2_5Con)
  272.                 a=ms2_5Con;
  273.         pwm[i]=a;
  274.         CommandDatatable[2]=0xff; //清除緩存
  275. }
  276.   
  277. /********************************************************************
  278. * 功能 : 串口中斷接收數據
  279. ***********************************************************************/


  280. /*********************************************************************************
  281. ** 函數功能 : 主函數
  282. *********************************************************************************/

  283. void main()
  284. {   
  285.   
  286.     MainLight=0;
  287.     Delay_1ms(6000);
  288.     Com_Init();//串口初始化
  289.     Timer0Init();//舵機PWM中斷初始化   
  290.   while(1)
  291.   {
  292.   
  293.    if(CommandDatatable[0]==0XFF && CommandDatatable[4]==0XFF)
  294.       {
  295.            switch (CommandDatatable[1])      //根據鍵值不同,執行不同的內容
  296.              {
  297.               case 0X00:  //類型位0X00,表明是控制數據包,進入控制數據case
  298.                   switch(CommandDatatable[2])  //根據數據位的值來進行選擇執行不同的動作
  299.                            {
  300.                              case 0X00:Moto_Stop();break;
  301.                              case 0X02:Moto_Forward();break;
  302.                              case 0X01:Moto_Backward();break;
  303.                              case 0X03:Moto_TurnLeft();break;
  304.                              case 0X04:Moto_TurnRight();break;
  305.                                                          /*case 0X05:Moto_R_F();break;
  306.                                                          case 0X06:Moto_L_F();break;                                                                                                                             
  307.                                                          case 0X07:Moto_R_B();break;
  308.                                                          case 0X08:M0to_L_B();break;
  309.                                                          default :  break;*/
  310.                            }
  311.                          break;


  312.                                                
  313.               case 0X01:    //類型位0X01,表明是舵機數據包,進入舵機case  
  314.                   switch(CommandDatatable[2])
  315.                  {         
  316.                         case 0x01:SetSteeringGear(0,CommandDatatable[3]);break;
  317.                             case 0x02:SetSteeringGear(0,CommandDatatable[3]);break;
  318.                             case 0x03:SetSteeringGear(2,CommandDatatable[3]);break;
  319.                             case 0x04:SetSteeringGear(3,CommandDatatable[3]);break;
  320.                             case 0x05:SetSteeringGear(4,CommandDatatable[3]);break;
  321.                             case 0x06:SetSteeringGear(5,CommandDatatable[3]);break;
  322.                                         case 0x07:SetSteeringGear(6,CommandDatatable[3]);break;
  323.                             case 0x08:SetSteeringGear(7,CommandDatatable[3]);break;
  324.                                          default :  break;
  325.                       }
  326.                      break;
  327.               case 0X02:  //類型位0X02,表明是大燈數據包,進入大燈case
  328.                   switch(CommandDatatable[2])
  329.                            {
  330.                              case 0X01:MainLight=1;break;
  331.                              case 0X02:MainLight=0;break;
  332.                                                          default :  break;
  333.                            }
  334.                   break;
  335.               default :  break;
  336.             }
  337.        }
  338.   }
  339. }
復制代碼




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:220936 發表于 2018-4-12 20:39 | 只看該作者
樓主你這個真可以用嗎我編譯后怎么還有錯誤
回復

使用道具 舉報

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

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久午夜国产精品www忘忧草 | 亚洲激情第一页 | 久草免费电影 | 亚洲一区二区免费 | 午夜影院视频 | 日韩中文一区二区三区 | 伊人免费观看视频 | www精品美女久久久tv | 中国人pornoxxx麻豆 | 欧美午夜一区 | 免费毛片网站在线观看 | 99在线精品视频 | 岛国av免费看 | 久久久一区二区 | 日韩中文欧美 | 人人鲁人人莫人人爱精品 | 婷婷综合激情 | 一区二区三区成人 | 国产我和子的乱视频网站 | 91久久精品日日躁夜夜躁国产 | 毛片免费看的 | 日韩国产中文字幕 | 亚洲国产成人一区二区 | 国产精品久久视频 | 日韩一二三区视频 | 精品久久一区二区三区 | 午夜免费福利影院 | 精品欧美一区二区精品久久久 | 成人久久久久 | 亚欧性视频| 国产精品色婷婷久久58 | 日本黄色影片在线观看 | 亚洲精品一区二区三区在线 | 欧美一区二区小视频 | 色综合久 | 久久一区| 91网站在线看 | 欧美成人一区二免费视频软件 | 久久久久国产一级毛片 | 91九色在线观看 | 操视频网站|