这是一个来自单片机开发板的源程序,原理图的下载地址: http://www.51hei.com/f/ks51.pdf
下面是源代码:
/**
*************************************************************************************************
* @file main.c
* @author xr
* @date 2014年3月18日20:00:03
* @note 步进电机的参数:减速比:1:64 步进角:5.625/64 启动频率:>=550 启动时间最小:1.08ms
* @brief 串口通信控制步进电机 单片机STC89C52RC MCU 晶振 11.0592MHZ
*************************************************************************************************
*/
#include <reg52.h>
typedef unsigned int uint;
typedef unsigned char uchar;
typedef unsigned long ulong;
//步进电机八拍模式相值编码 A-AB-B-BC-C-CD-D-DA
uchar code table[] = {
0xE, 0xC, 0xD, 0x9, 0xB, 0x3, 0x7, 0x6
};
uint tmp = 0;
bit dir = 0;
ulong beats = 0;//拍数
uchar angle = 0;//圈数
void timer0_Config();
void motor_Config(ulong angle);
void Uart_Config(uint baud);
void main()
{
timer0_Config();//启动时间设定为2ms
Uart_Config(9600);
while (1)
{
switch (angle)
{
case 2:
{
motor_Config(2*360);
angle = 0;
break;
}
case 3:
{
motor_Config(3*360);
angle = 0;
break;
}
case 4:
{
motor_Config(4*360);
angle = 0;
break;
}
case 5:
{
motor_Config(5*360);
angle = 0;
break;
}
case 6:
{
motor_Config(6*360);
angle = 0;
break;
}
case 7:
{
motor_Config(7*360);
angle = 0;
break;
}
case 8:
{
motor_Config(8*360);
angle = 0;
break;
}
case 9:
{
P1 |= 0x0F;
beats = 0;
angle = 0;
break;
}
default:
break;
}
}
}
/**
* @brief 步进电机配置(根据输出轴转的圈数来确定转子的拍数beats)
* @param 无
* @retval 无
*/
void motor_Config(ulong angle)
{
//在计算之前先关闭中断
EA = 0;
beats = (angle*64*8*8)/360;
EA = 1;
}
/**
* @brief 定时器T0定时配置
* @param uint xms
* @retval 无
*/
void timer0_Config()
{
TMOD &= 0xF0;//清零T0控制位
TMOD |= 0x01;//T1方式1
TH0 = 0xF8;
TL0 = 0xCC;//2ms
TR0 = 1;
ET0 = 1;
EA = 1;
}
/**
* @brief 串口通信配置
* @param 无
* @retval 无
*/
void Uart_Config(uint baud)
{
SCON |= 0x50;//SM0-SM2 REN TB8 RB8 TI RI
TMOD &= 0x0F;//清零T1控制位
TMOD |= 0x20;//设定定时器T1八位自动重装模式,计数设定串口波特率
TH1 = 256-(11059200/12/32/baud);//波特率 = 2^SMOD/32 * T1(溢出率) T1(溢出率) = 1/[(256-X)*(12/11059200)]
TL1 = TH1;
TR1 = 1;
ET1 = 0;//关闭T1的定时中断
ES = 1;//打开串口中断
EA = 1;//开总中断
}
/**
* @brief T0中断服务子程序
* @param 无
* @retval 无
*/
void timer0_Int() interrupt 1 using 3
{
static uchar step = 0;
uchar buf = 0;//存放相值
TH0 = 0xF8;
TL0 = 0xCC;
if (beats)
{
if (!dir)
{
buf = (P1 & 0xF0);//buf暂存P1的高字节,清零低字节
buf |= table[step++];//将相值存入buf
step &= 0x07;//与方式实现到8归零
P1 = buf;
beats--;
}
else
{
buf = (P1 & 0xF0);
buf |= table[step--];
if (step <= 0)
{
step = 7;
}
P1 = buf;
beats--;
}
}
else
{
P1 |= 0x0F;//关闭所有的相,即步进电机停止转动
}
}
/**
* @brief 串口中断服务子程序
* @param 无
* @retval 无
*/
void Uart_Int() interrupt 4 using 0
{
if (RI)
{
RI = 0;
if (SBUF > 1)
{
angle = SBUF;
}
else
{
dir = SBUF;
}
}
}