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

📄 step motor.c

📁 使用proteus进行仿真步进电机
💻 C
字号:
#include<regx51.h>
#define TIMER0_COUNT 0xee11
code forward[7]={0x03,0x06,0x04,0x0c,0x08,0x09,0x01};	//proteus里的步进电机控制序列 正向
code backward[7]={0x01,0x09,0x08,0x0c,0x04,0x06,0x03};
code key[4]={0xfe,0xfd,0xfb,0xf7};//第一键对应正转 第二键对应反转 第三键对应加速正转 第四键对应加速反转
unsigned char timer0_tick=0,i=0,times=100,status=1;	 //staus状态驱动 状态1正转 状态2反转 状态3加速正转 状态4加速反转

void delay(void)
{
  int i,j;
  for(i=0;i<155;i++)
  for(j=0;j<155;j++);
}						   //按键延时消抖动

char keypad_scan()
{
  char key;
  P2=0xff;
  while(P2!=0XFF);		  //P2不全高电平 就证明有键按下 开始扫描
  do{
  delay();
  key=P2;
  return(key);
  }while(1);
}

char gotkey()
{
  char temp,i;
  temp=keypad_scan();
  for(i=0;i<4;i++)
  {
    if(temp==key[i])return(i);	  //返回不同的i值对应不同的状态
  }
  return(4);
}
  
static void timer0_isr(void) interrupt TF0_VECTOR using 1
{
  TR0=0;
  TL0=(TIMER0_COUNT	& 0x00FF);
  TH0=(TIMER0_COUNT >> 8);
  TR0=1;
  timer0_tick++;
  if(timer0_tick==2000)
  {
     i++;
	 if(i==7)i=0;
	 timer0_tick=0;
	 if(status==1)P1=forward[i];
	 if(status==2)P1=backward[i];
  }
}

static void timer0_initialize(void)
{										 //使用计时计算器Timer0之前需要对其进行设设置
  EA=0;									 //先暂停接收所有的中断
  timer0_tick=0;						 
  TR0=0;								 //关闭Timer0
  TMOD=0x01;							 //设置计时器0的工作模式
  TL0=(TIMER0_COUNT & 0x00ff);			 //设置计时器0的计数器数值(THO与TL0的数值
  TH0=(TIMER0_COUNT >> 8);
  PT0=0;								 //设置计时器0有比较高的优先级
  ET0=1;								 //设置接收Timer0的中断
  TR0=1;								 //启动Timer0
  EA=1;									 //设置系统接收中断
}

void main(void)
{
  unsigned int command;
  timer0_initialize();
  do{
  command=gotkey();
  if(command==0) status=1;
  if(command==1) status=2;
  if(command==2) {times=50;status=1;}
  if(command==3) {times=50;status=2;}	   //书本上的(timers>1)的条件是保证/2的条件允许可执行
  if(command==4) status=0;
  }while(1)	;
}

⌨️ 快捷键说明

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