附录A 原理图
第 32 页 共 40 页
附录B 主程序
#include
//定义周期测频法测式的周期数,这个值越大,结果越精确,但也需 //要更多的时间。 #define TF_TIMES 3 //频率暂存字
unsigned long g_Ftmp; unsigned long g_Ftmp_All;
//单周期信号结束标志 0未测试完成 1初始化 2测试完成 unsigned int g_flag; //定时器T0溢出次数统计 unsigned long g_T0count; //每分钟心跳次数 unsigned int g_CountMinu;
unsigned char code string1[]=\
void INT0ISR( void ) interrupt 0 // 外部中断0中断服务函数 {
//IE0 = 0; //外部中断0标志位清0 在边沿触发模式下 //会由硬件清零 TR0 = 0; //停止计数 if(1 != g_flag) {
g_Ftmp = g_T0count * 65535;
第 33 页 共 40 页
}
}
g_Ftmp += (unsigned int)(TH0<<8)+TL0; g_flag = 2;
else { } TH0 = 0; TL0 = 0; g_T0count = 0;
TR0 = 1; //启动定时器进行下一周期测频
g_flag = 0;
void T0ISR( void ) interrupt 1 //定时器0溢出中断服务函数 { TH0 = 0; }
void TFInit( void ) //初始化函数 {
EX0 = 1; //使能外部中断0
IT0 = 1; //外部中断0触发方式为边沿触发 高-->低 ET0 = 1; //使能T0溢出中断 PX0 = 1; //外部中断0为高优先级 PT0 = 0;
//定时器0溢出中断为低优先级
第 34 页 共 40 页
TL0 = 0; g_T0count++;
TMOD = 0x01; //屏蔽T1,GATE = 0: 软件控制TR0启动定时器 // C/T = 0: T0工作在定时器方式
// M1\\M0= 01:T0工作方式为16位定时器 TF0 = 0;
//清零标志位,T0溢出中断请求
IE0 = 0; //清零标志位,外部中断标志位 TH0 = 0; TL0 = 0;
g_T0count = 0;//定时器溢出次数初始化 g_Ftmp = 0; g_CountMinu = 0; g_Ftmp_All = 0;
g_flag = 1; //标志位初始化 EA = 1;
//充许全局中断
}
void GetFreq( void ) //求频率 { unsigned char i; g_Ftmp_All = 0; EA = 1;
for(i=0; i 之和 { while(2 != g_flag || 1 == g_flag); g_flag = 0; LCD_Showchar(31, i+49); g_Ftmp_All += g_Ftmp; //每个时钟周期为1us } EA = 0; 第 35 页 共 40 页 //统计TF_TIMES次T } g_flag = 1; g_Ftmp = g_Ftmp_All/TF_TIMES; g_CountMinu = (60*1000000)/g_Ftmp; void main() { } TFInit(); LCD_init(); LCD_Showstring(0 , string1); GetFreq(); TS1602DisInt(22, g_CountMinu); 第 36 页 共 40 页