欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機pwm控制電機速度正反轉(終極版)函數都已寫好直接調用

  [復制鏈接]
跳轉到指定樓層
樓主


用51單片機做的滅火機器人程序,pwm控制速度正反轉,能夠實現自動尋找火源并滅火。此機器人在電子競賽中獲

單片機源程序如下:
  1. #include<reg52.h>
  2. #include<math.h>
  3. #include<math.h>
  4. #define uint unsigned int
  5. #define uchar unsigned char


  6. sbit IN_L1=P1^3;             //左輪電機控制1       //
  7. sbit IN_L2=P1^2;             //左輪電機控制2       //
  8. sbit IN_R1=P1^0;             //右輪電機控制1       //
  9. sbit IN_R2=P1^1;             //右輪電機控制2            //
  10. sbit PWMA=P1^6;              //左輪電機PWM波輸出  //
  11. sbit PWMB=P1^5;              //右輪電機PWM波輸出          //

  12. sbit HONG_L=P3^0;
  13. sbit HONG_M=P3^1;
  14. sbit HONG_R=P3^2;                                //紅外避障,左,中,右
  15.   
  16. sbit S_L=P3^4;
  17. sbit S_R=P3^5;                                  //尋跡傳感器,
  18. sbit J_L=P3^6;
  19. sbit J_R=P3^7;                                        //計數器,左輪,右輪

  20. sbit DJ=P0^0;                           //        電機
  21. sbit SPK=P2^1;                        //蜂鳴器
  22. sbit HUO_L=P2^3;
  23. sbit HUO_R=P2^4;                        //探測到火源 ,為低電位

  24. uchar SpeedTemp1=0;          //左輪電機速度鎖定變量
  25. uchar SpeedTemp2=0;          //右輪電機速度鎖定變量

  26. uchar SpeedLeft=0;          //左輪電機速度設定變量
  27. uchar SpeedRight=0;          //右輪電機速度設定變量

  28. uchar Timer0=0;           //定時器T0中斷次數計數變量
  29. uint i,j,k,n;

  30. void Motor(uchar Select,char Speed)   //Select為電機選擇,左輪為1,右輪為2                                  //Description:電機速度,正反轉傳遞程序            
  31. {
  32.    if(Select==1)                      //對左輪電機的處理
  33.    {
  34.       SpeedLeft=abs(Speed);              //取速度的絕對值
  35.       if(Speed>=0)
  36.       {
  37.          IN_L1=0;
  38.          IN_L2=1;                     //如果速度為非負,則正轉
  39.          }
  40.       else
  41.       {
  42.          IN_L1=1;
  43.          IN_L2=0;                     //如果速度為負,則反轉      
  44.       }
  45.    }

  46.    if(Select==2)                      //對右輪電機的處理
  47.    {
  48.       SpeedRight=abs(Speed);              //取速度的絕對值
  49.       if(Speed>=0)
  50.       {
  51.          IN_R1=0;
  52.          IN_R2=1;                     //如果速度為非負,則正轉
  53.          }
  54.       else
  55.       {
  56.          IN_R1=1;
  57.          IN_R2=0;                     //如果速度為負,則反轉      
  58.       }
  59.    }

  60. }
  61. void Delay(uint n)   //Delay范圍0 ~ 65535
  62. {
  63.    uint j;
  64.    while(n--!=0)         //延時次數
  65.    {
  66.       for(j=0;j<110;j++)    //延時1ms
  67.            ;
  68.    }
  69. }                           //總延時為Delay*1 ms


  70. void H_detect()
  71. {
  72.         if(HUO_L==0)
  73.         {       
  74.                 for(i=1;i<640;i++)
  75.                         for(k=1;k<110;k++)
  76.                 {       
  77.                         Motor(1,-50);
  78.                         Motor(2,0);
  79.                         DJ=1;
  80.                         j=1;
  81.                 }
  82.         }
  83.         else
  84.                 if(HUO_R==0)
  85.                 {
  86.                         for(i=1;i<640;i++)
  87.                                 for(k=1;k<110;k++)
  88.                                 {
  89.                                 Motor(1,0);
  90.                                 Motor(2,-50);
  91.                                 DJ=1;
  92.                                 j=2;
  93.                                 }
  94.                 }
  95.                 else
  96.                 {
  97.                         Motor(1,80);
  98.                         Motor(2,80);
  99.                         j=0;
  100.                 }
  101.         if((j==1)||(j==2))
  102.         {        DJ=1;
  103.                 for(i=0;i<500;i++)
  104.                         for(k=1;k<110;k++)
  105.                                 {
  106.                                 Motor(1,0);
  107.                                 Motor(2,0);
  108.                                 }
  109.                 if(j==1)
  110.                 {
  111.                         for(i=1;i<1150;i++)
  112.                                 for(k=1;k<110;k++)
  113.                                 {
  114.                                         Motor(1,50);
  115.                                         Motor(2,0);
  116.                                 }
  117.                 }
  118.                 else
  119.                 {
  120.                         for(i=1;i<1150;i++)
  121.                                 for(k=1;k<110;k++)
  122.                                 {
  123.                                         Motor(1,0);
  124.                                         Motor(2,50);
  125.                                 }                       
  126.                 }
  127.                 DJ=0;
  128.                 Delay(200);
  129.         }       
  130. }

  131. void Move()
  132. {
  133.         H_detect();
  134.         if((S_L==0)&&(S_R!=0))
  135.         {
  136.                 Motor(1,-10);
  137.                 Motor(2,80);
  138.         }
  139.         else
  140.         {
  141.                 if((S_R==0)&&(S_L!=0))
  142.                 {
  143.                         Motor(1,80);
  144.                         Motor(2,-10);
  145.                 }
  146.                 else
  147.                 {if((S_R==0)&&(S_L==0))
  148.                         {
  149.                                 Motor(1,80);
  150.                                 Motor(2,80);
  151.                         }
  152.                 }
  153.         }
  154. //        Delay(100);         
  155.         Motor(1,80);
  156.         Motor(2,80);
  157. }
  158. void Init()
  159. {
  160.    IN_L1=1;            
  161.    IN_L2=1;             //左輪電機剎車      
  162.    IN_R1=1;            
  163.    IN_R2=1;             //右輪電機剎車      

  164.         PWMA=0;            //左輪電機PWM波初始化
  165.         PWMB=0;             //右輪電機PWM波初始化
  166.    
  167.    TMOD=0x01;        // 設定T0的工作模式為1,GATE=0說明以TR0啟動定時器,C/T為0說明選擇了定時模式
  168.    TR0=0;             //關閉定時器0
  169.    TF0=0;             //定時器溢出復位
  170.    IE=0x00;             //所有中斷關閉
  171.    TH0=(65536-1000)/256;               
  172.    TL0=(65536-1000)%256;      //裝入TO定時初值,定時時間為50us
  173.    EA=1;             //開中斷
  174.    ET0=1;            //開定時器0的中斷   
  175.    TR0=1;            //啟動定時器0
  176. }
  177. void main()
  178. {        Init();
  179.         DJ=0;
  180.         n=1;
  181.         while(n)
  182.         {
  183.                 Motor(1,80);
  184.                 Motor(2,80);
  185.                 if((S_R!=0)&(S_L!=0))
  186.                 {
  187.                         for(i=1;i<95;i++)
  188.                                 for(k=1;k<110;k++)
  189.                                         {
  190.                                                 Motor(1,80);
  191.                                                 Motor(2,0);
  192.                                         }                         //右轉九十度
  193.                         n=0;
  194.                 }
  195.         }
  196.         Delay(200);
  197.            for(i=1;i<150;i++)
  198.                 for(k=1;k<110;k++)
  199.                         {
  200.                                 Move();
  201.                         }
  202.         for(i=1;i<180;i++)
  203.                                 for(k=1;k<110;k++)
  204.                                         {
  205.                                                 Motor(1,0);
  206.                                                 Motor(2,80);
  207.                                         }                         //zuo轉九十度       
  208.         while(1)
  209.         {
  210.                 Move();
  211.         }       
  212. }
  213. void PwmTimer0() interrupt 1     //定時器0的中斷服務程序來產生PWM波
  214. {     
  215.    TH0=(65536-1000)/256;
  216.    TL0=(65536-1000)%256;        //恢復定時器0的初值,定時時間50us
  217.    
  218.    if(Timer0==0)         //1個PWM周期完成后才會接受新數值 ,即500us內鎖定速度
  219.    {
  220.     SpeedTemp1=SpeedLeft;  //鎖定左輪電機的速度
  221.     SpeedTemp2=SpeedRight; //鎖定右輪電機的速度
  222.     }
  223.    
  224.     if(Timer0<SpeedTemp1)
  225.        PWMA=1;
  226.     else
  227.        PWMA=0;       //產生左輪電機的PWM波
  228.    
  229.     if(Timer0<SpeedTemp2)
  230.        PWMB=1;
  231.     else
  232.        PWMB=0;      //產生右輪電機的PWM波

  233.     Timer0++;         //中斷計數變量增1
  234.     if(Timer0>=100) //設定PWM波周期為500us
  235.     Timer0=0;       //中斷計數變量清0
  236. }
