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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5131|回復: 7
打印 上一主題 下一主題
收起左側

單片機智能小車巡黑線加藍牙遙控 源程序(雙運行模式)

  [復制鏈接]
跳轉到指定樓層
樓主
模式一  自動模式  通過檢測地面黑線自動行駛
模式二  手動模式  通過藍牙模塊+手機藍牙遙控運行(包含加減速,開關燈,舵機角度控制程序)

材料
STC89C52 芯片
藍牙模塊+手機軟件
黑線檢測傳感器
小車底盤+車輪
12V電池
其它配件


程序如下


  1. #include <reg52.h>           //此文件中定義了51的一些特殊功能寄存器
  2. #include <math.h>
  3. #include <stdio.h>
  4. #include <intrins.h>

  5. #define uchar unsigned char
  6. #define uint  unsigned int
  7. #define TH0_TL0 (65536-500)//設定中斷的間隔時長

  8. //定義小車驅動模塊輸入IO口
  9. sbit Left_1_led  = P2^3;         // 左傳感器      
  10. sbit Right_1_led = P2^1;         //右傳感器
  11. sbit Left_2_led  = P2^4;         // 左傳感器      
  12. sbit Right_2_led = P2^0;         //右傳感器
  13. sbit midle_1_led = P2^2;         //中間傳感器

  14. sbit K1=P2^7;//
  15. sbit K2=P2^6;//
  16. sbit K3=P2^5;//
  17. sbit LED=P3^6;//燈開關
  18. sbit PWM_OUT=P3^5;//舵機控制
  19.         
  20. sbit OUT1=P1^0;//左前    驅動
  21. sbit OUT2=P1^1;//左前    驅動
  22. sbit OUT3=P1^2;//左后    驅動
  23. sbit OUT4=P1^3;//左后    驅動
  24. sbit OUT5=P1^4;//右前        驅動
  25. sbit OUT6=P1^5;//右前        驅動
  26. sbit OUT7=P1^6;//右后        驅動
  27. sbit OUT8=P1^7;//右后        驅動
  28. /***蜂鳴器接線定義*****/
  29. sbit BUZZ=P3^7;

  30. bit  PWM1;  //PWM 通道 1,          左前
  31. bit  PWM2;  //PWM 通道 2,          左后
  32. bit  PWM3;  //PWM 通道 3,          右前
  33. bit  PWM4;  //PWM 通道 4,          右后
  34. bit PWM_Flag = 1;//舵機啟動標志位

  35. uint PWM_Value1;                        //定義pwm值
  36. uchar order1=0;

  37. uchar count0 = 50;//低電平的占空比
  38. uchar count1 = 0;//高電平的占空比

  39. uchar count2 = 50;//低電平的占空比
  40. uchar count3 = 0;//高電平的占空比

  41. uchar date;
  42. uchar mode;

  43. LedOut[5];         //舵機位置轉換AISCC
  44. LedOut2[5];         //小車速度轉換AISCC

  45. void Q0();

  46. /************************************************************************/        
  47. //延時函數
  48. /************************************************************************/
  49. void delay500ms(void)         
  50. {
  51.     unsigned char a,b,c;
  52.     for(c=23;c>0;c--)
  53.         for(b=75;b>0;b--)
  54.             for(a=70;a>0;a--);
  55. }

  56. /************************************************************************/        
  57. //         BUZZ1( )蜂鳴器
  58. /************************************************************************/
  59. void BUZZ1( )
  60. {
  61.         BUZZ=1;        //50次檢測K4確認是按下之后,蜂鳴器發出“滴”聲響,然后啟動小車。
  62.         delay500ms();
  63.         BUZZ=0;//響50ms后關閉蜂鳴器\PPPPP\\P
  64.         delay500ms();
  65.         BUZZ=1;        
  66.         delay500ms();
  67.         BUZZ=0;        
  68.         delay500ms();
  69.         BUZZ=1;
  70.         delay500ms();
  71.         BUZZ=0;
  72.         delay500ms();
  73.         BUZZ=1;
  74.         delay500ms();
  75.         BUZZ=0;        
  76.         delay500ms();               
  77.         BUZZ=1;
  78.         delay500ms();
  79.         BUZZ=0;
  80. }         


  81. /************************************************************************/
  82. //前速前進
  83. void  run(void)                                           //PWM=1表示電機正轉有效        PWM=0 表示電機反轉有效
  84. {
  85.           PWM1 = 1;         //左前
  86.           PWM2 = 1;         //左后
  87.           PWM3 = 1;         //右前
  88.           PWM4 = 1;         //右后
  89.           TR0 = 1;
  90.           ET0=1;                    //打開定時器0中斷發送脈沖
  91. }
  92. /************************************************************************/        
  93. //后退
  94. void  back(void)
  95. {
  96.       PWM1 = 0;         //左前
  97.           PWM2 = 0;         //左后
  98.           PWM3 = 0;         //右前
  99.           PWM4 = 0;         //右后
  100.           TR0 = 1;
  101.           ET0=1;                    //打開定時器0中斷發送脈沖
  102. }

  103. /************************************************************************/        
  104. //左轉
  105. void  leftrun(void)
  106. {         
  107.       PWM1 = 0;         //左前
  108.           PWM2 = 0;         //左后
  109.           PWM3 = 1;         //右前
  110.           PWM4 = 1;         //右后
  111.           TR0 = 1;
  112.           ET0=1;                    //打開定時器0中斷發送脈沖
  113. }
  114. /************************************************************************/        
  115. //右轉
  116. void  rightrun(void)
  117. {
  118.           PWM1 = 1;         //左前
  119.           PWM2 = 1;         //左后
  120.           PWM3 = 0;         //右前
  121.           PWM4 = 0;         //右后
  122.           TR0 = 1;
  123.           ET0=1;                    //打開定時器0中斷發送脈沖

  124. }
  125. /************************************************************************/           
  126. //停止   
  127. void  stop(void)
  128. {
  129.           OUT1 = 0;   OUT2 = 0;   
  130.           OUT5 = 0;   OUT6 = 0;   
  131.           OUT3 = 0;   OUT4 = 0;
  132.           OUT7 = 0;   OUT8 = 0;
  133. }

  134. //****定時器0初始化****//
  135. void Timer0Init()
  136. {

  137.     TMOD |= 0x01;          //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響               
  138.     TH0 = 0xfE;
  139.     TL0 = 0x33;
  140.     //ET0=1;           //定時器0中斷打開   后面打開
  141.     TR0=1;             //定時器0開關打開
  142.     EA=1;              //總中斷打開
  143.         PS=1;
  144. }

  145. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  146. 函數:擦除某一扇區(每個扇區512字節)
  147. 入口:addr = 某一扇區首地址                          
  148. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  149. void erase(uint addr)
  150. {      
  151. // 打開 IAP 功能(ISP_CONTR.7)=1:允許編程改變Flash, 設置Flash操作等待時間
  152. // 0x83(晶振<5M)   0x82(晶振<10M)   0x81(晶振<20M)   0x80(晶振<40M)
  153.     ISP_CONTR = 0x81;  
  154.     ISP_CMD   = 0x03;           // 用戶可以對"Data Flash/EEPROM區"進行扇區擦除
  155.     ISP_ADDRL = addr;           // ISP/IAP操作時的地址寄存器低八位,
  156.     ISP_ADDRH = addr>>8;        // ISP/IAP操作時的地址寄存器高八位。
  157.     EA =0;   
  158.     ISP_TRIG = 0x46;            // 在ISPEN(ISP_CONTR.7)=1時,對ISP_TRIG先寫入46h,
  159.     ISP_TRIG = 0xB9;            // 再寫入B9h,ISP/IAP命令才會生效。
  160.     _nop_();
  161.     Q0();                                            // 關閉ISP/IAP
  162.         EA = 1 ;                                       
  163. }
  164. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  165. 函數:寫一字節
  166. 入口:addr = 扇區單元地址 , dat = 待寫入數據
  167. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  168. void Write(uint addr,uchar dat)
  169. {
  170.     ISP_CONTR = 0x81;                  
  171.     ISP_CMD   = 0x02;           // 用戶可以對"Data Flash/EEPROM區"進行字節編程
  172.     ISP_ADDRL = addr;        
  173.     ISP_ADDRH = addr>>8;      
  174.     ISP_DATA  = dat;            // 數據進ISP_DATA
  175.     EA = 0;                                            // 關閉中斷
  176.     ISP_TRIG = 0x46;         
  177.     ISP_TRIG = 0xB9;         
  178.     _nop_();
  179.     Q0();                       // 關閉ISP/IAP
  180.         EA = 1 ;   
  181. }
  182. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  183. 函數:讀一字節
  184. 入口:addr = 扇區單元地址
  185. 出口:dat  = 讀出的數據
  186. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
  187. uchar read(uint addr)
  188. {   
  189.     uchar dat;

  190.     ISP_CONTR = 0x81;                  
  191.     ISP_CMD   = 0x01;          // 用戶可以對"Data Flash/EEPROM區"進行字節讀
  192.     ISP_ADDRL = addr;         
  193.     ISP_ADDRH = addr>>8;      
  194.     EA = 0;
  195.     ISP_TRIG = 0x46;         
  196.     ISP_TRIG = 0xB9;         
  197.     _nop_();
  198.     dat = ISP_DATA;            // 取出數據
  199.     Q0();                      // 關閉ISP/IAP
  200.         EA = 1 ;                     
  201.     return dat;
  202. }

  203. //**************************/
  204. //函數:EEPROM關閉ISP/IAP操作
  205. //**************************/
  206. void Q0()
  207. {
  208.     ISP_CONTR = 0;             // 關閉IAP功能
  209.     ISP_CMD   = 0;             // 待機模式,無ISP操作
  210.     ISP_TRIG  = 0;             // 關閉IAP功能, 清與ISP有關的特殊功能寄存器
  211. }

  212. /********************************************************************
  213. * 名稱 : UART_Send_Byte
  214. * 功能 : 串口屏通訊發送字節數
  215. ***********************************************************************/
  216. void UART_Send_Byte(unsigned char mydata)  
  217. {
  218.          ES=0;
  219.         TI=0;
  220.     SBUF=mydata;
  221.     while(!TI);
  222.     TI=0;
  223.     ES=1;
  224. }

  225. /********************************************************************
  226. * 名稱 : UART_Send_Str
  227. * 功能 : 串口屏通訊文本串發送
  228. ***********************************************************************/
  229. void UART_Send_Str(char *s)            
  230. {
  231.     int i=0;
  232.     while(s[i]!=0)
  233.     {
  234.            UART_Send_Byte(s[i]);
  235.            i++;
  236.     }

  237. }
  238. /********************************************************************
  239. * 名稱 : DisPlay
  240. * 功能 : 當前舵機位置轉換函數,顯示當前位置
  241. ***********************************************************************/
  242. void DisPlay()
  243. {
  244.     uchar i;
  245.     uchar DisDate;
  246.     DisDate = count2;
  247.     LedOut[0] = DisDate%100000/10000+0X30;
  248.     LedOut[1] = DisDate%10000/1000+0X30;
  249.     LedOut[2] = DisDate%1000/100+0X30;
  250.     LedOut[3] = DisDate%100/10+0X30;
  251.     LedOut[4] = DisDate%10+0X30;
  252.     UART_Send_Str("Pwm_Angel");         
  253.     for(i=0;i<5;i++)                                                   
  254.     {                  
  255.       UART_Send_Byte(LedOut[i]);
  256.     }
  257. }

  258. /********************************************************************
  259. * 名稱 : DisPlay
  260. * 功能 : 當前速度轉換函數,顯示當前速度
  261. ***********************************************************************/
  262. void Spend_DisPlay()
  263. {
  264.     uchar i;
  265.     uchar DisDate;
  266.     DisDate = count0;
  267.     LedOut2[0] = DisDate%100000/10000+0X30;
  268.     LedOut2[1] = DisDate%10000/1000+0X30;
  269.     LedOut2[2] = DisDate%1000/100+0X30;
  270.     LedOut2[3] = DisDate%100/10+0X30;
  271.     LedOut2[4] = DisDate%10+0X30;
  272.     UART_Send_Str("Car Spend");         
  273.     for(i=0;i<5;i++)                                                   
  274.     {                  
  275.       UART_Send_Byte(LedOut2[i]);
  276.     }
  277. }
  278. //****串口初始化****//
  279. void UsartInit()
  280. {
  281.     TMOD = 0x21;
  282.     PCON = 0x00;         //波特率不加倍
  283.     SCON = 0x50;   
  284.     TH1 = 0xFd;      //設置波特率 9600                11.0592M
  285.     TL1 = 0xFd;
  286.     TR1 = 1;         //啟動定時器1
  287.         PS=1;
  288.     ES = 1;          //開串口中斷
  289.     EA = 1;          //開總中斷
  290.     //IT0=0;         //外部中斷1觸發方式選擇位                IT0=0,為電平觸發方式,引腳INT1上低電平有效。IT0=1,為跳變沿觸發方式,引腳INT1上的電平從高到低的負跳變有效。
  291.     //EX0=1;         //外部中斷0中斷允許位。            EX0=1,打開外部中斷0中斷。          EX0=0,關閉外部中斷0中斷。
  292. }

  293. /*******************************************************************************
  294. * 函數名         : Usart() interrupt 4
  295. * 函數功能                  : 串口通信中斷函數
  296. * 輸入           : 無
  297. * 輸出                  : 無
  298. *******************************************************************************/
  299. void Usart() interrupt 4
  300. {

  301.         ET0 = 0 ;
  302.         ES = 0;
  303.         date=SBUF;//出去接收到的數據
  304.         RI = 0;//清除接收中斷標志位
  305.         //SBUF=date;
  306.     //while(!TI);
  307.     //TI=0;
  308.         /******按鍵處理減pwm占空比,電機加速*****/                         //0-20加減速度
  309.         if(date=='6') //加速
  310.            {
  311.           count0 += 10;
  312.           if(count0 >= 150)
  313.              {
  314.                 count0 = 150;
  315.              }

  316.            }
  317.         /******按鍵處理減pwm占空比,電機減速*****/
  318.         if(date=='7') //減速
  319.            {
  320.                 count0 -= 10;
  321.         if(count0 <= 0)
  322.             {
  323.                count0 = 0;
  324.             }

  325.            }        
  326.         if(date=='8')        {mode = 1;}         //模式1自動
  327.         if(date=='9')   {mode = 2;}  //模式2手動
  328.         if(date=='A')         {LED=~LED;}  //開關燈

  329.         /******按鍵處理減pwm占空比,電機減速*****/
  330.         if(date=='E') //舵機上抬
  331.            {
  332.               count2 += 5;
  333.           if(count2 >= 75)
  334.              {
  335.                 count2 = 75;
  336.              }
  337.                   
  338.            }
  339.         
  340.         if(date=='F') //舵機下降
  341.            {
  342.                   count2 -= 5;
  343.          if(count2 <= 20)
  344.             {
  345.                count2 = 20;
  346.             }
  347.                  
  348.            }
  349.    ES = 1;
  350.                                                                                  
  351. }

  352. /********************************************************************
  353. * 名稱 : SteeringGear() interrupt 1
  354. * 功能 : 定時器0中斷函數        (模式選擇控制)
  355. ***********************************************************************/
  356. void SteeringGear() interrupt 1
  357. {

  358.         TR0 = 0;
  359.     TL0 = TH0_TL0 % 256;
  360.     TH0 = TH0_TL0 / 256 ;//定時器裝初值

  361.     if(++count1 < count0)
  362.        {
  363.                   if(PWM1==1)  {OUT1=1;OUT2=0;}        else   {OUT2=1;OUT1=0;} //PWM=1表示電機正轉有效        PWM=0 表示電機反轉有效
  364.                   if(PWM2==1)  {OUT3=1;OUT4=0;}        else   {OUT4=1;OUT3=0;}
  365.                   if(PWM3==1)  {OUT5=1;OUT6=0;}        else   {OUT6=1;OUT5=0;}
  366.                   if(PWM4==1)  {OUT7=1;OUT8=0;}        else   {OUT8=1;OUT7=0;}
  367.        }
  368.     else
  369.            {
  370.                   if(PWM1==1)  {OUT1=0;OUT2=0;} else   {OUT2=0;OUT1=0;}
  371.                   if(PWM2==1)  {OUT3=0;OUT4=0;} else   {OUT4=0;OUT3=0;}
  372.                   if(PWM3==1)  {OUT5=0;OUT6=0;}        else   {OUT6=0;OUT5=0;}
  373.                   if(PWM4==1)  {OUT7=0;OUT8=0;}        else   {OUT8=0;OUT7=0;}
  374.            }
  375.     if(count1 >= 100)
  376.        {
  377.           count1=0;
  378.        }

  379. }


  380. //主函數
  381.         void main(void)
  382. {        
  383.     uchar a;
  384.     UsartInit();  
  385.         Timer0Init();
  386.         DisPlay();;
  387.         BUZZ1( );   
  388.         ET0 = 0;        
  389.         BUZZ=0;         
  390.         mode=0;
  391.     P1=0X00;  
  392.         LED = 0;
  393.         Spend_DisPlay() ;

  394.     while(1)
  395.           {
  396.             
  397.               while(mode==1)                  //自動程序
  398.                     {
  399.                           BUZZ=1;
  400.                   delay500ms();
  401.                   BUZZ=0;
  402.                   delay500ms();
  403.                   while(mode==1)   //有信號為0  沒有信號為1
  404.                         {

  405.                                    //WDT_CONTR=0x35;           //喂狗
  406.                            if(Left_1_led==1&&Right_1_led==1)          {   run();                    Spend_DisPlay() ; }           //調用前進函數                                 
  407.                                    else
  408.                                      {                          
  409.                                        if(Left_1_led==0&&Right_1_led==1)  {  leftrun();           Spend_DisPlay() ;}            //左邊檢測到黑線        調用小車左轉  函數                  
  410.                                        if(Right_1_led==0&&Left_1_led==1)  { rightrun();           Spend_DisPlay() ;}                //右邊檢測到黑線  調用小車右轉        函數
  411.                                     }
  412.                         }
  413.                      }
  414.              while(mode==2)                  //手動程序
  415.                         {
  416.                            BUZZ=0;
  417.                    delay500ms();
  418.                    BUZZ=1;
  419.                    delay500ms();
  420.                    BUZZ=0;        
  421.                    delay500ms();               
  422.                    BUZZ=1;
  423.                    delay500ms();
  424.                    BUZZ=0;
  425.                    while(mode==2)
  426.                          {
  427.                                    a = 1;
  428.                                                             
  429.                                while(date=='1')                //調用前進函數
  430.                                       {  
  431.                                          run();   
  432.                                          if(a == 1)  {UART_Send_Str("Car Run" );   Spend_DisPlay() ;}
  433.                                                  a = 0;
  434.                                       }                 

  435.                                while(date=='2')            //調用小車左轉
  436.                                       {  
  437.                                          leftrun();  
  438.                                          if(a == 1)  {UART_Send_Str("left run" );  Spend_DisPlay() ;}
  439.                                                  a = 0;
  440.                                       }                 
  441.                            
  442.                                while(date=='4')                  //調用小車右轉
  443.                                               {  
  444.                                          rightrun();  
  445.                                          if(a == 1) { UART_Send_Str("right run" );  Spend_DisPlay() ;}
  446.                                                  a = 0;
  447.                                       }        
  448.         
  449.                                while(date=='5')                   //調用小車后退
  450.                                       {  
  451.                                          back();  
  452.                                          if(a == 1)  {UART_Send_Str("back" );            Spend_DisPlay() ;  }
  453.                                                  a = 0;
  454.                                       }         
  455.         
  456.                                while(date=='0')                           //調用停止
  457.                                        {
  458.                                              
  459.                                          stop();
  460.                                                  if(a == 1) DisPlay();
  461.                                                  a = 0;
  462.                                                                                              
  463.                                                  if(++count3 < count2)         PWM_OUT=1;
  464.                                              else
  465.                                                            {
  466.                                                               PWM_OUT=0;
  467.                                                           }
  468.                                             if(count3 >= 100)
  469.                                                      {
  470.                                                     count3=0;
  471.                                                    }
  472.                                                    //WDT_CONTR=0x35;                                                   
  473.                                            }               
  474.                                 }
  475.                    }
  476.         }               
  477. }
復制代碼


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏11 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:913639 發表于 2021-4-28 16:51 | 只看該作者
老哥,代碼是全的嗎
回復

使用道具 舉報

板凳
ID:1531 發表于 2021-9-23 11:21 | 只看該作者
同問,代碼全嗎?
回復

使用道具 舉報

地板
ID:365834 發表于 2021-10-18 21:13 | 只看該作者
zbjllq 發表于 2021-9-23 11:21
同問,代碼全嗎?

全的,直接編譯就可以用(Keil4編寫)。
回復

使用道具 舉報

5#
ID:365834 發表于 2021-10-18 21:17 | 只看該作者
晚安可否 發表于 2021-4-28 16:51
老哥,代碼是全的嗎

全的,直接復制就可以。
回復

使用道具 舉報

6#
ID:979801 發表于 2021-11-10 16:11 | 只看該作者
遠方zjm 發表于 2021-10-18 21:13
全的,直接編譯就可以用(Keil4編寫)。

請問可以用Keil5運行嗎
回復

使用道具 舉報

7#
ID:783404 發表于 2021-11-12 11:10 | 只看該作者
有沒有ad原理圖啊
回復

使用道具 舉報

8#
ID:65956 發表于 2021-11-30 09:38 | 只看該作者
藍牙APP都沒發出來共享一下
回復

