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

📄 d.c

📁 步进电机控制.rar
💻 C
字号:
#include"reg51.h"
#include"intrins.h"
#include"math.h"
#include"absacc.h"
#define  PORTA  XBYTE[0x8500]
#define  PORTB  XBYTE[0x8502]
#define  PORTC  XBYTE[0x8504]
#define  PORTC0 XBYTE[0x8506]
#define nop _nop_()
#define Right_RUN  1
#define Left_RUN  0
unsigned long RunSpeed=76;
unsigned  char  RUNState=1;
sbit  RS=P2^0;
sbit  RW=P2^1;
sbit  E=P2^2;
sbit P17=P1^7;
bit   flag=0;
unsigned char xx[]="speed(n/min):";
unsigned char SD[]="76";
char  state[2][14]={"direction:cw","direction:ccw"};
unsigned char  FLG,INMA=0;
unsigned  char  t,s=0x01;
unsigned  int   a;
main()
{
  void  OPJIAN();
  unsigned char JIAN();
  unsigned char JIANZHI();
   void  speed();
 void  SHOW_LCD();
 void  show_state();
 void  write1();
 void  writ2(unsigned char i);
 void  delay();
 void time();
 void  busy();
 unsigned  char  i;
  i=0x90;
  PORTC0=i;
  i=0x01;
  TMOD=i;
  t=0x10;
  a=0x0f;
  TH0=0x10;
  TL0=0x0f;
  FLG=INMA;  
  SHOW_LCD();
  show_state();
  EA=1;
  ET0=1;
  TR0=1;
while(1)
{
 i=JIAN();
     if(i!=0)
	{
	  time();
	  time();
	 }
	i=JIAN();
	if(i!=0)
	{
	INMA=JIANZHI();
   OPJIAN();
	 time();
	}
  if(FLG!=INMA||flag==1)
   {  FLG=INMA;
		SHOW_LCD();
      show_state();
		flag=0;
		}
  }
  }
 void SHOW_LCD()/*lcd设置程序*/
 {
  P1=0x38;
  write1();
  delay();
  P1=0x38;
  write1();
  delay(); 
  P1=0x38;
  write1();
  delay();
  P1=0x01;
  write1();
 delay();
  P1=0x0f;
  write1();
 delay();
  P1=0x06;
  write1();
  delay();
  P1=0x0c;
  write1();
  
 }
void  show_state()/*状态显示程序*/
  {
   unsigned char i=0;
   P1=0x80;
	write1();
 while(xx[i]!='\0')
	  {
	    writ2(xx[i]);
		 i++;
		 delay();
		 }
   i=0;
  while(SD[i]!='\0')
    {
	  writ2(SD[i]);
	  delay();
	  i++;
	 
	  }
	  P1=0xc0;
  write1();
  i=0;
  if(RUNState==Right_RUN)
	 while(state[0][i]!='\0')
	   {
		  writ2(state[0][i]);
		  i++;
		 }
	else
	  if(RUNState==Left_RUN)
		  while(state[1][i]!='\0')
		   {
			  writ2(state[1][i]);
			   i++;
			 }
   }
void  write1()/*lcd写控制字*/
 {
   RS=0;
	RW=0;
	E=0;
	busy();
	E=1;
  }
void  writ2( unsigned char i)/*lcd写数据*/
 { P1=i;
   RS=1;
	RW=0;
	E=0;
   busy();
	E=1;
	}
 
 void delay()/*延时程序*/
{
  unsigned char  i;
  for(i=0;i<100;i++)
    {
    i=i;
	 }
	 
}
void time()
{ unsigned char i,j;
for(i=0;i<100;i++)
 { 
for(j=0;j<30;j++)
 {
   j=j;
  }
  }
}

void busy()         //判断LCD是否忙
{    
	 do
	 {
	 P1=0xff;
	  RS=0;
     RW=1;
     E=0;
	  nop;
	  E=1;
	  }while(P17==1);
  
 }
 unsigned char JIAN()/*判断是否有键按下*/
 {
  unsigned char  i,j;
     i=0xff;
     PORTA=i;
     time();
     i=0x00;
     PORTB=i;
     j=PORTA;
     j=~j;
     j=j&(0x0f);
     return  j;
 }
unsigned char JIANZHI()/*读键值程序*/
 {
   unsigned i,j,d,k,m=1;
	 i=0xfe;
	 k=0x01;
	 do
	 {
	 PORTB=i;
	 j=PORTA;
	 m=j&(0x01);
    if(m==0)
	   d=k/2;
	 else
 	   {
	 m=j&(0x02);
	     if(m==0)
		   d=k/2+4;
		  else
		    {
			  m=j&(0x04);
			   if(m==0)
				  d=k/2+8;
				   else
					 {
					  m=j&(0x08);
                  if(m==0)
						d=k/2+12;
					 }
	        }
       }
	k=k+2;
	i=i<<1;
	i=i|(0x01);
	}while(m!=0);
	return  d;
}
void OPJIAN() /* 键值处理程序*/
{
   switch(INMA)
 {
   case 0x08:  {RUNState=Right_RUN;s=0xf7;}break;
   case 0x09:  {RUNState=Left_RUN;s=0x01;}break;
   case 0x0b:  {
	           flag=1;
				  t=t-2;
				  RunSpeed=5000000/(65536-t*256-a);
				  speed();}break;
   case 0x0f:  {flag=1;
                t=t+2;
	                RunSpeed=5000000/(65536-t*256-a);
	                speed();} 
 }
}
void speed()/*速度处理程序*/
 {
  unsigned  char  i=0;
  SD[0]=RunSpeed/100+48;
  SD[1]=RunSpeed%100/10+48;
  SD[2]=RunSpeed%10+48;
  }
  void time1(void) interrupt 1 using 2
  {

   TR0=0;
   PORTC=s;
	if(RUNState==0)
	{
	s=(s<<1);
	if(s==0x10)
	  s=0x01;

	}
  	else
	{
		s=s>>1;
	if(s==0x0f)
	s=0xf7;
	 }
   TH0=t;
  TL0=a;
  TR0=1;
  }

   
 

⌨️ 快捷键说明

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