#include<reg52.h>
#define uchar unsigned char
/*
STCF10
简化版本 利用狂加1来完成测速,省下一大堆的 各种记数补偿
这个板本是实时显现的,速度上还要慢一点
先作 12位的计时显示吧
(其实这个简化板用 汇编来写会更好更快更精准)
改进进位判断处理方法由并行if 改为串行if --方法是整出来的但是 这样作 平均值会出现 1/10的波动 还是不改革
// 数码管位 8 7 6 5 4 3 2 1
// 变量 ww10 ww9 ww8 ww7 ww6 ww5 ww4 ww3 ww2 ww1
*/
#define uint unsigned int
sbit w1=P2^7;
sbit w2=P2^6;
sbit w3=P2^5;
sbit w4=P2^4;
sbit d5=P0^5;
//sbit key1=P3^2;
sbit key2=P3^4;
sbit key3=P3^6;
sbit key4=P3^5;
void delay(uint z);
uchar aa,ww1,ww2,ww3,ww4,ww5,ww6,ww7,ww8,ww9,ww10,ww11,ww12,wc;
uchar code table[]={0x28,0xeb,0x32,0xa2,0xe1,0xa4,0x24,0xea,0x20,0xa0,0xff};
void main()
{
EA=1;//????
EX0=1;//?????0
IT0=1;//?????0???
EX1=1;//?????1
IT1=1;//?????1???
w1=1;
w2=1;
w3=1;
w4=1;
aa=1;
ww1=0;
ww2=0;
ww3=0;
ww4=0;
ww5=0;
ww6=0;
ww7=0;
ww8=0;
ww9=0;
ww10=0;
ww11=0;
ww12=0;
wc=1;
//key1=1;
key2=1;
key3=1;
key4=1;
while(1)
{
//-------------------下--加检查aa是否=0 是着 加1
if (aa==0)
{
ww1++;
if (ww1==10)
{
ww1=0;
ww2++;
}
if (ww2==10)
{
ww2=0;
ww3++;
}
if (ww3==10)
{
ww3=0;
ww4++;
}
if (ww4==10)
{
ww4=0;
ww5++;
}
if (ww5==10)
{
ww5=0;
ww6++;
}
if (ww6==10)
{
ww6=0;
ww7++;
}
if (ww7==10)
{
ww7=0;
ww8++;
}
if (ww8==10)
{
ww8=0;
ww9++;
}
if (ww9==10)
{
ww9=0;
ww10++;
}
if (ww10==10)
{
ww10=0;
ww11++;
}
if (ww11==10)
{
ww11=0;
ww12++;
}
if (ww12==10)
{
ww12=0;
}
}
// -----------------向上--------------
//-----------向下 数码管显示----------
if(key3==0)
{
delay(4441);
wc++;
if (wc==5)
wc=4;
}
if(key4==0)
{
delay(4441);
wc--;
if (wc==0)
wc=1;
}
if(wc==1)
{
P0=table[ww1];
w4=0;
delay(1);
w4=1;
P0=table[ww2];
w3=0;
delay(1);
w3=1;
P0=0xff;
P0=table[ww3];
w2=0;
delay(1);
w2=1;
P0=table[ww4];
w1=0;
d5=0;
delay(1);
d5=1;
w1=1;
}
if(wc==2)
{
P0=table[ww5];
w4=0;
delay(1);
w4=1;
P0=table[ww6];
w3=0;
delay(1);
w3=1;
P0=table[ww7];
w2=0;
d5=0;
delay(1);
d5=1;
w2=1;
P0=table[ww8];
w1=0;
d5=0;
delay(1);
d5=1;
w1=1;
}
if(wc==3)
{
P0=table[ww9];
w4=0;
delay(1);
w4=1;
P0=table[ww10];
w3=0;
d5=0;
delay(1);
d5=1;
w3=1;
P0=table[ww11];
w2=0;
d5=0;
delay(1);
d5=1;
w2=1;
P0=table[ww12];
w1=0;
d5=0;
delay(1);
d5=1;
w1=1;
}
if(wc==4)
{
P0=table[ww4];
w4=0;
d5=0;
delay(1);
d5=1;
w4=1;
P0=table[ww8];
w3=0;
d5=0;
delay(1);
d5=1;
w3=1;
P0=table[ww10];
w2=0;
d5=0;
delay(1);
d5=1;
w2=1;
P0=table[ww12];
w1=0;
d5=0;
delay(1);
d5=1;
w1=1;
}
//***********转10进处理********
}
}
//速度检测部分*******************
void exter0() interrupt 0 //中段0 处理《子弹通过后》p3.2
{
aa=1;
}
/* 定时器中段
void exter1() interrupt 1 //中段1 处理
{
ww6++;//理论上来说 这个功能是不会触发的
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
}
*/
void exter2() interrupt 2 //中段2 目标开始进入处理 p3.3
{
aa=0;
}
//速度检测部分*******************
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=30;y>0;y--);
}