基于51单片机的智能小车

素颜马尾好姑娘i 2024-04-18 22:27 255阅读 0赞

这个是为了去年参加某比赛的作品。

功能:

蓝牙启动,

变速,

蔽障,

舵机摆臂攻击,

目标搜索,

其它

硬件搭建布局图:

20130819170327906

Center

在实验室写的程序,没及时备份。。完整版的程序没有了!

只实现部分模块功能的源码:

  1. #include "reg52.h"
  2. #include<math.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. #define Cycle 20000 //定义周期
  6. uint PWM_Value[8];
  7. uchar order=0; //中断步长
  8. //按键检测
  9. //sbit key1=P2^0;
  10. //sbit key2=P2^1;
  11. //PWM的输出端口
  12. sbit PWM_OUT0=P2^5;
  13. sbit PWM_OUT1=P2^6;
  14. //红外检测口
  15. sbit H1 = P0^0;
  16. sbit H2 = P0^1;
  17. sbit H3 = P0^2;
  18. sbit H4 = P0^3;
  19. sbit H5 = P0^4;
  20. sbit H6 = P0^5;
  21. sbit H7 = P0^6;
  22. sbit H8 = P0^7;
  23. //步进电机方向口
  24. sbit B1 = P1^4;
  25. sbit B2 = P1^5;
  26. sbit B3 = P1^6;
  27. sbit B4 = P1^7;
  28. //步进电机脉冲口
  29. sbit BU1 = P1^0;
  30. sbit BU2 = P1^1;
  31. sbit BU3 = P1^2;
  32. sbit BU4 = P1^3;
  33. int i,key1,key2;
  34. /********************************************
  35. 延时程序
  36. *********************************************/
  37. void delay(uint t,uint ti)
  38. {
  39. uint k;
  40. while(t--)
  41. {
  42. for(k=0; k<ti; k++)
  43. { }
  44. }
  45. }
  46. /********************************************************
  47. *
  48. *步进电机运行
  49. * //正常为20,加速16;delay:正常(2,50)加速(2,40)
  50. * //转向 16 2 50
  51. *
  52. *********************************************************/
  53. void motor_ffw(int nu1,int nu2,int nu3)
  54. {
  55. uchar i;
  56. for (i=0; i<nu1; i++)
  57. {
  58. BU1 = ~BU1;
  59. BU2 = ~BU2;
  60. BU3 = ~BU3;
  61. BU4 = ~BU4;
  62. delay(nu2,nu3);
  63. }
  64. }
  65. /********************************************************
  66. *
  67. * 按键检测
  68. *
  69. *********************************************************/
  70. void keyscan()
  71. {
  72. if(key1==0) //高电平加
  73. {
  74. if(PWM_Value[0]<2000)
  75. PWM_Value[0]+=2;
  76. if(PWM_Value[1]<2000)
  77. PWM_Value[1]+=2;
  78. }
  79. if(key2==0) //高电平减
  80. {
  81. if(PWM_Value[0]>1000)
  82. PWM_Value[0]-=2;
  83. if(PWM_Value[1]>1000)
  84. PWM_Value[1]-=2;
  85. }
  86. delay(5,20);
  87. }
  88. /**********************************************************
  89. * *
  90. * 步进电机驱动 *
  91. *num表示距离,num1表示步进电机脉冲频率, *
  92. *num2和num3表示延迟时间长度 *
  93. ***********************************************************/
  94. void motor_forward(int num,int num1,int num2,int num3) //前进
  95. {
  96. B1 = 1;
  97. B2 = 1;
  98. B3 = 0;
  99. B4 = 0;
  100. while(num--){
  101. motor_ffw(num1,num2,num3);
  102. }
  103. }
  104. void motor_backward(int num,int num1,int num2,int num3) //后退
  105. {
  106. B1 = 0;
  107. B2 = 0;
  108. B3 = 1;
  109. B4 = 1;
  110. while(num--){
  111. motor_ffw(num1,num2,num3);
  112. }
  113. }
  114. void motor_left(int num,int num1,int num2,int num3) //左转
  115. {
  116. B1 = 0;
  117. B2 = 0;
  118. B3 = 0;
  119. B4 = 0;
  120. while(num--){
  121. motor_ffw(num1,num2,num3);
  122. }
  123. }
  124. void motor_right(int num,int num1,int num2,int num3) //右转
  125. {
  126. B1 = 1;
  127. B2 = 1;
  128. B3 = 1;
  129. B4 = 1;
  130. while(num--){
  131. motor_ffw(num1,num2,num3);
  132. }
  133. }
  134. /********************************************************
  135. *
  136. *红外测距传感器函数 ,0为检测到障碍物,1为正常
  137. *
  138. *********************************************************/
  139. void red_driver()
  140. {
  141. if((H5|H6|H7|H8) == 1) //检测小车是否到达擂台边缘
  142. {
  143. if((H5&H7) == 1){//检测小车正前方到达边缘,先退后,再右转
  144. motor_backward(20,20,2,50);
  145. motor_right(36,16,2,50);
  146. }
  147. else if((H6&H8) == 1){//检测小册正后方到达边缘
  148. motor_forward(20,20,2,50);
  149. motor_right(36,16,2,50);
  150. }
  151. else
  152. { //检测小车四个角落到达边缘
  153. if (H5 == 1){
  154. motor_backward(20,20,2,50);
  155. motor_right(36,16,2,50);
  156. }
  157. else if (H6 == 1){
  158. motor_forward(10,20,2,50);
  159. }
  160. else if (H7 == 1){
  161. motor_backward(20,20,2,50);
  162. motor_left(36,16,2,50);
  163. }
  164. else if (H8 == 1){
  165. motor_forward(10,20,2,50);
  166. }
  167. }
  168. }
  169. else if((H3&H4) == 0) //检测小车左右两边是否有障碍物
  170. {
  171. if (H3 == 0){
  172. motor_left(36,16,2,50);
  173. }
  174. else if (H4 == 0){
  175. motor_right(36,16,2,50);//38
  176. }
  177. }
  178. else if(H2 == 0){ //检测小车后面是否有障碍物,加速倒退
  179. motor_backward(20,16,2,40);
  180. }
  181. else if(H1 == 0){ //检测小车前面是否有障碍物,加速冲击
  182. motor_backward(20,16,2,40);
  183. }
  184. else
  185. motor_forward(1,20,2,50);
  186. }
  187. /********************************************
  188. 初始化
  189. *********************************************/
  190. void init()
  191. {
  192. SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1
  193. TMOD|= 0x21; //定时器工作方式2
  194. PCON|= 0x80;
  195. //TH1 = 0xFD; //baud*2 /* reload value 19200、数据位8、停止位1。效验位无 (11.0592)
  196. TH1 = 0xF3; // //baud*2 /* 波特率4800、数据位8、停止位1。效验位无 (12M)
  197. TL1 = 0xF3;
  198. TH0=(65536-500)/256;
  199. TL0=(65536-500)%256;
  200. TR1 = 1; //打开定时器1中断
  201. TR0 = 1; //启动定时器0
  202. ES = 1; //开串口中断
  203. ET0 = 1; //打开定时器0中断
  204. ET1 = 1; //打开定时器1中断
  205. EA = 1; // 开总中断
  206. PT0 = 0; //定时器0 设置为最高优先中断,1表示高,0表示低
  207. PX0 = 0; // 外部中断0 设置最低中断
  208. PS = 1; //串口中断
  209. }
  210. /********************************************************
  211. *
  212. *主函数
  213. *
  214. *********************************************************/
  215. void main()
  216. {
  217. init();
  218. PWM_Value[0]=1500;
  219. PWM_Value[1]=1500;
  220. H5=H6=H7=H8 =0;
  221. H1=H2=H3=1;
  222. H4 = key1 = 0;
  223. RI = 1;
  224. for(i=0;i<100;i++)
  225. {
  226. keyscan();
  227. }
  228. key1 = 1;
  229. key2 = 0;
  230. while(1)
  231. {
  232. }
  233. }
  234. /********************************************************
  235. *
  236. *串口中断
  237. *
  238. *********************************************************/
  239. void serial() interrupt 4
  240. {
  241. motor_forward(60,20,2,50);
  242. while(1)
  243. {
  244. for(i=0;i<100;i++)
  245. {
  246. keyscan();
  247. }
  248. key2 = 1;
  249. red_driver();
  250. }
  251. }
  252. /********************************************************
  253. //定时器0 中断子函数
  254. //这里输出几路波形 就应该为 20MS/N =X 那么X 就是N路平分时间
  255. //在用N-高电平时间 就为该路低电平时间咯。 就这么简单。。。
  256. *********************************************************/
  257. void timer0() interrupt 1
  258. {
  259. switch(order)
  260. {
  261. case 1:PWM_OUT0=1;
  262. TH0=-PWM_Value[0]/256; //第一路输出高电平时长
  263. TL0=-PWM_Value[0]%256;
  264. break;
  265. case 2:PWM_OUT0=0;
  266. TH0=-(5000-PWM_Value[0])/256; //第一路 输出低电平时长
  267. TL0=-(5000-PWM_Value[0])%256;
  268. break;
  269. case 3:PWM_OUT1=1;
  270. TH0=-PWM_Value[1]/256;
  271. TL0=-PWM_Value[1]%256;
  272. break;
  273. case 4:PWM_OUT1=0;
  274. TH0=-(5000-PWM_Value[1])/256;
  275. TL0=-(5000-PWM_Value[1])%256;
  276. break;
  277. order=0;
  278. break;
  279. default: order=0;
  280. }
  281. order++;
  282. }

发表评论

表情:
评论列表 (有 0 条评论,255人围观)

还没有评论,来说两句吧...

相关阅读