#include <REGX51.H> //头文件
sfr16 DPTR=0X82; //定义寄存器DPTR
unsigned char cnt_t0,cnt_t1,qian,bai,shi,ge,bb,wan,shiwan;
unsigned long freq; //定义频率
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴极数码管断码表
void delay_1ms(unsigned int z)
{
unsigned char i,j;
for(i=0;i<z;i++)
for(j=0;j<110;j++);
}
void init() //初始化函数
{
freq=0; //频率赋初值
cnt_t1=0;
cnt_t0=0;
IE=0x8a; //开中断
TMOD=0x15; //T0为定时器方式1,T1为计数器方式1
TH1=0x3c; //T1定时
TL1=0xb0;
TR1=1; //开启定时器1
TH1=0; //T0清零
TL0=0;
TR0=1; //开启定时器T0
}
void display(unsigned long freq_num) //驱动数码管显示函数
{
shiwan=freq_num%1000000/100000; //显示十万位
wan=freq_num%100000/10000; //显示万位
qian=freq_num%10000/1000; //显示千位
bai=freq_num%1000/100; //显示百位
shi=freq_num%100/10; //显示十位
ge=freq_num%10; //显示个位
P0=0xdf;
P2=table[shiwan]; //显示十万位
delay_1ms(5);
P0=0xef;
P2=table[wan]; //显示万位
delay_1ms(3);
P0=0xf7;
P2=table[qian]; //显示千位
delay_1ms(3);
P0=0xfb;
P2=table[bai]; //显示百位
delay_1ms(3);
P0=0xfd;
P2=table[shi]; //显示十位
delay_1ms(3);
P0=0xfe;
P2=table[ge]; //显示个位
delay_1ms(3);
}
void main() //主函数
{
P0=0xff; //初始化P0口
init(); //计数器初始化
while(1)
{
if(cnt_t1==19) //定时1s
{
cnt_t1=0; //定时完成后清零
TR1=0; //关闭T1定时器
delay_1ms(150); //延时矫正误差
TR0=0; //关闭T0
DPL=TH0; //利用DPRT读入其值
DPH=TH0;
freq=cnt_t0*65535;
freq=freq+DPTR; //计数值放入变量
}
display(freq); //调用显示函数
}
}
void t1_func() interrupt 3 //中断函数
{
TH1=0x3c;
TL1=0xb0;
cnt_t1++;
}
void t0_func() interrupt 1 //中断函数
{
cnt_t0++;
}