使用道具 舉報

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

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 9久久精品 | 亚洲午夜精品 | 久久精品女人天堂av | 啪啪网页| 福利视频三区 | 日本不卡一区 | av黄色在线 | 日韩电影中文字幕 | 97免费在线观看视频 | 99re国产视频 | 成人精品免费视频 | 欧美成人精品一区 | 国产一区二区三区在线 | 成人精品久久 | 91视视频在线观看入口直接观看 | 日韩精品亚洲专区在线观看 | 日日躁狠狠躁aaaaxxxx | 国产精品一区久久久久 | 丝袜一区二区三区 | 欧美lesbianxxxxhd视频社区 | 亚洲欧美日韩精品久久亚洲区 | 欧美xxxx网站 | 精品无码久久久久国产 | 亚洲国产成人精品久久 | 欧美性大战久久久久久久蜜臀 | 国产成人jvid在线播放 | 日本不卡视频 | 国产精品综合色区在线观看 | 玖玖视频网| 欧美日韩久 | 日韩视频精品在线 | 亚洲成人精品在线 | 精品久久久久久久久亚洲 | 久久久精品综合 | 国产精品乱码一区二区三区 | 日韩在线观看精品 | 精品视频一区二区三区在线观看 | 日韩精品在线一区 | 久久精品小视频 | 99精品国产成人一区二区 | 欧美激情视频一区二区三区免费 |