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

📄 步进电机转速测定.c

📁 矩阵键盘实现步进电机的正反转
💻 C
字号:
#include<at89x52.h>
//端口定义
#define DB P0
sbit DI=P2^0;
sbit RW=P2^1;
sbit E=P2^2;
sbit CS1=P2^3;
sbit CS2=P2^4;
//全局变量定义
unsigned char Speed_Change;      //转速调节标志
bit Zheng_Fan;                   //正/反转标志
bit M;                           //设置标志位
unsigned char Time_Speed;        //时间转速设定标志
unsigned char Keyboard;          //键盘扫描标志 
unsigned char Step_Foot;         //步进电机步角驱动标志
unsigned char Arrow_Move;        //箭头移动标志
unsigned char a1,a2,a3;          //转速
unsigned char b1,b2,b3,b4;       //时间
unsigned char code Tab1[][32];   //汉字表格
unsigned char code Tab2[][16];   //数字表格
unsigned int Time;               //旋转时间
unsigned char N,T;               //旋转圈数
unsigned int Add_Dec;           //加速减速控制
//步进电机张转正转驱动表
unsigned char code Tab3[]={0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6,0xfe,};
//步进电机张转反转驱动表
unsigned char code Tab4[]={0xfe,0xf6,0xf7,0xf3,0xfb,0xf9,0xfd,0xfc,};
//判断忙指令
void Busy()
{
DI=0;
RW=1;
do
   {
   DB=0xff;
   E=1;
   DB&=0x80;
   E=0;
   }
   while(DB!=0);
}
//写指令程序
void Write_com( unsigned char com)
{
Busy();
DI=0;
RW=0;
E=1;
DB=com;
E=0;
}
//写数据程序
void Write_dat(unsigned char dat)
{
Busy();
DI=1;
RW=0;
E=1;
DB=dat;
E=0;
}
//写汉字程序
void Han_Zi(bit m,unsigned char page,unsigned char row,unsigned char n)
{
unsigned char i,j;
if(m)
   {
   CS1=0;
   CS2=1;
   }
   else
      {
      CS1=1;
      CS2=0;
      }
      for(j=0;j<2;j++)
         {
         Write_com(page+0xb8+j);
         Write_com(row+0x40);
         for(i=0;i<16;i++)
            {
            Write_dat(Tab1[n][16*j+i]);
            }
         }
}
//写字符程序
void Zi_Fu(bit m,unsigned char page,unsigned char row,unsigned char n)
{
unsigned char i,j;
if(m)
   {
   CS1=0;
   CS2=1;
   }
   else
      {
      CS1=1;
      CS2=0;
      }
      for(j=0;j<2;j++)
         {
         Write_com(page+0xb8+j);
         Write_com(row+0x40);
         for(i=0;i<8;i++)
            {
            Write_dat(Tab2[n][8*j+i]);
            }
         }
}
//清屏程序
void Clear()
{
unsigned char i,j;
CS1=1;
CS2=0;
for(j=0;j<8;j++)
   {
   Write_com(0xb8+j);
   Write_com(0x40);
   for(i=0;i<64;i++)
   Write_dat(0);
   }
   CS1=0;
   CS2=1;
   for(j=0;j<8;j++)
      {
      Write_com(0xb8+j);
      Write_com(0x40);
      for(i=0;i<64;i++)
      Write_dat(0);
      }
}
//初始化程序
void Init()
{
CS1=1;
CS2=0;
Write_com(0xc0);//设置起始行为第一行
Write_com(0x3f);//开显示关显示为0x3e
CS1=0;
CS2=1;
Write_com(0xc0);
Write_com(0x3f);
}
//延时10ms子程序
void delay10ms()
{
unsigned char a,b,c;
for(a=0;a<5;a++)
for(b=0;b<3;b++)
for(c=0;c<220;c++);
}
//转速时间显示子程序
void Speed_Time(unsigned char a)
{
if(Time_Speed==1)
   {
   a3=a2;
   a2=a1;
   a1=a;
   Zi_Fu(0,4,56,a3);
   Zi_Fu(1,4,0,a2);
   Zi_Fu(1,4,8,a1);
   if(a3==0)
      {
	  Zi_Fu(0,4,56,13);
	  if(a2==0)
	     {
		 Zi_Fu(1,4,0,13);
		 }
	  }
	  
   }
   if(Time_Speed==2)
      {
	  b4=b3;
	  b3=b2;
	  b2=b1;
	  b1=a;
	  Zi_Fu(1,6,24,b4);
      Zi_Fu(1,6,32,b3);
      Zi_Fu(1,6,40,b2);
	  Zi_Fu(1,6,48,b1);
	  if(b4==0)
	     {
		 Zi_Fu(1,6,24,13);
		 if(b3==0)
		    {
			Zi_Fu(1,6,32,13);
			if(b2==0)
			   {
			   Zi_Fu(1,6,40,13);
			   }
	        }
         }
      }
}
//时间更新子程序
void New_Time()
{
b4=Time/1000;
b3=Time%1000/100;
b2=Time%100/10;
b1=Time%10;
if(b4==0)
   {
   b4=13;
   if(b3==0)
      {
	  b3=13;
	  if(b2==0)
	     {
		 b2=13;
		 }
	  }
   }
   Zi_Fu(1,6,24,b4);
   Zi_Fu(1,6,32,b3);
   Zi_Fu(1,6,40,b2);
   Zi_Fu(1,6,48,b1);
}
//速度更新程序
void New_Speed()
{
a3=Add_Dec/100;
a2=Add_Dec%100/10;
a1=Add_Dec%10;
if(a3==0)
   {
   a3=13;
   if(a2==0)
      {
	  a2=13;
	  }
   }
   Zi_Fu(0,4,56,a3);
   Zi_Fu(1,4,0,a2);
   Zi_Fu(1,4,8,a1);
}
//主函数
void main()
{
TH0=0xec;
TL0=0x78;
TMOD=TR0=ET0=1;
P3=Tab3[Step_Foot];
P1=0xff;
Zheng_Fan=1;
Init();
Clear();
//固定字符显示
Han_Zi(0,0,16,14);
Han_Zi(0,0,32,15);
Han_Zi(0,0,48,16);
Han_Zi(1,0,0,17);
Han_Zi(1,0,16,18);
Han_Zi(1,0,32,19);
Han_Zi(0,2,16,0);
Han_Zi(0,2,32,1);
Han_Zi(0,2,48,2);
Han_Zi(1,2,0,3);
Zi_Fu(1,2,16,11);
Han_Zi(1,2,32,4);
Han_Zi(1,2,48,1);
Han_Zi(0,4,16,1);
Han_Zi(0,4,32,6);
Zi_Fu(0,4,48,11);
Zi_Fu(1,4,8,0);
Zi_Fu(1,4,32,0);
Han_Zi(1,4,24,1);
Zi_Fu(1,4,40,10);
Han_Zi(1,4,48,12);
Han_Zi(0,6,16,0);
Han_Zi(0,6,32,1);
Han_Zi(0,6,48,10);
Han_Zi(1,6,0,11);
Zi_Fu(1,6,16,11);
Zi_Fu(1,6,48,0);
Zi_Fu(1,6,56,12);
while(1)
   {
   for (Keyboard=0;Keyboard<=3;Keyboard++)
      {
      P1=0xfe<<Keyboard|0xfe>>(8-Keyboard);
      if(P1_4==0)
         {
         delay10ms();
         if(P1_4==0)
            {
            while(P1_4==0);
			if(4*Keyboard==12)
			   {
			   Add_Dec+=10;Speed_Change=1500/Add_Dec;New_Speed();//加速设置
			   }
			Speed_Time(4*Keyboard);
            }
         }
         if(P1_5==0)
            {
            delay10ms();
            if(P1_5==0)
               {
               while(P1_5==0);
			   if(4*Keyboard+1==13)
			      {
				  Add_Dec-=10;Speed_Change=1500/Add_Dec;New_Speed();//减速设置
				  }
               Speed_Time(4*Keyboard+1);
               }
            }
            if(P1_6==0)
               {
               delay10ms();
               if(P1_6==0)
                  {
                  while(P1_6==0);
				  if(4*Keyboard+2==14)
				     {
                     if(M==1)
					    {
					    a1=a2=a3=b1=b2=b3=b4=M=0;
					    Zi_Fu(1,6,24,13);
                        Zi_Fu(1,6,32,13);
                        Zi_Fu(1,6,40,13);
					    Zi_Fu(1,6,48,0);
					    Zi_Fu(0,4,56,13);
                        Zi_Fu(1,4,0,13);
					    Zi_Fu(1,4,8,0);
					    }
					 EA=0;
					 switch(Arrow_Move)
					    {
						case 0:Time_Speed=0;Han_Zi(0,2,0,9);Han_Zi(0,6,0,13);break;
						case 1:Time_Speed=1;Han_Zi(0,4,0,9);Han_Zi(0,2,0,13);break;
						case 2:Time_Speed=2;Han_Zi(0,6,0,9);Han_Zi(0,4,0,13);break;
						}
						Arrow_Move++;
						if(Arrow_Move==3)Arrow_Move=0;								  
					 }
					 else if(4*Keyboard+2==10)
				        {
						Han_Zi(1,2,32,4);
						Zheng_Fan=1;
						}
                        else Speed_Time(4*Keyboard+2);
                  }
               }
               if(P1_7==0)
                  {
                  delay10ms();
                  if(P1_7==0)
                     {
                     while(P1_7==0);
					 if(4*Keyboard+3==11)
					    {
						Han_Zi(1,2,32,5);
						Zheng_Fan=0;
						}
						else if(4*Keyboard+3==15)
						   {
                            M=1;
							EA=1;
							Arrow_Move=0;
						    Han_Zi(0,2,0,13);
							Han_Zi(0,4,0,13);
							Han_Zi(0,6,0,13);
							Time=b4*1000+b3*100+b2*10+b1;
							Add_Dec=a3*100+a2*10+a1;
							Speed_Change=1500/Add_Dec;
							}
                            else Speed_Time(4*Keyboard+3);
                     }
                  }
      }
   }
}
//中断子程序,每5ms中断一次
void Time0() interrupt 1 using 0
{
TH0=0xec;
TL0=0x78;
N++;
T++;
if(N==Speed_Change)
   {
   N=0;
   Step_Foot++;
   if(Step_Foot==8)Step_Foot=0;
   if(Zheng_Fan)P3=Tab3[Step_Foot];
   else P3=Tab4[Step_Foot];
   }
   if(T==200)
      {
	  T=0;
      Time--;
	  New_Time();
	  if(Time==0)EA=0;
	  }
}
//汉字表
unsigned char code Tab1[][32]={
//-- 旋 --0
      0x08,0x08,0xF9,0x4E,0x48,0xCC,0x28,0x10,
      0x2F,0x24,0xE4,0x24,0x24,0xA6,0x64,0x00,
      0x40,0x30,0x0F,0x20,0x40,0xBF,0x40,0x20,
      0x1F,0x20,0x7F,0x84,0x86,0xC4,0x40,0x00,
//-- 转 --1
      0x08,0xC8,0xB8,0x8F,0xE8,0x88,0x40,0x48,
      0xC8,0x7F,0x48,0x48,0x4C,0x68,0x40,0x00,
      0x08,0x18,0x08,0x04,0xFF,0x04,0x00,0x02,
      0x13,0x22,0x62,0x9A,0x06,0x02,0x00,0x00,
//-- 方 --2
      0x10,0x10,0x10,0x10,0x10,0xF1,0x92,0x96,
      0x90,0x90,0x90,0xD0,0x90,0x18,0x10,0x00,
      0x00,0x80,0x40,0x20,0x18,0x07,0x00,0x00,
      0x40,0x80,0x40,0x3F,0x00,0x00,0x00,0x00,
//-- 向 --3
      0x00,0xF8,0x08,0x08,0xCC,0x4A,0x49,0x48,
      0x48,0x48,0xE8,0x48,0x08,0xFC,0x08,0x00,
      0x00,0xFF,0x00,0x00,0x1F,0x08,0x08,0x08,
      0x08,0x08,0x1F,0x40,0x80,0x7F,0x00,0x00,
//-- 正 --4
      0x00,0x02,0x02,0xC2,0x02,0x02,0x02,0xFE,
      0x82,0x82,0x82,0xC2,0x83,0x02,0x00,0x00,
      0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x7F,
      0x40,0x40,0x40,0x40,0x40,0x60,0x40,0x00,
//-- 反 --5
      0x00,0x00,0xFC,0x24,0x24,0xE4,0x24,0x24,
      0x24,0x22,0x22,0xA3,0x62,0x00,0x00,0x00,
      0x40,0x30,0x0F,0x80,0x80,0x40,0x23,0x14,
      0x08,0x14,0x22,0x21,0x40,0xC0,0x40,0x00,
//-- 速 --6
      0x40,0x42,0x44,0xCC,0x00,0xF4,0x94,0x94,
      0x94,0xFF,0x94,0x94,0x94,0xF6,0x04,0x00,
      0x00,0x40,0x20,0x1F,0x20,0x51,0x48,0x44,
      0x42,0x7F,0x42,0x44,0x4C,0x61,0x20,0x00,
//-- 度 --7
      0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0xA5,
      0xA6,0xA4,0xFC,0x24,0x34,0x26,0x04,0x00,
      0x40,0x20,0x9F,0x80,0x42,0x42,0x26,0x2A,
      0x12,0x2A,0x26,0x42,0x40,0xC0,0x40,0x00,
//-- 分 --8
      0x00,0x80,0x40,0x20,0x98,0x86,0x80,0x80,
      0x83,0x8C,0x90,0x20,0xC0,0x80,0x80,0x00,
      0x01,0x00,0x80,0x40,0x20,0x1F,0x00,0x40,
      0x80,0x40,0x3F,0x00,0x00,0x01,0x00,0x00,
//-- -> --9
      0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,
      0xD8,0xF0,0xE0,0xC0,0x80,0x00,0x00,0x00,
      0x00,0x00,0x07,0x07,0x07,0x07,0x07,0x07,
      0x37,0x1F,0x0F,0x07,0x03,0x01,0x00,0x00,
//-- 时 --10
      0x00,0xFC,0x84,0x84,0x84,0xFE,0x14,0x10,
      0x90,0x10,0x10,0x10,0xFF,0x10,0x10,0x00,
      0x00,0x3F,0x10,0x10,0x10,0x3F,0x00,0x00,
      0x00,0x23,0x40,0x80,0x7F,0x00,0x00,0x00,
//-- 间 --11
      0x00,0xF8,0x01,0x02,0xF6,0x10,0x12,0x12,
      0x12,0x12,0xFA,0x12,0x02,0xFF,0x02,0x00,
      0x00,0xFF,0x00,0x00,0x3F,0x11,0x11,0x11,
      0x11,0x11,0x3F,0x40,0x80,0x7F,0x00,0x00,
//-- 分 --12
      0x00,0x80,0x40,0x20,0x98,0x86,0x80,0x80,
      0x83,0x8C,0x90,0x20,0xC0,0x80,0x80,0x00,
      0x01,0x00,0x80,0x40,0x20,0x1F,0x00,0x40,
      0x80,0x40,0x3F,0x00,0x00,0x01,0x00,0x00,
//--    --13
	  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//-- 步 --
      0x40,0x40,0x40,0x40,0x7E,0x40,0x40,0xFF,
      0x48,0x48,0x48,0x4C,0x48,0x60,0x40,0x00,
      0x00,0x80,0x88,0x84,0x43,0x42,0x20,0x2F,
      0x10,0x10,0x0C,0x03,0x02,0x00,0x00,0x00,
//-- 进 --
      0x40,0x42,0xCC,0x00,0x08,0x08,0xFF,0x08,
      0x08,0x08,0xFF,0x08,0x8C,0x08,0x00,0x00,
      0x40,0x20,0x1F,0x20,0x41,0x51,0x4F,0x41,
      0x41,0x41,0x7F,0x41,0x41,0x61,0x20,0x00,
//-- 电 --
      0x00,0xF8,0x48,0x48,0x48,0x48,0xFF,0x48,
      0x48,0x48,0x48,0xFC,0x08,0x00,0x00,0x00,
      0x00,0x07,0x02,0x02,0x02,0x02,0x3F,0x42,
      0x42,0x42,0x42,0x47,0x40,0x70,0x00,0x00,
//-- 机 --
      0x10,0x10,0xD0,0xFF,0x90,0x10,0x00,0xFC,
      0x04,0x04,0x04,0xFE,0x04,0x00,0x00,0x00,
      0x04,0x03,0x00,0xFF,0x80,0x41,0x20,0x1F,
      0x00,0x00,0x00,0x3F,0x40,0x40,0x70,0x00,
//-- 仿 --
      0x80,0x40,0x20,0xF8,0x07,0x10,0x10,0x10,
      0xF1,0x96,0x90,0x90,0xD0,0x98,0x10,0x00,
      0x00,0x00,0x00,0xFF,0x00,0x80,0x40,0x30,
      0x0F,0x40,0x80,0x40,0x3F,0x00,0x00,0x00,
//-- 真 --
      0x00,0x04,0x04,0xF4,0x54,0x54,0x54,0x5F,
      0x54,0x54,0x54,0xFC,0x16,0x04,0x00,0x00,
      0x10,0x10,0x90,0x5F,0x35,0x15,0x15,0x15,
      0x15,0x15,0x35,0x5F,0xD0,0x18,0x10,0x00,};

//字符表
unsigned char code Tab2[][16]={
    0xF0,0xF8,0x0C,0x04,0x04,0x0C,0xF8,0xF0, // -0-
    0x0F,0x1F,0x30,0x20,0x20,0x30,0x1F,0x0F,

    0x00,0x00,0x08,0xF8,0xFC,0x00,0x00,0x00, // -1-
    0x00,0x00,0x20,0x3F,0x3F,0x20,0x00,0x00,

    0x30,0x38,0x0C,0x04,0x04,0x0C,0xF8,0xF0, // -2-
    0x20,0x30,0x38,0x2C,0x26,0x23,0x21,0x38,

    0x10,0x18,0x0C,0x84,0x84,0xCC,0x78,0x30, // -3-
    0x08,0x18,0x30,0x20,0x20,0x31,0x1F,0x0E, 
  
    0x00,0xC0,0x70,0x18,0xFC,0xFE,0x00,0x00, // -4-
    0x07,0x05,0x04,0x24,0x3F,0x3F,0x24,0x04, 
       
    0xFC,0xFC,0xC4,0x44,0x44,0xC4,0x84,0x04, // -5-
    0x08,0x18,0x30,0x20,0x20,0x30,0x1F,0x0F, 
        
    0xF0,0xF8,0x8C,0x44,0x44,0xCC,0x98,0x10, // -6-
    0x0F,0x1F,0x30,0x20,0x20,0x30,0x1F,0x0F, 
       
    0x1C,0x0C,0x0C,0x0C,0xCC,0xEC,0x3C,0x1C, // -7-
    0x00,0x00,0x3C,0x3F,0x03,0x00,0x00,0x00, 
       
    0x30,0x78,0xCC,0x84,0x84,0xCC,0x78,0x30, // -8-
    0x0E,0x1F,0x31,0x20,0x20,0x31,0x1F,0x0E,
         
    0xF0,0xF8,0x0C,0x04,0x04,0x0C,0xF8,0xF0, // -9-
    0x08,0x19,0x33,0x22,0x22,0x33,0x1F,0x0F, 
 
    0x00,0x00,0x00,0x80,0xC0,0x60,0x30,0x00, // -/-
    0x0C,0x06,0x03,0x01,0x00,0x00,0x00,0x00,
 
    0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00, // -:-
    0x00,0x00,0x00,0x06,0x06,0x00,0x00,0x00,

    0x30,0x78,0xC8,0x88,0x88,0x38,0x30,0x00, // -S-
  	0x0C,0x1C,0x10,0x10,0x11,0x1F,0x0E,0x00,
	 
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // - -
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};

⌨️ 快捷键说明

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