📄 简易频率计.txt
字号:
//MCU:AT89S52
//晶振:12M
#include"AT89X52.H"
unsigned char code numcode[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
0x48,0x71
};//数字0~9及"F="共阳数码管代码
unsigned char dispbuff[8]={0,0,0,0,0,0,10,11};
unsigned char code bitcode[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f}; //数码管位选代码
unsigned char temp[8]; //频率值暂存
unsigned char disp_bit_count;
unsigned char T0_ovf_times; //记录计数器C/T0溢出次数
unsigned int T1_count;
bit flag; //读频率标志位,flag=1时,读和计算频率值。
unsigned long f; //频率值
void main(void)
{
unsigned char i;
TMOD=0x15;//定时器T1工作在方式1(16位),T0工作在16位计数方式
TH0=0; //T0寄存器清零
TL0=0;
TH1=(65536-4000)/256; //T1装载4MS定时初值
TL1=(65536-4000)%256;
TR0=1; //开计数器C0;
TR1=1; //开定时器T1;
ET0=1; //允许计数器C0溢出中断
ET1=1; //允许定时器T1溢出中断
EA=1; //开总中断
while(1)
{
if(flag==1)
{
flag=0;
for(i=0;i<8;i++)
{
temp[i]=0;
}
i=0;
while(f/10)
{
temp[i]=f%10;
f=f/10;
i++;
}
temp[i]=f;
for(i=0;i<6;i++)
{
dispbuff[i]=temp[i];
}
T1_count=0;
T0_ovf_times=0;
TH0=0;
TL0=0;
TR0=1; //重开计数器C0
}
}
}
void t0(void) interrupt 1
{
T0_ovf_times++;
}
/*********T1定时2.5mS中断服务程序*********************/
void t1(void) interrupt 3
{
TH1=(65536-2500)/256;//重装定时器T1初值
TL1=(65536-2500)%256;
T1_count++;
P1=0xff;
if(T1_count==400) //定时1S到,置flag=1,允许读C/T0值和T0_ovf_time
{
TR0=0; //关闭计数器C0
T1_count=0;
flag=1;
f=T0_ovf_times*65536+TH0*256+TL0; //读出频率值
}
P0=numcode[dispbuff[disp_bit_count]];
P1=bitcode[disp_bit_count];
disp_bit_count++;
if(disp_bit_count==8)
{
disp_bit_count=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -