📄 main.c
字号:
/*****************************************
* 基于频率计程序设计 *
* 功 能:频率计 *
* 时钟频率:内部8M *
* 设 计:莫锦攀 *
* 修改日期:2007年07月05日 *
* 编译环境:ICC-AVR6.31 *
* 实验环境:M16学习板 *
* 使用端口:PC6,PC7,PA4~PA7,PD6(ICP) *
*****************************************/
#include <iom16v.h>
#include "1602.h"
#define uint unsigned int
#define uchar unsigned char
uint Cnt1; //第一次捕获值
uint Cnt2; //第二次捕获值
uint Cnt; //捕获差值
uchar Flag=0; //捕获次数
uchar Data[6]={0,0,0,0,0,0};//显示初值,最后一个0是结束符,方便液晶显示
void init_timer1(void) //初始化T/C1的输入捕获中断
{
TIMSK=1<<OCIE0; //0X02输入捕获使能
TCCR1B=0xC2; //输入捕获噪音使能,下降沿捕获,时钟8分频1us计数一次
TIFR=1<<ICF1; //0x20写"1"清输入捕获标志位
SREG=SREG&0x7f; //全局中断关
}
void hz(uint i,uchar *p) //显示处理,+48是因为液晶显示的是ASCII码
{p[4]=i%10+48;//个
p[3]=i/10%10+48;//十
p[2]=i/100%10+48;//百
p[1]=i/1000%10+48;//千
p[0]=i/10000%10+48;//万
}
void timer1(void) //捕获检测
{if(TIFR&0x20)
{TIFR|=0x20; //清除捕获标志位
Cnt=ICR1L; //cnt暂存
Cnt2=(ICR1H<<8)+ICR1L; //cnt2存放点前捕获值
Cnt=Cnt2-Cnt1; //cnt存放两次时间差
Cnt1=Cnt2; //cnt1存放上次捕获值
Flag++; //检测到第一次捕获
if(Flag==2) //检测到第二次捕获
{Flag=0; //清除捕获标志位
hz(Cnt,Data); //显示处理
LCD_write_string(6,1,Data); //显示
delay_nms(100);
Cnt=0;Cnt1=0;Cnt2=0; //清除捕获值几捕获差值
}
}
}
void main(void)
{
LCD_init();//液晶初始化
init_timer1();
DDRD=0x00;
PORTD=0xff;//设置D口为带上拉电阻输入
while(1)
{LCD_write_string(3,0,"ICP BY MJP");
timer1();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -