📄 sp0604_实验16_频率计数器.c
字号:
#include <REGX51.H>
//数码管显示的代码表0-F
unsigned char code LEDDATA[]=
{
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71,
0x40,0x00,
};
//数码管扫描代码表
unsigned char code LEDBITDATA[]=
{
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,
};
unsigned char LEDBuffer[8];//定义显示缓冲区数组
unsigned char LEDScanCount;//扫描计数器
unsigned char Counter_High=0;
unsigned int Counter_Low=0;
unsigned long Calc_Counter;
unsigned int SecondCount=0;
bit SecondFlag=0;
void Delay(unsigned int t)
{
while(t)t--;
}
#define TEST_KEY P3_2
unsigned char DIV_Count=10;
void main(void)
{
unsigned char i;
TMOD=0x15;
TH0=0x00;
TL0=0x00;
TH1=(65536-1843)/256;
TL1=(65536-1843)%256;
TR0=1;
TR1=1;
ET0=1;
ET1=1;
EA=1;
while(1)
{
//---------------------------------------
//此处是测试按扭处理段
if(TEST_KEY==0)
{
Delay(1000);
if(TEST_KEY==0)
{
DIV_Count+=10;
if(DIV_Count==200)DIV_Count=10;
while(TEST_KEY==0);
}
}
//---------------------------------------
if(SecondFlag==1)
{
SecondFlag=0;
Counter_Low=TH0;
Counter_Low<<=4;
Counter_Low|=TL0;
Calc_Counter=Counter_High*65536+Counter_Low;
for(i=0;i<sizeof(LEDBuffer);i++)LEDBuffer[i]=0;
i=0;
while(Calc_Counter)
{
LEDBuffer[i]=Calc_Counter%10;
Calc_Counter/=10;
i++;
}
Counter_High=0;
TH0=0;
TL0=0;
TR0=1;
}
}
}
void timer0_isr(void) interrupt 1
{
Counter_High++;
}
void timer1_isr(void) interrupt 3
{
TH1=(65536-1843)/256;//TH0,TL0装入定时1mS的初值
TL1=(65536-1843)%256;
//根据扫描计数值的内容寻找显示缓冲区内容对应的显示代码送出显示
P0=LEDDATA[LEDBuffer[LEDScanCount]];
P2=LEDBITDATA[LEDScanCount];//送出扫描代码
LEDScanCount++;
if(LEDScanCount==sizeof(LEDBuffer))LEDScanCount=0;//扫描完从头开始
if(TR0==1)
{
SecondCount++;
//---------------------------------------
//此处是测试点
if((SecondCount%DIV_Count)==0)
{
P3_5=~P3_5;
}
//---------------------------------------
if(SecondCount==1000)
{
SecondCount=0;
SecondFlag=1;
TR0=0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -