学习了单片机在的根本输入输出和在数据收集范畴的使用,接着学习了单片机在操控范畴的使用。在操控系统中,一般要操控机械部件的平移和滚动,这些机械部件的驱动大都选用沟通电机、直流电机和步进电机等,其间步进电机最适合与数字操控。因此在了解单片机在操控系统中的使用时,首要了解了单片机操控步进电机的规划。
首要器材:
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;
}
}
}