资源描述
#include<regX51.h>
#define uchar unsigned char
#define uint unsigned int
#define out P2
uchar flag,count,n,m,x;//x是总开关标标志位,flag计数标志位,count变量:控制自动累加的时间长短,m档位标志位
uchar temp0,temp1,temp2,temp3;//手动按键设置四个数码管的数值变量
uchar tl_temp,th_temp,tl1_temp,th1_temp;//中间变量
uchar xz;//
uint s;//数码管显示的值
/////////////////////////////////////////////////////////////////////////////////////////////
uint pwm1[3] = {56536,49536,36536};
uint pwm2[3] = {56536,56536,56536};//这两个数组是为了给定时器1一个初值
uchar zdm[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管的字段码
void keyscan1();//声明键盘扫描函数
void dispaly();//声明函数:选择挡位1,2,3三个档位
void dispaly1();//声明:功能赋值函数
void delay();//声明延时
void delay()
{
uchar i,j;
for(i=0;i<=10;i++)
for(j=0;j<=120;j++);
}
//////////////////////////////延时程序
void keyscan1()
{
if(P3_0==0)
{
delay();
if(P3_0==0)
{
while(P3_0==0);
flag++;
if(flag==2)
flag=0;
}
}
///////////////////////////////当p3_0按下falg加1,flag=2时清0;功能:下面说明
if(P1_4==0)
{
delay();
if(P1_4==0)
{
while(P1_4==0);
temp0++;
if(temp0==10)
temp0=0;
}
}
if(P1_3==0)
{
delay();
if(P1_3==0)
{
while(P1_3==0);
temp1++;
if(temp1==10)
temp1=0;
}
}
if(P1_2==0)
{
delay();
if(P1_2==0)
{
while(P1_2==0);
temp2++;
if(temp2==10)
temp2=0;
}
}
if(P1_1==0)
{
delay();
if(P1_1==0)
{
while(P1_1==0);
temp3++;
if(temp3==10)
temp3=0;
}
}
///////////////////////////////按键调整四个数码管的调的数值
if(P3_1==0)
{
delay();
if(P3_1==0)
m=1;
}
if(P3_2==0)
{
delay();
if(P3_2==0)
m=2;
}
if(P3_3==0)
{
delay();
if(P3_3==0)
m=3;
}
/////////////////////////////////////按键控制三个档位
if(P1_5==0)
{
delay();
if(P1_5==0)
{
while(P1_5==0);
x++;
if(x==2)
x=0;
}
}
}
///////////////////////////////总开关
void timer() interrupt 1
{
TH0=0X3C;
TL0=0XB0;
count++;
if(count==20)
{
count=0;
s++;
temp3=s/1000;
temp2=s%1000/100;
temp1=s%100/10;
temp0=s%10;
}
}
///////////////////////////////////用定时器控制累加的时间间隔,s自加然后得出个十百千位的数值
void dispaly()
{
P0=zdm[s%10];
P3=0x7f;
delay();
P3=0xff;
P0=zdm[s%100/10];
P3=0xbf;
delay();
P3=0xff;
P0=zdm[s%1000/100];
P3=0xdf;
delay();
P3=0xff;
P0=zdm[s/1000];
P3=0xef;
delay();
P3=0xff;
}
//////////////////////////////数码管显示
void display1()
{
if(m==1)
{
tl_temp=pwm1[0]%256;
th_temp=pwm1[0]/256;
tl1_temp=pwm2[0]%256;
th1_temp=pwm2[0]/256;
}
else if(m==2)
{
tl_temp=pwm1[1]%256;
th_temp=pwm1[1]/256;
tl1_temp=pwm2[1]%256;
th1_temp=pwm2[1]/256;
}
else if(m==3)
{
tl_temp=pwm1[2]%256;
th_temp=pwm1[2]/256;
tl1_temp=pwm2[2]%256;
th1_temp=pwm2[2]/256;
}
}
/////////////////////////////////占空比的时间初值,我的意思是把初值付给定时器的高八位低八位
void time2() interrupt 3
{
if(xz==0)
{
TL1=tl_temp;
TH1=th_temp;
n=0;
}
////////////////////////////////xz=0时把值付给定时器作初值计满电机开转
else
{
TL1=tl1_temp;
TH1=th1_temp;
n=1;
}
////////////////////////////////xz=1时把另外的一个值付给定时器作初值,定时器计满电机停止
xz=~xz;//起循环控制作用
}
/////////////////////////////////改变他们的初值就改变了速度
void main()
{
TMOD=0x11;
TH0=0X3C;
TL0=0XB0;
EA=1;
ET1=1;
TR0=1;
TR1=1;
///////////////////////////启用两个定时器
while(1)
{
keyscan1();
display1();
P1_0=n;
if(x==1)
{
P3=0X00;
P0=0X00;
if(s==10000)
{
ET1=0;
P1_0=1;
s=0;
P3=0X0F;
P0=0XFF;
}
else
{
if(flag==1)
ET0=0;
else
ET0=1;
s=temp3*1000+temp2*100+temp1*10+temp0;
dispaly();
}
}
else
{
s=0;
P1_0=1;
P3=0X0F;
P0=0XFF;
}
}
}
展开阅读全文