ChunJian-YANG

#include <REGX51.H>

#define FOSC 12000000 //--- 宏定义时钟频率 ---
//=================================================================================================
//--- 步进电机控制的定义与声明区 ---
unsigned char code StepPhase[] = //--- 四相八拍代码表 ---
{
0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x09,
};
bit Direction = 0;
bit RunStatus = 0;
unsigned char StepPointer = 0;
#define TIMER50US 20000
#define STEPMOTOR P2
unsigned char SpeedGrade = 0;
unsigned char SpeedCount = 0;

//=================================================================================================
//--- 数码管显示定义与声明区 ---
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
code unsigned char LEDSEG[16] = //--- 显示0~9,A~F笔段代码表 ---
{
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71
};

#define K1 P3_2
#define K2 P3_3
#define K3 P3_4
#define K4 P3_5

//=================================================================================================
//--- main()主程序区 ---
void main(void)
{
unsigned int i;

P0M1 = 0x00; //--- 配置P0端口的P0.0~P0.7为推挽输出模式 ---
P0M0 = 0xFF;

TMOD = 0x20; //--- 配置T1为定时模式,工作于方式2 ---
TH1 = (256 - FOSC / 12 / TIMER50US); //--- 初始化T1定时1mS ---
TL1 = (256 - FOSC / 12 / TIMER50US);
TR1 = 1; //--- 启动T0工作 ---
ET1 = 1; //--- 使能T0中断 ---
EA = 1; //--- CPU开中断 ---

P0 = LEDSEG[SpeedGrade]; //--- 显示等级 ---

while(1)
{
if(0 == K1) //--- 按键K1是否按下 ---
{
for(i=0;i<1000;i++); //--- 延时去抖动 ---
if(0 == K1) //--- 按键K1是否真得按下 ---
{
Direction = 0; //--- 正向 ---
}
while(0 == K1); //--- 等待按键K1释放 ---
}
if(0 == K2) //--- 按键K2是否按下 ---
{
for(i=0;i<1000;i++); //--- 延时去抖动 ---
if(0 == K2) //--- 按键K2是否真得按下 ---
{
Direction = 1; //--- 反向 ---
}
while(0 == K2); //--- 等待按键K1释放 ---
}
if(0 == K3) //--- 按键K3是否按下 ---
{
for(i=0;i<1000;i++); //--- 延时去抖动 ---
if(0 == K3) //--- 按键K3是否真得按下 ---
{
SpeedGrade ++; //--- 电机速度切换 ---
if(6 == SpeedGrade) SpeedGrade = 0;
P0 = LEDSEG[SpeedGrade];
SpeedCount = 0;
}
while(0 == K3); //--- 等待按键K3释放 ---
}
if(0 == K4) //--- 按键K4是否按下 ---
{
for(i=0;i<1000;i++); //--- 延时去抖动 ---
if(0 == K4) //--- 按键K4是否真得按下 ---
{
if(0 == RunStatus) RunStatus = 1; //--- 启动运行 ---
else RunStatus = 0; //--- 停止 ---
}
while(0 == K4); //--- 等待按键K4释放 ---
}

}
}

//=================================================================================================
//--- 定时器T1定时50us溢出中断服务程序 ---
void T1_ISR(void) interrupt 3
{
TH1 = (256 - FOSC / 12 / TIMER50US); //--- 初始化T1定时1mS ---
TL1 = (256 - FOSC / 12 / TIMER50US);
if(1 == RunStatus) //--- 若电机处于运行状态下 ---
{
SpeedCount ++;
if(SpeedCount == (SpeedGrade + 1) * 2) //--- 到达了设置的速度档位 ---
{
SpeedCount = 0;
STEPMOTOR = (~StepPhase[StepPointer]) << 1; //--- 送出对应相位数据 ---
if(0 == Direction) //--- 正向状态下 ---
{
StepPointer ++;
if(sizeof(StepPhase) == StepPointer)
StepPointer = 0;
}
else //--- 反向状态下 ---
{
StepPointer --;
if(0xFF == StepPointer)
StepPointer = sizeof(StepPhase) - 1;
}
}
}
}

分类:

技术点:

相关文章:

  • 2021-12-30
  • 2022-12-23
  • 2021-11-30
  • 2021-04-02
  • 2021-11-04
  • 2021-12-30
  • 2021-12-24
  • 2021-08-07
猜你喜欢
  • 2021-10-13
  • 2022-12-23
  • 2022-12-23
  • 2021-08-18
  • 2022-12-23
  • 2021-04-11
  • 2022-12-23
相关资源
相似解决方案