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

📄 dw.c

📁 能够实现步进电机启动、加速、减速、停止以及4位led显示。
💻 C
字号:
#include <REGX51.H>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int

uint dw;
int Mispeed=25;			  //步进电机起始速度
int Maspeed=100;		  //步进电机最高转动速度
int speed;				  //速度计数
int loopdj;				  //控制电机线圈的接通
int ldata;
int count;			      //显示速度值
uint id=0;				  //电机状态判断

uchar code table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};
uint code DHTab[]={76,0xd3,86,95,100,106,110,115,119,123};
uint code DLTab[]={0,0x00,86,73,212,0,214,96,163,165};
void delay(uint n);		  //延时函数
void viewkey();			  //键值处理程序
uchar scankey(uchar num); //键值扫描程序
void led_xianshi();       //速度值显示函数

//延时函数
void delay(uint n)
{
  int i,j;
  for(i=0;i<n;i++)
  for(j=0;j<200;j++);
}

//主函数
void main()
{ 
  speed=Mispeed;          //初值
  loopdj=0xf7;
  P1=0xff;
  TMOD=0x10;			  //定时器T1初始化
  TH1=0x4c;
  TL1=0x00;
  EA=1;					  //开总中断
  ET1=1;

  while(1)
  { 
    P3=0xff;
	if((P3&0xff)!=0xff)
	{
	 delay(2);
	 if((P3&0xff)!=0xff)
	 {
	   dw=scankey(P3);		  //扫描键值
	 }
	}
	viewkey();			     //键值处理及显示
  }
}



//键值扫描程序
uchar scankey(uchar num)
{ uchar keynum;
  ldata=num;
  while((P3&0xff)!=0xff);		   //按键完全释放
    switch(ldata)
    {
      case 0xfe:keynum=1;break;
	  case 0xfd:keynum=2;break;
	  case 0xfb:keynum=3;break;
	  case 0xf7:keynum=4;break;
    }
	return(keynum);				   //返回键值
}


//键值处理及显示程序
void viewkey()
{ 
  //启动步进电机模块
  if(dw==1)
  {
    TR1=1;			     //启动T1
	speed=25;
	dw=5;
	led_xianshi(); 	     //显示速度值
  }
  //加速模块
  else if(dw==2)
  {
    while((P3&0xff)!=0xff);		   //按键完全释放
    speed++;
	if(speed>Maspeed)
	{speed=100;}
	dw=5;
	led_xianshi(); 	     //显示速度值
  }
  //减速模块
  else if(dw==3)
  {
    speed--;
	if(speed<Mispeed)
	{speed=25;}
	dw=5;
	led_xianshi(); 	     //显示速度值
  }
  //停止电机转动模块
  else if(dw==4)
  {
    TR1=0;			     //停止T1
	P1=0xff;			 //P1.4-P1.7均置高
	speed=0;
	dw=5;
	led_xianshi(); 	     //显示速度值
  }
  else if(dw==5)
  {
    //TR1=1;			     //启动T1
	dw=5;
	led_xianshi(); 	     //显示速度值
  }
}

//速度值显示函数
void led_xianshi()
{ 
  int led_bai,led_shi,led_ge;
  count=speed;
  led_bai=count/100;		 //显示值百位
  led_shi=count%100/10;		 //显示值十位
  led_ge =count%10;			 //显示值个位

  P2=0x7f;					 //个位位选
  P0=table[led_ge];		     //显示个位数
  delay(2);

  P2=0xbf; 				     //十位位选
  P0=table[led_shi];		 //显示十位数
  delay(2);

  P2=0xdf;					 //百位位选
  P0=table[led_bai];		 //显示百位数
  delay(2);
}


//定时器T1中断处理函数
void T1INT() interrupt 3 using 2
{
  int t;
  TR1=0;
  t=speed-Mispeed;
  TH1=DHTab[t/10];			 //重新置初值
  TL1=DLTab[t%10];

  loopdj=loopdj<<1;			 //循环输出控制步进电机
  P1=loopdj;
  id++;
  if(id==4)
  {
    id=0;					 //重新置0
    loopdj=0xf7;			 //循环
  }
  TR1=1;
}























⌨️ 快捷键说明

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