avr捕获PD6上的ICP信号,在数码管上显示捕获结果。
#include <mega16.h>
#include <delay.h>
#define ICP PIND.6
#define LED PORTD.2
unsigned char ov_counter;//timer1溢出次数
unsigned int rising,falling;//开始和结束的时刻记录
unsigned long pulse;//时钟记录
unsigned int res;//记录结果(Us)
interrupt [TIM1_OVF] void time1ovf(void)
{
ov_counter++;//记录timer1 溢出次数
}
interrupt [TIM1_CAPT] void timer1capt(void)//输入捕获
{
if(ICP)
{
rising=ICR1H*256+ICR1L;//读取当前寄存器数值
TCCR1B=TCCR1B&0XBF;//改为下降沿触发
ov_counter=0;//清除time1计数
}
else
{
falling=ICR1H*256+ICR1L;//读取当前寄存器数值
TCCR1B=TCCR1B|0X40;//改为上升沿触发
pulse=(unsigned long)falling-
(unsigned long)rising+
(unsigned long)ov_counter*65536;
res=pulse*2;//将结果转换为微秒
}
}
void display(unsigned char number,unsigned char position)//digtial show function
{
DDRA=0Xff;//set PORTA output
  ORTA=0XFF;//set PORTA output in high level
switch(position)//choice the position
{
case 1:{PORTA&=0xf8;break;}
case 2:{PORTA&=0xf9;break;}
case 3:{PORTA&=0Xfa;break;}
case 4:{PORTA&=0Xfb;break;}
case 5:{PORTA&=0Xfc;break;}
case 6:{PORTA&=0Xfd;break;}
case 7:{PORTA&=0Xfe;break;}
case 8:{PORTA&=0Xff;break;}
}
switch(number)//show number
{
case 0:{PORTA&=0x87;break;} //0
case 1:{PORTA&=0x8f;break;} //1
case 2:{PORTA&=0x97;break;} //2
case 3:{PORTA&=0x9f;break;} //3
case 4:{PORTA&=0xa7;break;} //4
case 5:{PORTA&=0xaf;break;} //5
case 6:{PORTA&=0xb7;break;} //6
case 7:{PORTA&=0xbf;break;} //7
case 8:{PORTA&=0xc7;break;} //8
case 9:{PORTA&=0xcf;break;} //9
default:{PORTA=0xff;break;} //null
}
}
void main()
{
unsigned int d;
DDRD=0X3F;
PORTD=0XFF;
TCCR1B=0Xc2;//噪声抑制,8分频、上升沿触发
TIMSK=0x24;
#asm("sei")//开启中断
LED=0;
while(1)
{
for(d=0;d<20;d++)
{
display((res/10000)%10,4);delay_us(1000);
display((res/1000)%10,5);delay_us(1000);
display((res/100)%10,6);delay_us(1000);
display((res/10)%10,7);delay_us(1000);
display(res%10,8);delay_us(1000);
}#asm("cli")
//#asm("sei")
//delay_us(2);
}
}
|