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

標題: 51單片機pwm控制電機速度正反轉(終極版)函數都已寫好直接調用 [打印本頁]

作者: 大紅色九分褲    時間: 2017-10-31 21:06
標題: 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)



作者: yyyttt_2007    時間: 2017-11-10 18:25
好資料,51黑有你更精彩!!!
作者: teast_tea    時間: 2018-5-6 15:15
非常需要,謝謝摟住
作者: bleach    時間: 2018-5-8 09:23
謝謝分享
作者: ck夏    時間: 2018-5-8 10:11
謝謝大神
作者: zcmthr    時間: 2018-7-3 14:53

謝謝分享
作者: wis98    時間: 2018-9-18 14:36
好資料,51黑有你更精彩!!!
作者: dyx811    時間: 2018-10-16 18:12
太精彩了,久久不愿離開
作者: 好又快維修部    時間: 2018-10-18 10:30
樓主這是大愛啊
作者: 秦沐    時間: 2018-11-14 09:36
完美的51hei
作者: 范飯飯    時間: 2018-11-16 10:23
大愛無言
作者: 笑天我    時間: 2018-11-19 18:28

大愛無言
作者: 夢里見回復    時間: 2018-11-21 11:07
謝謝分享
作者: li972695398    時間: 2019-3-28 14:16
感謝分享,能不能看下原理圖
作者: 冰醋混合物    時間: 2019-4-3 09:56
樓主,你確定 定時50us話,賦的初值是65536-1000?比如你的是12M晶振,怎么算都是65536-50吧?就算是11.0592的晶振,也絕不可能是這個數值。
作者: 絮塵    時間: 2019-4-26 10:51
請問能不能發下硬件原理圖
作者: sky505050w    時間: 2019-4-26 12:15
樓主,你這個PWM里面的速度鎖定變量是為了防止電機產生沖擊嗎,變速的時候
作者: hzsstudy    時間: 2020-4-9 09:19
非常需要,謝謝摟住
作者: mszw2100    時間: 2020-4-9 10:34

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




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 天天操网| 亚洲精品一区二区在线观看 | 91视频国产精品 | 免费成人av | 成人在线观看免费爱爱 | 亚洲精品乱码久久久久久按摩观 | 亚洲三区视频 | 综合久久久 | 亚洲日日夜夜 | 欧美一区二区三区四区五区无卡码 | 欧美一区二区三区在线视频 | 亚洲精品日韩一区二区电影 | 亚洲在线看 | 亚洲精选一区 | 91se在线 | 中文字幕亚洲一区二区va在线 | av网站免费观看 | 欧美精品成人一区二区三区四区 | 久久综合九九 | 玖玖精品 | 久久三区 | 在线观看视频一区二区三区 | 日日爱夜夜操 | 97视频精品| 一区二区三区在线免费 | 欧美成人一级 | 在线激情视频 | 蜜桃视频在线观看免费视频网站www | 成人精品一区二区三区四区 | 久久99精品国产自在现线小黄鸭 | 成人精品鲁一区一区二区 | 亚洲欧美日韩精品久久亚洲区 | 超碰美女在线 | 懂色av蜜桃av | 国产视频二区 | 日韩精品一区二区三区视频播放 | 日韩av成人在线观看 | 亚洲美女网站 | 91视频正在播放 | 日韩av一区二区在线观看 | 91精品国产91久久综合桃花 |