专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

基于ATMEGA16单片机的频率计设计

作者:佚名   来源:本站原创   点击数:  更新时间:2012年03月03日   【字体:




 

完整程序下载地址:http://www.51hei.com/f/avrplj.rar 

 主函数(main()):/*

程序功能:频率计

作者:朱波

时间:2012年1月28日

说明:PB1为输入端口

定义:频率计——频率为1秒时间内信号变化的次数,数字频率计就是在

      1秒标准时间内测出信号变化的次数,然后以数字的形式显示出来

原理:用定时器0得到1秒,定时器1进入技术模式,在定时器0的中断中

 得到计数值,即为频率值  


 

*/

#include<iom16v.h>

#include<macros.h>

#include"delay.h"

#include"show.h"

#include"HD_init.h"

#define uchar unsigned char

#define uint unsigned int

unsigned int FREQ=0; //定义全局变量,用于计算


 

void main()

{

  PORT_Init();//端口初始化

  timer1_init();//定时器1初始化

  timer0_init();//定时器0初始化

  SEI();//开启总中断

  

  while(1)

 {  

display();

 }

 

}

硬件初始化函数HD_init.c:
#include<iom16v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
#include"HD_init.h"
extern unsigned int FREQ; //定义全局变量,用于计算
 uint time_num=250;//250*4ms=1s

 
//端口初始化函数
void PORT_Init()
{
  DDRB  = 0xFD;//PB1作为输入口
}
//T0溢出中断服务程序
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
 TCNT0 = 0x83; //重赋值
 if(!--time_num) 
 { 
   FREQ=TCNT1L; 
   FREQ|=TCNT1H<<8; //这就是读取低八位和高八位的值的方法
   TCNT1H=0; //计数值归零
   TCNT1L=0; 
   time_num=250;//定时器0定时4ms,乘以250为1s   
 } 
}
//定时T1初始化进入计数模式
void timer1_init(void)
{
 TCCR1B = 0x00; //stop 
 TCNT1H = 0x00 /*INVALID SETTING*/; //setup 
 TCNT1L = 0x00 /*INVALID SETTING*/; 
 TCCR1A = 0x00; 
 TCCR1B = 0x06; //start Timer 
}
//定时器T0初始化定时4ms
void timer0_init(void)
{
 TCCR0  = 0x00;//停止定时器
 TCNT0  = 0x83;//初始值
 OCR0   = 0x82;//匹配值
 TIMSK |= 0x01;//中断允许
 TCCR0  = 0x04;//启动定时器
}
延时函数(delay.c):
#define uchar unsigned char
#define uint unsigned int
#include"delay.h"
void delay(uint ms)
{
        uint i,j;
for(i=0;i<ms;i++)
  {
  for(j=0;j<1141;j++);
       }
}
显示函数(show.c)
#include<iom16v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
#include"show.h"
extern unsigned int FREQ; //定义全局变量,用于计算
const  table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,
          0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void show(uchar j,uchar k)
{
 
DDRA|=BIT(3);  
DDRA|=BIT(4);
DDRD=0XFF;
    PORTA|=BIT(3);
PORTD=table[j];
PORTA&=~BIT(3);
delay(3);//此延时在仿真时非常重要
PORTD=0XFF;
PORTD&=~BIT(k);
PORTA|=BIT(4);
PORTA&=~BIT(4);
 
}
void display()//实际上只用最后一个就行,保留这么多
              //就是为了留一种算法
{
  if(FREQ<10)
{
 show(FREQ%10,1);
 show(0,2);
 show(0,3);
 show(0,0);
}
else if(FREQ<100)
{
   show(FREQ%10,1);
   show(FREQ%100/10,2);
show(0,3);
  show(0,0);
}
else if(FREQ<1000)
{
 show(FREQ%10,1);
 show(FREQ%100/10,2);
 show(FREQ%1000/100,3);
 show(0,0);
}
else 
{
 show(FREQ%10,1);
 show(FREQ%100/10,2);
 show(FREQ%1000/100,3);
 show(FREQ/1000,0);
}
}
以下是接口函数:


 

show.h:
#define uchar unsigned char
#define uint unsigned int
#ifndef delay_h
#define delay_h
extern void show(uchar j,uchar k);
extern void display();
#endif

HD_init.h:
#ifndef HD_init_H
#define HD_init_H
extern void PORT_Init();
extern void timer0_init(void);
extern void timer1_init(void);
#endif

delay.h:
#define uchar unsigned char
#define uint unsigned int
#ifndef delay_h
#define delay_h
extern void delay(uint ms);
#endif
关闭窗口

相关文章