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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3664|回復: 0
收起左側

51單片機+pwm波控制L298直流電機+測速 Proteus仿真程序

[復制鏈接]
ID:884334 發表于 2022-7-4 16:00 | 顯示全部樓層 |閱讀模式
自己寫的一個單片機程序,簡單的通過L298控制直流電機正反轉
利用定時器,產生pwm
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)

可調占空比,電機正反轉

可調占空比,電機正反轉


單片機源程序如下:
  1. #include"reg52.h"
  2. #define uchar unsigned char
  3. #define  uint unsigned int
  4. sbit IN1=P2^4;
  5. sbit IN2=P2^5;
  6. sbit ENA=P3^7;
  7. sbit Add=P1^0;
  8. sbit Sub=P1^1;
  9. sbit zhen=P1^2;
  10. sbit fan=P1^3;
  11. sbit Stop=P1^4;
  12. sbit WE4=P2^0;
  13. sbit WE3=P2^1;
  14. sbit WE2=P2^2;
  15. sbit WE1=P2^3;
  16. sbit PWM=P3^7;
  17. uint cnt=0;//脈沖計數
  18. int PWMTime=60;//初始脈沖寬度
  19. uint speed = 0;//速度
  20. int dw =  5; //檔位
  21. uint time;//時間計數
  22. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共陽極數碼管段選
  23. void SystemInt();
  24. void delay(uint x);
  25. void PWMOUT();
  26. void SetSpeed();
  27. void display();//函數定義

  28. void delay(uint x)           //延時函數
  29. {
  30.      uint i,j;
  31.          for(i=x;i>0;i--)
  32.             for(j=0;j<110;j++);
  33. }

  34. void SystemInt()  //系統初始化
  35. {
  36.         TMOD = 0x51;   //T0定時器 T1計數器  均采用方式1
  37.         TH0 = (65536-250)/256;
  38.         TL0 = (65536-250)%256;           //250us
  39.         ET0 = 1; TR0 = 1;                //打開T0
  40.         ET1 = 1;TR1 = 1;                                                         //打開T1
  41.         TH1 = 0;
  42.         TL1 = 0;                          //計數器初值為0
  43.   EA = 1;                                                                                                         //開啟總中斷
  44.         IN1 = 1;
  45.         IN2 = 0;        //初始正轉
  46. }

  47. void PWMOUT()                   //PWM輸出控制
  48. {
  49.         if(cnt<PWMTime)           //小于計數變量,輸出高電平
  50.         {
  51.                 PWM=1;
  52.         }
  53.         else            
  54.         {
  55.                 PWM=0;      //大于計數變量,低電平
  56.         }
  57.         if(cnt>100)
  58.                 cnt=0;         
  59. }

  60. void SetSpeed()     //速度設定
  61. {
  62.         if(Add==0)   //速度加
  63.         {
  64.                 delay(100);                   //按鍵消抖         
  65.                 if(Add==0)
  66.                 {
  67.                         PWMTime+=10;   //PWM波占空比增加10%
  68.                                 dw += 1;       //檔位加1
  69.                                 if(dw>9)
  70.                         {
  71.                                 dw = 9;  
  72.                         }
  73.                                 while(Add==0);   //松手檢測
  74.                         }
  75.                 }
  76.         if(Sub==0)     //如果速度減
  77.         {
  78.                 delay(100);    // 按鍵消抖           
  79.                 if(Sub==0)   
  80.                 {
  81.                                 PWMTime-=10;    //PWM波占空比減少10%
  82.                                 dw -= 1;                                //檔位減1
  83.                                         if(dw<0)
  84.                         {
  85.                                 dw = 0;
  86.                         }
  87.                         while(Sub==0);
  88.                 }
  89.         }
  90.         if(zhen==0)     //正轉
  91.         {
  92.                 delay(100);         
  93.                 if(zhen==0)   
  94.                 {
  95.                    IN1 = 1;
  96.                    IN2 = 0;
  97.                    while(zhen==0);
  98.                 }
  99.         }
  100.         if(fan==0)   //反轉
  101.         {
  102.                 delay(100);         
  103.                 if(fan==0)
  104.                 {
  105.                    IN1 = 0;
  106.                    IN2 = 1;
  107.                    while(fan==0);
  108.                 }
  109.         }
  110.         if(Stop==0)         //停止
  111.         {
  112.                 delay(100);      
  113.                 if(Stop==0)      
  114.                 {
  115.                    IN1 = 1;
  116.                    IN2 = 1;
  117.                    while(Stop==0);
  118.                 }
  119.         }
  120. }

  121. void xianshi()                  //數碼管顯示速度和檔位
  122. {
  123.         uint shi,ge;     
  124.         shi=speed/10;                  
  125.         ge=speed%10;     

  126.     WE1 = 0;
  127.                 P0 = table[ge];    //速度個位顯示
  128.                 delay(1);
  129.                 WE1 = 1;
  130.                
  131.                 WE2 = 0;
  132.                 P0 = table[shi];     //速度十位顯示
  133.                 delay(1);
  134.                  WE2 = 1;   
  135.                
  136.                 WE3 = 1;     
  137.                
  138.                  WE4 = 0;      
  139.                 P0 = table[dw];      //檔位顯示
  140.                 delay(1);
  141.                  WE4 = 1;

  142. }


  143. void timer0() interrupt 1   //定時器
  144. {
  145.         TH0 = (65536-250)/256;
  146.         TL0 = (65536-250)%256;       //250us
  147.         cnt++;                        
  148.         time++;
  149.         if(time==4000)              //1s時間內T1的脈沖次數
  150.         {
  151.                 time = 0;                  //計數置0
  152.                 TR0 = 0;TR1 = 0;          //先關閉定時器
  153.                 speed = TH1;                                                         
  154.                 speed = speed << 8;       //左移8位
  155.                 speed += TL1;                                                         //賦值
  156.                 speed = speed*2.2;                 //電機轉一圈產生24個脈沖,轉速為speed/24*60 r/min
  157.                 TH1 = 0;TL1 = 0;                                                //清0重新計數
  158.                 TR0 = 1;TR1 = 1;                                                //重新啟動定時器
  159.         }
  160. }


  161. void timer1() interrupt 3    //計數器
  162. {
  163.   TH1 = 0;
  164.         TL1 = 0;             //計數T1外部脈沖
  165. }

  166. void main()
  167. {
  168.          SystemInt();        
  169.    while(1)
  170.                 {        
  171.                         PWMOUT();
  172.                         SetSpeed();
  173.                         xianshi();
  174.                 }        
  175. }
