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

📄 2.txt

📁 步进电机(键盘控制可调速加显示)!!!!!!!!!!!!!!!
💻 TXT
字号:
步进电机(键盘控制可调速加显示)

 

#include <reg51.h>

#define uchar unsigned char
static unsigned int count;  //计数
static int step_index;  //步进索引数,值为0-7

static bit turn;  //步进电机转动方向
static bit stop_flag;  //步进电机停止标志
static int speedlevel; //步进电机转速参数,数值越大速度越大,最小值为1,速度最慢
static int spcount;    //步进电机转速参数计数

void ddelay(void);     //键盘扫描延时函数
void delay(unsigned int endcount);  //延时函数,延时为endcount*1毫秒
void gorun();          //步进电机控制步进函数

void Delay400Ms(void);
void LCMInit(void); //LCM初始化
void WriteCommandLCM(unsigned char WCLCM,BuysC); //BuysC为0时忽略忙检测
void DisplayOneChar(uchar X, uchar Y, uchar DData);
void DisplayListChar(uchar X, uchar Y,uchar ListLength, uchar  *DData,uchar n);

 sbit P10=P3^0 ;  //电机端口定义
 sbit P11=P3^1 ;
 sbit P12=P3^2;
 sbit P13=P3^3 ;

 uchar code speed[]={ 0x3a,0x39,0x38,0x37,0x36,0x35,0x34,0x33,0x32,0x31,0x30};
 uchar code stop[] = {"stop"};
 uchar code go[] = {"go:"};
 uchar code back[] = {"back:"};
 uchar code max[] = {"max:8"};

void ddelay(void)
{
 uchar i;
 for (i=300;i>0;i--);
}



uchar keyscan(void)
{
 uchar scancode;
 uchar tmpcode;
 P1 = 0xf8;         // 发全0行扫描码
 if ((P1&0xf8)!=0xf8)     // 若有键按下
 {
  ddelay();       // 延时去抖动
  if ((P1&0xf8)!=0xf8)    // 延时后再判断一次,去除抖动影响
  {
   scancode = 0xfe;
   while((scancode&0x08)!=0)  // 逐行扫描
   {
    P1 = scancode;    // 输出行扫描码
    if ((P1&0xf8)!=0xf8)  // 本行有键按下
    {
     tmpcode = (P1&0xf8)|0x07;
     return((~scancode)+(~tmpcode)); // 返回特征字节码,为1的位即对应于行和列
    }
    else scancode = (scancode<<1)|0x01;  // 行扫描码左移一位
   }
  }
 }
 return(0);        // 无键按下,返回值为0  
}

void main(void)
{
  uchar key;
  count = 0;
  step_index = 0;
  spcount = 0; 

  P10 = 0;
  P11 = 0;
  P12 = 0;
  P13 = 0;

  EA = 1;             //允许CPU中断
  TMOD = 0x11; //设定时器0和1为16位模式1
  ET0 = 1;           //定时器0中断允许

  TH0 = 0xFc;
  TL0 = 0x18;   //设定时每隔1ms中断一次
  TR0 = 1;         //开始计数

  P0=0XFF;
  P3 &=0XEF;  //573片选
  LCMInit(); //LCM初始化
  Delay400Ms();

  stop_flag = 0;
  turn=0;

    speedlevel = 5;
 DisplayListChar(0,0,3,go,1); //每次扫描键盘显示更新一次uchar code go[]
 DisplayOneChar(0,1,0x35); //每次扫描键盘显示更新一次
    while(1)
 {
   key = keyscan();
   switch(key)
   {
     case 0x09:   //按键#,正转以speedlevel = 1的速度转1000*0.5MS=0.5S
  stop_flag=0;
     turn = 0;
        speedlevel =5; 
        gorun();
  WriteCommandLCM(0x01,1);//显示清屏,
  DisplayListChar(0,0,3,go,0); //每次扫描键盘显示更新一次uchar code go[]
  DisplayOneChar(0,1,0x35); //每次扫描键盘显示更新一次
   delay(1000);
  break;

     case 0x0c:   //按键*, 停止 2000*0.5MS=0.5S
     stop_flag=1;
  WriteCommandLCM(0x01,1);//显示清屏,
  DisplayListChar(0,0,4,stop,0); //每次扫描键盘显示更新一次
  break;

  
     case 0x0a:    //按键0, 反转以speedlevel = 1的速度转1000*0.5MS=0.5S
  stop_flag=0;
     turn=1;
     speedlevel =5;
  gorun();
  WriteCommandLCM(0x01,1);//显示清屏,
  DisplayListChar(0,0,5,back,0); //每次扫描键盘显示更新一次
  DisplayOneChar(0,1,0x35); //每次扫描键盘显示更新一次
        delay(1000);
  break;

  case 0x11:     // 按键9, 以--speedlevel的加速转1000*0.5MS=0.5S
  stop_flag=0;
  if (speedlevel==2)
       { speedlevel=2;}
  else { speedlevel--;}
  gorun();
  if(speedlevel==2)
   { DisplayListChar(0,1,5,max,0);} 
  else {DisplayOneChar(0,1, speed[speedlevel]);} //每次扫描键盘显示更新一次
  delay(1000);
  break; 

  case 0x12:  // 按键8,以++speedlevel的减速转1000*0.5MS=0.5S
  stop_flag=0;
  speedlevel++;
  gorun();
  WriteCommandLCM(0x01,1);//显示清屏,
  if(turn==0)
  {DisplayListChar(0,0,3,go,0); //每次扫描键盘显示更新一次uchar code go[]
  DisplayOneChar(0,1, speed[speedlevel]);} //每次扫描键盘显示更新一次
  else {DisplayListChar(0,0,5,back,0); //每次扫描键盘显示更新一次
        DisplayOneChar(0,1,speed[speedlevel]);} //每次扫描键盘显示更新一次
     delay(1000);
  break;
       }
 }
 }


