基于Atmega8的频率计原程序

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

基于Atmega8的频率计原程序+图基于Atmega8单片机的频率计基于Atmega8单片机的频率计前言:Atmega8-是8位AVR单片机,(8-Kbyteself-programmingFlashProgramMemory,1-KbyteSRAM,512ByteEEPROM,6or8Channel10-bitA/D-converter.Upto16MIPSthroughputat16Mhz.2.7-5.5Voltoperation.);Nokia3310LCD实验目标频率计是我们经常会用到的实验仪器之一,本实验要使用单片机和计数电路及液晶器件来设计一个宽频的频率计。期望达到10Hz-1.1G范围的频率精确测量。实验电路图(初步方案)1)计数及显示电路:此主题相关图片如下:2)前置放大及分频电路:设计设计测量频率的思路频率的测量实际上就是在1S时间内对信号进行计数,计数值就是信号频率。用单片机设计频率计通常采用两种办法,1)使用单片机自带的计数器对输入脉冲进行计数,或者测量信号的周期;2)单片机外部使用计数器对脉冲信号进行计数,计数值再由单片机读取。由于单片机自带计数器输入时钟的频率通常只能是系统时钟频率的几分之一甚至几十分之一,因此采用单片机的计数器直接测量信号频率就受到了很大的限制。本实验电路采用方式2,使用一片74LS393四位双二进制计数器和Atmega8的T1计数器组成了24位计数器,最大计数值为16777215。如果输入信号经过MB501分频器进行64分频后再进行测量,则固定1S时基下最高测量频率为1073.741760Mhz。为了方便得到准确的1秒钟测量闸门信号,我们使用了Atmega8的异步实时时钟功能,采用32.768Khz的晶振由TC2产生1秒钟的定时信号。测量频率原理:单片机打开测量闸门,即PB1输出高电平,同时TC2定时器启动。74LS393开始对输入脉冲进行计数,74LS393每计数达256时,Atmega8的T1计数器也向上计数1次。当1S定时到达时,单片机产生中断,PB1输出低电平关闭测量闸门,然后Atmega8读取74LS393和T1的计数值,然后送LCD显示。实验进展2004-09-27根据设计思路编写程序初步获得了一些实验结果,如下图所示。下图是测量8M有源晶振的输出结果。此主题相关图片如下:由于1S的测量闸门时间在业余条件下不好测试,因此,实验程序中在LCD上同时显示实时时钟用于判断1S闸门时间的准确*。实验中,我使用CDMA手机上显示的GPS卫星精确时间进行比较。手机时间显示的最小单位是分钟,测量时一旦手机分钟值发生跳变,则立即记录下LCD显示的秒值,这样的话让频率计运行一段时间后,再多次记录下LCD显示的秒,就可以准确判断频率计的异步时钟是否准确。实验过程中,我让频率计走了10个小数左右,测量的1S时钟还是非常准确的。实验源程序频率测量源代码:#includeiom8v.h#includemacros.h#includelcd.h#includebmp.hunsignedlongcounter;unsignedcharcountlow;unsignedcharfre[]=00.000000;unsignedchartime[]=00:00:00;#pragmainterrupt_handlertimer2_ovf_isr:iv_TIMER2_OVFvoidtimer2_ovf_isr(void){unsignedchari;//TCCR2=0;PORTB&=~0X02;//关闭闸门//读取计数值counter=TCNT1;//读取T/C1计数值(频率值的高16位)counter=counter*256;//计算频率值的高16位countlow=(PIND&0b11000000)|(PINC&0b00111111);//读取计数值的低8位counter=counter+countlow;//计算频率值PORTD|=0X01;//74LS393清零TCNT1=0;PORTD&=~0X01;//关闭清零TCNT2=0X80;//定时时间1秒PORTB|=0X02;//打开闸门//实时时钟显示time[7]++;fre[0]=counter/10000000+0x30;counter=counter%10000000;fre[1]=counter/1000000+0x30;counter=counter%1000000;fre[3]=counter/100000+0x30;counter=counter%100000;fre[4]=counter/10000+0x30;counter=counter%10000;fre[5]=counter/1000+0x30;counter=counter%1000;fre[6]=counter/100+0x30;counter=counter%100;fre[7]=counter/10+0x30;fre[8]=counter%10+0x30;LCD_write_String(0,2,fre);LCD_draw_map(14,2,Bmp003,7,14);//显示小数点LCD_draw_map(62,2,MHz,22,14);//显示频率单位if(time[7](9+0x30)){time[6]++;time[7]-=10;}if(time[6](5+0x30)){time[4]++;time[6]-=6;}if(time[4](9+0x30)){time[3]++;time[4]-=10;}if(time[3](5+0x30)){time[1]++;time[3]-=6;}if(time[1](9+0x30)){time[0]++;time[1]-=10;}LCD_write_String(2,4,time);LCD_draw_map(16,4,Bmp002,7,14);//显示“:”字符LCD_draw_map(37,4,Bmp002,7,14);}/******************************************************************************/voidmain(void){unsignedchari;OSCCAL=0xA3;//8M系统内部时钟校准//设置MCU的I/O口DDRB|=LCD_RST|LCD_DC|LCD_CE|SPI_MOSI|SPI_CLK;DDRB|=0x02;//计数闸门DDRD|=0X01;//74LS393清零//DDRD|=0X08;//LED//DDRD&=~0X20;DDRC&=0B11000000;DDRD&=0B00111111;SPSR|=BIT(SPI2X);//设置SPI时钟倍速SPCR|=BIT(SPE)|BIT(MSTR);//使能SPI接口,主机模式,4M时钟LCD_init();//LCD_clear();//清屏LCD_draw_map(12,0,Bmp001,60,13);ASSR=1AS2;//选择异步时钟TCNT2=0X80;//定时时间1秒TCCR2=(1CS22)|(1CS21);//T/C2预分频比256TIMSK|=BIT(TOIE2);//允许TC2溢出中断TCCR1B|=BIT(CS12)|BIT(CS11)|BIT(CS10);//时钟外部T1输入,上升源驱动SEI();while(1){}}3310液晶显示源代码:#includeiom8v.h#includemacros.h#includelcd.h#include6x8.h#includechinese.h/*----------LCD_init:3310LCD初始化编写日期:2004-8-10最后修改日期:2004-8-10------------*/voidLCD_init(void){PORTB&=~LCD_RST;//产生一个让LCD复位的低电平脉冲delay_1us();PORTB|=LCD_RST;PORTB&=~LCD_CE;//关闭LCDdelay_1us();PORTB|=LCD_CE;//使能LCDdelay_1us();LCD_write_byte(0x21,0);//使用扩展命令设置LCD模式LCD_write_byte(0xc8,0);//设置偏置电压LCD_write_byte(0x06,0);//温度校正LCD_write_byte(0x13,0);//1:48LCD_write_byte(0x20,0);//使用基本命令LCD_clear();//清屏LCD_write_byte(0x0c,0);//设定显示模式,正常显示PORTB&=~LCD_CE;//关闭LCD//LCD_clear();}/*--------LCD_clear:LCD清屏函数编写日期:2004-8-10最后修改日期:2004-8-10-------------*/voidLCD_clear(void){unsignedinti;LCD_write_byte(0x0c,0);LCD_write_byte(0x80,0);for(i=0;i504;i++)LCD_write_byte(0,1);}/*---------LCD_set_XY:设置LCD坐标函数输入参数:X:0-83Y:0-5编写日期:2004-8-10最后修改日期:2004-8-10-----------*/voidLCD_set_XY(unsignedcharX,unsignedcharY){LCD_write_byte(0x40|Y,0);//columnLCD_write_byte(0x80|X,0);//row}/*-----------LCD_write_char:显示英文字符输入参数:c:显示的字符;编写日期:2004-8-10最后修改日期:2004-8-10-------------------*/voidLCD_write_char(unsignedcharc){unsignedcharline;//c-=32;//for(line=0;line6;line++)//LCD_write_byte(font6x8[c][line],1);for(line=0;line7;line++)LCD_write_byte(font7x13[c][line],1);for(line=7;line14;line++)LCD_write_byte(font7x13[c][line],1);}/*----------LCD_write_char:英文字符串显示函数输入参数:*s:英文字符串指针;X、Y:显示字符串的位置编写日期:2004-8-10最后修改日期:2004-8-10------------*/voidLCD_write_String(unsignedcharX,unsignedcharY,char*s){unsignedcharline;unsignedchari=0;while(*s){LCD_set_XY(X+i*7,Y);for(line=0;line7;line++)LCD_write_byte(font7x13[*s-0X30][line],1);LCD_set_XY(X+i*7,Y+1);for(line=7;line14;line++)LCD_write_byte(font7x13[*s-0X30][line],1);s++;i++;}}/*--------------------LCD_write_chi:在LCD上显示汉字输入参数:X、Y:显示汉字的起始X、Y坐标;ch_with:汉字点阵的宽度num:显示汉字的个数;line:汉字点阵数组中的起始行数row:汉字显示的行间距编写日期:2004-8-11最后修改日期:2004-8-12---------------------------*/voidLCD

1 / 17
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功