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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1080|回復: 0
收起左側

WiFi智能小車程序

[復制鏈接]
ID:928335 發表于 2021-5-29 09:39 | 顯示全部樓層 |閱讀模式
  1. #include<reg52.h>
  2. #include<math.h>
  3. #include<intrins.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. uchar Buffer =0; // 從串口接收的數據
  7. uint URTAReceivedCount=0,n=1;
  8. uchar dataTempdatatable[5],CommandDatatable[5];// 數據包
  9. uchar serVal[2];
  10. uintpwm[]={1120,1190,1382,1382,1382,1382,1382,1382}; // 初始 90 度 , (實際是 1382.4 ,取整得 1382 )
  11. uchar pwm_flag=0;
  12. uint code ms0_5Con=461; //0.5ms 計數   (實際是 460.8 ,取整得 461 )
  13. uint code ms2_5Con=2304; //2.5ms 計數
  14. bit key_stime_ok;
  15. sbit StatusLight=P2^0; // 狀態燈
  16. sbit MainLight=P2^1; // 主大燈
  17. sbit servo0=P0^0; // 舵機控制
  18. sbit servo1=P0^1;
  19. sbit servo2=P0^2;
  20. sbit servo3=P0^3;
  21. sbit servo4=P0^4;
  22. sbit servo5=P0^5;
  23. sbit servo6=P0^6;
  24. sbit servo7=P0^7;
  25.    // 定義智能小車驅動模塊輸入 IO
  26. sbit IN1 = P1^0; //  高電平 1  后退(反轉)
  27. sbit IN2 = P1^1; //  高電平 1  前進(正轉)
  28. sbit IN3 = P1^2; //  高電平 1  前進(正轉)
  29. sbit IN4 = P1^3; //  高電平 1  后退(反轉)
  30. sbit EN1 = P1^4; //  高電平使能  
  31. sbit EN2 = P1^5;  //  高電平使能  
  32. /********************************************************************
  33. *  名稱  : Delay_1ms()
  34. *  功能  :  延時子程序,延時時間為  1ms * x
  35. *  輸入  : x ( 延時一毫秒的個數 )
  36. *  輸出  :  無
  37. ***********************************************************************/
  38. void Delay_1ms(uint i)//1ms 延時
  39. {
  40. uchar x,j;
  41. for(j=0;j<i;j++)
  42. for(x=0;x<=148;x++);
  43. }
  44. void TurnOnStatusLight()
  45. {
  46. StatusLight=0;
  47. }
  48. /********************************************************************
  49. *  名稱  : Send_Data()
  50. *  功能  :  向上位機傳送字符
  51. *  輸入  :  無
  52. *  輸出  :  無
  53. ***********************************************************************/
  54. void Send_Data(uchar type,uchar cmd,uchardat)
  55. {
  56. uchardata Buffer[5];// 構建數據包
  57. uchar*p;
  58. uintSend_Count=0;
  59. p =Buffer;
  60. Buffer[0]=0XFF;
  61. Buffer[1]=type;
  62. Buffer[2]=cmd;
  63. Buffer[3]=dat;
  64. Buffer[4]=0XFF;
  65. while(1)
  66. {
  67. if(*p==0XFF)
  68. {
  69. Send_Count++; //0XFF 標志統計位
  70. }
  71. SBUF= *p; // 發送
  72. while(!TI) // 如果發送完畢,硬件會置位 TI ,等待發送完畢
  73. {
  74. _nop_();
  75. }
  76. p++;
  77. TI =0;
  78. if(Send_Count == 2) // 當統計到兩次出現 0XFF ,則認為一個數據包發送完畢,跳出循環
  79. {
  80. TI =0;
  81. break;
  82. }
  83. }
  84. }
  85. /********************************************************************
  86. 協議規定:
  87. 包頭   類型位   數據位   數據位   結束位
  88. 0XFF 0X** OX** 0X** 0XFF
  89. 各命令說明:
  90. 類型位   數據位   數據位   功能
  91. 0X00 0X02 0X00  前進
  92. 0X00 0X01 0X00  后退
  93. 0X00 0X03 0X00  左轉
  94. 0X00 0X04 0X00  右轉
  95. 0X00 0X00 0X00  停止
  96. 0X01 0X01 角度   舵機 1
  97. 0X01 0X02 . 舵機 2
  98. 0X01 0X01 . 舵機 3
  99. 0X01 0X02 . 舵機 4
  100. 0X01 0X01 . 舵機 5
  101. 0X01 0X02 . 舵機 6
  102. 0X01 0X01 . 舵機 7
  103. 0X01 0X02 數據   舵機 8
  104. 0X02 0X01 車燈亮
  105. 0X02 0X02 車燈滅
  106. 0X03  雷達數據   發送雷達數據  
  107. ***********************************************************************/
  108. /********************************************************************
  109. *  名稱  : Com_Int()
  110. *  功能  :  串口中斷子函數
  111. ***********************************************************************/
  112. void Com_Int(void) interrupt 4
  113. {
  114. uchar temp;
  115. ES=0; // 關串口中斷
  116. RI=0; // 軟件清除接收中斷
  117. temp=SBUF;
  118. if(temp==0XFF &&URTAReceivedCount<3)
  119. {
  120. Tempdatatable[0]==0XFF; // 包頭
  121. URTAReceivedCount++;
  122. }
  123. else
  124. {
  125. Tempdatatable[n]=temp;
  126. n++;
  127. if(URTAReceivedCount==0&&n==2)
  128. n=1;
  129. }
  130. if(URTAReceivedCount==2)// 包尾
  131. {
  132. Tempdatatable[0]=0XFF;
  133. Tempdatatable[4]=0XFF;
  134. n=1;
  135. URTAReceivedCount=0; // 組包完畢
  136. temp="";
  137. //Send_Data(Tempdatatable[1],Tempdatatable[2],Tempdatatable[3]); // 發送組成的數據包回去
  138. }
  139. CommandDatatable[0]=Tempdatatable[0];
  140. CommandDatatable[1]=Tempdatatable[1];
  141. CommandDatatable[2]=Tempdatatable[2];
  142. CommandDatatable[3]=Tempdatatable[3];
  143. CommandDatatable[4]=Tempdatatable[4];
  144. ES=1;// 開串口中斷

  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; // 設置波特率  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 啟動,都是前進,整車表現為前進。
  166. ***********************************************************************/
  167. void Moto_Forward()
  168. {
  169. IN1=0;   // 左電機
  170. IN2=1;
  171. IN3=1;    // 右電機
  172. IN4=0;
  173. EN1=1;
  174. EN2=1;
  175. Delay_1ms(100);
  176. }
  177. /********************************************************************
  178. *  名稱  :Moto_Backward()
  179. *  功能  :  電機 1 、 2 啟動,都是后退,整車表現為后退。
  180. ***********************************************************************/
  181. void Moto_Backward()
  182. {

  183. IN1=1;   // 左電機
  184. IN2=0;
  185. IN3=0;   // 右電機
  186. IN4=1;
  187. EN1=1;
  188. EN2=1;
  189. Delay_1ms(100);
  190. }
  191. /********************************************************************
  192. *  名稱  :Moto_TurnLeft()
  193. *  功能  :  電機 1 后退,電機 2 前進,整車表現為左轉。
  194. ***********************************************************************/
  195. void Moto_TurnLeft()
  196. {
  197. IN1=0;   // 左電機
  198. IN2=0;
  199. IN3=1;   // 右電機
  200. IN4=0;
  201. EN1=1;
  202. EN2=1;
  203. Delay_1ms(100);
  204. }
  205. /********************************************************************
  206. *  名稱  :Moto_TurnRight()
  207. *  功能  :  電機 1 前進,電機 2 后退,整車表現為右轉。
  208. ***********************************************************************/
  209. void Moto_TurnRight()
  210. {
  211. IN1=0;   // 左電機
  212. IN2=1;
  213. IN3=0;   // 右電機
  214. IN4=0;
  215. EN1=1;
  216. EN2=1;
  217. Delay_1ms(100);
  218. }
  219. /********************************************************************
  220. *  名稱  :Moto_Stop()
  221. *  功能  :  電機 1 停止,電機 2 停止,整車表現為停止。
  222. ***********************************************************************/
  223. void Moto_Stop()
  224. {

  225. IN1=0;   // 左電機
  226. IN2=0;
  227. IN3=0;   // 右電機
  228. IN4=0;
  229. EN1=1;
  230. EN2=1;
  231. Delay_1ms(100);
  232. }
  233. /********************************************************************
  234. *  功能  :  舵機 PWM 中斷初始化
  235. ***********************************************************************/
  236. void Timer0Init()
  237. {
  238. /*0 度 =0.5ms, 45 度 =1ms, 90 度 =1.5ms, 135 度 =2ms, 180 度 =2.5ms
  239. /.5ms 初始值  F700, (12n/11059200=2.5/1000,n=2304, X=65536-2304=63232 > F700)*/
  240. TMOD|= 0x01;  // 使用模式 1 , 16 位定時器,使用 "|" 符號可以在使用多個定時器時不受影響   
  241. TH0=-ms2_5Con>>8;  // 給定初值, 17ms 中斷
  242. TL0=-ms2_5Con;
  243. EA=1;// 總中斷打開
  244. ET0=1; // 定時器 0 中斷打開
  245. TR0=1; // 定時器 0 開關打開  
  246. }
  247. /********************************************************************
  248. *  功能  :  舵機 PWM 中斷 , // 舵機控制函數   周期為 20ms  一個循環 20MS = 8*2.5ms
  249. ***********************************************************************/
  250. void SteeringGear() interrupt 1
  251. {
  252. switch(pwm_flag)
  253. {
  254. case1: servo0=1; TH0=-pwm[0]>>8; TL0=-pwm[0]; break;
  255. case2: servo0=0; TH0=-(ms2_5Con-pwm[0])>>8; TL0=-(ms2_5Con-pwm[0]); break;
  256. case3: servo1=1; TH0=-pwm[1]>>8; TL0=-pwm[1]; break;
  257. case4: servo1=0; TH0=-(ms2_5Con-pwm[1])>>8; TL0=-(ms2_5Con-pwm[1]); break;
  258. case5: servo2=1; TH0=-pwm[2]>>8; TL0=-pwm[2]; break;
  259. case6: servo2=0; TH0=-(ms2_5Con-pwm[2])>>8; TL0=-(ms2_5Con-pwm[2]); break;
  260. case7: servo3=1; TH0=-pwm[3]>>8; TL0=-pwm[3]; break;
  261. case8: servo3=0; TH0=-(ms2_5Con-pwm[3])>>8; TL0=-(ms2_5Con-pwm[3]); break;
  262. case9: servo4=1; TH0=-pwm[4]>>8; TL0=-pwm[4]; break;
  263. case10: servo4=0; TH0=-(ms2_5Con-pwm[4])>>8; TL0=-(ms2_5Con-pwm[4]); break;
  264. case11: servo5=1; TH0=-pwm[5]>>8; TL0=-pwm[5]; break;
  265. case12: servo5=0; TH0=-(ms2_5Con-pwm[5])>>8; TL0=-(ms2_5Con-pwm[5]); break;
  266. case13: servo6=1;TH0=-pwm[6]>>8; TL0=-pwm[6]; break;
  267. case14: servo6=0;TH0=-(ms2_5Con-pwm[6])>>8; TL0=-(ms2_5Con-pwm[6]); break;
  268. case15: servo7=1;TH0=-pwm[7]>>8; TL0=-pwm[7]; break;
  269. case16: servo7=0;TH0=-(ms2_5Con-pwm[7])>>8; TL0=-(ms2_5Con-pwm[7]); break;
  270.   default: TH0=0xff; TL0=0x80; pwm_flag=0;
  271. }
  272. pwm_flag++;
  273. }
  274. voidSetSteeringGear(uchar i, uchar val)
  275. {
  276. uinta = (val+46)*10;
  277. if(a<ms0_5Con)
  278.   a=ms0_5Con;
  279. if(a>ms2_5Con)
  280.   a=ms2_5Con;
  281. pwm[i]=a;
  282. CommandDatatable[2]=0xff; // 清除緩存
  283. }
  284. /********************************************************************
  285. *  功能  :  串口中斷接收數據
  286. ***********************************************************************/

  287. /*********************************************************************************
  288. **  函數功能   :   主函數
  289. *********************************************************************************/
  290. void main()
  291. {

  292. MainLight=0;
  293. Delay_1ms(200);
  294. Com_Init();// 串口初始化
  295. Timer0Init();// 舵機 PWM 中斷初始化  
  296. while(1)
  297. {

  298. if(CommandDatatable[0]==0XFF &&CommandDatatable[4]==0XFF)
  299. {
  300. switch (CommandDatatable[1]) // 根據鍵值不同,執行不同的內容
  301. {
  302. case0X00: // 類型位 0X00 ,表明是控制數據包,進入控制數據 case
  303. switch(CommandDatatable[2]) // 根據數據位的值來進行選擇執行不同的動作
  304. {
  305. case0X00:Moto_Stop();break;
  306. case0X01:Moto_Forward();break;
  307. case0X02:Moto_Backward();break;
  308. case0X03:Moto_TurnLeft();break;
  309. case0X04:Moto_TurnRight();break;
  310.             default : break;
  311. }
  312. break;
  313. case0X01: // 類型位 0X01 ,表明是舵機數據包,進入舵機 case
  314. switch(CommandDatatable[2])
  315. {
  316. case0x01:SetSteeringGear(0,CommandDatatable[3]);break;
  317.   case 0x02:SetSteeringGear(1,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. case0X02: // 類型位 0X02 ,表明是大燈數據包,進入大燈 case
  328. switch(CommandDatatable[2])
  329. {
  330. case0X01:MainLight=1;break;
  331. case0X02:MainLight=0;break;
  332.             default : break;
  333. }
  334. break;
  335. default : break;
  336. }
  337. }
  338. }
  339. }
復制代碼


回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美不卡在线 | 国产精品 亚洲一区 | 91免费版在线观看 | 国产日韩精品一区 | 91久久电影 | 亚洲免费视频在线观看 | aaa在线| 欧美精品在线一区二区三区 | 亚洲精品国产电影 | 成人h视频| 日韩一区二区精品 | 在线国产中文字幕 | 成年人网站国产 | 中文字幕不卡 | 91爱爱·com| 影音先锋亚洲资源 | 日韩一区二区三区在线播放 | 日韩欧美视频网站 | 国产三级 | 国产精品美女久久久久久久久久久 | 国产精品久久久久久久久免费樱桃 | 欧美久久久久久久久中文字幕 | 福利视频一区二区 | 中文字幕 在线观看 | 高清一区二区三区 | 中文精品一区二区 | 黄色网毛片 | 欧美久久一区 | 国产成人一区二区三区精 | 亚洲综合大片69999 | 日日操av | 国产激情91久久精品导航 | 国产精品久久久久婷婷二区次 | 国产精品免费在线 | 欧美国产视频 | 久久精品亚洲成在人线av网址 | 免费a级毛片在线播放 | 久久丁香| 国产精品国产a级 | 一级毛片免费 | 国产亚洲欧美在线 |