/*------------------------------------*/
/*用外部中断0和定时器0结合进行频率测量*/
/*由外部中断0对信号进行计数,定时器每隔1秒对计数值进行采样并清0计数值*/
/*------------------------------------*/
#include "iom8v.h"
#include "macros.h"
unsigned char CountNum;
unsigned int nTnum;
unsigned int CountF;
#pragma interrupt_handler INT0_Ovf:iv_INT0
void INT0_Ovf(void)
{
CLI();
CountNum++;
SEI(); //恢复中断
}
//---------------------
#pragma interrupt_handler T0_Ovf:iv_TIMER0_OVF
void T0_Ovf(void)
{
CLI();
TCNT0=0x06;
if(!(nTnum--))
{
nTnum=500;
CountF=CountNum;
CountNum=0x00;
}
SEI(); //恢复中断
}
//----------------------------------
void main(void)
{
unsigned char d1,d2;
PORTB=0x00;
DDRB=0xff;
TCCR0=03; //晶振频率:8MHz,64分频:8us
TCNT0 =0x06; //定时器每隔(256-6)*8=2000us(2ms)中断一次
TIMSK|=(1<<TOIE0); //允许TC0中断
nTnum=500; //采样时间1s=2ms*500
MCUCR|=(1<<ISC01); //INT0下降沿触发
GICR|=(1<<INT0); //使能INT0
CountNum=0x00;
SEI(); //使能全局中断
while(1)
{
/*以下为简单的显示,将采样值进行十进制换后由PORTB接两只8421码LED显示*/
d1=CountF/10;
d2=CountF%10;
d1=(d1<<4)|d2;
PORTB=d1;
}
}