资源描述
* 2007年2月 */
/* 目标MCU:MEGA16 晶振:外部8MHZ */
/*基于LCD的频率计,PC0~PC2对E,RS,RW
PORTA接DATA的8根线
用PB0口产生5000HZ方波,并二的N次分频
给ICP1输入补捕捉,既练习TC中断又有ICP
*****************************************/
#include<iom16v.h>
#include"lcd.h"
#pragma interrupt_handler Icp_timer1:6
//ICP中断入口地址
#pragma interrupt_handler Timer0:10
//定时器T0中断入口地址
char string[]="The frequency :";
unsigned int oldcount=0;//捕获时新旧T1值
unsigned int newcount=0;
unsigned char i=0; //用以分频
void Int_to_Char(unsigned int i,char *p) //整数到ASCII
{p[0]=i/1000+48;
p[1]=(i/100)%10+48;
p[2]=(i%100)/10+48;
p[3]=(i%100)%10+48;
}
//MCU初始化
void Init_Io()
{DDRB=0xff;
DDRA=0XFF;//液晶输出
DDRD&=~(1<<PD6); //捕捉引脚 处为输入
DDRC=0X0f; //液晶输出
TIMSK=0X21;//使能ICP捕捉中断;使能T/C0溢出中断
TCCR0=0X02;//8分频,溢出中断T0
TCCR1A=0X00;
TCCR1B=0XC2;//8分频;捕捉最小单位1us
TCNT0=0;
ICR1=0;
TCNT1=0;
}
void main(void)
{char a ;
uint freq=8888;
uchar f[5]={0,0,0,0,'\0'};
Init_Io();
Init_LCD();
SREG=0x80;
display_string(string);
set_xy(10,1);
display_char('H');
display_char('Z');
Delay_nms(100);
for(;;)
{
if((newcount&0xfff8)!=(oldcount&0xfff8)) //低三位不一样,频率
{ oldcount=newcount; //改变较大,要接受新值
freq=1000000/oldcount; //count每个数代表1us
Int_to_Char(freq,f);
set_xy(4,1);
display_string(f);
Delay_nms(100); //不必太快
}
}
}
//捕捉中断处理程序
void Icp_timer1()
{
newcount=ICR1;
ICR1=0;
TCNT1=0;
TCCR1B=0XC2;//8分频,噪声抑制,使能捕获
}
//方波产生中断程序
void Timer0()
{TCNT0=156;
i++;
PORTB=i;//在PA口产生频率不同的方波,从低位到高位2倍递增,便于试验
}
展开阅读全文