復制代碼

所有資料51hei提供下載:
用51單片機做的滅火機器人程序,能夠實現自動尋找火源并滅火。此機器人在電子競賽中獲.rar (32.79 KB, 下載次數: 161)


評分

參與人數 1黑幣 +8 收起 理由
2452873337 + 8 絕世好帖!

查看全部評分

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

使用道具 舉報

沙發
ID:129783 發表于 2017-11-10 18:25 | 只看該作者
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

板凳
ID:323477 發表于 2018-5-6 15:15 | 只看該作者
非常需要,謝謝摟住
回復

使用道具 舉報

地板
ID:146874 發表于 2018-5-8 09:23 | 只看該作者
謝謝分享
回復

使用道具 舉報

5#
ID:324822 發表于 2018-5-8 10:11 | 只看該作者
謝謝大神
回復

使用道具 舉報

6#
ID:41770 發表于 2018-7-3 14:53 | 只看該作者

謝謝分享
回復

使用道具 舉報

7#
ID:33544 發表于 2018-9-18 14:36 | 只看該作者
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

8#
ID:34149 發表于 2018-10-16 18:12 | 只看該作者
太精彩了,久久不愿離開
回復

使用道具 舉報

9#
無效樓層,該帖已經被刪除
10#
ID:101014 發表于 2018-10-18 10:30 來自觸屏版 | 只看該作者
樓主這是大愛啊
回復

