📄 mcu_measurefrequency.c
字号:
#include "AT89X52.h"
#include "stdio.h"
#include " absacc.h "
#include <intrins.h>
#include <math.h>
#include "lcd1602.h"
sbit F_in=P1^0;
bit T0int_flag;
unsigned int frequency;
void Display(void);
void Mcu_init(void);
void Measure_F(void);
void Measure_T(void);
void Frequency_Measure(void);
void main() {
Mcu_init();
while(1) {
Frequency_Measure();
Display();
}
}
void time0(void) interrupt 1 {
T0int_flag=1;
}
void Frequency_Measure(void) {
if(frequency<2000) Measure_T();
else Measure_F();
}
void Measure_F(void) {
bit state_old=0,state_new=0;
unsigned int f_count=0;
int_flag=0;
TH0=-50000/256;
TL0=-50000%256;
TR0=1;
while(1) {
state_new=F_in;
if(state_old!=state_new) f_count++;
state_old=state_new;
if(T0int_flag) {
TR0=0;
frequency=f_count*10;
return;
}
}
}
void Measure_T(void) {
bit state_old=0,state_new=0;
unsigned char temp_flag=0;
unsigned int t_count;
TH0=0;
TL0=0;
while(1) {
state_new=F_in;
if(state_old&&!state_new) {//下降沿计数
temp_flag++;
TR0=1;
}
if(temp_flag==2) {//满一个周期后停止计数
TR0=0;
t_count=TH0*256+TL0;
frequency=1000000/t_count;
return;
}
state_old=state_new;
}
}
void Display(void) {
unsigned char a,b,c,d,e;
a=frequency/10000;
b=frequency%10000/1000;
c=frequency%1000/100;
d=frequency%100/10;
e=frequency%10;
LCD_string(LINE1,0,"F-measure:");
LCD_char(LINE1,0x0b,a|0x30);
LCD_char(LINE1,0x0c,b|0x30);
LCD_char(LINE1,0x0d,c|0x30);
LCD_char(LINE1,0x0e,d|0x30);
LCD_char(LINE1,0x0f,e|0x30);
if(frequency<2000) LCD_string(LINE2,0,"Now is measure T");
else LCD_string(LINE2,0,"Now is measure F");
}
void Mcu_init(void) {
EA=1;
ET0=1;
TR0=1;
TMOD=0x01;
TH0=-(50000/256);
TL0=-(50000%256);
LCD_init();
LCD_string(LINE1,0x00," ");
LCD_string(LINE1,0x00," ");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -