📄 freqcount.c
字号:
//定时器0作为外部计数器,定时器1作为定时器,在定时1s范围内察看计数器0所计的数。
//-----------------------------------------------------------------------------
#include "c8051F020.h"
#include "intrins.h"
#include "CH452CMD.H" // 定义常用命令码及外部子程序
#include "pin.h"
#include "math.h"
#include "key_display.h"
#define N 4
#define SYSCLK (N*1000000) // 根据频率值设初值
unsigned int Frequence=0; //外部脉冲数变量
uchar times_of_overflow1=0;
float JIA=0;
uchar timein=10;
// Peripheral specific initialization functions,
// Called from the Init_Device() function
void Port_IO_Init()
{
XBR1 = 0x02; //交叉开关使能T0
XBR2 = 0x40; // 使能交叉开关和弱上拉
}
void Interrupts_Init()
{
IE = 0x0A; /*允许TF1/TF0标志位(TCON.7/TCON.5)的中断请求*/
/*定时器1/0发生溢出*/
IP = 0x0A; /*定时器1和0是高优先级中断*/
}
// Initialization function for device,
// Call Init_Device() from your main program
void Init_Device(void)
{
Reset_Sources_Init();
Timer_Init();
Port_IO_Init();
Oscillator_Init();
Interrupts_Init();
}
//定时n秒。不要放在循环语句中调用
void timecontrol(float n)
{
timein=(uchar)(n*10);
TR1=1;
TR0=1;
}
// MAIN Routine
void main (void)
{
Init_Device(); //初始化时钟 初始化交叉开关和IO口 初始化定时器0/1
EA=1; // 开总中断
//TR1=1; // 开定时器1
//TR0=1; // 开定时器0
timecontrol(0.5);
while (1)
{
//BCDdisplay1(Frequence);
//BCDdisplay_l(JIA);
delayms(200);
}
}
void TIMER0_ISR (void) interrupt 1 using 0
{
TF0=0; //清中断标志
}
void TIMER1_ISR (void) interrupt 3 using 1
{
TR1=0;
TF1=0;
TH1=0x7D ;
TL1=0xFB ;
if(times_of_overflow1 < timein)
times_of_overflow1 ++ ;
else
{ TR0=0;
Frequence=TH0*0x100+TL0;
times_of_overflow1=0;
JIA+=(float)timein/10 ;
BCDdisplay_l(JIA);
TH0=0;
TL0=0;
TR0=1;
}
TR1=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -