#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^1; //段选
sbit wela=P2^0; //位选
uchar code tabledu[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //位码
uchar code tablewe[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //段码
uchar Data[8]; //存数位的段码
sbit d1=P1^0; //定义步进电机的端口
sbit d2=P1^1;
sbit d3=P1^2;
sbit d4=P1^3;
#define A {d1=1,d2=0,d3=0,d4=0;} //1-2相励磁法
#define B {d1=0,d2=1,d3=0,d4=0;}
#define C {d1=0,d2=0,d3=1,d4=0;}
#define D {d1=0,d2=0,d3=0,d4=1;}
#define AB {d1=1,d2=1,d3=0,d4=0;}
#define BC {d1=0,d2=1,d3=1,d4=0;}
#define CD {d1=0,d2=0,d3=1,d4=1;}
#define DA {d1=1,d2=0,d3=0,d4=1;}
#define OF {d1=0,d2=0,d3=0,d4=0;}
void delay(uchar t) //延时函数
{
while(--t);
}
void delayMS(uchar t)
{
while(t--)
{
delay(245);
delay(245);
}
}
void init(); //初始化函数
void display(uchar f,uchar n); //显示函数
uchar speed; //控制延时长度,speed越大,延时越长,步进电机转速越慢
void main()
{
uint i=512; //控制步进电机转的圈数
init(); //初始化定时器0
EA=1; //开总中断
EX0=1; //开外部中断
IT0=1; //边沿触发方式
speed=3; //初始化speed
Data[0]=tabledu[speed/10]; //将speed的十位段码装入Data[0]中
Data[1]=tabledu[speed%10]; //将speed的个位段码装入Data[1]中
OF //关闭任意线圈,步进电机不转动
while(i--) //步进电机转圈
{
A //1-2相励磁法
delayMS(speed);
AB
delayMS(speed);
B
delayMS(speed);
BC
delayMS(speed);
C
delayMS(speed);
CD
delayMS(speed);
D
delayMS(speed);
DA
delayMS(speed);
}
}
void init() //初始化定时器
{
TMOD=0x01; //T0方式,定时器模式,16位定时器
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //T0开始工作
PT0=1; //定时器中断0优先级(优先)
}
void INTE() interrupt 0 //外部中断0
{
if(!INT0) //判断独立按键是否按下
{
delayMS(10); //延时消抖
if(!INT0) //再次判断独立按键是否按下
{
speed++;
if(speed==20)
{
speed=3;
}
Data[0]=tabledu[speed/10]; //将speed的十位段码装入Data[0]中
Data[1]=tabledu[speed%10]; //将speed的个位段码装入Data[1]中
}
while(!INT0); //松手检测
}
}
void display(uchar f,uchar n) //数码管显示函数
{
static uchar i=0; //定义静态变量i
P0=0; //消隐
dula=1;
dula=0;
P0=0;
wela=1;
wela=0;
P0=tablewe[i+f]; //因为f恒为0,i为静态变量(保存上一次调用此函数时的i值)
wela=1; //所以位选的值随i值变
wela=0;
P0=Data[i]; //段选的值随i值变,因为Data[i]的值只有0,1有取值,所以后面的都不显示
dula=1;
dula=0;
i++;
if(i==n) //n恒为8,所以此语句即为if(i==8)
{
i=0;
}
}
void timer0() interrupt 1 //定时器0中断
{
TH0=(65536-2000)/256; //装初值,定时2MS
TL0=(65536-2000)%256;
display(0,8); //显示
}