51单片机调节步进电机应用C语言程序设计
//步进电机应用C语言程序设计
#include
#define uchar unsigned char
sbit dula=P2^6; //数码管显示段选I/O口定义
sbit wela=P2^7; //数码管显示位选I/O口定义
sbit jia_key=P3^6; //电机加速I/O口定义
sbit jian_key=P3^7; //电机减速I/O口定义
sbit zf_key=P3^5; //电机正反转I/O定义
bit flag=0; //电机正反转标志位
uchar num=0,show_num=2,maichong=4,table_begin=0;
uchar code table1[]={0x01,0x02,0x04,0x08,0x08,0x04,0x02,0x01};
//uchar code table1[]={0x09,0x03,0x06,0x0c,0x08,0x04,0x02,0x01};
//uchar code table1[]={0x01,0x04,0x02,0x08,0x08,0x02,0x04,0x01};
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay(uchar i) //延时函数
{
uchar j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
void display() //显示函数
{
dula=0;
P0=table[show_num];
dula=1;
dula=0;
wela=0;
P0=0xfe;
wela=1;
wela=0;
delay(5);
P0=table[0];
dula=1;
dula=0;
P0=0xfd;
wela=1;
wela=0;
delay(5);
}
void key () //按键检测处理函数
{
if(jia_key==0)
{
delay(5); //加速键按下,消抖
if(jia_key==0)
{
num++; //速度标示加1
if(num==4)
num=3; //达到最大3则保持
while(jia_key==0); //等待松开按键
}
}
if(jian_key==0)
{
delay(5); //减速键按下
if(jian_key==0)
{
if(num!=0)
num--; //速度标示减1
else
num=0; //达到最小0则保持
while(jian_key==0);
}
}
if(zf_key==0)
{
delay(5); //正反转按键按下
if(zf_key==0)
{
flag=~flag; //正反转标识取反
while(zf_key==0);
}
}
}
void dispose() //根据速度标识进行数据处理
{
switch(num)
{
case 0:
show_num=2; //数码管第一位显示的数字
maichong=5; //利用maichong数据控制送给电机脉冲的频率,控制速度
break;
case 1:
show_num=4;
maichong=4;
break;
case 2:
show_num=6;
maichong=3;
break;
case 3:
show_num=8;
maichong=2;
break;
}
if(flag==0)
{
table_begin=0; //flag为0,正转
}
else
table_begin=4; //flag为1,反转
}
void qudong() //电机速度,和正反转控制
{
uchar i,j;
for(j=0+table_begin;j<4+table_begin;j++)
{
P1=table1[j]; //读取控制电机转动I/O口表
for(i=0;i&
lt;maichong;i++)
{
display(); //利用显示函数起延时作用,控制电机速度
} //这样也不影响数码管显示,一举两得
}
}
void main()
{
while(1)
{
key();
disp