找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5170|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

科技立項(xiàng)--藍(lán)牙小車

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:52130 發(fā)表于 2014-4-17 09:40 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  1. #include<reg52.h>
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. #define ulong unsigned long
  7. #define t1n 100

  8. /*sbit L_on=P1^4;
  9. sbit L1=P0^1;
  10. sbit L2=P0^2;
  11. sbit L3=P0^3;
  12. sbit L4=P0^4;
  13. sbit L5=P0^5;
  14. sbit L6=P0^6; */

  15. //循跡紅外對(duì)管信號(hào)反饋
  16. sbit Leftled = P3^2;
  17. sbit Rightled = P3^4;
  18. sbit Leftled2 = P3^3;
  19. sbit Rightled2 = P3^5;

  20. //超聲波管腳定義
  21. sbit Trig = P2^0; //產(chǎn)生脈沖引腳
  22. sbit Echo = P2^1; //回波引腳

  23. //左邊輪子
  24. sbit in1=P0^0;
  25. sbit in2=P0^1;
  26. sbit in3=P0^2 ;
  27. sbit in4=P0^3 ;
  28. //右邊輪子
  29. sbit in11=P0^4 ;
  30. sbit in22=P0^5 ;
  31. sbit in33=P0^6 ;
  32. sbit in44=P0^7 ;

  33. sbit Beef = P3^6;
  34. uint ZKB = 70;
  35. uchar BK =0;

  36. uchar z=0,time=0; //計(jì)數(shù)器
  37. char Buffer;
  38. char BufferFunction = 0x63; //默認(rèn)模式限定藍(lán)牙控制
  39. char BufferSpeed;
  40. char BufferDirection;

  41. bit flag=0; //用于超聲波
  42. bit flag_b=0;
  43. bit flag1=0;
  44. ulong t0,count,tc;
  45. ulong distance;
  46. ulong C;

  47. void Bluetooth_Move();
  48. void BTControl();
  49. void xunji();
  50. void bizhang();

  51. //超聲波
  52. void delay(uint z);
  53. void delay1(void);
  54. void DelayMs(uint t);
  55. void DelayUs(uint t);
  56. void celiang();
  57. void zhuanxiang();

  58. /********************************************************************
  59. * 名稱 : Delay_1ms()
  60. * 功能 : 延時(shí)子程序,延時(shí)時(shí)間為 1ms * x
  61. * 輸入 : x (延時(shí)一毫秒的個(gè)數(shù))
  62. * 輸出 : 無(wú)
  63. ***********************************************************************/
  64. void Delay_1ms(int i)//1ms延時(shí)
  65. {
  66. int x,j;
  67. for(j=0;j<i;j++)
  68. for(x=0;x<=148;x++);
  69. }
  70. /********************************************************************
  71. * 名稱 : Com_Int()
  72. * 功能 : 串口中斷子函數(shù)
  73. * 輸入 : 無(wú)
  74. * 輸出 : 無(wú)
  75. ***********************************************************************/
  76. //當(dāng)IO口有數(shù)據(jù)流入時(shí)會(huì)自動(dòng)執(zhí)行
  77. void Com_Int(void) interrupt 4
  78. {
  79. //ES = 0; //總中斷關(guān)閉
  80. if(RI == 1) //當(dāng)硬件接收到一個(gè)數(shù)據(jù)時(shí),RI會(huì)置位串口有發(fā)送和接收兩種不同的情況
  81. //(不論是發(fā)送還是接收,只要發(fā)送或接收完成,都會(huì)置位串口中斷標(biāo)志位(發(fā)送就置位TI,接收則置位RI),
  82. //所以=1表示的是兩個(gè)標(biāo)志位只要有一個(gè)為1(即是兩種情況有一種發(fā)生)且此時(shí)系統(tǒng)允許串口中斷,
  83. //則會(huì)轉(zhuǎn)向中斷服務(wù)程序,在服務(wù)程序里判斷中斷是TI/RI哪個(gè)為1觸發(fā)的,相應(yīng)的做出處理,如可以把緩沖區(qū)的數(shù)據(jù)讀出來(lái)。)
  84. {
  85. Buffer=SBUF;//SBUF:51串口通信寄存器
  86. if(0x62<=Buffer&&Buffer<=0x69){
  87. BufferFunction = Buffer;
  88. B = 1;
  89. }
  90. if(0x30<=Buffer&&Buffer<=0x39) BufferSpeed = Buffer;
  91. if(0x41<=Buffer&&Buffer<=0x61) BufferDirection = Buffer;
  92. RI = 0; //關(guān)閉串口中斷
  93. }
  94. //ES = 1;
  95. }


  96. /********************************************************************
  97. * 名稱 : Com_Init()
  98. * 功能 : 串口初始化,晶振11.0592,波特率9600,使串口中斷
  99. * 輸入 : 無(wú)
  100. * 輸出 : 無(wú)
  101. ***********************************************************************/
  102. void Com_Init(void)
  103. {
  104. TMOD = 0x21; //選擇使用8位定時(shí)器1
  105. PCON = 0x00; //是設(shè)置波特率不加倍
  106. SCON = 0x50; //選擇8位異步通信方式,波特率可變,由定時(shí)器控制;允許接受;發(fā)送中斷標(biāo)志、接收中斷標(biāo)志分別為0、0
  107. TH1 = 0xfd; //設(shè)置波特率 9600= 11.0592*1000000/12/(0x100-0xfd)/32
  108. TL1 = 0xfd;
  109. TH0 = (65536-100)/256;
  110. TL0 = (65536-100)/256;
  111. TR0 = 0; //先不啟動(dòng)定時(shí)器0
  112. TR1 = 1; //啟動(dòng)定時(shí)器1
  113. ES = 1; //開(kāi)串口中斷
  114. EA = 1; //開(kāi)總中斷

  115. //超聲波管腳
  116. Trig=0;
  117. Echo=0;
  118. }

  119. //避障超聲波定時(shí)器
  120. void timer0()interrupt 1 using 2
  121. {
  122. TH0 = (65536-100)/256; //定時(shí)器0無(wú)法溢出
  123. TL0 = (65536-100)/256;
  124. }

  125. void timer1()interrupt 2 using 2
  126. {
  127. TH1 = (65536-100)/256;
  128. TL1 = (65536-100)/256;
  129. z++;
  130. if(z>=100) z=0;
  131. }


  132. /**********速度變化*******************/
  133. void SpeedChoice()
  134. {
  135. switch(BufferSpeed){
  136. case '0': ZKB = 10;break;
  137. case '1': ZKB = 20;break;
  138. case '2': ZKB = 30;break;
  139. case '3': ZKB = 40;break;
  140. case '4': ZKB = 50;break;
  141. case '5': ZKB = 60;break;
  142. case '6': ZKB = 70;break;
  143. case '7': ZKB = 80;break;
  144. case '8': ZKB = 90;break;
  145. case '9': ZKB = 100;break;
  146. }
  147. }


  148. /*******左邊輪驅(qū)動(dòng)***************/
  149. void pwm_out_left_moto(uchar a,uchar b,uchar c,uchar d )
  150. {
  151. if(z<a) in1=1;
  152. else in1=0;
  153. if(z<b) in2=1;
  154. else in2=0;
  155. if(z<c) in3=1;
  156. else in3=0;
  157. if(z<d) in4=1;
  158. else in4=0;
  159. }

  160. /*********右邊輪驅(qū)動(dòng)*******************/
  161. void pwm_out_right_moto(uchar a,uchar b,uchar c,uchar d )
  162. {
  163. if(z<a) in11=1;
  164. else in11=0;
  165. if(z<b) in22=1;
  166. else in22=0;
  167. if(z<c) in33=1;
  168. else in33=0;
  169. if(z<d) in44=1;
  170. else in44=0;
  171. }

  172. /************超聲波********************/
  173. //*************************啟動(dòng)超生波模塊***************************************
  174. void startmodule()
  175. {
  176. count=0;
  177. Trig=1;
  178. DelayUs(18);
  179. Trig=0;

  180. while(!Echo) // 等待高電平
  181. {
  182. count++; //超時(shí)檢測(cè)
  183. if(count>26000)
  184. {count=0;
  185. flag1=1;break;}
  186. }
  187. if(!flag1)
  188. {
  189. TR0=1; //啟動(dòng)定時(shí)器0
  190. while(Echo); //beep=0;
  191. TR0=0; //關(guān)閉定時(shí)器0

  192. }
  193. else
  194. {flag1=0;
  195. TH0=30000;
  196. TL0=30000;
  197. }
  198. }

  199. //*******************測(cè)距模塊*********************************************
  200. void celiang()
  201. {
  202. t0=TH0*256+TL0;
  203. TH0=0;
  204. TL0=0;
  205. distance=(t0*1.7)/100; //算出來(lái)是CM
  206. if((distance>=700)||(flag==1)) //超出測(cè)量范圍
  207. {
  208. flag=0;distance=700;
  209. }

  210. }
  211. void zhuanxiang()
  212. {
  213. startmodule();
  214. celiang();
  215. if(distance<25)
  216. {
  217. if(distance<15)
  218. {
  219. pwm_out_left_moto(0,100,0,100); //后退
  220. pwm_out_right_moto(0,100,0,100);
  221. delay1();
  222. pwm_out_left_moto(0,100,0,100); //左轉(zhuǎn)
  223. pwm_out_right_moto(100,0,100,0);

  224. delay1();
  225. }
  226. else
  227. {
  228. pwm_out_left_moto(0,100,0,100); //左轉(zhuǎn)
  229. pwm_out_right_moto(100,0,100,0);
  230. delay1();
  231. }
  232. }
  233. else
  234. pwm_out_left_moto(100,0,100,0);
  235. pwm_out_right_moto(100,0,100,0);
  236. }

  237. /*******************延時(shí)函數(shù)*********************************************/
  238. //***************us延時(shí)函數(shù)
  239. void delay(uint z)
  240. {
  241. uint x,y;
  242. for(x=z;x>0;x--)
  243. for(y=110;y>0;y--);
  244. }
  245. void DelayUs(uint t)
  246. {
  247. while(--t);
  248. }
  249. void DelayMs(uint t)
  250. {
  251. while(t--) //大致延時(shí)mS
  252. {
  253. DelayUs(250);
  254. DelayUs(250);
  255. }
  256. }
  257. void delay1(void)
  258. {
  259. DelayMs(60);DelayMs(60);
  260. }


  261. /********主函數(shù)********************/
  262. void main()
  263. {
  264. // L_on = 0;
  265. Com_Init();
  266. while(1)
  267. {
  268. SpeedChoice();
  269. Bluetooth_Move();
  270. }
  271. }

  272. /*****************************/
  273. void Bluetooth_Move(){
  274. switch(BufferFunction){
  275. case 0x62: //遙控
  276. BTControl();
  277. break;
  278. case 0x63: //循跡
  279. xunji();
  280. break;
  281. case 0x64: //紅外
  282. break;
  283. case 0x65: //金探
  284. break;
  285. case 0x66: //測(cè)溫
  286. break;
  287. case 0x67: //測(cè)濕
  288. break;
  289. case 0x68: //測(cè)速
  290. break;
  291. case 0x69: //避障
  292. bizhang();
  293. break;


  294. }
  295. }

  296. /*************各種小車功能***********************/
  297. //藍(lán)牙遙控
  298. void BTControl(){
  299. switch(BufferDirection){
  300. case 0x41: pwm_out_left_moto(20,0,20,0);
  301. pwm_out_right_moto(20,0,20,0);
  302. break; //前進(jìn)
  303. case 0x42: pwm_out_left_moto(0,ZKB,0,ZKB);
  304. pwm_out_right_moto(0,ZKB,0,ZKB);
  305. break; //后退
  306. case 0x43: pwm_out_left_moto(0,80,0,80);
  307. pwm_out_right_moto(80,0,80,0);
  308. break; //左上
  309. case 0x44: pwm_out_left_moto(80,0,80,0);
  310. pwm_out_right_moto(0,80,0,80);
  311. break; //右上
  312. case 0x45: pwm_out_left_moto(80,0,80,0);
  313. pwm_out_right_moto(0,80,0,80);
  314. break; //左下
  315. case 0x46: pwm_out_left_moto(0,80,0,80);
  316. pwm_out_right_moto(80,0,80,0);
  317. break; //右下
  318. case 0x61: pwm_out_left_moto(0,0,0,0);
  319. pwm_out_right_moto(0,0,0,0);
  320. break; //手離開(kāi)屏幕停止
  321. default : pwm_out_left_moto(0,0,0,0);
  322. pwm_out_right_moto(0,0,0,0);
  323. break;
  324. }
  325. }

  326. //循跡
  327. void xunji(){
  328. //有信號(hào)為0 沒(méi)有信號(hào)為1(碰黑)
  329. if(Leftled==0&&Rightled==0&&Leftled2==0&&Rightled2==0)
  330. {
  331. pwm_out_left_moto(20,0,20,0);
  332. pwm_out_right_moto(20,0,20,0);
  333. }
  334. else
  335. {
  336. if(Rightled==1||Rightled2==1) //右邊檢測(cè)到黑線
  337. {
  338. if(Leftled==0||Leftled2==0)
  339. {
  340. pwm_out_left_moto(100,0,100,0);
  341. pwm_out_right_moto(0,100,0,100);
  342. }
  343. }
  344. if(Leftled==1||Leftled2==1) //左邊檢測(cè)到黑線
  345. {
  346. if(Rightled==0||Rightled==0)
  347. {
  348. pwm_out_left_moto(0,100,0,100);
  349. pwm_out_right_moto(100,0,100,0);
  350. }
  351. }
  352. if(Leftled==1&&Rightled==1&&Leftled2==1&&Rightled2==1) //兩邊檢測(cè)到黑線
  353. {
  354. pwm_out_left_moto(0,0,0,0);
  355. pwm_out_right_moto(0,0,0,0);
  356. }
  357. }
  358. }
  359. void bizhang() //避障
  360. {
  361. zhuanxiang();
  362. }




復(fù)制代碼

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

使用道具 舉報(bào)

沙發(fā)
ID:60882 發(fā)表于 2014-4-19 19:56 | 只看該作者
最近也要做這個(gè),能告訴我你QQ號(hào)嗎?我qq1519051636
回復(fù)

使用道具 舉報(bào)

板凳
ID:114191 發(fā)表于 2016-6-2 14:36 | 只看該作者
無(wú)敵大神,這就是我的畢業(yè)設(shè)計(jì)內(nèi)容,但是要答辯了還是有很多沒(méi)做出來(lái),現(xiàn)在只能看看你給的這些程序了。。
回復(fù)

使用道具 舉報(bào)

地板
ID:121541 發(fā)表于 2016-9-3 14:30 | 只看該作者
為什么會(huì)對(duì)兩個(gè)輪子的分開(kāi)編譯
回復(fù)

使用道具 舉報(bào)

5#
ID:79544 發(fā)表于 2016-11-24 20:02 | 只看該作者
樓主你好,手機(jī)APP可以分享一下嗎?謝謝
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表