/******************************************************
用PWM控制小电机的转速。。。。。。。。。
用单片机的两个管脚控制小电机的转向,速率先逐渐增大,
到全速持续5s,再减小,到0,反向,其余与正向时相同。
。。。。。。。。。。。
******************************************************/
#include<reg52.h>
#define timer_data (256-93) //定时器预置值,12M时钟是,定时0.1ms
#define PWM_T 100 //定义PWM的周期T为10ms
sbit PWM=P1^0; //电机的两个接口管脚
sbit DR=P1^1;
unsigned int PWM_t_con;
unsigned char sec_five;
unsigned char sec_one;
unsigned int time_count;
unsigned int PWM_t;
unsigned int mmm,nn;
unsigned char direction;
unsigned char direction2;
void timer_init()
{
TMOD=0x22; /*定时器1为工作模式2(8位自动重装),0为模式2(8位自动重装) */
PCON=0x00;
TF0=0;
TH0=timer_data; //保证定时时长为0.1ms
TL0=TH0;
ET0=1;
TR0=1; //开始计数
EA=1; //中断允许
DR=1;
PWM_t=PWM_T;
direction=1;
sec_five=1;
}
void set_pwm()
{
/********************************************************
当正向转动的时候,电机执行的程序,最后时刻为两位全1时
其中,变量mmm。nn位控制循环时的顺序问题。
平衡时间为time_count*sec_one=200*50
********************************************************/
if(direction==1)
{
if(PWM_t==PWM_T&&mmm==0)
{
sec_five=1;DR=1;PWM_t_con=0;
}
if(PWM_t==0)
{sec_five=0;PWM_t=1;}
if(time_count==200)
{
time_count=0;
sec_one++;
if(sec_one==50)
{
sec_one=0;
sec_five=1;
PWM_t_con=1;//控制PWM_t++
mmm=1;
if(nn==1)
{direction2=1;nn=0;direction=0;PWM_t=0;mmm=0;}
}
}
if(PWM_t==PWM_T&&mmm==1)
{
sec_five=0;nn=1;
}
}
/********************************************************
当反向转动的时候,电机执行的程序,最后时刻为两位全0时
其中,变量mmm。nn位控制循环时的顺序问题。
平衡时间为time_count*sec_one=200*50
********************************************************/
if(direction2==1)
{
if(PWM_t==0&&mmm==0)
{sec_five=1;DR=0;PWM_t_con=1;}
if(PWM_t==PWM_T)
{sec_five=0;PWM_t=99;}
if(time_count==200)
{
time_count=0;
sec_one++;
if(sec_one==50)
{
sec_one=0;
sec_five=1;
PWM_t_con=0;
mmm=1;
if(nn==1)
{direction=1;nn=0;direction2=0;PWM_t=PWM_T;mmm=0;DR=1;}
}
}
if(PWM_t==0&&mmm==1)
{
sec_five=0;nn=1;
}
}
}
/***********************************************************
中断部分 ,设置占空比及时间控制
************************************************************/
void IntTime() interrupt 1
{
time_count++;
if(sec_five==1)
{
if(time_count>=PWM_T)
{
time_count=0;
if(PWM_t_con==0)
PWM_t--;
if(PWM_t_con==1)
PWM_t++;
}
if(time_count<PWM_t)
PWM=1;
else PWM=0;
}
}
/*************主程序***************/
void main()
{
timer_init();
while(1)
{set_pwm();}
}
- 1
- 2
- 3
前往页