找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1859|回复: 1
收起左侧

基于51单片机的蓝牙循迹小车设计源程序

[复制链接]
ID:618309 发表于 2019-9-30 11:43 | 显示全部楼层 |阅读模式
渣渣为了凑积分,发一个以前做过的小玩意

单片机源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. /*****电机驱动*****/
  6. sbit IN1=P1^0;
  7. sbit IN2=P1^1;
  8. sbit IN3=P1^2;
  9. sbit IN4=P1^3;
  10. /*****红外寻迹*****/
  11. sbit RSEN1=P2^1;
  12. sbit RSEN2=P2^2;
  13. sbit LSEN1=P2^3;
  14. sbit LSEN2=P2^4;
  15. /*****使能A、B*****/
  16. sbit ENA=P1^4;
  17. sbit ENB=P1^5;
  18. /*****电机驱动*****/
  19. #define Left_moto_go      {IN1=1,IN2=0;}
  20. #define Left_moto_back    {IN1=0,IN2=1;}               
  21. #define Right_moto_go     {IN3=1,IN4=0;}
  22. #define Right_moto_back   {IN3=0,IN4=1;}
  23. #define Left_moto_s              {IN1=0,IN2=0;}               
  24. #define Right_moto_s      {IN3=0,IN4=0;}

  25. uchar M; //从串口接收的数据
  26. uchar pwm_val_left  =0;//变量定义
  27. uchar push_val_left=4; //左电机占空比N/20
  28. uchar pwm_val_right =0;
  29. uchar push_val_right=4;//右电机占空比N/20
  30. bit Right_moto_stop=1;
  31. bit Left_moto_stop =1;

  32. /********************************************
  33. 毫秒延时函数
  34. **********************************************/
  35. void Delay_ms(uint x) //12.000MHz
  36. {  

  37. uchar a,b;
  38.   for(a=x;a>0;a--)
  39.     for(b=199;b>0;b--);

  40. }

  41. /*****延时*****/
  42. void delay50ms(void)   //误差 0us
  43. {
  44.     unsigned char a,b;
  45.     for(b=173;b>0;b--)
  46.         for(a=143;a>0;a--);
  47. }

  48. /********************************************************************
  49. * 名称 : Com_Init()
  50. * 功能 : 串口初始化,晶振12,波特率2400,使串口中断
  51. * 输入 : 无
  52. * 输出 : 无
  53. ***********************************************************************/

  54. void Com_Init(void)
  55. {
  56.         PCON &= 0x00;                //波特率不倍速
  57.         SCON = 0x50;                //8位数据,可变波特率
  58.         //AUXR &= 0xBF;                //定时器1时钟为Fosc/12,即12T
  59.         //AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
  60.         TMOD &= 0x0F;                //清除定时器1模式位
  61.         TMOD |= 0x20;                //设定定时器1为8位自动重装方式
  62.         TL1 = 0xF3;                //设定定时初值
  63.         TH1 = 0xF3;                //设定定时器重装值
  64.         ET1 = 0;                //禁止定时器1中断
  65.         TR1 = 1;                //启动定时器1
  66.         SM0 = 0;
  67.         SM1 = 1;
  68.         REN = 1;
  69.         EA = 1;
  70.         ES = 1;

  71. }

  72. /*****前进*****/
  73. void  go()       
  74. {  
  75.          Left_moto_go ;               
  76.          Right_moto_go ;       
  77. }
  78. /*****后退*****/
  79. void  back()       
  80. {  
  81.          Left_moto_back ;               
  82.          Right_moto_back ;       
  83. }
  84. /*****左转*****/
  85. void turn_left()
  86. {
  87.          Left_moto_back;
  88.          Right_moto_go ;
  89. }
  90. /*****右转*****/
  91. void turn_right()
  92. {
  93.          Left_moto_go;
  94.          Right_moto_back;
  95. }
  96. /*****急停*****/
  97. void stop()
  98. {
  99.          Left_moto_s;  
  100.          Right_moto_s;
  101. }

  102. /*****PWM左电机*****/
  103. void pwm_out_left_moto(void)
  104. {  
  105.    if(Left_moto_stop)
  106.    {
  107.     if(pwm_val_left<=push_val_left)
  108.                ENA=1;
  109.         else
  110.                ENA=0;
  111.         if(pwm_val_left>=20)
  112.         pwm_val_left=0;
  113.    }
  114.    else  ENA=0;
  115. }
  116. /*****PWM右电机*****/
  117.    void pwm_out_right_moto(void)
  118. {
  119.   if(Right_moto_stop)
  120.    {
  121.     if(pwm_val_right<=push_val_right)
  122.                ENB=1;
  123.         else
  124.                ENB=0;
  125.         if(pwm_val_right>=20)
  126.         pwm_val_right=0;
  127.    }
  128.    else    ENB=0;
  129. }

  130. /********************************************************************
  131. * 名称 : Com_Int()
  132. * 功能 : 串口中断子函数
  133. * 输入 : 无
  134. * 输出 : 无
  135. ***********************************************************************/
  136. void Com_Int(void) interrupt 4
  137. {
  138.         EA = 0;
  139.         if(RI) //当硬件接收到一个数据时,RI会置位
  140.         {
  141.                 M = SBUF;
  142.                 RI = 0;
  143.         }
  144.         EA = 1;
  145. }


  146. /*TIMER0中断服务子函数产生PWM信号*/
  147. void timer0()interrupt 1   using 2
  148. {
  149.         TH0=0XFC;          //1ms定时
  150.         TL0=0X18;
  151.         pwm_val_left++;
  152.         pwm_val_right++;
  153.         pwm_out_left_moto();
  154.         pwm_out_right_moto();
  155. }

  156. /*****循迹函数*****/
  157. void xunji()

  158. {
  159.         uchar flag;
  160.         if((RSEN1==0)&&(RSEN2==0)&&(LSEN1==0)&&(LSEN2==0))
  161.         { flag=0; }//*******直行*******//
  162.         else if((RSEN1==0)&&(RSEN2==1)&&(LSEN1==0)&&(LSEN2==0))
  163.         { flag=1;} //***右偏,左转***//
  164.         else if((RSEN1==0)&&(RSEN2==0)&&(LSEN1==1)&&(LSEN2==0))
  165.         { flag=2;} //***左偏,右转***//
  166.         else if((RSEN1==1)&&(RSEN2==0)&&(LSEN1==0)&&(LSEN2==0))
  167.         { flag=1;} //***右偏,左转***//
  168.         else if((RSEN1==0)&&(RSEN2==0)&&(LSEN1==0)&&(LSEN2==1))
  169.         { flag=2;} //***左偏,右转***//
  170.         else if((RSEN1==1)&&(RSEN2==1)&&(LSEN1==0)&&(LSEN2==0))
  171.         { flag=1;} //***右偏,左转***//
  172.         else if((RSEN1==0)&&(RSEN2==0)&&(LSEN1==1)&&(LSEN2==1))
  173.         { flag=2;} //***左偏,右转***//
  174.         else if((RSEN1==1)&&(RSEN2==1)&&(LSEN1==1)&&(LSEN2==1))
  175.         { flag=3; }//*******急停*******//
  176.         switch (flag)
  177.         {
  178.                 case 0:go();break;
  179.                 case 1:turn_left();delay50ms();break;
  180.                 case 2:turn_right();delay50ms();break;
  181.                 case 3:stop();delay50ms();break;
  182.                 default: break;
  183.         }
  184. }

  185. /********循迹模式*******/
  186. void tracing()
  187. {
  188.         while(1)
  189.         {
  190.                 TMOD|=0X01;
  191.                 TH0=0XFC;//1ms定时
  192.                 TL0=0X18;
  193.                 TR0=1;
  194.                 ET0=1;
  195.                 EA =1;
  196.                 if(M == '1')
  197.                         break;
  198.                 while(1)/*无限循环*/
  199.                 {
  200.                         xunji();
  201.                         if(M == '1')
  202.                                 break;
  203.                 }
  204.         }
  205. }

  206. void main()
  207. {
  208.         Delay_ms(100);
  209.         Com_Init();//串口初始化
  210.         while(1)
  211.         {
  212.                                 switch(M)
  213.                         {
  214.                                 case 'A': go();Delay_ms(100); break;
  215.                                 case 'B': back();Delay_ms(100); break;
  216.                                 case 'C': turn_left();Delay_ms(100); break;
  217.                                 case 'D': turn_right();Delay_ms(100); break;
  218.                                 case 'F': stop();Delay_ms(100); break;
  219.                                 case '2': tracing(); break;
  220.                                 case '3': push_val_left =4;push_val_right =4; break;
  221.                                 case '4': push_val_left =10;push_val_right =10; break;
  222.                                 case '5': push_val_left =20;push_val_right =20; break;
  223.                                 default:break;
  224.                         }
  225.         }
  226. }
复制代码

所有资料51hei提供下载:
蓝牙寻迹终极.zip (1.86 KB, 下载次数: 20)



回复

使用道具 举报

ID:1 发表于 2019-9-30 16:54 | 显示全部楼层
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表