单片机控制步进电机系统
主要器件:
1、AT89C52单片机芯片,用与接受键盘输入和控制步进电机。
2、4相步进电机驱动芯片STK672-040,内含有硬件脉冲分配电路和功率驱动动能。
3、4×4行列式键盘。
试验流程图:
试验电路图:
试验程序代码:
//Stepper.h程序
#ifndef_STEPPER_H//防止Stepper.h被重复引用
#define_STEPPER_H
#include
#define uchar unsigned char
#define uint unsigned int
#define T 10000// 10ms定时常量宏定义
sbit M1=P2^0;
sbit M2=P2^1;
sbit M4=P2^2;
sbit M5=P2^3;
sbit EN=P2^4;
sbit CWB=P2^5;
sbit RET=P2^6;
sbit CLK=P2^7;
#endif
//Stepper.c程序
#include "Stepper.h"
/*定时器0服务子程序*/
void time0() interrupt 1 using 1//用定时器0中断来产生CLK时钟
{
/*定时10ms,产生20ms周期的时钟,也就是50Hz的时钟*/
TH0 = -T/256;
TL0 = -T%256;
CLK = ~CLK;
}
/*键消抖延时函数*/
void delay(void)
{
uchar i;
for (i=300;i>0;i--);
}
/*键扫描函数*/
uchar keyscan(void)
{
uchar scancode,tmpcode;
P1 = 0xf0;//发全0行扫描码
if ((P1&0xf0)!=0xf0)//若有键按下
{
delay();//延时去抖动
if ((P1&0xf0)!=0xf0)//延时后再判断一次,去除抖动影响
{
scancode = 0xfe;
while((scancode&0x10)!=0)//逐行扫描
{
P1 = scancode;//输出行扫描码
if ((P1&0xf0)!=0xf0)//本行有键按下
{
tmpcode = (P1&0xf0)|0x0f;
/*返回特征字节码,为1的位即对应于行和列*/
return((~scancode)+(~tmpcode));
}
else scancode = (scancode<1)|0x01;//行扫描码左移一位
}
}
}
return(0);//无键按下,返回值为0
}
/*主程序*/
void main()
{
uchar key;
TMOD = 0x01;//设置定时器0工作模式
EA = 1;
ET0 = 1;
/*设置为2相激励*/
M1 = 0;
M2 = 0;
/*设置为环形转向轨迹*/
M4 = 1;
M5 = 1;
EN = 0;//切断驱动输出
RET = 0;//归位输入无效
CWB = 1;//初始设置为顺时针方向
while(1)
{
key = keyscan();//调用键盘扫描函数
switch(key)
{
case 0x11:// 0行0列,启动键
EN = 1;//打开驱动输出
TH0 = -T/256;//改变T可以改变步进电机转动速度
TL0 = -T%256;
TR0 = 1;//定时器0开始计数
break;
case 0x21:// 0行1列,停止键
TR0 = 0;//定时器0停止计数
EN = 0;//切断驱动输出
break;
case 0x41:// 0行2列,切换转向按键
CWB = ~CWB;
break;
case 0x81:// 0行3列,归位键
RET = 1;
delay();
RET = 0;
break;
default:break;
}
}
}
单片机控制步进电机系 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)