您好,我想咨询下您51单片机控制直流电机再使用PWM调速的情况下怎么控制电机的停歇时间,比如我想让电机转动两秒,停止两秒,我该如何编写代码,感谢您的回复。
要实现电机在旋转一定时间后停止的功能,可以在程序中设置一个计时器来控制电机的运行时间和停留时间。具体编写代码的过程如下:
以下是代码示例:
#include <reg51.h>
unsigned char count; // 定时器计数器
unsigned char running_time; // 电机运行时间计数器
unsigned char stop_time; // 电机停留时间计数器
void timer0_isr() interrupt 1 // 定时器0中断服务函数
{
TH0 = 0x4C; // 重新赋初值
TL0 = 0x00;
count++; // 计时器加1
if(count == 50) // 1秒钟
{
count = 0;
running_time++; // 运行时间计时器加1
stop_time++; // 停留时间计时器加1
if(running_time == 2) // 运行时间达到2秒
{
running_time = 0;
stop_time = 0;
P1 &= 0xFE; // 关闭PWM输出,电机停止运转
}
else if(stop_time == 2) // 停留时间达到2秒
{
stop_time = 0;
P1 |= 0x01; // 开启PWM输出,电机重新开始运转
}
}
}
void main()
{
TMOD |= 0x01; // 定时器0工作在模式1
TH0 = 0x4C; // 初值
TL0 = 0x00;
TR0 = 1; // 启动定时器0
ET0 = 1; // 允许定时器0中断
EA = 1; // 允许中断
P1 |= 0x01; // 初始化为PWM输出,电机开始运转
while(1)
{
// 在主程序中编写PWM调速的代码
// 比如使用定时器2和PCA模块来实现PWM输出
}
}
以上代码中的定时器计时器使用了一个计数器count,当计数器达到50时(1秒钟),中断服务函数会将计数器count清零,然后对运行时间计数器和停
不知道你这个问题是否已经解决, 如果还没有解决的话:程序的实现用的是keil软件编写的c语言程序,用了两种思路写的,都可以实现,下面都贴了出来。
第一种,用的是延时函数实现的脉冲。
#include <reg51.h>
#define uint unsigned int
void delayms(uint);
sbit ENA=P1^0;
sbit DIR=P1^1;
sbit PWM=P1^2;
void main()
{
ENA = 0;
DIR = 0;
PWM = 0;
while(1)
{
PWM = ~PWM;
delayms(1);
}
}
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i–)
for(j=110;j>0;j–);
}
第二种,用的51单片机的T1定时器实现的脉冲。
#include <reg51.h>
#define uint unsigned int
unsigned char timer1;
sbit DIR=P1^0;
sbit ENA=P1^1;
sbit PWM=P1^2;
void system_Ini()
{
TMOD = 0x00; //13λ
TH1 = 0xfd; //253
TL1 = 0x06; //6
EA = 1;
ET1 = 1;
TR1 = 1;
}
/*********************************************************
2^13=8192
25332=8096
8096+6=8102
8192-8102=90
12(1/11059200)= 1.09us
*********************************************************/
main()
{
system_Ini();
DIR = 0;
ENA = 0;
while(1)
{
if(timer1==40)
{
timer1=0;
}
if(timer1<20)
{
PWM=0;
}
else
{
PWM=1;
}
}
}
void Ti1(void) interrupt 3
{
TH1 = 0xfd;
TL1 = 0x06;
timer1++;
}