标题: DIY 循迹小车(加入步进电机、超声波) [打印本页]

作者: admin    时间: 2013-6-2 01:26
标题: DIY 循迹小车(加入步进电机、超声波)
  1. 小车程序 采用C8051f020芯片
  2. #include
  3. #include

  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. #define SYSCLK 22118400
  7. sfr PH0=0xFA;
  8. sfr PH1=0xFB;
  9. sbit IN1=P3^0;
  10. sbit IN2=P3^1;
  11. sbit IN3=P3^2;
  12. sbit IN4=P3^3;
  13. sbit S1=P2^0;
  14. sbit S2=P2^1;
  15. sbit S3=P2^2;
  16. sbit S4=P2^3;
  17. sbit S5=P2^4;
  18. sbit S6=P2^5;

  19. uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
  20. uint num,temp,left,right,t,r,ge,shi,bai,qian;


  21. void SYSCLK_init() //时钟初始化
  22. {
  23. int i;
  24. OSCXCN=0x67;
  25. for(i=0;i<256;i++);
  26. while(!(OSCXCN&0x80));
  27. OSCICN=0x88;
  28. }

  29. void IO_init() //IO口初始化
  30. {
  31. XBR0=0x10;
  32. XBR1=0x00;
  33. XBR2=0x40;
  34. P0MDOUT=0xff;
  35. P3MDOUT=0xff;
  36. }

  37. void PCA_int_init() //PCA0初始化
  38. {
  39. PCA0MD=0x08; //使用系统时钟 禁止中断
  40. PCA0CPM0=0xc2;
  41. PCA0CPM1=0xc2;
  42. PCA0CN=0x40;
  43. PCA0L=0x00;
  44. PCA0H=0x00;
  45. PCA0CPL0=0x00; //设置PCA0CP0脉冲宽度
  46. PCA0CPH0=240;
  47. PCA0CPL1=0x00; //设置PCA0CP1脉冲宽度
  48. PCA0CPH1=240;
  49. }

  50. void T_init() //定时器初始化
  51. {
  52. IE=0x82;
  53. TMOD=0x01;
  54. TH0=(65536-18432)/256;
  55. TL0=(65536-18432)%256;
  56. TR0=0;
  57. }

  58. void delay1ms(uint z) //延时函数
  59. {
  60. uint x,y,i;
  61. for(y=z;y>0;y--)
  62. {
  63. for(x=0;x<10;x++)
  64. for(i=0;i<221;i++);
  65. }
  66. }

  67. void control() //方向控制
  68. {
  69. num=P2;
  70. num=num&0x3f;
  71. switch(num)
  72. {
  73. case 0x0c: //001100 011110 111111
  74. case 0x1e:
  75. case 0x3f:
  76. {
  77. PH0=0xa0; //左路电机
  78. PH1=0xa0; //右路电机
  79. } break;
  80. case 0x0e: //001110 001111 011111
  81. case 0x0f:
  82. case 0x1f:
  83. {
  84. PH0=0xa0;
  85. PH1=0x00;
  86. } break;
  87. case 0x06: //000110 000111
  88. case 0x07:
  89. {
  90. PH0=0xa0;
  91. PH1=0x00;
  92. } break;
  93. case 0x01: //000011 000001
  94. case 0x03:
  95. {
  96. PH0=0xb8;
  97. PH1=0x00;
  98. } break;
  99. case 0x1c: //011100 111100 111110
  100. case 0x3c:
  101. case 0x3e:
  102. {
  103. PH0=0x90;
  104. PH1=0xa0;
  105. } break;
  106. case 0x18: //011000 111000
  107. case 0x38:
  108. {
  109. PH0=0x80;
  110. PH1=0xa0;
  111. } break;
  112. case 0x30: //110000 100000
  113. case 0x20:
  114. {
  115. PH0=0x60;
  116. PH1=0xb8;
  117. } break;
  118. case 0x00: //000000
  119. {
  120. if(PH0<H1)
  121. {
  122. PH0=0x00;
  123. PH1=0x70;
  124. }
  125. if(PH0>H1)
  126. {
  127. PH0=0x70;
  128. PH1=0x00;
  129. }
  130. } break;
  131. }

  132. }

  133. void display(uchar qian,uchar bai,uchar shi,uchar ge) //数码管显示函数
  134. {
  135. if(qian!=0)
  136. {
  137. P4=0xef;
  138. P7=table[qian];
  139. delay1ms(2);
  140. }
  141. if(qian!=0||bai!=0)
  142. {
  143. P4=0xdf;
  144. P7=table[bai];
  145. delay1ms(2);
  146. }
  147. if(qian!=0||bai!=0||shi!=0)
  148. {
  149. P4=0xbf;
  150. P7=table[shi];
  151. delay1ms(2);
  152. }
  153. P4=0x7f;
  154. P7=table[ge];
  155. delay1ms(2);
  156. }

  157. void main() //主函数
  158. {
  159. WDTCN=0xde; //关闭看门狗
  160. WDTCN=0xad;
  161. SYSCLK_init();
  162. IO_init();
  163. PCA_int_init();
  164. T_init();
  165. IN1=0;
  166. IN2=1;
  167. IN3=0;
  168. IN4=1;
  169. TR0=1; //打开定时器
  170. while(1)
  171. {
  172. control();
  173. display(qian,bai,shi,ge);
  174. if(temp==1)
  175. {
  176. temp=0;
  177. ge=shi=bai=qian=0;
  178. display(qian,bai,shi,ge);
  179. for(r=0;r<5;r++)
  180. {
  181. P6=0x00;
  182. delay1ms(1000);
  183. P6=0xff;
  184. delay1ms(1000);

  185. }
  186. IN2=1;
  187. IN4=1;
  188. TR0=1;
  189. }
  190. }
  191. }

  192. void timer0() interrupt 1
  193. {
  194. TH0=(65536-18432)/256;
  195. TL0=(65536-18432)%256;
  196. t++;
  197. if(t==100)
  198. {
  199. t=0;
  200. ge++;
  201. if(ge==10) //秒计数
  202. {
  203. ge=0;
  204. shi++;
  205. }
  206. if(shi==10)
  207. {
  208. shi=0;
  209. bai++;
  210. }
  211. if(bai==10)
  212. {
  213. bai=0;
  214. qian++;
  215. }
  216. if(qian==10)
  217. ge=shi=bai=qian=0;
  218. }
  219. if(shi==5)
  220. {
  221. IN2=0;
  222. IN4=0;
  223. TR0=0;
  224. temp=1;
  225. }
  226. }
复制代码
飞奔中


跑道


小车全景


安装后内部

等待下线


电源、驱动、传感器电路

车底传感器


电源驱动PCB

超声波蔽障

超声波蔽障

步进电机驱动小车


步进电机驱动板+电源




作者: 鲜の水晶葡萄    时间: 2013-7-31 20:26
高手在这里
作者: 申家坤    时间: 2013-8-20 10:58
高手很不错的制作,谢谢分享。
作者: xi_chang    时间: 2014-5-4 13:35
谢谢分享
作者: LEAVING    时间: 2014-5-5 14:21
学习了~~~~~
作者: 许你晴天柱    时间: 2014-6-2 17:35
厉害,大神!
作者: 终无畏    时间: 2014-7-31 21:05
听说可以得金币哇
作者: 终无畏    时间: 2014-8-1 00:37
M币到手。。。
作者: HADES_YZ    时间: 2014-10-23 21:50
大神,真是不错啊
作者: xyz2014sxl    时间: 2014-10-25 10:21
很不错的设计
作者: blj178    时间: 2014-10-27 08:49
学习下
作者: zyqwyh    时间: 2014-11-9 11:01
不错学 习了
作者: zyqwyh    时间: 2014-11-9 11:05
不错学习了呀
作者: szzheng    时间: 2014-11-20 11:38
高手!!!!!!!!!
作者: 日日日    时间: 2015-1-6 09:11
大神,有电路图不
作者: whrui5033    时间: 2015-1-12 13:08
研究研究
作者: heros    时间: 2015-1-20 10:07
学习了
作者: 一把刀    时间: 2015-1-21 21:38
不错啊,学习了
作者: delay    时间: 2015-1-23 15:20
厉害,高手呀
作者: 蒲公英lhl    时间: 2015-1-31 12:13
好厉害啊
作者: nry928    时间: 2015-4-1 11:08
好像买这些配件来学习学习,给下配件资料别,还有196的学习版什么时候有货
作者: lb688    时间: 2015-4-3 14:39
学习了。
作者: dzdalong    时间: 2015-4-8 00:01
楼主能分享下电路就更好了   
作者: dzdalong    时间: 2015-4-8 00:02
代码标注在详细点就更完美了,
作者: 老大好    时间: 2015-4-8 08:03
楼主,程序和原理图分享一下谢谢1419214137@qq.com
作者: H全新    时间: 2015-4-8 09:00
值得学习学习  .非常感谢
作者: 单片菜菜机    时间: 2015-4-8 22:04
吊的很!大神啊
作者: 6ningning    时间: 2015-4-12 14:36
做的不错。
作者: san    时间: 2015-4-13 20:38
我能问一下,超声模块可以循迹吗?要怎么循迹,还有彻底的传感器是什么?
作者: yyxtj    时间: 2015-4-16 20:37

好东西,学习一下,谢谢!
作者: e介草民    时间: 2017-9-27 11:06
厉害啊楼主




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1