⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 使用单片机实现的对信号源的频率测试。准确精确度好!
💻 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 + -