找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6137|回复: 2
打印 上一主题 下一主题
收起左侧

蓝牙遥控小车可调速pwm,带灭火,寻迹,超声波避障,l298n驱动

[复制链接]
跳转到指定楼层
楼主
基本功能写在题目,有需要的朋友就去看看,免费下载,欢迎讨论,这个是假期做的,开学又做了一个平衡车,用的stm32f103c8t6,硬件都是自己拼凑的,但是程序是某小车之家的,还在学习中,,pid是个难啃的骨头,现在感觉不会的太多了,需要不断学习,平衡小车的程序太大发不上来,以后等我做了一些改进,修改一半以上再发吧, 现在程序完全是人家的,网上都有,我也就不发了,这个简单的51车仅供玩耍,没大技术,就是为了把多余的零件 凑成东西,要不瞅着乱乱的,不多说了,下载去吧,骚年们

蓝牙控制pwm和l298n和超声波程序:
  1. #include <reg52.h>
  2. #include<absacc.h>
  3. #include<intrins.h>
  4. #include<string.h>
  5. #include"lcd1602.h"
  6. #define uchar  unsigned char
  7. #define uint   unsigned int
  8. //IO引脚定义:
  9. sbit IN1=P1^0;               
  10. sbit IN2=P1^1;
  11. sbit IN3=P1^2;
  12. sbit IN4=P1^3;
  13. //以上为电机驱动板输入引脚定义,
  14. //IN1和IN2控制左轮电机,输出对应的OU1和OUT2接左轮电机,
  15. //IN3和IN4控制右轮电机,输出对应的OU3和OUT4接右轮电机
  16. sbit L_PWM=P1^4;           //左轮调速,接驱动模块ENA使能端,在这里输入PWM信号
  17. sbit R_PWM=P1^5;           //右轮调速,接驱动模块ENB使能端,在这里输入PWM信号
  18. //宏定义
  19. #define L_go      IN1=0;IN2=1 //左轮前进
  20. #define L_back    IN1=1;IN2=0 //左轮后退   
  21. #define L_stop    IN1=0;IN2=0        //左轮停止,两个输出1也可以
  22. #define R_go            IN3=0;IN4=1 //右轮前进
  23. #define R_back          IN3=1;IN4=0 //右轮后退
  24. #define R_stop          IN3=0;IN4=0 //右轮停止,两个输出1也可以

  25. #define car_go                                L_go;R_go;                //小车前进
  26. #define car_back                        L_back;R_back        //小车后退
  27. #define car_left                        R_go;L_stop                //小车左转弯
  28. #define car_right                        L_go;R_stop                //小车右转弯
  29. #define car_stop                        L_stop;R_stop        //小车停车
  30. #define car_left_360        R_go;L_back                //小车向左360度转,也可以认为是大转弯
  31. #define car_right_360        L_go;R_back                //小车向右360度转,也可以认为是大转弯

  32. //数据定义
  33. unsigned char l_tt=0;        //定时器计数用
  34. unsigned char l_Lpwm=0;        //左轮PWM占空比值,我们设计10个格,0-9,0为停止,9为全速
  35. unsigned char l_Rpwm=0;        //右轮PWM占空比值,我们设计10个格,0-9,0为停止,9为全速
  36. uchar buf,count1,count3,count4,count5;
  37. /*************超声波定义************/
  38. double distance;
  39. sfr T2MOD=0x0c9;    //T2MOD在reg52.h中没有定义,这里进行定义
  40. sbit Trig=P2^5;
  41. sbit Echo=P3^2;
  42. bit succeed_flag=0;
  43. uchar code table2[]="0123456789. ";
  44. /*********声音传感器模块io**************/
  45. sbit io=P3^7;
  46. /*********火焰传感器模块D0**************/                 //剩余端口33 26 27
  47. sbit D0=P1^6;
  48. sbit D1=P1^7;
  49. sbit ji1=P2^4;           //继电器1端口
  50. /*****************************寻迹**************************/
  51. sbit xun1=P2^0;
  52. sbit xun2=P2^1;
  53. sbit xun3=P2^2;
  54. sbit xun4=P2^3;
  55. //延时
  56. void Delay(unsigned int t)
  57. {
  58.         unsigned int c;
  59.         while(t--){
  60.                 c=10000;
  61.                 while(c--);
  62.         }
  63. }
  64. void delay1ms(uint z)
  65. {
  66.          uint x,y;
  67.          for(x=z;x>0;x--)
  68.              for(y=110;y>0;y--);
  69. }
  70. void delay_20us()
  71. {
  72.          uchar a ;
  73.          for(a=0;a<20;a++);
  74. }
  75. void display_distance(int m)
  76. {  
  77.    unsigned int num2;
  78.    LCD_set_position(0x4b);
  79.    
  80.     num2=m%1000/100;
  81.     LCD_write_data(table2[num2]);
  82.     delay1ms(2);
  83.     num2=m%100/10;         
  84.     LCD_write_data(table2[num2]);
  85.     delay1ms(2);
  86.         num2=m%10;
  87.     LCD_write_data(table2[num2]);
  88.     delay1ms(2);
  89. }
  90. //入口函数
  91. void main(void)
  92. {
  93.         LCD_initial();          //1602chushi初始化

  94.         EA=1;                                                //首先开启总中断
  95.         TMOD|=0X11;                        //定时器方式1,16位计数器,用来计数时间
  96.         TH0= 0XFC;                  //1ms定时
  97.         TL0= 0X14;
  98.         TR0= 1;
  99.         ET0= 1;                delay1ms(20);

  100.         SCON=0x50;           //设定串口工作方式
  101.     PCON=0x00;           //波特率不倍增                       
  102.     TMOD=0x20;           //定时器1工作于8位自动重载模式, 用于产生波特率
  103.     ES = 1;              //允许串口中断
  104.     TL1=0xfd;
  105.     TH1=0xfd;             //波特率9600
  106.     TR1=1;                delay1ms(20);
  107.        
  108.     Trig=0;     //首先拉低脉冲输入引脚
  109.     T2MOD=0;  //定时器1,16位工作方式
  110.     ji1=1;           //先关闭风扇

  111.     l_Lpwm=l_Rpwm=4;           //起始pwm
  112.         car_stop;                          //起始状态
  113.         LCD_set_position(0x0b);         
  114.         LCD_prints("STOP ");       

  115.            LCD_set_position(0x09);           //单位名称
  116.         LCD_prints("S:");
  117.         LCD_set_position(0x49);
  118.         LCD_prints("L:");
  119.         LCD_set_position(0x4e);
  120.         LCD_prints("cm");
  121.         while(1)
  122.         {
  123.                 EA=0;  //关总中断
  124.         IT0=1;           
  125.         Trig=1;//超声波输入端
  126.         delay_20us();   //延时20us
  127.         Trig=0;       //产生一个20us的脉冲
  128.         while(Echo==0); //等待Echo回波引脚变高电平
  129.         succeed_flag=0; //清测量成功标志
  130.         EA=1;
  131.         EX0=1;
  132.         TR2=1;          //启动定时器1
  133.         delay1ms(20);      //等待测量的结果
  134.                   
  135.                 display_distance(distance);  //刷新距离
  136.                                                
  137.               if(count1==1)               
  138.                 {       
  139.                         if((3<distance)&&(distance<25))
  140.                         {
  141.                           car_back;Delay(8);
  142.                           car_left_360;Delay(6);
  143.                           car_go;
  144.                         }
  145.                 }
  146.                 if(count3==1)                   //听声音前进
  147.                 {         
  148.                         if(io==0)                        //如果有声音,小车前进一下
  149.                         {                
  150.                             car_left_360;  Delay(2);
  151.                                 LCD_set_position(0x06);LCD_prints("pa");
  152.                                 LCD_set_position(0x0b);LCD_prints(" GO  ");
  153.                         }
  154.                         else
  155.                         {
  156.                                 car_stop;                                          
  157.                                 LCD_set_position(0x06);LCD_prints("  ");
  158.                                 LCD_set_position(0x0b);LCD_prints("STOP ");
  159.                         }
  160.                 }
  161.                 if(count4==1)                        //灭火
  162.                 {       
  163.                         if(D0==0||D1==0)
  164.                         {
  165.                            ji1=0;
  166.                            LCD_set_position(0x01);LCD_prints("fire");  
  167.                         }
  168.                         else
  169.                         {
  170.                            ji1=1;
  171.                            LCD_set_position(0x01);LCD_prints("    ");
  172.                         }
  173.                 }
  174.                 if(count5==1)                        //寻迹
  175.                 {
  176.                   car_go;
  177.                   if(xun1==1||xun2==1)
  178.                   {
  179.                           car_left;Delay(1);
  180.                   }
  181.                   if(xun3==1||xun4==1)
  182.                   {
  183.                           car_right;Delay(1);
  184.                   }
  185.                 }       
  186.         }
  187. }
  188. void exter()  interrupt 0  // 外部中断0是0号
  189. {         
  190.     TR2=0;
  191.     EX0=0;
  192.     distance=(TH2*256+TL2+59)*0.0172;  //厘米     
  193.     succeed_flag=1;//至成功测量的标志
  194.     TH2=0;          //定时器2清零
  195.     TL2=0;      //关闭外部中断1
  196. }
  197. void timer0()interrupt 1  
  198. {
  199.         TH0=0XFC;          //定时1毫秒,10格调速,为100HZ频率,此频率下效果比较好,过大有噪声,过小振动大
  200.         TL0=0X17;
  201.     l_tt++;
  202.         if(l_tt>9)l_tt=0;        //比较用,10格调速
  203.        
  204.         if(l_tt<=l_Lpwm){//左调速,占空比数值越大,输出高电平时间越宽,电机转速越高,我们设计10个格,0-9,0为停止,9为全速
  205.                  L_PWM=1;
  206.         }
  207.         else{
  208.                 L_PWM=0;
  209.         }
  210.         if(l_tt<=l_Rpwm){//右调速,同上
  211.                 R_PWM=1;
  212.         }
  213.         else{
  214.                 R_PWM=0;
  215.         }
  216. }       
  217. void serial() interrupt 4
  218. {
  219.    ES = 0;                //关闭串行中断
  220.    RI = 0;                //清除串行接受标志位
  221.    buf = SBUF;            //从串口缓冲区取得数据
  222.   switch(buf)
  223.    {
  224.       case 0x31: car_go;count1=1;;LCD_set_position(0x0b);LCD_prints(" GO  "); break;  //  count1判断距离躲避墙      
  225.       case 0x32: car_stop;count1=0; LCD_set_position(0x0b);LCD_prints("STOP "); break;  //        
  226.       case 0x33: car_left;count1=0; LCD_set_position(0x0b);LCD_prints("LEFT "); break;  //        
  227.       case 0x34: car_right;count1=0; LCD_set_position(0x0b);LCD_prints("RIGHT"); break;  //      
  228.       case 0x35: car_left_360;count1=0; LCD_set_position(0x0b);LCD_prints("L_360"); break;  //            
  229.       case 0x36: car_right_360;count1=0;LCD_set_position(0x0b);LCD_prints("R_360");   break;  //                  
  230.       case 0x37: car_back;count1=0; LCD_set_position(0x0b);LCD_prints("BACK ");break;  // count2判断距离躲避墙
  231.           case 0x38: l_Lpwm+=1;l_Rpwm+=1; if(l_Lpwm==10||l_Rpwm==10){l_Lpwm=l_Rpwm=9;}break;  // 速度加
  232.           case 0x39: l_Lpwm-=1;l_Rpwm-=1; if(l_Lpwm==3||l_Rpwm==3){l_Lpwm=l_Rpwm=4;}break;         //速度减
  233.           case 0x40: count3=1; break;                //判断声音
  234.           case 0x41: count3=0; break;       
  235.           case 0x42: count4=1; break;                        //判断火焰
  236.           case 0x43: count4=0; break;
  237.           case 0x44: count5=1; LCD_set_position(0x0B);LCD_prints("XUNJI");break;
  238.           case 0x45: count5=0; LCD_set_position(0x0B);LCD_prints("STOP "); break;
  239.           default:break;  //接受到其它数据,蜂鸣器响         
  240.    }
  241.    ES = 1;    //允许串口中断
  242. }
  243. void timer2() interrupt 5  
  244. {  
  245.         //!!!注意!!! 定时器2必须由软件对溢出标志位清零,硬件不能清零,这里与定时器0和定时器1不同!!!   
  246.     TF2=0;  
  247. }
复制代码
全部资料下载地址:
蓝牙控制pwm和l298n和超声波.zip (95.13 KB, 下载次数: 92)


评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:224249 发表于 2017-10-12 13:42 | 只看该作者
一直想坐一辆自己的小车,现在就开始吧
回复

使用道具 举报

板凳
ID:165424 发表于 2018-1-19 14:08 | 只看该作者
小车车让我拆掉啦,哈哈哈,换成了一个平衡车,因为这个车太慢,没意思了,改天上平衡车程序和图,最近在画平衡车的板子,嘻嘻嘻
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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