//接線:主板的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;
}
}
}
|