📄 步进电机转速测定.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 + -