新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 用AVR单片机实现频率计设计

用AVR单片机实现频率计设计

作者:时间:2012-10-17来源:网络收藏
//课程设计程序//名称://硬件:ATMEGA16_FHz-QLD100623产品  8MHz 晶振 三位数码管显示//程序说明:程序初调阶段,可测频率范围1Hz--65KHz 自动换档显示//编写人:李春起#includeiom16v.h>  #include macros.h>//-------------位拉高--------------------------------------------#define LED1_H PORTD|=BIT(PD4) #define LED2_H PORTD|=BIT(PD5)   #define LED3_H PORTD|=BIT(PD6)  #define AT1_H PORTA|=BIT(PA0)  #define AT2_H PORTA|=BIT(PA1)  #define AT3_H PORTA|=BIT(PA2) //-------------位拉低--------------------------------------------#define LED1_L PORTD=~BIT(PD4)  #define LED2_L PORTD=~BIT(PD5)    #define LED3_L PORTD=~BIT(PD6)   #define AT1_L PORTA=~BIT(PA0)    #define AT2_L PORTA=~BIT(PA1)  #define AT3_L PORTA=~BIT(PA2)  #define NOP() asm("nop")#define uchar unsigned char #define uint unsigned int//==================声明全局变量====================================uint data,F_data=0,F_data10K=0;F_data1M=0;//频率分段储存uint decimal1,decimal2,decimal3;//===================数据表==============================================__flash uchar SEG[]={0X03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};//==================mS延时子程序=========================================void delayms(uint m){uint i,j;for(i=0;im;i++){for(j=0;j1141;j++);}}//==================IO口初始化=======================================void IO_init(void){DDRA = 0XFF;DDRB = 0X00;//PB0为频率输入,其它为按键DDRC = 0XFF;DDRD = 0XFF;}//====================定时器T0初始化===================================void timer0_init(void){TCCR0 = 0x0F;  //T0上升沿触发CTC模式TCNT0 = 0x00;  //计数器清0OCR0  = 255;   //计数值达100中断TIMSK |=0x02;  //使能OCIE0TIFR  |=0x02;  //清OCIF0中断标识位}//====================定时器T1初始化===================================void timer1_Init(void)//用于产生标准1S时间{ TCCR1A=0x00;  //WGM1[3:0]=0100,OCR1ATCCR1B=0x0c;  //256 division,8M/256,CTC ModeTCNT1=0X00;   //Clear CounterOCR1A=31250;  //31250*256/8M=1STIMSK|=0X10; //比较匹配A中断使能TIFR |=0X10; //中断标志写1清0}//=====================使能全局中断================================void Interrupt_init(void){SREG|=0x80;}//====================MCU初始化==========================================void MCU_init(void){IO_init();timer0_init();timer1_Init();Interrupt_init();}//=============================================================//-------------------------------------------------------------//---------------主函数----------------------------------------//-------------------------------------------------------------void main(void){MCU_init();PORTD=0XFF;while(1){PORTC=(SEG[(data%10)]-decimal1);AT3_H;delayms(5);AT3_L;PORTC=(SEG[(data/10)%10]-decimal3);AT2_H;delayms(5);AT2_L;PORTC=(SEG[(data/100)%10]-decimal2);AT1_H;delayms(5);AT1_L;}}//--------------------------------------------------------------//--------------------------------------------------------------//==============================================================//====================定时器T0中断服务子程序==========================#pragma interrupt_handler Timer0_Interrupt:20void Timer0_Interrupt(void){TCNT0 = 0X00;//计数器清0if(++F_data10K>=65535){F_data10K=0;if(++F_data1M>=65535){F_data1M=0;}}}//=====================定时器T1中断服务==============================#pragma interrupt_handler Timer1_Interrupt:7void Timer1_Interrupt(void){TCNT1 = 0X00;//计数数清0F_data = TCNT0;F_data |= F_data10K8; TCNT0 = 0X00;F_data10K = 0;if(F_data1000){decimal3=0;decimal2=0;decimal1=1;data=F_data;LED1_L;LED2_H;LED3_H;}if(F_data>=1000){decimal3=0;decimal2=1;decimal1=0;data=(F_data/10);LED1_H;LED2_L;LED3_H;}if(F_data>=10000){decimal3=1;decimal2=0;decimal1=0;data=(F_data/100);}//if(F_data>=65534){F_data = (F_data>>8);F_data |= F_data1M8;//                F_data=(F_data/1000);}}

单片机相关文章:单片机教程


单片机相关文章:单片机视频教程


单片机相关文章:单片机工作原理


尘埃粒子计数器相关文章:尘埃粒子计数器原理


关键词: AVR 单片机 频率计

评论


相关推荐

技术专区

关闭