找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3190|回复: 0
打印 上一主题 下一主题
收起左侧

51单片机+pwm波控制L298直流电机+测速 Proteus仿真程序

[复制链接]
跳转到指定楼层
楼主
自己写的一个单片机程序,简单的通过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. }
复制代码

Proteus仿真8.10版本的仿真文件下载(如果没有安装8.10的朋友就不要下载了,其他版本打不开的)
直流电机.7z (107.52 KB, 下载次数: 131)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表