使用道具 舉報

11#
ID:413123 發表于 2018-11-14 09:36 | 只看該作者
完美的51hei
回復

使用道具 舉報

12#
ID:333950 發表于 2018-11-16 10:23 | 只看該作者
大愛無言
回復

使用道具 舉報

13#
ID:383498 發表于 2018-11-19 18:28 | 只看該作者

大愛無言
回復

使用道具 舉報

14#
ID:426241 發表于 2018-11-21 11:07 來自觸屏版 | 只看該作者
謝謝分享
回復

使用道具 舉報

15#
ID:227908 發表于 2019-3-28 14:16 | 只看該作者
感謝分享,能不能看下原理圖
回復

使用道具 舉報

16#
ID:497553 發表于 2019-4-3 09:56 | 只看該作者
樓主,你確定 定時50us話,賦的初值是65536-1000?比如你的是12M晶振,怎么算都是65536-50吧?就算是11.0592的晶振,也絕不可能是這個數值。
回復

使用道具 舉報

17#
ID:393828 發表于 2019-4-26 10:51 | 只看該作者
請問能不能發下硬件原理圖
回復

使用道具 舉報

18#
ID:362398 發表于 2019-4-26 12:15 | 只看該作者
樓主,你這個PWM里面的速度鎖定變量是為了防止電機產生沖擊嗎,變速的時候
回復

使用道具 舉報

19#
ID:725297 發表于 2020-4-9 09:19 | 只看該作者
非常需要,謝謝摟住
回復

使用道具 舉報

20#
ID:725358 發表于 2020-4-9 10:34 | 只看該作者

好資料,51黑有你更精彩!!!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表