#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x83,0xf8,0x80,0x98}; //共阳极数码管显示0-9字形码
uchar code table[]={0x01,0x02,0x04,0x08,0x10,0x20}; //数码管位选
uint temp[8]; //频率的各位数数值
unsigned long f;
uint N=0,count1=0,flag,i,j,k; //定时,计数 ,一秒到的标志,
sbit led=P1^2; //代替铃声的二极管,亮即为铃响
void exter0() interrupt 1 //计数器中断
{
TH0=0;
TL0=0;
N++;
}
void exter1() interrupt 3 //定时器中断
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
count1++;
}
//延时程序
void delay(uchar m)
{
uchar i,l;
for(i=m;i>0;i--)
for(l=200;l>0;l--);
}
//主函数
void main()
{
TH1=(65536-50000)/256; //定时50ms
TL1=(65536-50000)%256;
TH0=0;
TL0=0;
TMOD=0x15; //T0方式1计数 T1模式定时方式1
EA=1;
ET0=1;
ET1=1;
TR0=1; //启动T0计数
TR1=1; //启动T1定时
j=0;
while(1)
{
if(count1==20) //判断一秒是否到
{
TR1=0;
TR0=0; //计数停止并且清零
count1=0;
flag=1;
}
if(flag==1) //计数停止时的数据处理
{
f=N*65536+TH0*256+TL0;
if(f<1||f>500000)
{
led=0;
f=0;
}
flag=0;
for(i=0;i<8;i++) //获取每位数码管的数
{
temp[i]=f%10;
f/=10;
}
P0=0xff; //消影
TH0=0;
TL0=0;
TR0=1;
TR1=1;
N=0;
}
//数码管显示
for(j=0;j<6;j++)
{
P2=table[j];
P0=num[temp[5-j]];
delay(10);
}
}
}