虹山艺术高地步进电机控制—独立按键输入设定速度和宽度(工作正常)

/**************************************************************/
#include<reg52.h>

#define uint unsigned int
#define uchar unsigned char

sbit key0=P1^0;
sbit key1=P1^1;
sbit key2=P1^2;
sbit key3=P1^3;

sbit CP=P3^6; //脉冲输出
sbit DIR=P3^7; //方向信号
sbit lim_back=P3^2; //极限和手动变向

uchar a[10]={0xc0,0xcf,0xa4,0x06,0x0b,0x92,0x90,0x47,0x80,0x82};
uchar b[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};

uchar num0,num1,num2,num3,num4,num5,num20,num30;
uchar num,speed_num,j;
uint plu_num,plu_ori;
/***********************************************************/
void delayms(uchar xms)
	{
		uchar i,j;
    for(i=xms;i>0;i--)
      {
      	for(j=110;j>0;j--);
      }
  }
/***********************************************************/
void scan_key0()
  {
  	 if(key0==0)
  		{
  			delayms(10);
  			  if(key0==0)
  			  	{
  			  		num0++;
  			  		if(num0==10)
  			  			{
  			  				num0=0;
  			  			}
  			  		while(!key0);
  			  	}
  	  }
  }
/***********************************************************/
void scan_key1()
  {
  	 if(key1==0)
  		{
  			delayms(10);
  			  if(key1==0)
  			  	{
  			  		num1++;
  			  		if(num1==10)
  			  			{
  			  				num1=0;
  			  			}
  			  		while(!key1);
  			  	}
  	  }
  }
/***********************************************************/
void scan_key2()
  {
  	 if(key2==0)
  		{
  			delayms(10);
  			  if(key2==0)
  			  	{
  			  		num2++;
  			  		
  			  		if(num2==10)
  			  			{
  			  				num2=0;
  			  			}
  			  		while(!key2);
  			  	}
  	  }
  }
/***********************************************************/
void scan_key3()
  {
  	 if(key3==0)
  		{
  			delayms(10);
  			  if(key3==0)
  			  	{
  			  		num3++;
  			  		
  			  		if(num3==10)
  			  			{
  			  				num3=0;
  			  			}
  			  		while(!key3);
  			  	}
  	  }
  }
/***********************************************************/
void rate_set()
  {
  	 P0=0xff;
  	 scan_key0();
  	 scan_key1();
  	 speed_num=num1*10+num0; //计算速度设定值  
  }
/***********************************************************/
void range_set()
  {
  	 
  	 P0=0xff;
  	 scan_key2();
  	 scan_key3();
  	 
  	 if((num2!=num20)||(num3!=num30))
  	 	 {
  	 	 	  num20=num2;
  	 	 	  num30=num3;
  	      plu_num=(num3*10+num2)*360;//由宽度设定计算脉冲总量
  	      plu_ori=plu_num;
  	   }
  }
/***********************************************************/
void keyscan()
  {  	 
  	 rate_set();
  	 range_set();   	 	 
  }
/***********************************************************/
void display()
  {
  	 P0=a[num0];
  	 P2=b[0];
  	 delayms(5);
  	 
  	 P0=a[num1];
  	 P2=b[1];
  	 delayms(5);
  	 
  	 P0=a[num2];
  	 P2=b[2];
  	 delayms(5);
  	 
  	 P0=a[num3];
  	 P2=b[3];
  	 delayms(5);
  	 
  	 P0=a[num4];
  	 P2=b[4];
  	 delayms(5);
  	 
  	 P0=a[num5];
  	 P2=b[5];
  	 delayms(5);  	 
  }
/***********************************************************/
void step_moto() //步进电机驱动	
	{									
		if((EX0==0)&&(plu_num<(plu_ori-100)))
			{ 
				EX0=1;
			}
			
		num5=(plu_num/360)/10;
    num4=(plu_num/360)%10;
    
    if((num2==0)&&(num3==0))
    	{
    		num4=0;
    		num5=0;
    	}	
  }
/***********************************************************/
void T0_time() interrupt 1
  {
   	TH0 = 0xFF;//150us初值
    TL0 = 0x6A;        
    
    if(speed_num!=0)
  	 	{
  	 		num++;
    
        if(num==(100-speed_num)) //数字越大,角速度越快
    	    {
    		    num=0;    				         				
    		    CP=~CP;
    		    j++;
    		    if(j==2)
    		    	{
    		    		j=0;
    		    		plu_num--;
    		    	}	    							  			 	
    	    }
    	
        if(plu_num==0)
    	    {	 
            DIR=~DIR;  //改换方向
            plu_num=plu_ori;  
          }	 	                     
      }
  }
/***********************************************************/
void int_int0() interrupt 0     //外部中断0
  {
    if(lim_back==0)
		  {
				delayms(10);//消抖				
				if(lim_back==0);
					{
						DIR=~DIR;  //改换方向
						EX0=0;     //关外部中断
						plu_num=plu_ori;
					 }
			 }    
   }
/***********************************************************/ 
void init()
	{
		TMOD = 0x01; //定时器0为工作方式1		
		TH0 = 0xFF; //150us初值
    TL0 = 0x6A;     
    
    EA = 1;      //开全局中断    
    ET0=1;     //开定时器0中断
		TR0=1;     //启动定时器0 
		
		EX0=1;     //开外部中断0
		IT0=1;  	 //外部中断0下降沿触发	  
	}
/***********************************************************/
void main()
  {
    init();
    
    while(1)
      {      	
      	 keyscan();
      	 display();
      	 step_moto();      	   	     	
      }
  }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值