復制代碼
屏幕截圖 2022-07-04 155925.png
Proteus仿真8.10版本的仿真文件下載(如果沒有安裝8.10的朋友就不要下載了,其他版本打不開的)
直流電機.7z (107.52 KB, 下載次數: 131)

評分

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

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品无码专区在线观看 | 国产精品视频999 | 91精品久久久久久久久久 | 精品国产乱码久久久久久闺蜜 | 久久久久国产一区二区三区 | 亚洲高清视频一区二区 | 精品欧美一区二区三区久久久小说 | 日韩久久久久久久久久久 | 久久久久久黄 | 91久久精品国产91久久 | 国产成人高清 | 精品一二三区在线观看 | 精品国产黄a∨片高清在线 成人区精品一区二区婷婷 日本一区二区视频 | 黄色一级免费 | 亚洲区中文字幕 | 亚洲视频三区 | 免费一区二区在线观看 | 国产99久久久国产精品 | 日韩精品视频在线播放 | 偷拍自拍网址 | 91亚洲国产成人久久精品网站 | 国产免国产免费 | 国产视频h | 蜜桃精品噜噜噜成人av | 一区二区三区免费 | 中文字幕在线中文 | 久久一 | 狠狠色狠狠色综合日日92 | 亚洲精品福利视频 | 国产一二三视频在线观看 | 日韩欧美亚洲 | 国精产品一品二品国精在线观看 | 精品一区二区在线观看 | 免费看国产一级特黄aaaa大片 | 久久精品小短片 | 日本一区二区三区四区 | www.玖玖玖 | 国产精品久久久久久久午夜片 | 久热9| 久久中文一区二区 | 酒色成人网 |