金牌会员
- 积分
- 1532
- 威望
- 708
- 贡献
- 426
- 兑换币
- 22
- 注册时间
- 2010-5-8
- 在线时间
- 199 小时
|
可以参考我用51做的。有不明白的可以加我QQ350100546
#include<REG51.H>
unsigned char Seg[10]={ //共阴数码管
0x3F, // 0
0x06, // 1
0x5B, // 2
0x4F, // 3
0x66, // 4
0x6D, // 5
0x7D, // 6
0x07, // 7
0x7F, // 8
0x6F // 9
};
unsigned char Sel[4]={
0x38, // 第1个数码管
0x58, // 第2个数码管
0x68, // 第3个数码管
0x70 // 第4个数码管
};
static int num_1=0,num_2=0,num_3=0,num_4=0;
static int NN=0,nnum=0,ljys=0;
unsigned char n=0;
unsigned int lj=0;//累加数
sbit xinhao=P1^0; //信号口,用光电对管
bit zd_flag=0,js_flag=0,ljys_flag=0;
//主程序***********************************************************************
void main(void)
{
TMOD=0x11; //定时,方式1
TH0 = 0xDC; //10ms进入一次中断
TL0 = 0x00;
ET0=1; //允许T0中断
TR0=1; //启动T0
EA=1; //开总中断
TF0=1;
while(1)
{
if(xinhao==0)
{
if(nnum==0)
{
nnum++;//第一次通过起跑线后,此时为1吧
js_flag=1;//计时标志位为1,开始计时
ljys_flag=1;//开始在主函数累加延时,累加延时的结果是在一定时间内不管有没有信号都继续计时
}
if(zd_flag==1) //终点标志位为1时,当有信号则认为是车辆到达终点,停止计时
{
nnum++;
js_flag=0;//计时结束
}
}
if(ljys_flag==1)
{
ljys++; //第一次检测到信号后,累加延时标志位为1,在此函数达到累加延时的目的,累加延时的结果是在一定时间内不管有没有信号都继续计时
}
if(ljys>300)
{
ljys_flag=0;//取消累加延时
zd_flag=1; //将终点信号置为1,此后若有车通过则停止计时
}
for(n=0;n<4;)
{
P3=Sel[n];
if(n==0)
{
P2=Seg[num_1];
}
if(n==1)
{
P2=Seg[num_2];
}
if(n==2)
{
P2=Seg[num_3];
}
if(n==3)
{
P2=Seg[num_4];
}
NN++;
if(NN>100)
{
NN=0;
n++;
}
}
}
}
//中断服务程序*************************************************************
void timer0() interrupt 1 using 1 //这部分不用解释了吧
{
TH0 = 0xDC; //10ms进入一次中断
TL0 = 0x00;
if(js_flag==1) //计时标志位
{
num_4++;
if(num_4>9)
{
num_4=0;
num_3++;
if(num_3>9)
{
num_3=0;
num_2++;
if(num_2>9)
{
num_2=0;
num_1++;
if(num_1>5)
{
num_1=0;
num_2=0;
num_3=0;
num_4=0;
}
}
}
}
}
else
{
num_1=num_1;
num_2=num_2;
num_3=num_3;
num_4=num_4;
}
} |
|