📄 频率计.c
字号:
#include<AT89X52.H>
unsigned char Tab[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x00};
unsigned char dispcount;
unsigned char count;
unsigned char timecount;
bit flag; //将flag定义为位变量//
unsigned long a;
unsigned char b1,b2,b3,b4,b5,b6;
void main(void)
{
IP=0x02; //将T0定义为高优先级,使CPU优先响应其中断//
count=0; //计数脉冲赋初值0//
TMOD=0x15; //给TOMD送方式控制字,使T0为计数方式,T1为定时方式//
TH0=0;
TL0=0;
TH1=0XF0;
TL1=0X60;
TR1=1;
ET1=1;
TR0=1;
ET0=1;
EA=1;
while(1)
{
if(flag==1)
{flag=0; //位变量清0//
a=count*65536+TH0*256+TL0; // 计算脉冲个数//
b1=a%10; //计算b1位//
a=a/10;
b2=a%10; // 计算b2位//
a=a/10;
b3=a%10; //计算b3位//
a=a/10;
b4=a%10; //计算b4位//
a=a/10;
b5=a%10; // 计算b5位//
a=a/10;
b6=a%10; //计算b6位//
a=a/10;
timecount=0; //重新使T0计数//
count=0;
TH0=0;
TL0=0;
TR0=1;
}
switch(dispcount) // 六位动态扫描显示//
{
case 0:P0=Tab[b1];P2=0xFE;break;
case 1:P0=Tab[b2];P2=0xFD;break;
case 2:P0=Tab[b3];P2=0xFB;break;
case 3:P0=Tab[b4];P2=0xF7;break;
case 4:P0=Tab[b5];P2=0xEF;break;
case 5:P0=Tab[b6];P2=0xDF;break;
}
}
}
void to (void) interrupt 1 using 0 // 中断服务函数说明//
{
count++; //溢出的次数//
}
void t1 (void) interrupt 3 using 1 //中断服务函数说明//
{
TH1=0XF0; //重新给T1填装定时初值//
TL1=0X60;
timecount++;dispcount++;
if(dispcount==6)
{
dispcount=0; // 6位扫描完后清0//
}
if(timecount==250)
{
TR0=0; //时间到1秒关掉计数器//
timecount=0;
flag=1; //位变量置1//
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -