#include<AT89X52.H>
#define uint unsigned int
#define uchar unsigned char
sbit led1=P2^4;
sbit led2=P2^5;
sbit led3=P2^6;
sbit led4=P2^7;
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^3;
sbit key5=P1^4;
sbit key6=P1^5;
sbit zheng=P2^0;
sbit fan=P2^1;
sbit zhengled=P3^6;
sbit fanled=P3^7;
sbit zhixing=P3^5;
uchar code table[]={0xA0,0xBB,0x62,0x2A,0x39,0x2C,0x24,0xBA,
0x20,0x28,0x30,0x25,0xE4,0x23,0x64,0x74};
uint count=0,count1=0,time=0;
uint qian,bai,shi,ge;
uint moshi=0;
uchar pwm=75,key55=0,key66=75,xianshi=1;
unsigned long int jishu=0,shuzhi;
void delay(uint xms) //延時函數
{
int a,b;
for(a=xms;a>0;a--)
for(b=110;b>0;b--);
}
void initclock() //時鐘初始化
{
T2MOD=0x00;
T2CON=0x04; /*定時器2為自動重裝定時工作模式) TR2=1 */
RCAP2L=(65536-50000)%256; //給定時器T2裝初值
RCAP2H=(65536-50000)/256;
TR2=1; //打開定時器中斷1,2
ET2=1;
EA=1; //開中斷
}
void timer_init() //定時器一初始化
{
TMOD=0x15;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
ET1=1; //開定時器零1中斷
TR1=1; //啟動計數器1
TH0=0X00;
TL0=0X00;
ET0=1; //開計數器中斷
TR0=1; //啟動計數器器0
EA=1; //開中斷
}
void jisuan() //計算時間速度距離函數
{
if(time==1)
{
jishu=10;
jishu=TH0*256+TL0; //讀取計數器的值
TH0=0X00;
TL0=0X00; //重裝
time=0;
TF2=0;
RCAP2H=(65536-50000)/256;
RCAP2L=(65536-50000)%256;
jishu=jishu*60;
shuzhi=jishu;
}
}
void display(uint shu) //
{
qian=shu/1000;
bai=shu%1000/100;
shi=shu%1000%100/10;
ge=shu%1000%100%10;
led1=0;
P0=table[qian];
delay(5);
led1=1;
led2=0;
P0=table[bai];
delay(5);
led2=1;
led3=0;
P0=table[shi];
delay(5);
led3=1;
led4=0;
P0=table[ge];
delay(5);
led4=1;
}
void keyscan() //
{
if(key1==0)
{
delay(5);
if(key1==0)
{
while(!key1);
moshi=0;
}
}
if(key2==0)
{
delay(5);
if(key2==0)
{
while(!key2);
moshi=1;
}
}
if(key3==0)
{
delay(5);
if(key3==0)
{
EA=0;
delay(2);
while(!key3);
key66=key66+5;
if(key66>=100)
{
key66=100;
}
pwm=key66;
EA=1;
}
}
if(key4==0)
{
delay(5);
if(key4==0)
{
while(!key4);
EA=0;
delay(2);
key66=key66-5;
if(key66<=25)
{
key66=25;
}
pwm=key66;
EA=1;
}
}
if(key5==0)
{
delay(5);
if(key5==0)
{
while(!key5);
key55++;
if(key55==1)
{
timer_init();
initclock();
EA=1;
delay(100);
zhixing=0;
}
if(key55==2)
{
key55=0;
zhixing=1;
EA=0;
zheng=0;
fan=0;
jishu=0;
}
}
}
if(key6==0)
{
delay(5);
if(key6==0)
{
while(!key6);
// {
// display(shuzhi);
// }
xianshi++;
if(xianshi==3)
xianshi=1;
}
}
}
void chuli()
{
uint i,j;
i=key66*20;
j=shuzhi;
if(i>j)
pwm=pwm+1;
if(j>i)
pwm=pwm-1;
}
void main()
{
while(1)
{
uint ms;
ms++;
if(xianshi==1)
display(key66*20);
if(xianshi==2)
display(shuzhi);
keyscan();
jisuan();
if(ms==15)
{
ms=0;
chuli();
}
}
}
void T1_time()interrupt 5 //定時器
{
TF2=0;
RCAP2H=(65536-50000)/256;
RCAP2L=(65536-50000)%256;
count++;
if(count==10)
{
time=1;
count=0;
}
}
void time1(void)interrupt 3 //定時器1溢出,yichu=1
{
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
count1++;
if(count1==156)
{
count1=0;
}
if(moshi==0)
{
zheng=0;
zhengled=0;
fanled=1;
if(count1<pwm)
{
fan=1;
}
if(count1>=pwm)
{
fan=0;
}
}
if(moshi==1)
{
fan=0;
zhengled=1;
fanled=0;
if(count1<pwm)
{
zheng=1;
}
if(count1>=pwm)
{
zheng=0;
}
}
}
|