微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于ATMEGA16单片机的频率计设计

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

时间:08-06 来源:互联网 点击:




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

主函数(main()):/*

程序功能:频率计

作者:朱波

时间:2012年1月28日

说明:PB1为输入端口

定义:频率计——频率为1秒时间内信号变化的次数,数字频率计就是在1秒标准时间内测出信号变化的次数,然后以数字的形式显示出来

原理:用定时器0得到1秒,定时器1进入技术模式,在定时器0的中断中得到计数值,即为频率值

*/

#includeiom16v.h>

#includemacros.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:

#includeiom16v.h>

#includemacros.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|=TCNT1H8; //这就是读取低八位和高八位的值的方法

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;ims;i++)

{

for(j=0;j1141;j++);

}

}

显示函数(show.c)

#includeiom16v.h>

#includemacros.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(FREQ10)

{

show(FREQ%10,1);

show(0,2);

show(0,3);

show(0,0);

}

else if(FREQ100)

{

show(FREQ%10,1);

show(FREQ%100/10,2);

show(0,3);

show(0,0);

}

else if(FREQ1000)

{

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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top