资讯详情

单片机串口通信控制步进电机

这是一个来自单片机的源程序,原理图的下载地址: 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 串口通信控制步进 单片机C89C52RC 晶振 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) { SC |= 0x50;//SM0-SM2 REN TB8 RB8 RI TMOD &= 0x0F;//清零T1控制位 TMOD |= 0x20;//设定定时器T1八位自动重装模式,计数设定串口波特率 TH1 = 256-(11059200/12/32/baud);//波特率 = 2^SMOD/32 * T1(溢出率) T1(溢出率) = 1/[(256-X)*(12/11059200)] = 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; } } }

-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台