📄 pwm-motor.cpp
字号:
程序名:PWM直流电机调速 */
/* */
/* 晶振:12.0 M CPU型号:AT89S52 */
/* */
/* */
/* 功能描述: 将J12的2,3脚和J8的7,8脚(均自上而下数)分别相连! */
/* 直流电机的pwm波控制,可以直接的调速从0到20级的调速 */
/* */
/************************************************************************************/
#include<reg51.h>
#define TH0_TL0 (65536-1000)//设定中断的间隔时长
unsigned char count0 = 0;
unsigned char count1 = 0;
bit Flag = 1;//电机正反转标志位,1正转,0反转
sbit Key_add=P1 ^ 4; //电机减速
sbit Key_dec=P1 ^ 5; //电机加速
sbit Key_turn=P1 ^ 6; //电机换向
sbit PWM1=P3^6;//PWM 通道 1
sbit PWM2=P3^7;//PWM 通道 2
unsigned char Time_delay;
//函数声明
void Delay(unsigned char x);
void Motor_speed_high(void);
void Motor_speed_low(void);
void Motor_turn(void);
void Timer0_init(void);
/******************************************************************************/
void Delay(unsigned char x)//延时处理
{
Time_delay = x;
while(Time_delay != 0);
}
/******************************************************************************/
void Timer0_int(void) interrupt 1 using 1//定时0中断处理
{
TR0 = 0;
TL0 += (TH0_TL0 + 9) % 256;
TH0 += (TH0_TL0 + 9) / 256 + (char)CY;
TR0 = 1;
if(Time_delay != 0)//延时函数用
{
Time_delay--;
}
if(Flag == 1)//电机正转
{
PWM1 = 0;
if(++count1 < count0)
{
PWM2 = 1;
}
else
PWM2 = 0;
if(count1 >= 100)
{
count1=0;
}
}
else //电机反转
{
PWM2 = 0;
if(++count1 < count0)
{
PWM1 = 1;
}
else
PWM1 = 0;
if(count1 >= 100)
{
count1=0;
}
}//反转
}
/******************************************************************************/
void Motor_speed_high(void)//按键处理加pwm占空比,电机加速
{
if(Key_add==0)
{
Delay(10);
if(Key_add==0)
{
count0 += 5;
if(count0 >= 100)
{
count0 = 100;
}
}
while(Key_add == 0);//等待键松开
}
}
/******************************************************************************/
void Motor_speed_low(void)//按键处理减pwm占空比,电机减速
{
if(Key_dec==0)
{
Delay(10);
if(Key_dec==0)
{
count0 -= 5;
if(count0 <= 0)
{
count0 = 0;
}
}
while(Key_dec == 0);
}
}
/******************************************************************************/
void Motor_turn(void)//电机正反向控制
{
if(Key_turn == 0)
{
Delay(10);
if(Key_turn == 0)
{
Flag = ~Flag;
}
while(Key_turn == 0);
}
}
/******************************************************************************/
void Timer0_init(void)//定时器0初始化
{
TMOD=0x01;
TH0=TH0_TL0 / 256;
TL0=TH0_TL0 % 256;
TR0=1;
ET0=1;
EA=1;
}
/******************************************************************************/
void main(void)//主函数
{
Timer0_init();
while(1)
{
Motor_turn();
Motor_speed_high();
Motor_speed_low();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -