久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6013|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99re在线视频 | 超碰最新在线 | 一区二区在线免费播放 | 国产精品国产a级 | 国产在线1区 | 国产精品久久久久久久午夜片 | 亚洲一区二区三区在线播放 | 国产免费一级片 | 欧美不卡一区二区 | 日韩三级在线 | 久久久久成人精品免费播放动漫 | 国产一区欧美 | 日韩www| 五月网婷婷| 中文在线a在线 | 久久伊 | 欧美在线一区二区三区四区 | 久草.com| 91亚洲国产成人久久精品网站 | 亚洲成人三区 | 日本不卡高字幕在线2019 | 欧美另类视频在线 | 欧美精品一区二区三区在线四季 | 国产一伦一伦一伦 | 911精品国产 | 中国一级大黄大片 | 97偷拍视频 | 亚洲精品一级 | 国产综合精品 | 日本久久网站 | 久久综合av | 国产精品九九九 | 欧美在线观看一区 | 色精品视频 | 精品欧美乱码久久久久久 | 91精品一区二区三区久久久久 | 精品久久ai电影 | 91亚洲精 | 国产69久久精品成人看动漫 | 久久久久久国产精品久久 | 亚洲一区二区免费 |