#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define GPIO_DIG P0 //数据端
sbit K1=P3^2;
sbit K2=P3^3;
sbit K3=P3^4;
sbit K4=P3^5;
sbit L1=P1^0; //数码管1位选
sbit L2=P1^1; //数码管2位选
sbit L3=P1^2; //数码管3位选
sbit L4=P1^3; //数码管4位选
sbit PWM=P2^0;
sbit PWM2=P2^1;
uchar state=0;
int Time;
int Time2;
int disp = 0,disp1 = 0;
unsigned char code DIG_CODE[10] = {
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
//0、1、2、3、4、5、6、7、8、9的显示码
unsigned char code DIG_CODE2[10] = {
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,
0xff,0xef};
//0、1、2、3、4、5、6、7、8、9带小数点的显示码
unsigned char DisplayData[4];
void TimerConfiguration();
void DigDisplay() //数码管显示子函数
{
unsigned int j; //定义变量
L1=0; //位选
GPIO_DIG = DisplayData[0]; //发送段码
j = 100; //扫描间隔时间设定
while(j--);
L1=1; //消隐
L2=0; //位选
GPIO_DIG = DisplayData[1]; //发送段码
j = 100; //扫描间隔时间设定
while(j--);
L2=1;
L3=0; //位选
GPIO_DIG = DisplayData[2]; //发送段码
j = 100; //扫描间隔时间设定
while(j--);
L3=1;
L4=0; //位选
GPIO_DIG = DisplayData[3]; //发送段码
j = 100; //扫描间隔时间设定
while(j--);
L4=1;
}
void delay10ms() //delay
{
uchar a,b;
for(a=10;a>0;a--)
for(b=60;b>0;b--);
}
void main()
{
Time=0;
Time2=0;
TimerConfiguration();
while(1)
{
while(state==0)
{
PWM2=0;
if(K1==0) //按键按下,开始和停止
{
delay10ms();
if(K1==0)
{
if(Time2!=0)
Time2=0;
else
Time2=15;
disp = Time2;
while(K1==0);
}
}
if(K3==0) //按键按下,速度加1
{
delay10ms();
if(K3==0)
{
Time2=Time2+1;
disp++;
if(Time2>=30)
Time2=30;
while(K3==0);
}
}
if(K4==0) //按键按下,速度减1
{
delay10ms();
if(K4==0)
{
Time2=Time2-1;
if(Time2<=0)
Time2=0;
disp = Time2;
while(K4==0);
}
}
if(K2==0) //按键按下,正反转
{
delay10ms();
if(K2==0)
{
state=!state;
while(K2==0);
}
}
/**********显示*********/
disp1 = disp*10;
DisplayData[0] = DIG_CODE[disp1/1000];
DisplayData[1] = DIG_CODE[disp1/100];
DisplayData[2] = DIG_CODE[disp1/10%10];
DisplayData[3] = DIG_CODE[disp1%10];
DigDisplay();
}
while(state==1)
{
PWM=0;
if(K1==0)
{
delay10ms();
if(K1==0)
{
if(Time2!=0)
Time2=0;
else
Time2=5;
disp = Time2;
while(K1==0);
}
}
if(K3==0) //按键按下,速度加1
{
delay10ms();
if(K3==0)
{
Time2=Time2+1;
disp++;
if(Time2>=30)
Time2=30;
while(K3==0);
}
}
if(K4==0) //按键按下,速度减1
{
delay10ms();
if(K4==0)
{
Time2=Time2-1;
if(Time2<=0)
Time2=0;
disp = Time2;
while(K4==0);
}
}
if(K2==0) //按键按下,正反转
{
delay10ms();
if(K2==0)
{
state=!state;
while(K2==0);
}
}
/**********显示*********/
disp1 = disp*10;
DisplayData[0] = DIG_CODE[disp1/1000];
DisplayData[1] = DIG_CODE[disp1/100];
DisplayData[2] = DIG_CODE[disp1/10%10];
DisplayData[3] = DIG_CODE[disp1%10];
DigDisplay();
}
}
}
void TimerConfiguration()
{
TMOD = 0x01; //选择工作方式1
TH0=(65536-500)/256; //恢复定时器0初值
TL0=(65536-500)%256;
EA = 1; //打开总中断
ET0 = 1;TR0 = 1;
}
/*******************************************************************************
* 函数名 : Timer0()
* 函数功能 : 定时器0中断函数
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void Timer0() interrupt 1
{
TH0=(65536-500)/256; //恢复定时器0初值
TL0=(65536-500)%256;
Time++;
if(Time<Time2)
{
if(state==0)
PWM=1;
if(state==1)
PWM2=1;
}
else if(Time<16)
{
if(state==0)
PWM=0;
if(state==1)
PWM2=0;
}
else
{
Time=0;
}
}