按键控制步进电机转速(led闪烁)学习心得

面对一个任务时的分工能力

比如这个任务,由三块组成,步进电机,按键,led,根据难易程度或复杂程度,我的首要任务是先把步进电机搞懂,包括他的原理,工作方式,输入/输出逻辑表,在心中大体确定使用什么方法编程;接着就把按键也加入其中,要考虑两者之间的控制、联动等等;最后把led加入其中,将三者整合在一起。

处理问题的能力

前两步一直都挺顺利的,但是加入led闪烁这个条件时,就遇到了一些困难,比方说,必须要使用定时器中断了,因为电机转速控制和led闪烁控制都使用延迟函数的话,会导致一些问题(因为延迟函数本质上,是执行到这一步时,整个系统都处在待命状态,这样会导致此时电机与led灯都停止工作,就会造成两者同步运行的现象);再比如,在使用定时器中断时,由于电机转速和闪烁频率是变量,这就需要进行一些处理 TH0=ledfrequency/256; TL0=ledfrequency%256;在按键编程时,忽略了按完之后要讲两个键都复位,导致出现一些意外的混乱

程序

一直以来我都对编程都心存恐惧,学习的时候都只是处在看懂的阶段,从来没有真正使用过,正好借这次机会,战胜我心里的恐惧
还有就是感觉,将知识融入到真正的项目中,也就是实践,真的能学到很多很多东西,光看是学不到真正的知识的。

#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器


typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;

sbit MOTOA = P1^0;
sbit MOTOB = P1^1;
sbit MOTOC = P1^2;
sbit MOTOD = P1^3; 

sbit K1=P3^0;	   //高速
sbit K2=P3^1;	   //低速

sbit led=P0^0;
int motorspeed=400;		
int ledfrequency=60535;	   //10ms

#define GPIO_MOTOR P1
 
void delay(u16 i)
{
     
	while(i--);	
}


void Timer0InitLED()
{
     	 
  	  TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
	  TH0=ledfrequency/256;	
	  TL0=ledfrequency%256;	
	  ET0=1;//打开定时器0中断允许
	  EA=1;//打开总中断
	  TR0=1;//打开定时器   
	  		
}

void Timer0() interrupt 1
{
     
	static u16 i=0;
	TH0=ledfrequency/256;	
	TL0=ledfrequency%256;	
	i++;
	if(i==100)
	{
     
		i=0;
		led=~led;	
	}	
}
					 
void keypros()
{
     
	if(K1==0)		  //检测按键K1是否按下
	{
     	
		delay(1000);    	
		while(!K1);	 //检测按键是否松开
	}
	
	 if(K2==0)		  //检测按键K2是否按下
	{
     	
		delay(1000);  
		while(!K2);	 //检测按键是否松开
	}
	
			
}

void main()
{
     		
	P1=0X00; //因为P1^0有上拉电阻所以需要先调低
    while(1)
  {
      	
        keypros();
	  	Timer0InitLED();
	  	MOTOA = 1;	 
		MOTOB = 0;
		MOTOC = 1;
		MOTOD = 1;
		delay(motorspeed);
		MOTOA = 1;
		MOTOB = 1;			 
		MOTOC = 1;
		MOTOD = 0;
		delay(motorspeed);
		MOTOA = 0;
		MOTOB = 1;
		MOTOC = 1;
		MOTOD = 1;
		delay(motorspeed);
		MOTOA = 1;
		MOTOB = 1;
		MOTOC = 0;
		MOTOD = 1;
		delay(motorspeed); 

		if(K1==0)
	  {
     
		K2=1;
		K1=1;
		ledfrequency-=63535; 
	  	motorspeed-=100;	 
	  }	
	  if(K2==0)
	   {
     	
		 K1=1;
		 K2=1;
	     ledfrequency+=63535;
	  	 motorspeed+=100;	     
	   }
	   
     			    
    }
	   						
}

你可能感兴趣的