📄 c2051.c
字号:
#include <reg51.h>
#include <math.h>
#define POS1 218//(223-5) //测试头下落至磁环高度时的位置
#define POS2 51 //测试头移至磁环正中心时的位置
#define POS3 142//(137+5) //测试头上升至磁环高度时的位置
#define TIME1 10 //脉冲之间的延时
#define TIME2 4
#define TIME3 3
#define TIME4 16
#define TIME5 19
#define TIME6 23
#define TIME7 28
#define TIME8 35
#define NUM 9 //两齿轮的比例
#define HIGH 1
#define LOW 0
sbit PULSE = P3^7;
sbit SENS = P3^0;
sbit LED = P3^1;
unsigned char pos; //测试头位置
void delay( unsigned char time )
{
unsigned char i = time;
while( --i );
}
void delays( )
{
unsigned char i = 20;
while( --i )
delay( 255 );
}
//*********************************************************************
void step( )
{
/*************************************************
小拨盘前进一格(45度),
为防止出错,发出的脉冲数最多可移动2格
转动过程中检查光耦以确定是否到位
检查测试头位置以确定拨盘是否还可以继续转动
64细分,转动45度需1600个脉冲
分2步发送脉冲,第一步直接发送160个脉冲
第二步边监测边发脉冲,最多发3200个脉冲
*************************************************/
unsigned int i, j;
LED = HIGH;
//第一步
for ( i = 1500; i > 0; i -- )
{
for ( j = NUM; j > 0; j -- )
{
PULSE = HIGH;
delay( TIME3 );
PULSE = LOW;
delay( TIME3 );
}
}
//第二步
for ( i = 20000; i > 0; i -- )
{
pos = P1;
// if ( ( SENS == 0 ) || (( pos >= POS1 ) || ( pos < POS3 )) )
// break;
// for ( j = NUM; j > 0; j -- )
// {
if((SENS==0)||(pos>0&&pos<140)||(pos>216&&pos<255)) break;
PULSE = HIGH;
delay( TIME2 );
PULSE = LOW;
delay( TIME2);
// }
}
/*
//3
for ( i = 160; i > 0; i -- )
{
pos = P1;
// if ( ( SENS == 0 ) || (( pos >= POS2 ) && ( pos < POS3 )) )
if ( ( SENS == 0 ) || (( pos >= POS1 ) || ( pos < POS3 )) )
// if( SENS == 0 )
break;
for ( j = NUM; j > 0; j -- )
{
if(SENS==0) break;
PULSE = HIGH;
delay( TIME3 );
PULSE = LOW;
delay( TIME3 );
}
}
*/
/*
//防止丢步,补差
for ( i = 160; i > 0; i -- )
{
pos = P1;
// if ( ( SENS == 0 ) || (( pos >= POS2 ) && ( pos < POS3 )) )
if ( ( SENS == 0 ) || (( pos >= POS1 ) || ( pos < POS3 )) )
// if( SENS == 0 )
break;
for ( j = NUM; j > 0; j -- )
{
if(SENS==0) break;
PULSE = HIGH;
delay( TIME3 );
PULSE = LOW;
delay( TIME3 );
}
}
*/
LED = LOW;
}
//*********************************************************************************
/*
void test( )
{
unsigned int i;
while( 1 )
{
step( );
}
}
*/
void init( )
{
unsigned char i;
pos = P1;
while( ( pos == 0xff ) || ( pos == 0x00) )
{
pos = P1;
}
pos = P1;
i = pos;
//判断马达是否上电
while( pos == i )
{
delay( 25 );
i = P1;
}
//空转一周
pos = P1;
i = pos;
while( pos == i )
{
delay( 25 );
i = P1;
}
delays( );
while( pos != i )
{
i = P1;
}
}
void main( )
{
// test( );
delays();
delays();
init( );
pos = P1;
/* while ( ( pos <= POS2 ) || ( pos >= POS3 ) )
{
// delay( 25 );
pos = P1;
}
pos = P1;
while ( ( pos <= POS2 ) || ( pos >= POS3 ) )
{
// delay( 25 );
pos = P1;
}
*/
while ( 1 )
{
//等待
pos = P1;
if((pos>=0)&&(pos<=140)) //from 216~255 and 0~140 moto can't move
{
pos=P1;
}
else if (( pos>=216 )&&( pos<=255 ))
{
pos=P1;
}
else if (( pos>140)&&(pos<216))
{
char w1;
w1 = P1;
delay(TIME1);
pos = P1;
if( (pos>w1 ) && ( pos < 160)) //限定一个比较窗口,注意160这个值不能太大,不然电机走不完测头就下来了。
{
step();
}
else if (pos >196)
step();
while((pos>140)&&(pos<224)) //手摇时反转也能步进一格
{
pos = P1;
delay(TIME1);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -