51单片机怎样用定时器和pwm控制直流电机变速?

我想实现的是在一段时间里由定时器控制pwm改变占空比实现电动机自动多段调速 我试了一下匀速两段调速可以实现再多了就实现不了了 求大神指点在线等 挺急的 下面是程序 我没有财富值TT

#include <reg52.h>
#include "pwm_timer.h"
#define uchar unsigned char
#define uint unsigned int
sbit a_up=P2^0;
sbit a_down=P2^1;
sbit s = P2^2;
sbit pwm=P1^0;
sbit in1 = P2^5;
sbit in2 = P2^6;
sbit led1 = P0^0;
sbit led2 = P0^1;
sbit led3 = P0^2;
sbit led4 = P0^3;
sbit led5 = P0^4;
char mark,mark2,mark3,mark4;
unsigned int count;
char q,e;

void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void zheng()
{
in1 = 1;
in2 = 0;
}
void fan()
{
in1 = 0;
in2 = 1;
}

void init_Timer1(void)
{
TMOD &= 0x0F;
TMOD |= 0x10;
TL1 = 0xB0;
TH1 = 0x3C;
ET1 = 1;
TF1 = 0;
}

void keyscan()
{
if(a_up==0)
{
delayms(1);
if(a_up==0)
{
mark2 = 1;
mark3 = 0;
mark4 = 0;
}
while(!a_up);
}
if(a_down==0)
{
delayms(1);
if(a_down==0)
{
mark3=1;
mark4=0;
}
while(!a_down);
}
if(s==0)
{
delayms(1);
if(s==0)
{
mark4 = 1;
mark2 = 0;
mark3 = 0;
}
while(!s);
}

}

main()
{
init_Timer1();
init_Timer0();
pwm = 0;
mark = 0;
led1 = 0;
led2 = 0;
led3 = 0;
led4 = 0;
led5 = 0;
q=0;
e=0;
while(1)
{
keyscan();
if(mark==0&&mark2==1) //匀速
{
TR1=1;
if(count<=100)
{
led1 = 1;
zheng();
pwm_calculator(55);
}else{
TR1 = 0;
count =0;
pwm_calculator(0);
led1 = 0;
mark++;
mark2=0;
mark3=0;
}
}
if(mark==1&&mark2==1)//三段调速(实现不了)
{
TR1=1;
if(count<=200&&e==0)
{
led3 = 1;
zheng();
pwm_calculator(20);
q=1;
}else{
e=1;
if(q==1){
count=0; }
}
if(count<=200&&e==1)
{
pwm_calculator(20);
q=2;
}else{
e=2;
if(q==2){
count=0; }
}
if(count<=300&&e==2)
{
pwm_calculator(80);
q=0;
}
if(count>300){
TR1 = 0;
count =0;
pwm_calculator(0);
led3 = 0;
mark++;
mark2=0;
count=0;
e=0;
mark3=0;
}
}
if(mark == 3)
{
mark =0;
}
if(mark3==1&&(!mark2))
{
TR1 = 1;
if(count<=200)
{
led4 = 1;
fan();
pwm_calculator(90);
}else{
TR1 = 0;
count =0;
pwm_calculator(0);
led4 = 0;
mark3=0;
}

}
if(mark4 == 1)
{
TR1 = 0;
led1 = 0;
led2 = 0;
led3 = 0;
led4 = 0;
led5 = 1;
pwm_calculator(0);
delayms(1000);
led5 = 0;
}
}
}
void T_C1 (void) interrupt 3 using 3{ //Çл»¼Ä´æÆ÷×éµ½3
TL1 = 0xB0; //ÉèÖö¨Ê±³õÖµ
TH1 = 0x3C; //ÉèÖö¨Ê±³õÖµ
count++;
}

用一个定时器生成最小时间基准,软件中用在定时器中断程序里用多个寄存器对这个时间基准进行不同周期的计数,就可以实现多个计数器的功能,进而实现多段PWM的应用追问

可不可以具体一点?可以根据我的程序说明一下吗?

温馨提示:答案为网友推荐,仅供参考
相似回答