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

📄 no1.c

📁 步进电机多级控制 可以64级调节步进电机转速和正反转
💻 C
字号:
#include <reg51.h>
#include <intrins.h>
#include <stdio.h>
	
#define uchar unsigned char
#define uint  unsigned int 

uchar code FFW[8]={0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90};
uchar code REV[8]={0x90,0x80,0xc0,0x40,0x60,0x20,0x30,0x10}; 

#define LCD_data  P0;              //数据口
sbit LCD_RS  =  P2^0;            //寄存器选择输入 
sbit LCD_RW  =  P2^1;            //液晶读/写控制
sbit LCD_EN  =  P2^2;            //液晶使能控制
sbit LCD_PSB =  P2^3;            //串/并方式控制
sbit LCD_RST =  P2^5;            //液晶复位端口

sbit ON = P3^0;
sbit OP = P3^1;
sbit RUN = P2^7;
sbit B0 = P3^7;
sbit B1 = P3^6;
sbit B2 = P3^5;
sbit B3 = P3^4;
sbit B4 = P3^3;

uchar code dis1[] = {"32级步进速度控制 "};
uchar code dis2[] = {"当前状态   OFF   "};
uchar code dis3[] = {"当前状态   FFW   "};
uchar code dis4[] = {"当前状态   REV   "}; 
uchar code dis5[] = {"转速   0  X      "};
uchar code dis6[] = {" ROUND  00000    "}; 
uchar  S;  
uchar  R;
uchar  IRDIS[2];
uchar  IRCOM[4];

void ffwr();
void revr();
void showspd();
void showr();

/*******************************************************************/
/*                                                                 */
/*延迟类程序                                                       */
/*                                                                 */
/*                                                                 */
/*******************************************************************/

void delayNOP() 
        {    
	     _nop_();
         _nop_();
		 _nop_();
		 _nop_();
		 }

void delay(int ms)
{
    while(ms--)
	{
      uchar i;
	  for(i=0;i<250;i++)  
	   {
	    _nop_();			   
		_nop_();
		_nop_();
		_nop_();
	   }
	}
}

void delay1(int n)
{
    while(n--)
	{
      int i;
	  for(i=0;i<250;i++)  
	   {
	    _nop_();			   
		_nop_();
		_nop_();
		_nop_();
	   }
	}
}


/*******************************************************************/
/*                                                                 */
/*检查LCD忙状态                                                    */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。      */
/*                                                                 */
/*******************************************************************/
bit lcd_busy()
 {                          
    bit result;
    LCD_RS = 0;
    LCD_RW = 1;
    LCD_EN = 1;
    delayNOP();
    result = (bit)(P0&0x80);
    LCD_EN = 0;
    return(result); 
 }
/*******************************************************************/
/*                                                                 */
/*写指令数据到LCD                                                  */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                             */
/*                                                                 */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{                          
   while(lcd_busy());
    LCD_RS = 0;
    LCD_RW = 0;
    LCD_EN = 0;
    _nop_();
    _nop_(); 
    P0 = cmd;
    delayNOP();
    LCD_EN = 1;
    delayNOP();
    LCD_EN = 0;  
}
/*******************************************************************/
/*                                                                 */
/*写显示数据到LCD                                                  */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。                               */
/*                                                                 */
/*******************************************************************/
void lcd_wdat(uchar dat)
{                          
   while(lcd_busy());
    LCD_RS = 1;
    LCD_RW = 0;
    LCD_EN = 0;
    P0 = dat;
    delayNOP();
    LCD_EN = 1;
    delayNOP();
    LCD_EN = 0; 
}
/*******************************************************************/
/*                                                                 */
/*  LCD初始化设定                                                  */
/*                                                                 */
/*******************************************************************/
void lcd_init()
{ 
	LCD_RST = 0;		 //液晶复位
    delay(30);                   
    LCD_RST = 1;      
    delay(5);
    LCD_PSB = 1;         //并口方式
    
    lcd_wcmd(0x34);      //扩充指令操作
    delay(5);
    lcd_wcmd(0x30);      //基本指令操作
    delay(5);
    lcd_wcmd(0x0C);      //显示开,关光标
    delay(5);
    lcd_wcmd(0x01);      //清除LCD的显示内容
    delay(5);
}
/*********************************************************/
/*                                                       */
/* 设定显示位置                                          */
/*                                                       */
/*********************************************************/
void lcd_pos(uchar X,uchar Y)
{                          
   uchar  pos;
   if (X==0)
     {X=0x80;}
   else if (X==1)
     {X=0x90;}
   else if (X==2)
     {X=0x88;}
   else if (X==3)
     {X=0x98;}
   pos = X+Y ;  
   lcd_wcmd(pos);    
}
/*********************************************************/
/*							       	    				 */
/* 转换为ASCII              	    					 */
/*                                                       */
/*********************************************************/
void  dataconv()	 
  {
     uchar  t; 
	 for (t=0;t<2;t++)   
     if(IRDIS[t]>9)
      IRDIS[t]=IRDIS[t]+0x37;
     else
	  IRDIS[t]=IRDIS[t]+0x30;
  }
 
/*********************************************************/
/*							       	    				 */
/* 主程序                   	    					 */
/*                                                       */
/*********************************************************/

void main()
   {uchar i,s=1;
    int  r=0;
	IE = 0x81;                
    TCON = 0x01;  
	EX0 = 0;
	R=0;	

	delay(10);                
    lcd_init();              
        
    lcd_pos(0,0);             
     i = 0;
    while(dis1[i] != '\0')
     {                        
       lcd_wdat(dis1[i]);
       i++;
     }
    lcd_pos(1,0);             
     i = 0;
    while(dis2[i] != '\0')
     {
       lcd_wdat(dis2[i]);     
       i++;
     }
 	 lcd_pos(2,0);            
     i = 0;
    while(dis5[i] != '\0')
     {
       lcd_wdat(dis5[i]);    
       i++;
     }
	 lcd_pos(3,0);             
     i = 0;
    while(dis6[i] != '\0')
     {
       lcd_wdat(dis6[i]);    
       i++;
     } 

	while(1)
	{ RUN=1;
	  lcd_pos(1,0);             
      i = 0;
      while(dis2[i] != '\0')
      {
       lcd_wdat(dis2[i]);     
       i++;
      }
	  if(ON==0)
	  {RUN=0;
	   if(OP==0)
	     {
		      lcd_pos(1,0);             
              i = 0;
              while(dis3[i] != '\0')
              {
              lcd_wdat(dis3[i]);     
              i++;
              } 
		  ffwr();
		  r++;
		  R=r;
		  showr();
		  }
		else 
		 {
		      lcd_pos(1,0);             
              i = 0;
              while(dis4[i] != '\0')
              {
              lcd_wdat(dis4[i]);     
              i++;
              }  
		  revr();
		  r++;
		  R=r;
		  showr();
		  } 
		
		}	 
	}
	}	  
	 
 
/*********************************************************/
/*							       	    				 */
/* 正转                     	    					 */
/*                                                       */
/*********************************************************/
void ffwr()
  {
    uchar i,j,s=32;
	if(B0==1)
	   s=s-1;
	if(B1==1)
	   s=s-2;
	if(B2==1)
	   s=s-4;
	if(B3==1)
	   s=s-8;
	if(B4==1)
	   s=s-16;
	   S=s;
	showspd();
	for(i=0;i<12;i++)
	{for (j=0; j<8; j++)    
         {
           P1 = FFW[j];        
           delay1(s); 
		   }
	 }
	}   


 
/*********************************************************/
/*							       	    				 */
/* 反转                     	    					 */
/*                                                       */
/*********************************************************/

void revr()
  {
    uchar i,j,s=32;	
	if(B0==1)
	   s=s-1;
	if(B1==1)
	   s=s-2;
	if(B2==1)
	   s=s-4;
	if(B3==1)
	   s=s-8;
	if(B4==1)
	   s=s-16;
	   S=s;
	   showspd();
	for(i=0;i<12;i++)
	{for (j=0; j<8; j++)    
         {
           P1 = REV[j];        
           delay1(s); 
		   }
	 }	  
	}   
 
/*********************************************************/
/*							       	    				 */
/* 显示                      	    					 */
/*                                                       */
/*********************************************************/
void showspd()
   { uchar i,j,c,play[3],p,s;
   	 s=S;
     c=32-s;
     if(c<10)
	 {j=48;
	  i=c+49;
	  }
	 else if(c<19)
	 {j=49;
	  i=c+39;
	  }
	 else if(c<29)
	 {j=50;
	  i=c+29;
	  }
	 else
	 {j=51;
	  i=c+19;
	  }
	 play[0]=j;
	 play[1]=i;
	 play[2]='\0';
	lcd_pos(2,3);             
    p = 0;
      while(play[p] != '\0')
      {
        lcd_wdat(play[p]);     
        p++;
      } 
	}   

void showr()
    {
	uint r;
	uchar p[7],g,s,b,q,w,l;
	r=R;
	g=r%10;
    r=r-g;
	r=r/10;
    s=r%10;
    r=r-s;
	r=r/10;
    b=r%10;
	r=r-b;
	r=r/10;
	q=r%10;
	r=r-q;
	r=r/10;
	w=r%10;
	p[0]=w+48;
	p[1]=q+48;
	p[2]=b+48;
	p[3]=s+48;
	p[4]=g+48;
	p[5]=0;
	lcd_pos(3,4);             
    l = 0;
      while(p[l] != '\0')
      {
        lcd_wdat(p[l]);     
        l++;
      } 
	}

⌨️ 快捷键说明

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