//接线:主板的VCC +12V GND分别接位置对象的+5V +V GND;
//主板中插上位置对象控制板,信号接口接对象的信号接口,CLK_mcu,K1,K2分别接CPU的P14,P15,P16;
// JD1接到MCU的P1口 独立键盘的KEY接口接到MCU的P1口 短路帽打在右方。
// KEY0- 右运动0.25MM; KEY1- 左运动0.25MM;
// KEY2- 右运动1cm; KEY3- 左运动1cm;
// KEY4- 右运动5cm; KEY5- 左运动5cm;
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit en=P1^0; // 定义P1.0口
sbit rst=P1^1; // 定义P1.1口
sbit ccw=P1^2; // 定义P1.2口
sbit hf=P1^3; // 定义P1.3口
sbit clk=P1^4; // 定义P1.4口
sbit k1=P1^5; // 定义P1.5口
sbit k2=P1^6; // 定义P1.6口
void ShortDelay(void)
{ uchar x,y;
for(x=0;x<5;x++)
for(y=0;y<125;y++)
_nop_();
return;
}
void outclk(uint a)
{ uint i,j;
while(a--)
{ en=1; // 定义P1.0口
rst=1; // 定义P1.1口
if((k1&k2)!=0) // K1,K2限位置判断
{clk=1;
for(i=150;i>0;i--) //200
for(j=150;j>0;j--); //200
clk=0;
}
else {rst=1;en=0;}
}
}
uchar key(void)
{uchar key_num;
if( ( P2 & 0x3f) != 0x3f ) //判断按键
{
ShortDelay(); //消除抖动
if( ( P2 & 0x3f ) != 0x3f )
{
switch ( P2 & 0x3f ) //将按键码转换成键值
{
case 0x3e: return key_num=01;
case 0x3d: return key_num=02;
case 0x3b: return key_num=03;
case 0x37: return key_num=04;
case 0x2f: return key_num=05;
case 0x1f: return key_num=06;
default : return key_num=00;
}
}
}
return key_num;
}
char code dx516[3] _at_ 0x003b;
void main(void)
{ uchar b;
while(1)
{
b= key();
switch(b)
{ //4步走1CM设定走5Cm 半应该是200的为了调整误差所以少4步 (10CM为多8步)
case 00:rst=1;break;//0
case 01:ccw=1; outclk(1);break;//1 右运动1步
case 02:ccw=0; outclk(1);break;//2 左运动1步
case 03:ccw=1; outclk(40);break;//3 右运动1CM
case 04:ccw=0; outclk(40);break;//4 左运动1CM
case 05:ccw=1; outclk(196);break;//5 右运动5CM
case 06:ccw=0; outclk(196);break;//6 左运动5CM
default:break;
}
}
}
|