光电开关控制步进电机正反转


步进电机的正反转控制直接给方向引脚给高低电平即可。

光电开关被遮挡时,引号引脚输出高低电平

#include

#define uint unsigned int
sbit motor = P1^0;//位定义电机脉冲信号端口
sbit block = P1^1;  //位定义接收光电开关遮挡信号的端口
sbit dir = P1^2;//位定义步进电机方向控制端口
sbit WE = P2^7;
sbit DU = P2^6;
sbit beep = P2^3;
uint pp;

void InitTimer0(void)
{
	TMOD=0x01;		 //模式设置,00000001,采用的是定时器0,工作与模式1(M1=0,M0=1)。
	TR0=1;			 //打开定时器
	TH0=0Xff;		 //定时器设置,每隔100微秒发起一次中断。
	TL0=0X48;		  // 0Xa4
	ET0=1;			 //开定时器0中断
	EA=1;			 //开总中断
}

void time0() interrupt 1	   //每隔100微秒发起一次中断
{	TH0=0Xff;
	TL0=0Xdb;				 //    TH0 = 0x0FF;	  TL0=0Xa4;
    
	pp++;
}

void motor_degree(uint i)	   // i取值0-255
{
	while(i--)
	{
		if(pp<=2)	//占空比0.2
	    	motor = 1;  
		else
	    	motor = 0;
		if(pp==10)
			pp=0;
	}
}
void main()
{

	InitTimer0();	  //定时器0初始化
	while(1)
	{
	WE = 1;	  //打开位选锁存器
	P0 = 0xfe;	 //选中第一位数码管1111 1110
	WE = 0;  //	  锁存位选数据

	while(block == 0)		   //光电开关被遮挡,反转90度
			 {	
				DU = 1;
				P0 = 0x06;	 //数码管显示1
				DU = 0;
				dir = 0;
				beep = 0;
				motor_degree(50);//    
			 }
	while(block == 1)			//光电开关无遮挡
			{     		   
				DU = 1;
				P0 = 0x3f;	 //数码管显示0
				DU = 0;
				dir = 1;
				beep = 1;
				motor_degree(50);//	无遮挡,正转90度
			}
	}
}

	
			 

你可能感兴趣的:(单片机)