//定时器0中断处理
void timeint(void) interrupt 1
{
  TH0=0xFc;
  TL0=0x18; //设定时每隔1ms中断一次

  count++;
  spcount--;
  if(spcount<=0) //速度调整,SPEEDLEVEL越大,延时越长(延时约为1MS*SPEEDLEVEL),
  {     // 频率越小,速度越慢
   spcount = speedlevel;     
   gorun();
  }

}

void delay(unsigned int endcount)//延时函数,延时为endcount*0.5毫秒
 {
  count=0;
  do{}
  while(count<endcount);
 }

void gorun()
{
  if (stop_flag==1)
  {
    P10 = 0;
    P11 = 0;
    P12 = 0;
    P13 = 0;
    return;
  }

  switch(step_index)
  {
  case 0: //0
    P10 = 1;
    P11 = 0;
    P12 = 0;
    P13 = 0;
    break;
  case 1: //0、1
    P10 = 1;
    P11 = 1;
    P12 = 0;
    P13 = 0;
    break;
  case 2: //1
    P10 = 0;
    P11 = 1;
    P12 = 0;
    P13 = 0;
    break;
  case 3: //1、2
    P10 = 0;
    P11 = 1;
    P12 = 1;
    P13 = 0;
    break;
  case 4:  //2
    P10 = 0;
    P11 = 0;
    P12 = 1;
    P13 = 0;
    break;
  case 5: //2、3
    P10 = 0;
    P11 = 0;
    P12 = 1;
    P13 = 1;
    break;
  case 6: //3
    P10 = 0;
    P11 = 0;
    P12 = 0;
    P13 = 1;
    break;
  case 7: //3、0
    P10 = 1;
    P11 = 0;
    P12 = 0;
    P13 = 1;
  }

  if (turn==0)    //正转
 {
    step_index++;
    if (step_index>7)
      step_index=0;
 }
  else
 {       //反转
    step_index--;
    if (step_index<0)
      step_index=7;
 }
   
}

 

步进电机(自动循环调速)

 

 #include <reg51.h>
 sbit P00=P2^0 ;
 sbit P01=P2^1 ;
 sbit P02=P2^2;
 sbit P03=P2^3 ;

static unsigned int count;  //计数
static int step_index;  //步进索引数,值为0-7

static bit turn;  //步进电机转动方向
static bit stop_flag;  //步进电机停止标志
static int speedlevel; //步进电机转速参数,数值越大速度越快,最小值为1,速度最慢
static int spcount;    //步进电机转速参数计数
void delay(unsigned int endcount);  //延时函数,延时为endcount*0.5毫秒
void gorun();          //步进电机控制步进函数

void main(void)
{
  count = 0;
  step_index = 0;
  spcount = 0;
  stop_flag = 0;

  P00 = 0;
  P01 = 0;
  P02 = 0;
  P03 = 0;

  EA = 1;             //允许CPU中断
  TMOD = 0x11; //设定时器0和1为16位模式1
  ET0 = 1;           //定时器0中断允许

  TH0 = 0xFE;
  TL0 = 0x0C;   //设定时每隔0.5ms中断一次
  TR0 = 1;         //开始计数

  turn = 0;

 
  do{
    speedlevel =4;
    delay(10000);  //以speedlevel = 4的速度转2000*0.5MS=1S
 speedlevel =4;
    delay(10000);  //以speedlevel = 4的速度转2000*0.5MS=1S
    stop_flag=1;
    delay(6000);//停止,2000*0.5MS=3S
    stop_flag=0;
  }while(1);

}

//定时器0中断处理
void timeint(void) interrupt 1
{
  TH0=0xFE;
  TL0=0x0C; //设定时每隔0.5ms中断一次

  count++;

  spcount--;
  if(spcount<=0)
  {
   spcount = speedlevel;
   gorun();
  }

}

void delay(unsigned int endcount)
{
  count=0;
  do{}while(count<endcount);
}

void gorun()
{
  if (stop_flag==1)
  {
    P00 = 0;
    P01 = 0;
    P02 = 0;
    P03 = 0;
    return;
  }

  switch(step_index)
  {
  case 0: //0
    P00 = 1;
    P01 = 0;
    P02 = 0;
    P03 = 0;
    break;
  case 1: //0、1
    P00 = 1;
    P01 = 1;
    P02 = 0;
    P03 = 0;
    break;
  case 2: //1
    P00 = 0;
    P01 = 1;
    P02 = 0;
    P03 = 0;
    break;
  case 3: //1、2
    P00 = 0;
    P01 = 1;
    P02 = 1;
    P03 = 0;
    break;
  case 4:  //2
    P00 = 0;
    P01 = 0;
    P02 = 1;
    P03 = 0;
    break;
  case 5: //2、3
    P00 = 0;
    P01 = 0;
    P02 = 1;
    P03 = 1;
    break;
  case 6: //3
    P00 = 0;
    P01 = 0;
    P02 = 0;
    P03 = 1;
    break;
  case 7: //3、0
    P00 = 1;
    P01 = 0;
    P02 = 0;
    P03 = 1;
  }

  if (turn==0)
  {
    step_index++;
    if (step_index>7)
      step_index=0;
  }
  else
  {
    step_index--;
    if (step_index<0)
      step_index=7;
  }
   
}

⌨️ 快捷键说明

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