本程序的实现是基于虚拟接口卡和8051单片机的. 通过对8051部分引脚的操作, 以合适的逻辑序列, 实现了 主转盘步进电机走8步 -> 针臂落下 -> 针臂在底部停留片刻 -> 针臂抬起至最高位 -> 主转盘步进电机走8步 这样的循环操作.
日后我会在此基础上加入上位机发送信号控制系统工作的部分.
#include <STC89C5xRC.h>
char tcount = 0;
char step = 0;//记录主电机走过的步数(走过的步数=step/2)
void delay()
{
int i,j;
for(i = 0; i < 40; i++)
for(j = 0; j < 40 ; j++)
{
;//为针臂步进电机提供时延
}
}
void delay2()//针臂在底部停留时延
{
int i,j;
for(i=0;i<1000;i++)
for(j=0;j<1000;j++)
{
;
}
}
void motor_Control(char steps)//控制主转盘电机转动指定步数
{
int i;
P21 = 0;//主转盘方向
for(i = 0; i < steps; i++)
{
P20 = 0;
delay();
P20 = 1;
delay();
}
}
void timer0() interrupt 1
{
TR0 = 0;//关闭定时器0
TH0 = 0x3c;
TL0 = 0xB0;//50ms
tcount++;
if(tcount == 2)//100ms = 0.1s
{
P20 = ~P20;//P20翻转,相当于发送脉冲
tcount = 0;
step ++;
if(step / 2 == 8)//电机走了8步(经历了8次高低电平的转换)
{
step = 0;//将步数归零
//P1.3=1代表向下,P1.3=0代表向上
P03 = 1;//往下转,P13接单片机P03
while(P02 == 1)//若未到下限位置,P0.2接单片机P02
{
P22 = 0;
delay();
P22 = 1;
delay();
}
delay2();//针臂在底部停留片刻
P03 = 0;//往上转
while(P01 == 1)//若未到上限位置,P0.1接单片机P01
{
P22 = 0;
delay();
P22 = 1;
delay();
}
}
}//1000ms = 1s 发送一个完整的脉冲
TR0 = 1;//开启定时器0
}
int main()
{
TMOD = 0x01;
TH0 = 0x3C;
TL0 = 0xB0;
IE = 0x83;
P20 = 0;//给虚拟接口卡P1.0发脉冲,以驱动主转盘步进电机
P22 = 0;//给虚拟接口卡P1.2发脉冲,以驱动针臂步进电机
TR0 = 1;//启动定时器0
while(1)
{
;
}
}
/*
P1.0:转盘电机Pulse信号
P1.1:转盘电机Dir
P1.2:针臂电机Pulse
P1.3:针臂电机Dir
P0口:输出口,连接虚拟软件中的传感器信号
P0.0:霍尔传感器信号,平时为高电平,有效时为低电平
P0.1:针臂上限位信号
P0.2:针臂下限位信号
*/