⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c2051.c

📁 用KEIL 开发
💻 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 + -