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

📄 text1.c

📁 一个步进电机控制程序
💻 C
字号:
#include <AT89X51.h>//51芯片管脚定义头文件
#include <intrins.h>//内部包含延时函数 _nop_() ;
#include <LCD1602.H>
#define uchar unsigned char
#define uint unsigned int
#define keys P1							//按键控制端口
#define stepper P2 						//stepper motor control output 
#define TMax 20000
#define TMin 100
uchar nstr[5];		//字符串形式的转速值
uchar code cdis1[ ] = {" welcome "};
uchar code cdis2[ ] = {" On  P "};	
uchar code cdis3[ ] = {" On  N"};
uchar code cdis4[ ] = {" off "};			

uchar ctlw[8]={0x0c,0x06,0x03,0x09,0x0c,0x06,0x03,0x09};	//双三拍控制字
uchar m;
bit qt=0;	   								//启停
bit fx=0;	   								//方向
bit max=0;								//最大转速限制 =1时,到达最大值允许值
bit min=0;								//最小转速限制   
unsigned int T=10000;					//时钟控制;

// init()初始化
void init()
{
   
	TMOD = 0x01;						// 设置定时器0工作模式
  	EA = 1;
	ET0 = 1;
	TH0 = -T/256;
	TL0 = -T%256;
	lcd_init();
	lcd_pos(0) ;
	m = 0 ;
    while(cdis1[m] != '\0')
  {
    lcd_wdat(cdis1[m]) ; //显示字符
    m++ ;
     }
}
//计算转速
int ncal()
{
	uint fw,N,ZR;
	fw=500000/T;
	return 60*fw/N/ZR;
}

//整数转字符串,保存到 nstr 中
void itoa(uint Value)
{
   uchar ch,*right,*left;
   left = right = nstr;

   //把数字转换成字符串(倒置的)
   while(Value)
   {
      *right = (Value%10)+0x30;
      Value = Value/10;
      right++;
   }
   *right-- = '\0';
   //把倒置的字符串正放过来
   while(right > left)
   {
      ch = *left;
       *left++ = *right;
       *right-- = ch;
   }
}

//显示转速
void ndisp()
{
	uint i=ncal();
	itoa(i);
 	lcd_pos(0) ;
	m = 0 ;
    while(nstr[m] != '\0')
  {
    lcd_wdat(nstr[m]) ; //显示字符
    m++ ;
     }
}

//显示函数
void display()
{
	if(qt)
	  {
		 if(fx)
		  {lcd_wcmd(0x01) ;
		   lcd_pos(0) ;
	       m = 0 ;
           while(cdis2[m] != '\0')
           {
            lcd_wdat(cdis2[m]) ; //显示字符
            m++ ;
            }
			}

		 else 
		   {lcd_wcmd(0x01);
		    lcd_pos(0) ;
            m = 0 ;
            while(cdis3[m] != '\0')
            {
             lcd_wdat(cdis3[m]) ; //显示字符
             m++ ;
             }
		    }
		 ndisp();
	  }
	else
     {lcd_wcmd(0x01);
	  lcd_pos(0) ;
      m = 0 ;
      while(cdis4[m] != '\0')
      {
             lcd_wdat(cdis4[m]) ; //显示字符
             m++ ;
	         }
      }
 }
//加速
void accelerate()
{
	if(T>=TMin+500){T-=200;min=0;}
	else max=1;
}

//减速
void decelerate()
{
	if(T<=TMax+500){T+=200;max=0;}
	else min=1;
}





	

/* 定时器0服务子程序 */
void time0() interrupt 1 using 1  // 用定时器0中断来产生CLK时钟
{
	/* 定时10ms,产生20ms周期的时钟,也就是50Hz的时钟 */
	static uchar n=0;
	TH0 = -T/256;
	TL0 = -T%256;
	if(fx)
	{
		stepper=ctlw[n%4];
		if(n<3)n++;
		else n=0;
	}
	else 
	{
		stepper=ctlw[n%4];
		if(n>0)n--;
		else n=3;
	}
	
}

/* 键消抖延时函数 */
void delay(void)
{
	uchar i;
	for (i=300;i>0;i--);
}

/* 键扫描函数 */
void keyscan(void)
{
	uchar tmpkey;
	keys = 0x0f;			 					// 发全0行扫描码
	if ((keys&0x0f)!=0x0f)					// 若有键按下
	{
		delay();							// 延时去抖动
		if ((keys&0x0f)!=0x0f)				// 延时后再判断一次,去除抖动影响
		{tmpkey=keys&0x0f;
		while((keys&0x0f)!=0x0f);			//直至键松开
		switch(tmpkey)
			{case 0x0e: 
						qt=~qt;
						break;
			 case 0x0d: 
			 			if(qt==1)fx=~fx;
			 			break;
			 case 0x0b: 
			 			if(qt==1&&!max)accelerate();
			 			break;
			 case 0x07: 
			 			if(qt==1&&!min)decelerate();
			 			break;
			 default:   break;
			}
		 display();
		}
	}								// 无键按下,返回值为0 	
}

/* 主程序 */
void main()
{ 
	init();
  	while(1)
    {
		keyscan();			// 调用键盘扫描函数
		if(qt) TR0=1;
		else   TR0=0;
	}
}



	
	
	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -