#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit wela=P2^0;
sbit dula=P2^1;
uchar code tablewe[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar code tabledu[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar Data[8]; //存储显示值的全局变量
sbit dc1=P1^1; //定义电机信号输出端口
uchar pwm_on; //定义速度等级
#define cycle 10 //周期
void delay(uchar t)
{
while(--t);
}
void delayMS(uchar t)
{
while(t--)
{
delay(245);
delay(245);
}
}
void display(uchar f,uchar n);
uchar keyscan();
void init();
void main()
{
uchar num;
pwm_on=0; //速度等级赋初值
init();
Data[0]=0x5e; //'d'
Data[1]=0x39; //'c'
while(1)
{
num=keyscan();
if(num==1) //第一个按键,速度等级增加
{
if(pwm_on<cycle)
{
pwm_on++;
}
}
else if(num==2) //第二个按键,速度等级减小
{
if(pwm_on>0)
{
pwm_on--;
}
}
Data[5]=tabledu[pwm_on/10]; //显示速度等级
Data[6]=tabledu[pwm_on%10];
}
}
void init() //初始化定时器
{
TMOD=0x01;
EA=1;
ET0=1;
TR0=1;
//PT0=1; //开优先级(有多个中断时使用)
}
void display(uchar f,uchar n) //数码管显示函数
{
static uchar i; //定义静态变量
P0=0; //消隐
dula=1;
dula=0;
P0=tablewe[i+f];
wela=1;
wela=0;
P0=Data[i];
dula=1;
dula=0;
i++;
if(i==n)
i=0;
}
void timer0() interrupt 1 //定时器中断
{
static uchar times;
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
display(0,8);
if(times==pwm_on) //如果定时的时间等于on的时间,说明作用时间结束,输出低电平
{
dc1=0;
} //pwm_on越大,占空比越大,速度越大。
times++; //on的延时时间越长,相应的关的时间越短,从而占空比越大,速度越快。所以调节pwm——on即为调节直流电机转动的占空比
if(times==cycle) //反之,低电平时间结束后返回高电平
{
times=0;
if(pwm_on!=0) //如果开启的时间是0,保持原来状态
{
dc1=1;
}
}
}
uchar keyscan()
{
uchar value;
if(P3!=0xff)
{
delayMS(10);
if(P3!=0xff)
{
value=P3;
while(P3!=0xff);
switch(value)
{
case 0xfe:return 1;break;
case 0xfd:return 2;break;
case 0xfb:return 3;break;
case 0xf7:return 4;break;
case 0xef:return 5;break;
case 0xdf:return 6;break;
case 0xbf:return 7;break;
case 0x7f:return 8;break;
default :return 0;break;
}
}
}
return 0;
}