#include <REGX52.H>
#include "Delay.h"
#include "Nixie.h"
#include "Timer0.h"
#include "Key.h"
sbit Motor=P1^0;
unsigned char Count,Compare;
unsigned char KeyNum,Speed;
void main()
{
Timer0_Init();
while(1)
{
KeyNum=Key();
if(KeyNum==1)
{
Speed++;
Speed%=4;
if(Speed==0){Compare=0;}
if(Speed==1){Compare=25;}
if(Speed==2){Compare=50;}
if(Speed==3){Compare=100;}
}
Nixie(1,Speed);
}
}
void Timer0_Routine() interrupt 1
{
TL0 = 0x9C;
TH0 = 0xFF;
Count++;
Count%=100;
if(Count<Compare)
{
Motor=0;
}
else
{
Motor=1;
}
}
为啥我的直流电机不能调速啊 是不是接线问题啊 基本就是启动自己狂转 数码管有显示数字 但是就是控制不了速度。
【以下回答由 GPT 生成】
首先,根据您提供的代码和描述,我注意到您使用了单片机的定时器中断来控制电机的转速。您将Speed的值设置为0、25、50和100,然后在定时器中断中通过比较Count和Compare来切换Motor的状态。这个基本逻辑是正确的,但是您有两个问题可能导致电机无法以期望的速度旋转。
首先,根据您提供的代码,您使用的是定时器0来控制电机的转速。定时器0是一个8位计数器,它的初值由TH0和TL0寄存器决定。在您的代码中,您将TH0设置为0xFF,这意味着定时器0的计数值从255开始,而不是从0开始。因此,您需要调整定时器的初值设置。如果希望电机旋转速度较慢,请将TH0和TL0的初值设置为合适的值。
例如,如果所选择的晶振频率为12MHz,并且希望定时器每过1ms触发一次中断,则需要设置以下初值:
TH0 = (65536 - (12000/12))/256; // 65536是2^16
TL0 = (65536 - (12000/12))%256;
这将使定时器计数从0开始,并且每过1ms触发一次中断。
在您的代码中,当Count小于Compare时,将Motor设置为0,否则设置为1。这意味着当Count小于Compare时,电机是关闭的,而当Count大于或等于Compare时,电机是打开的。为了让电机旋转,您应当在Count小于Compare时设置Motor为1,否则设置为0。
修改后的代码如下:
void Timer0_Routine() interrupt 1
{
TL0 = (65536 - (12000/12))%256;
TH0 = (65536 - (12000/12))/256;
Count++;
Count%=100;
if(Count < Compare)
{
Motor=1;
}
else
{
Motor=0;
}
}
请尝试根据以上建议进行修改,看看是否能够解决电机无法以期望速度旋转的问题。如果问题仍然存在,请提供更多的信息,例如电机驱动电路、使用的电机型号和其他可能相关的细节,以便进一步调查和解决问题。
【相关推荐】