本帖最后由 sinianzain 于 2012-9-26 12:31 编辑
#include<reg52.h>
#include"delay1ms.h" //包含自定义延时函数的头文件
#define uchar unsigned char
#define WALK 4
sbit LATCH1=P2^2; //数码管段锁存位
sbit LATCH2=P2^3; //数码管位锁存位
sbit KEY_ADD=P3^0;//随便定义的一个加速的按键位
sbit KEY_DEC=P3^1; //随便定义的一个减速的按键位
uchar code EM[]={0x08,0x04,0x02,0x01}; //顺时针旋转相序(P1^0-P1^3)
uchar code DM[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9的段码值
uchar code WM[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //1-8数码管的位码值
void display(uchar site,uchar digit); //数码管显示函数
void INIT_T0(void);
uchar ADD_DEC(void); //按键操作函数
uchar temp[8]; //临时数组
void main(void)
{
static uchar i,speed;
INIT_T0();
while(1)
{
speed=ADD_DEC();
for(i=0;i<WALK;i++) //步进电机单步4拍方式顺时针转动
{
P1=EM;
delay1ms(2+speed); //调节速度
}
temp[7]=DM[(5-speed)%10]; //只显示数码管的最后一位
}
}
uchar ADD_DEC(void) //自定义按键操作函数
{
static uchar speed_key=5;//这个赋初值5为了让最开始时从速度0显示
if(!KEY_ADD) //按键判断(加速)
{
delay1ms(10);
if(!KEY_ADD)
{
if(speed_key==0)
speed_key=5; //减小speed,增加步进电机速度
else
speed_key--;
}
while(!KEY_ADD); //等待按键释放
}
if(!KEY_DEC) //按键判断(减速)
{
delay1ms(10);
if(!KEY_DEC)
{
speed_key++; //增加speed,降低步进电机速度
if(speed_key==6)
speed_key=0;
}
while(!KEY_DEC); //等待按键释放
}
return speed_key;
}
void display(uchar site,uchar digit)
{
static uchar dex;
P0=0; //清空数码管
LATCH1=1;
LATCH1=0;
P0=WM[dex+site]; //保存选择位
LATCH2=1;
LATCH2=0;
P0=temp[dex]; //保存选择段码
LATCH1=1;
LATCH1=0;
dex++;
if(dex==digit)
dex=0;
}
void INIT_T0(void)
{
TMOD|=0x01;
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
EA=1;
ET0=1;
TR0=1;
}
void INTERRUPT_T0(void) interrupt 1
{
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
display(0,8);
}
上面是我写的一个小程序,用两个按键控制步进电机的速度。有两个问题请教,请教前辈指点,谢谢!:1.最开始我将uchar ADD_DEC(void)里面的局部变量speed_key直接声明为uchar speed_key,但是只要一给这个变量初始化,调试的时候按键按下数字就只是闪一下,不改变,但是当把这个声明为static uchar speed_key时问题解决了(最后我直接将所有局部变量全部用static修饰了),初学,没用过static,所以理解不好,请就此题帮我分析分析。2.uchar ADD_DEC(void)里面的局部变量speed_key直接声明为uchar speed_key且不初始话的时候,它默认应该为0(但是我又记得c书上有一句话:自动存储时期的变量未初始化时具有一个无效值,静态存储时期变量未初始化时,编译器会将其存储为0,如果按这样理解,那是否默认的就为静态存储时期?),但是程序最开始显示的却是0(个人理解应该是5)。 |