自己写的一个单片机程序,简单的通过L298控制直流电机正反转
利用定时器,产生pwm
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include"reg52.h"
- #define uchar unsigned char
- #define uint unsigned int
- sbit IN1=P2^4;
- sbit IN2=P2^5;
- sbit ENA=P3^7;
- sbit Add=P1^0;
- sbit Sub=P1^1;
- sbit zhen=P1^2;
- sbit fan=P1^3;
- sbit Stop=P1^4;
- sbit WE4=P2^0;
- sbit WE3=P2^1;
- sbit WE2=P2^2;
- sbit WE1=P2^3;
- sbit PWM=P3^7;
- uint cnt=0;//脉冲计数
- int PWMTime=60;//初始脉冲宽度
- uint speed = 0;//速度
- int dw = 5; //档位
- uint time;//时间计数
- uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阳极数码管段选
- void SystemInt();
- void delay(uint x);
- void PWMOUT();
- void SetSpeed();
- void display();//函数定义
- void delay(uint x) //延时函数
- {
- uint i,j;
- for(i=x;i>0;i--)
- for(j=0;j<110;j++);
- }
- void SystemInt() //系统初始化
- {
- TMOD = 0x51; //T0定时器 T1计数器 均采用方式1
- TH0 = (65536-250)/256;
- TL0 = (65536-250)%256; //250us
- ET0 = 1; TR0 = 1; //打开T0
- ET1 = 1;TR1 = 1; //打开T1
- TH1 = 0;
- TL1 = 0; //计数器初值为0
- EA = 1; //开启总中断
- IN1 = 1;
- IN2 = 0; //初始正转
- }
- void PWMOUT() //PWM输出控制
- {
- if(cnt<PWMTime) //小于计数变量,输出高电平
- {
- PWM=1;
- }
- else
- {
- PWM=0; //大于计数变量,低电平
- }
- if(cnt>100)
- cnt=0;
- }
- void SetSpeed() //速度设定
- {
- if(Add==0) //速度加
- {
- delay(100); //按键消抖
- if(Add==0)
- {
- PWMTime+=10; //PWM波占空比增加10%
- dw += 1; //档位加1
- if(dw>9)
- {
- dw = 9;
- }
- while(Add==0); //松手检测
- }
- }
- if(Sub==0) //如果速度减
- {
- delay(100); // 按键消抖
- if(Sub==0)
- {
- PWMTime-=10; //PWM波占空比减少10%
- dw -= 1; //档位减1
- if(dw<0)
- {
- dw = 0;
- }
- while(Sub==0);
- }
- }
- if(zhen==0) //正转
- {
- delay(100);
- if(zhen==0)
- {
- IN1 = 1;
- IN2 = 0;
- while(zhen==0);
- }
- }
- if(fan==0) //反转
- {
- delay(100);
- if(fan==0)
- {
- IN1 = 0;
- IN2 = 1;
- while(fan==0);
- }
- }
- if(Stop==0) //停止
- {
- delay(100);
- if(Stop==0)
- {
- IN1 = 1;
- IN2 = 1;
- while(Stop==0);
- }
- }
- }
- void xianshi() //数码管显示速度和档位
- {
- uint shi,ge;
- shi=speed/10;
- ge=speed%10;
- WE1 = 0;
- P0 = table[ge]; //速度个位显示
- delay(1);
- WE1 = 1;
-
- WE2 = 0;
- P0 = table[shi]; //速度十位显示
- delay(1);
- WE2 = 1;
-
- WE3 = 1;
-
- WE4 = 0;
- P0 = table[dw]; //档位显示
- delay(1);
- WE4 = 1;
- }
- void timer0() interrupt 1 //定时器
- {
- TH0 = (65536-250)/256;
- TL0 = (65536-250)%256; //250us
- cnt++;
- time++;
- if(time==4000) //1s时间内T1的脉冲次数
- {
- time = 0; //计数置0
- TR0 = 0;TR1 = 0; //先关闭定时器
- speed = TH1;
- speed = speed << 8; //左移8位
- speed += TL1; //赋值
- speed = speed*2.2; //电机转一圈产生24个脉冲,转速为speed/24*60 r/min
- TH1 = 0;TL1 = 0; //清0重新计数
- TR0 = 1;TR1 = 1; //重新启动定时器
- }
- }
- void timer1() interrupt 3 //计数器
- {
- TH1 = 0;
- TL1 = 0; //计数T1外部脉冲
- }
- void main()
- {
- SystemInt();
- while(1)
- {
- PWMOUT();
- SetSpeed();
- xianshi();
- }
- }
复制代码
Proteus仿真8.10版本的仿真文件下载(如果没有安装8.10的朋友就不要下载了,其他版本打不开的)
直流电机.7z
(107.52 KB, 下载次数: 131)
|