📄 motor.c
字号:
#include <reg51.h>
#include <intrins.h>
#include <absacc.h>
#define uchar unsigned char
sbit PWM=P1^0;
sbit DR=P1^1;
sbit big_pwm=P1^2;
sbit small_pwm=P1^3;
sbit turn_direction=P1^4;
sbit big =P2^1;
#define timer_data (256-100)
#define PWM_T 100 //定义脉冲的宽度
unsigned char PWM_t ; //位时间脉冲宽度0~100
unsigned char PWM_count; //输出周期计数
unsigned char time_count;
bit direction;
/***************************************************/
//函数声明
/***************************************************/
void Delay(uchar);
void Mortor_speed_high();
void Mortor_speed_low();
void Mortor_turn();
/***************************************************/
// 定时器初始化选择方式二,延时0.1MS
/***************************************************/
void timer_init(void)
{
TMOD=0x22;
PCON=0x00; //选择方式2
TF0=0;
TH0=timer_data; //定时0.1毫秒
TL0=TH0;
ET0=1;
TR0=1;
EA=1;
}
void init()
{
}
void Delay(uchar temp)
{
uchar i;
for(i=0;i<temp;i++);
}
/***************************************************/
// 设定脉冲宽度和方向
/***************************************************/
void setting_PWM()
{
if(PWM_count==0)
{
PWM_t=20;
direction=1;
}
}
/******************************************************************************/
void Motor_speed_high(void)//按键处理加pwm占空比,电机加速
{
if(big_pwm==0)
{
Delay(10);
if(big_pwm==0)
{
PWM_t += 5;
if(PWM_t >= 100)
{
PWM_t = 100;
}
}
while(big_pwm == 0);//等待键松开
}
}
/******************************************************************************/
void Motor_speed_low(void)//按键处理减pwm占空比,电机减速
{
if(small_pwm==0)
{
Delay(10);
if(small_pwm==0)
{
PWM_t -= 5;
if(PWM_t <= 0)
{
PWM_t = 0;
}
}
while(small_pwm == 0);
}
}
/******************************************************************************/
void Motor_turn(void)//电机正反向控制
{
if(turn_direction== 0)
{
Delay(10);
if(turn_direction== 0)
{
direction = ~direction;
}
while(turn_direction== 0);
}
}
void main()
{
timer_init();
while(1)
{
setting_PWM();
Mortor_speed_low();
Mortor_speed_high();
Mortor_turn();
}
}
/***************************************************/
// pwm波输出程序
/***************************************************/
void Intimer0() interrupt 1
{
time_count++;
DR=PWM_t;big=!big;
if(time_count>=PWM_T)
{
time_count=0;
PWM_count++;
setting_PWM(); //每一个周期调用一次
}
if(time_count<PWM_t)
PWM=1;
else
PWM=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -