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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1613|回復(fù): 0
收起左側(cè)

藍牙循跡小車源程序

[復(fù)制鏈接]
ID:267314 發(fā)表于 2017-12-26 19:32 | 顯示全部樓層 |閱讀模式
單片機源程序如下:
  1. #include <reg52.h>
  2. #define uchar unsigned char         
  3. #define uint unsigned int
  4. sbit in1=P1^0;      
  5. sbit in2=P1^1;
  6. sbit in3=P1^2;
  7. sbit in4=P1^3;
  8. sbit ENA=P1^4;      
  9. sbit ENB=P1^5;
  10. sbit led=P2^3;
  11. uchar count_flag=0;                        //當?shù)?個字符接收完成后,置count_flag=1
  12. uchar recv_flag=0;                        //當3個字符全部接收完成后,置recv_flag=1,否則recv_flag=0
  13. uchar count_data=0;                        //接收到的3個字符在數(shù)組中的下標,0、1、2
  14. uchar buffer_data[3]=0;                //存放接收到的3個字符,buffer_data[count_data]為數(shù)組中的一個字符
  15. uint  pwm_data=0;                        //PWM方波的計數(shù)變量
  16. uint  left_pwm=0;                        //表征左邊電機的占空比
  17. uint  right_pwm=0;                        //表征右邊電機的占空比
  18. uint  PWM_CYCLE=210;                //PWM方波的周期
  19. uint  temp=0;                                //保存P3口輸入的循線信息
  20. uint  flag=0;
  21. uint  flagxun=0;                        //flagxun=0,藍牙狀態(tài);flagxun=1,循線狀態(tài)
  22. /************************毫秒延時函數(shù)**********************************************/
  23. void delay(uint x)
  24. {
  25.         uint m,n;
  26.         for(m=0;m<x;m++)
  27.                 for(n=0;n<15;n++);
  28. }
  29. /**************************端口初始化函數(shù)******************************************/
  30. void com_init()                              
  31. {
  32.         P0=0xff;
  33.         P1=0xff;
  34.         P2=0xff;
  35.         P3=0xff;
  36. }
  37. /**************************電機初始化函數(shù)******************************************/
  38. void dian_init()                       
  39. {
  40.         in1=1;
  41.         in2=0;
  42.         in3=1;
  43.         in4=0;
  44.         ENA=0;
  45.         ENB=0;
  46. }
  47. /**************************定時器初始化函數(shù)******************************************/
  48. void timer_init(void)                        
  49. {
  50.         TMOD=0x22;                          //T1為方式2,T0為方式2
  51.     TL1=0xfd;                                     //11.0592M晶振,波特率為9600
  52.     TH1=0xfd;
  53.         TL0=0;
  54.         TH0=156;                                //計數(shù)100次溢出,即每隔100us進入T0中斷
  55.     SCON=0x50;  
  56.     PCON=0x00;
  57.    
  58.         TR1=1;
  59.         ES=1;   
  60.     EA=1;
  61.         ET0=1;
  62.         TR0=1;      
  63. }
  64. /**************************驅(qū)動輪方向與速度控制函數(shù)******************************************/
  65. void forward1(uint x)        //左輪前進
  66. {
  67.         in1=1;
  68.         in2=0;
  69.         left_pwm=x;
  70. }
  71. void forward2(uint x)        //右輪前進
  72. {
  73.         in3=1;
  74.         in4=0;
  75.         right_pwm=x;
  76. }
  77. void back1(uint x)        //左輪后退
  78. {
  79.         in1=0;
  80.         in2=1;
  81.         left_pwm=x;
  82. }
  83. void back2(uint x)        //右輪后退
  84. {
  85.         in3=0;
  86.         in4=1;
  87.         right_pwm=x;
  88. }
  89. /**************************高速向前******************************************/
  90. void bforw()                                                //高速向前
  91. {
  92.         in1=1;
  93.         in2=0;
  94.         in3=1;
  95.         in4=0;
  96.         left_pwm=140;
  97.         right_pwm=140;      
  98. }
  99. void mforw()                                           //中速向前
  100. {
  101.         in1=1;
  102.         in2=0;
  103.         in3=1;
  104.         in4=0;
  105.         flag=0;
  106.         while((temp==0)&&(8000-flag))
  107.         {
  108.                 left_pwm=105;
  109.                 right_pwm=105;
  110.                 flag++;
  111.                 delay(10);
  112.         }
  113.         bforw();
  114.         flag=0;      
  115. }
  116. void sforw()                //保持原來方向,低速向前測黑線
  117. {
  118.         left_pwm=35;
  119.         right_pwm=35;      
  120. }
  121. void sright()                                //微調(diào)路徑,盡量減小小車左右擺動
  122. {
  123.         in1=1;
  124.         in2=0;
  125.         in3=1;
  126.         in4=0;
  127.         flag=0;
  128.         while(temp==64)
  129.         {
  130.                 left_pwm=80-2*flag;//可調(diào)試
  131.                 right_pwm=28-7*flag;//可調(diào)試
  132.                 delay(30);
  133.                 flag++;
  134.                 if(flag>=4)flag=4;
  135.         }
  136.         flag=0;      
  137. }
  138. void sleft()
  139. {
  140.         in1=1;
  141.         in2=0;
  142.         in3=1;
  143.         in4=0;
  144.         flag=0;
  145.         while(temp==32)
  146.         {
  147.                 right_pwm=80-2*flag;//可調(diào)試
  148.                 left_pwm=28-7*flag;//可調(diào)試
  149.                 delay(30);
  150.                 flag++;
  151.                 if(flag>=4)flag=4;
  152.         }
  153.         flag=0;      
  154. }
  155. void mright()                                           //二次調(diào)節(jié),減小左右擺動
  156. {
  157.         in1=1;
  158.         in2=0;
  159.         in3=1;
  160.         in4=0;
  161.         flag=0;
  162.         while(temp==192)
  163.         {
  164.                 left_pwm=100-4*flag;//可調(diào)試
  165.                 right_pwm=50-3*flag;//可調(diào)試
  166.                 delay(2);
  167.                 flag++;
  168.                 if(flag>=10)flag=10;
  169.         }
  170.         flag=0;      
  171. }
  172. void mleft()
  173. {
  174.         in1=1;
  175.         in2=0;
  176.         in3=1;
  177.         in4=0;
  178.         flag=0;
  179.         while(temp==48)
  180.         {
  181.                 right_pwm=100-4*flag;//可調(diào)試
  182.                 left_pwm=50-3*flag;//可調(diào)試
  183.                 delay(2);
  184.                 flag++;
  185.                 if(flag>=10)flag=10;
  186.         }
  187.         flag=0;      
  188. }
  189. void bright()                                                         //后退,防止小車脫離賽道
  190. {
  191.         flag=0;
  192.         in3=0;
  193.         in4=1;
  194.         while(temp==128)
  195.         {
  196.                 flag++;
  197.                 if(flag<16)
  198.                 {
  199.                         left_pwm=60+1*flag;//可調(diào)試
  200.                         right_pwm=0;//可調(diào)試
  201.                         delay(6);
  202.                 }
  203.                 if(flag>=16)
  204.                 {
  205.                         left_pwm=35+(flag-17)^2;//可調(diào)試
  206.                         right_pwm=3*(flag-15);//可調(diào)試
  207.                         delay(10);
  208.                 }
  209.                 if(flag>=25)flag=25;
  210.         }
  211.         flag=0;      
  212. }
  213. void bleft()
  214. {
  215.         flag=0;
  216.         in1=0;
  217.         in2=1;
  218.         while(temp==16)
  219.         {
  220.                 flag++;
  221.                 if(flag<16)
  222.                 {
  223.                         right_pwm=60+1*flag;//可調(diào)試
  224.                         left_pwm=0;//可調(diào)試
  225.                         delay(6);
  226.                 }
  227.                 if(flag>=16)
  228.                 {
  229.                         right_pwm=35+(flag-17)^2;//可調(diào)試
  230.                         left_pwm=3*(flag-15);//可調(diào)試
  231.                         delay(10);
  232.                 }
  233.                 if(flag>=25)flag=25;
  234.         }
  235.         flag=0;      
  236. }
  237. void expe()                 //接收到未知數(shù)據(jù),保持原來方向
  238. {
  239.         left_pwm=110;
  240.         right_pwm=110;      
  241. }
  242. void stop()                  //停止
  243. {
  244.         left_pwm=0;
  245.         right_pwm=0;
  246. }
  247. /**************************手機APP遙控函數(shù)*****************************************/
  248. void bluetooth(void)
  249. {
  250.         switch(buffer_data[2])
  251.         {
  252.                 case 'A': forward1(80);forward2(80);break;                //按下APP前進鍵
  253.                 case 'B': back1(80);back2(80);break;                          //按下APP后退鍵
  254.                 case 'C': back1(50);forward2(50);break;              //按下APP左轉(zhuǎn)鍵
  255.                 case 'D': forward1(50);back2(50);break;                  //按下APP右轉(zhuǎn)鍵
  256.                 case 'F': forward1(0);forward2(0);break;                //松手
  257.                 case '1': flagxun=~flagxun;break;                                //按下1,進入循線狀態(tài)
  258.                 default : ;
  259.         }         
  260. }
  261. /**************************循線函數(shù)*****************************************/
  262. void xunji(void)
  263. {
  264.                 P3=0xff;
  265.                 temp=P3;
  266.                 temp=temp&0xf0;
  267.                 P0=temp;
  268.                 switch(temp)                                        //左1 左2 右3 右4
  269.                 {
  270.                         case 0:mforw();break;                //全都沒檢測到黑線,中速前進
  271.                         case 16:bleft();break;                //左1檢測到黑線,高速左轉(zhuǎn)
  272.                         case 32:sleft();break;                //左2檢測到黑線,低速左轉(zhuǎn)
  273.                         case 64:sright();break;                //右3檢測到黑線,低速右轉(zhuǎn)
  274.                         case 128:bright();break;        //右4檢測到黑線,高速右轉(zhuǎn)
  275.                         case 96:sforw();break;                //左2、右3檢測到黑線,低速前進
  276.                         case 48:mleft();break;                //左1、左2檢測到黑線,中速左轉(zhuǎn)
  277.                         case 192:mright();break;        //右3、右4檢測到黑線,中速右轉(zhuǎn)
  278.                         case 240:stop();break;                //全都檢測到黑線,停止
  279.                         default :expe();break;                //接收到未知數(shù)據(jù),保持原來方向前進
  280.                 }
  281. }
  282. /*************************主函數(shù)***************************************************/
  283. void main(void)
  284. {
  285.         com_init();                        //四組IO口初始化
  286.         dian_init();                //電機初始化
  287.         timer_init();                //定時器初始化
  288.         led=0;
  289.         flagxun=0;
  290.         while(!flagxun)                                               
  291.         {
  292.                 if(recv_flag==1)        //recv_flag==1表明3個字符全部接收完畢                           
  293.                 {
  294.                         recv_flag=0;    //清空3個字符全部接收完畢標記位
  295.                            bluetooth();    //手機APP遙控函數(shù)
  296.                 }
  297.                 while(flagxun)
  298.                         xunji();
  299.         }
  300. }
  301. /**************************串口中斷服務(wù)函數(shù)****************************************/
  302. void Serial(void) interrupt 4                                  //中斷接收3個字符
  303. {
  304.            uchar temp_data;                                                  //temp_data用來存放接收到的字符
  305.         RI=0;
  306.         temp_data=SBUF;
  307.         if(temp_data=='O'&&(count_data==0))         //接收第一個字符串
  308.         {
  309.                 buffer_data[count_data]=temp_data;
  310.                 count_flag=1;                            //count_flag=1表示已經(jīng)接收到第1個字符
  311.         }
  312.         else
  313.         {
  314.                 if(count_flag==1)                            //開始接收第2、3個字符
  315.                 {
  316.                         count_data++;
  317.                         buffer_data[count_data]=temp_data;
  318.                         if(count_data>=2)                                   //count_data=2,表明已經(jīng)接收3個字符
  319.                         {                                                                   //此時表明3個字符已接收完畢,開始執(zhí)行遙控程序
  320.                                 count_data=0;
  321.                                 count_flag=0;                                   //清空標記位
  322.                                 recv_flag=1 ;                                   //數(shù)據(jù)接收完畢標記位
  323.                         }  
  324.                 }
  325.         }         
  326. }
  327. /*************************定時器中斷函數(shù)*******************************************/
  328. void Timer0(void) interrupt 1
  329. {
  330.         pwm_data++;
  331.         if(pwm_data>PWM_CYCLE)
  332.                 pwm_data=0;
  333.         if(pwm_data<=left_pwm)                       
  334.                 ENA=1;
  335.         else
  336.                 ENA=0;
  337.         if(pwm_data<=right_pwm)
  338.                 ENB=1;
  339.         else
  340.                 ENB=0;
  341.         P3=0xff;
  342.         temp=P3;
  343.         temp=temp&0xf0;
  344.         P0=temp;
  345. }
復(fù)制代碼





回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕精品一区 | 国产成人精品一区二区三区在线 | 日本在线免费看最新的电影 | 中文字幕二区 | 久久精品成人 | 午夜视频在线播放 | 婷婷综合五月天 | av一区二区三区四区 | 亚洲欧美激情网 | 天堂一区在线 | av免费网 | 国产精品1区 | 欧美一区免费 | 国产中文字幕网 | 欧美在线一区二区视频 | 97人人超碰 | 午夜影晥 | 久久草在线视频 | 日韩不卡视频在线 | 亚洲国产一区在线 | 久草在线在线精品观看 | 精品国产aⅴ | 国产精品久久久久一区二区三区 | 亚洲一区二区免费视频 | 欧美日韩精品亚洲 | 精品一区av| 国产精品久久久久一区二区三区 | 97精品国产一区二区三区 | www亚洲一区 | 中文字幕一区二区三区四区五区 | 国产美女久久久 | 精品久久香蕉国产线看观看亚洲 | 欧美日韩免费视频 | 成人三级视频 | 成人精品 | 黄色大片在线播放 | 国产成人小视频 | 免费午夜视频 | 黄色在线免费看 | 亚洲精品国产区 | 免费在线一区二区三区 |