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

標題: 基于51單片機和L298N的小車制作 [打印本頁]

作者: dccc    時間: 2018-9-27 21:38
標題: 基于51單片機和L298N的小車制作
到目前為止, 總算把51單片機過了一遍, 本來暑假就要完成的任務一直拖到了現在。  51學完, 就想著先做點東西, 就從小車開始。
     玩小車最重要的是什么? 電機。這個就不用多解釋了。 從今天早上開始到現在 總算是知道點皮毛了。 因為有學長做過這東西, 所以做起來也有大概的方向  知道是要搞哪些東西。 現在主要是L298N電機驅動和PWM脈沖控制。  
什么是L298N電機驅動? 什么是PWM脈沖?
一開始我一無所知, 實驗室里面有L298N驅動 但是我只知道它是L298N驅動, 對于怎么使用卻是一點也不知道。 在網上找教程, 淘寶上找資料; 掙扎了一個上午總算是知道了L298N驅動怎么使用, 相應I/O口的含義以及用途。  給一個傳送門:我是L298N驅動資料地址: L298N_電機驅動模塊_程序書.doc (1.13 MB, 下載次數: 38)
那什么是PWM呢? PWM是脈沖寬度調制, 在電機方面主要是通過改變占空比來改變電機的轉速, 從而實現加速、減速、轉彎等基本功能。 什么是占空比? 占空比指的是一個周期內, 高電平占這個周期的比例。  占空比越高,
電壓輸出就越高, 電機轉動的就越快。
在飛思卡爾、stm32 等芯片中有專門的模塊用來控制PWM, 但是在51單片機中則沒有, 所以需要用到內部的定時器來實現, 相對來說比較麻煩。 關于51單片機輸出PWM波可以參考一下這篇文章:如果利用51單片機輸出PWM波
我感覺這個網站對現在我也挺好的。
代碼部分:
程序一: 通過P2^0和P2^1口來控制電機的轉動, 通過按鍵來控制電機轉動的快慢。
  1. #include <reg52.h>

  2. typedef unsigned int u16;
  3. typedef unsigned char u8;

  4. sbit PWM1 = P2^0;                 
  5. sbit PWM2 = P2^1;
  6. sbit key_add = P3^2;
  7. sbit key_less = P3^3;

  8. u16 count = 50, time;

  9. void init0()
  10. {
  11.         TMOD = 0x01;         // 方式一
  12.         TH0 = (65536 - 10)/256;                // 賦初值
  13.         TL0 = (65536 - 10)%256;
  14.         TR0 = 1;       // 開啟定時器0
  15.         EA = 1;                   // 開啟總中斷
  16.         ET0 = 1;       // 定時器0允許中斷
  17. }
  18. void delayms(u16 z)   // 延遲函數
  19. {
  20.         u16 i, j;
  21.         for (i = z; i > 0; i--)
  22.                 for (j = 110; j > 0; j--);
  23. }
  24. void speed_add()     // 加速函數
  25. {
  26.         if (key_add == 0)
  27.         {
  28.                 delayms(2);
  29.                 if (key_add == 0)
  30.                 {
  31.                         count += 5;  // 通過改變占空比來進行加速
  32.                 }
  33.                 while (!key_add);
  34.         }
  35. }
  36. void speed_less()//減速函數
  37. {
  38.         if (key_less == 0)
  39.         {
  40.                 delayms(2);
  41.                 if (key_less == 0)
  42.                 {
  43.                         count -= 5;
  44.                 }
  45.                 while (!key_less);
  46.         }
  47. }  
  48. int main (void)
  49. {
  50.         init0();
  51.         while (1)
  52.         {
  53.                 speed_add();
  54.                 speed_less();        
  55.         }
  56.         return 0;
  57. }
  58. void T0_inter() interrupt 1
  59. {
  60.         TR0 = 0;
  61.         TH0 = (65536 - 10)/256;
  62.         TL0 = (65536 - 10)%256;
  63.         TR0 = 1;
  64.         

  65.         PWM1 = 0;
  66.         time ++ ;
  67.         if (time < count)// 因為總數是100, 所以可以直接看出占空比是多少。
  68.         {
  69.                 PWM2 = 1;
  70.         }
  71.         else
  72.         {
  73.                 PWM2 = 0;
  74.         }
  75.         if (time >= 100)
  76.         {
  77.                 time = 0;
  78.         }
  79. }
復制代碼

程序2:
  1. #include<reg52.h>

  2. #define uint unsigned int
  3. #define uchar unsigned char

  4. uchar time,count=50,flag=1;//低電平的占空比

  5. sbit PWM1=P2^0;//PWM 通道 1
  6. sbit PWM2=P2^1;//PWM 通道 2
  7. sbit key_turn=P3^3; //電機換向


  8. void delayxms(uint z);
  9. void Motor_turn(void);
  10. void timer0_init(void);


  11. void main(void)
  12. {
  13.         timer0_init();
  14.         while(1)
  15.         {
  16.                 Motor_turn();
  17.     }
  18. }

  19. void delayxms(uint z)//延時xms程序
  20. {
  21.     uint x,y;
  22.         for(y=z;x>0;x--)
  23.                for(y=110;y>0;y--);
  24. }

  25. /***電機正反向控制****/
  26. void Motor_turn(void)
  27. {
  28.         if(key_turn==0)
  29.         {
  30.                 delayxms(2);//此處時間不能太長,否者會的中斷產生沖突
  31.                 if(key_turn==0)
  32.                 {
  33.                         flag=~flag;
  34.                 }
  35.                 while(!key_turn);
  36.         }
  37. }

  38. /***********定時器0初始化***********/
  39. void timer0_init(void)
  40. {
  41.     TMOD=0x01; //定時器0工作于方式1
  42.     TH0=(65536-10)/256;                // 賦初值
  43.     TL0=(65536-10)%256;
  44.     TR0=1;                                         // 開啟定時器
  45.     ET0=1;                                         // 允許定時器0中斷
  46.         EA=1;                                         // 開啟總中斷
  47. }

  48. /**************定時0中斷處理******************/
  49. void timer0_int(void) interrupt 1
  50. {
  51.         TR0=0;//設置定時器初值期間,關閉定時器
  52.     TH0=(65536-10)/256;
  53.     TL0=(65536-10)%256;
  54.     TR0=1;
  55.     if(flag==1)//電機正轉
  56.     {
  57.             PWM1=0;
  58.                 time++;
  59.         if(time<count)        //占空比
  60.         {
  61.                 PWM2=1;
  62.         }
  63.         else
  64.         {
  65.                         PWM2=0;
  66.                }
  67.         if(time>=100)
  68.         {
  69.                 time=0;
  70.         }
  71.         }
  72.     else //電機反轉
  73.     {
  74.             PWM2=0;
  75.         time++;
  76.         if(time<count)
  77.         {
  78.                 PWM1=1;
  79.         }
  80.         else
  81.                 {
  82.                 PWM1=0;
  83.                 }
  84.         if(time>=100)
  85.         {
  86.                 time=0;
  87.         }
  88.         }
  89. }
復制代碼



作者: dccc    時間: 2018-9-27 21:40
謝謝樓主
作者: skorzeny    時間: 2018-10-4 15:55
好東西




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1