|
|
這是我的程序,電機(jī)會轉(zhuǎn)動,但是最快轉(zhuǎn)一圈用了10s,怎么讓它更快呢?定時器的時間也該過了,但是還是不快#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit jiasu = P3^2; //加速
sbit jiansu = P3^3; //減速
sbit begin = P3^0; //開始
sbit fangxiang = P3^7; //方向鍵
sbit MOTOR_A=P1^0;
sbit MOTOR_B=P1^1;
sbit MOTOR_C=P1^2;
sbit MOTOR_D=P1^3;
uchar code PHASE_CW[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //四相八拍電平表
uchar code PHASE_CCW[]={0x01,0x09,0x08,0x0c,0x04,0x06,0x02,0x03};
uchar code tab1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff };
bit fx_flag = 0; // 方向標(biāo)志位
uchar phase = 0; // 當(dāng)前相位
uint cycle_cnt = 0; // 計數(shù)器
uint timelong =10; // 固定每個相位
uchar sudu = 0; // 默認(rèn)速度檔位
uchar sudu_num; // 數(shù)碼管顯示
void motor_speed();
volatile uchar phaseIndex = 0; // 相序索引(全局變量,需加volatile)
volatile bit direction = 0; // 轉(zhuǎn)向(全局變量)
void Timer0_Init(void)
{
TMOD &= 0xF0; // 清除T0模式
TMOD |= 0x01; // 設(shè)置T0為模式1(16位自動重裝)
TH0 = 0xFC; // 定時初值(1ms@12MHz)
TL0 = 0x18; // 65536 - 1000 = 64536 = 0xFC18
ET0 = 1; // 使能T0中斷
TR0 = 1; // 啟動T0
EA = 1; // 使能總中斷
}
void Timer0_ISR(void) interrupt 1
{
static uint cnt=0;
TH0 = 0xFC; // 重裝初值(1ms)
TL0 = 0x18;
cnt++;
if(cnt>=timelong)
{
cnt=0;
// 輸出當(dāng)前相序電平
if (direction == 0)
{ // 正轉(zhuǎn)
switch (PHASE_CW[phaseIndex])
{
case 0x01: MOTOR_A=1; MOTOR_B=0; MOTOR_C=0; MOTOR_D=0; break;
case 0x03: MOTOR_A=1; MOTOR_B=1; MOTOR_C=0; MOTOR_D=0; break;
case 0x02: MOTOR_A=0; MOTOR_B=1; MOTOR_C=0; MOTOR_D=0; break;
case 0x06: MOTOR_A=0; MOTOR_B=1; MOTOR_C=1; MOTOR_D=0; break;
case 0x04: MOTOR_A=0; MOTOR_B=0; MOTOR_C=1; MOTOR_D=0; break;
case 0x0C: MOTOR_A=0; MOTOR_B=0; MOTOR_C=1; MOTOR_D=1; break;
case 0x08: MOTOR_A=0; MOTOR_B=0; MOTOR_C=0; MOTOR_D=1; break;
case 0x09: MOTOR_A=1; MOTOR_B=0; MOTOR_C=0; MOTOR_D=1; break;
}
}
else
{ // 反轉(zhuǎn)
switch (PHASE_CCW[phaseIndex])
{
case 0x01: MOTOR_A=1; MOTOR_B=0; MOTOR_C=0; MOTOR_D=0; break;
case 0x09: MOTOR_A=1; MOTOR_B=0; MOTOR_C=0; MOTOR_D=1; break;
case 0x08: MOTOR_A=0; MOTOR_B=0; MOTOR_C=0; MOTOR_D=1; break;
case 0x0C: MOTOR_A=0; MOTOR_B=0; MOTOR_C=1; MOTOR_D=1; break;
case 0x04: MOTOR_A=0; MOTOR_B=0; MOTOR_C=1; MOTOR_D=0; break;
case 0x06: MOTOR_A=0; MOTOR_B=1; MOTOR_C=1; MOTOR_D=0; break;
case 0x02: MOTOR_A=0; MOTOR_B=1; MOTOR_C=0; MOTOR_D=0; break;
case 0x03: MOTOR_A=1; MOTOR_B=1; MOTOR_C=0; MOTOR_D=0; break;
}
}
// 相序索引遞增(循環(huán)0~7)
phaseIndex++;
if (phaseIndex >= 8) phaseIndex = 0;
}
}
void Delays(uint Xms)
{
unsigned int i,j;
for(i=Xms;i>0;i--)
for(j=110;j>0;j--);
}
void keyscan()
{
if(jiasu == 0)
{
Delays(5);
if(jiasu == 0)
{
sudu++;
if(sudu >= 5)
sudu = 4;
motor_speed();
while(jiasu == 0);
}
}
if(jiansu == 0)
{
Delays(5);
if(jiansu == 0)
{
if(sudu > 0)
sudu--;
motor_speed();
while(jiansu == 0);
}
}
if(begin == 0)
{
Delays(5);
if(begin == 0)
{
sudu = 2;
motor_speed();
while(begin == 0);
}
}
if(fangxiang == 0)
{
Delays(5);
if(fangxiang == 0)
{
fx_flag = ~fx_flag;
direction = fx_flag; // 同步方向標(biāo)志
while(fangxiang == 0);
}
}
}
void motor_speed()
{
switch(sudu)
{
case 0:
sudu_num = 1;
timelong = 20; //最慢
break;
case 1:
sudu_num = 2;
timelong = 10;
break;
case 2:
sudu_num = 3;
timelong = 5;
break;
case 3:
sudu_num = 4;
timelong = 3;
break;
case 4:
sudu_num = 5;
timelong = 1; //最快
break;
}
}
void main()
{
motor_speed();
Timer0_Init(); // 初始化定時器
while(1)
{
keyscan(); // 循環(huán)掃描按鍵
}
}
|
|