等精度频率计设计C程序
单片机频率计C程序

单片机频率计C程序单片机频率计C程序//---------函数声明,变量定义--------------------------#include <reg51.h>sbit GATE=P3^0; //预制门限sbit CLR =P3^1; //请零sbit RGATE=P3^2; //实际门限sbit SEL0=P3^4; //数据选择位0sbit SEL1=P3^5; //数据选择位1sbit SEL2=P3^6; //数据选择位2#define data_in P1unsigned char Nx[4]; //待测频率计数值unsigned char Ns[4]; //标准频率计数值unsigned char GATE_time=1; //门限时间,预定义为1S unsigned char time_count;bit PRE_judge=1;//-----------------------变量声明---------------------------------------------------------------------void system_init(void ); //初始化,设置定时器0的工作方式,供主程序调用void TIMER0_SCANkey(); //定时器0中断处理函数//--------------------------------------------------------------------------------------------------// 函数名称:system_init()// 函数功能:初始化设置// 设定INT0的工作方式//--------------------------------------------------------------------------------------------------void system_init(void ){TMOD=0x01; //定时器0工作在方式1ET0=1; //定时器0中断允许TH0=-5000/256; //12M时钟时,定时0.01秒TL0=-5000%256;TR0=1; //定时器0开始计数EA=1; //系统中断允许}//--------------------------------------------------------------------------------------------------// 函数名称:read_result// 函数功能:将计数值读出到Nx、Ns//--------------------------------------------------------------------------------------------------void read_result(){GATE=0;while(RGATE); //等待实际门限的结束SEL0=0;SEL1=0;SEL2=0;Nx[0]=data_in; //SEL=000SEL0=1;Nx[1]=data_in; //001SEL1=1;Nx[3]=data_in; //011SEL0=0;Nx[2]=data_in; //010SEL0=0;SEL1=0;SEL2=1;Ns[0]=data_in; //100SEL0=1;Ns[1]=data_in; //101SEL1=1;Ns[3]=data_in; //111SEL0=0;Ns[2]=data_in; //110}//--------------------------------------------------------------------------------------------------// 函数名称:judge_Prage// 函数功能:判断频率范围,// 大于1M 即Nx>0x00 0F 42 40, GATE=1// 小于1M大于1k即0x00 00 03E8<Nx<0x00 0F 42 40,GATE=5// 小于1k 即Nx<0x00 00 03 E8, GATE=10//--------------------------------------------------------------------------------------------------void judge_Prage(){if((Nx[3]==0)&&(Nx[2]==0))if((Nx[1]<3)||((Nx[1]==3)&&(Nx[0]<0xE8)))GATE_time=10;else GATE_time=5;else if((Nx[3]==0)&&(Nx[2]<0x0f))GATE_time=5;else if((Nx[3]==0)&&(Nx[2]==0x0f))if(Nx[1]<0x42)GATE_time=5;elseif((Nx[1]==0x42)&&(Nx[0]<0x40))GATE_time=5;elseGATE_time=1;else GATE_time=1;}//--------------------------------------------------------------------------------------------------// 函数名称:calcu_Fx// 函数功能:计算频率,根据Fx=(Nx/Ns)Fs 计算结果//--------------------------------------------------------------------------------------------------void calcu_Fx(){}//--------------------------------------------------------------------------------------------------// 函数名称:TIMER0_intrupt// 函数功能:定时器0中断处理程序//--------------------------------------------------------------------------------------------------void TIMER0_intrupt() interrupt 1 using 1{EA=0; //系统中断禁止GATE=1;TH0=-5000/256; //12M时钟时,定时0.01秒TL0=-5000%256;time_count++;if(++time_count==100) GATE_time--;while(GATE_time==0){GATE=0;read_result();if(PRE_judge) //预测,判断频率范围{judge_Prage();PRE_judge=0;if(GATE_time) //如果频率大于1M,直接计算,无须再测calcu_Fx();}elsecalcu_Fx(); //不是预测,直接计算结果}EA=1;}//--------------------------------------------------------------------------------------------------// 函数名称:main// 函数功能:主函数//--------------------------------------------------------------------------------------------------void main(){CLR=0;GATE=1;system_init();}。
PIC单片机C语言编程实例六 利用CCP模块设计频率计

第10章利用CCP模块设计频率计10.5 程序设计10.5.4 程序清单#include <pic.h>#include <stdio.h>#include <math.h>//本程序利用CCP1模块实现一个“简易数字频率计”的功能const char table[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0xFF};//不带小数点的显示段码表const char table0[11]={0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10,0xFF};//带小数点的显示段码表bank3 int cp1z[11];//定义一个数组,用于存放各次的捕捉值union cp1{int y1;unsigned char cp1e[2];}cp1u;//定义一个共用体unsigned char COUNTW,COUNT;//测量脉冲个数寄存器unsigned char COUNTER,data,k;unsigned char FLAG @ 0XEF;#define FLAGIT(adr,bit) ((unsigned)(&adr)*8+(bit)) //绝对寻址位操作指令static b it FLAG1 @ FLAGIT(FLAG,0);static b it FLAG2 @ FLAGIT(FLAG,1);static b it FLAG3 @ FLAGIT(FLAG,2);unsigned char s[4];//定义一个显示缓冲数组int T5 ,uo;double RE5;double puad5;//spi方式显示初始化子程序void SPIINIT(){PIR1=0;SSPCON=0x30;SSPSTA T=0xC0;174//设置SPI的控制方式,允许SSP方式,并且时钟下降沿发送,与"74HC595,当其//SCLk从低到高跳变时,串行输入寄存器"的特点相对应TRISC=0xD7;//SDO引脚为输出,SCK引脚为输出TRISA5=0;//RA5引脚设置为输出,以输出显示锁存信号FLAG1=0;FLAG2=0;FLAG3=0;COUNTER=0X01;}//CCP模块工作于捕捉方式初始化子程序void ccpint( ){CCP1CON=0X05;//首先设置CCP1捕捉每个脉冲的上升沿T1CON=0X00;//关闭TMR1震荡器??PEIE=1;//外围中断允许(此时总中断关闭)CCP1IE=1;//允许CCP1中断TRISC2=1;//设置RC2为输入}//系统其它部分初始化子程序void initial( ){COUNT=0X0B;//为保证测试精度,测试5个脉冲的参数后//求平均值,每个脉冲都要捕捉其上升、下降沿,//故需要有11次中断TRISB1=0;PORTB=0XFB;B=1011TRISB2=0;PORTB=0XFD ;D=1101TRISB4=1;TRISB5=1;//设置与键盘有关的各口的输入、输出方式RB1=0;RB2=0;//建立键盘扫描的初始条件}//SPI传送数据子程序void SPILED(data){SSPBUF=data;//启动发送do {;175}while(SSPIF==0);SSPIF=0;}//显示子程序,显示4位数void display( ){RA5=0;//准备锁存for(COUNTW=0;COUNTW<4;COUNTW++){data=s[COUNTW];data=data&0x0F;if(COUNTW==k) data=table0[data];//第二位需要显示小数点else data=table[data];SPILED(data);//发送显示段码}for(COUNTW=0;COUNTW<4;COUNTW++){data=0xFF;SPILED(data);//连续发送4个DARK,使显示好看一些}RA5=1;//最后给一个锁存信号,代表显示任务完成}//键盘扫描子程序void keyscan( ){if((RB4==0)||(RB5==0)) FLAG1=1;//若有键按下,则建立标志FLAG1(FLAG1有无按键标志位)else FLAG1=0;//若无键按下,则清除标志FLAG1}//键服务子程序void keyserve( ){PORTB=0XFD ;RB2=1if(RB5==0) data=0X01;if(RB4==0) data=0X03;PORTB=0XFB;RB1=1if(RB5==0) data=0X02;if(RB4==0) data=0X04;//以上确定是哪个键按下PORTB=0X00;//恢复PORTB的值if(data==0x01) {176COUNTER=COUNTER+1;//若按下S9键,则COUNTER加1if(COUNTER>4) COUNTER=0x01;//若COUNTER超过4,则又从1计起}if(data==0x02) {COUNTER=COUNTER-1;//若按下S11键,则COUNTER减1 if(COUNTER<1) COUNTER=0x04;//若COUNTER小于1,则又循环从4计起}if(data==0x03) FLAG2=1 ;//若按下S10键,则建立标志FLAG2if(data==0x04) FLAG2=0 ;//若按下S12键,则清除标志FLAG2}//中断服务程序void interrupt cp1int(void){CCP1IF=0;//清除中断标志cp1u.cp1e[0]=CCPR1L;cp1u.cp1e[1]=CCPR1H;cp1z[data]=cp1u.y1;//存储1次捕捉值CCP1CON=CCP1CON^0X01;//把CCP1模块改变成捕捉相反的脉冲沿data++;COUNT--;}//周期处理子程序void PERIOD( ){T5=cp1z[10]-cp1z[0];//求得5个周期的值???????????/RE5=(double)T5;//强制转换成双精度数RE5=RE5/5;//求得平均周期,单位为μs}//频率处理子程序void FREQUENCY( ){PERIOD( );//先求周期RE5=1000000/RE5;//周期值求倒数,再乘以1 000 000 (μs转换),得频率,//单位为HZ}//脉宽处理子程序void PULSE( )177{int pu;for(data=0;puad5=0;data<=9;data++){pu=cp1z[data+1]-cp1z[data];puad5=(double)pu+puad5;data=data+2;} //求得5个脉宽的和值RE5=puad5/5;//求得平均脉宽}//占空比处理子程序void OCCUPA TIONAL( ){PULSE( );//先求脉宽puad5=RE5;//暂存脉宽值PERIOD();//再求周期RE5=puad5/RE5;//求得占空比}//主程序main( ){SPIINIT( );//SPI方式显示初始化while(1) {ccpint();//CCP模块工作于捕捉方式初始化initial();//系统其它部分初始化if(FLAG2==0) {s[0]=COUNTER;//第一个存储COUNTER的值s[1]=0X0A;s[2]=0X0A;s[3]=0X0A;//后面的LED将显示"DARK"}display( );//调用显示子程序keyscan();//键盘扫描data=0x00;//存储数组指针赋初值TMR1H=0;TMR1L=0;//定时器1清0CCP1IF=0;//清除CCP1的中断标志,以免中断一打开就进入//中断178ei( );//中断允许TMR1ON=1;//定时器1开while(1){if(COUNT==0)break;} //等待中断次数结束di();//禁止中断TMR1ON=0;//关闭定时器keyscan();//键盘扫描if(FLAG1==1) keyserve() ;//若确实有键按下,则调用键服务程序if(FLAG2==0) continue;//如果没有按下确定键,则终止此次循环,//继续进行测量//如果按下了确定键,则进行下面的数值转换和显示工作if(COUNTER==0x01) FREQUENCY();//COUNTER=1,则需要进行频率处理if(COUNTER==0x02) PERIOD();//COUNTER=2,则需要进行周期处理if(COUNTER==0x03) OCCUPA TIONAL();//COUNTER=3,则需要进行占空比处理if(COUNTER==0x04) PULSE();//COUNTER=4,则需要进行脉宽处理k=5;if(RE5<1){RE5=RE5*1000;//若RE5<1,则乘以1 000,保证小数点的精度k=0x00;}else if(RE5<10){RE5=RE5*1000;//若RE5<10,则乘以1 000,保证小数点的精度k=0x00;}else if(RE5<100){RE5=RE5*100;//若RE5<100,则乘以100,保证小数点的精度k=0x01;}else if(RE5<1000){RE5=RE5*10;//若RE5<1000,则乘以10,保证小数点的精度k=0x02;}else RE5=RE5 ;uo=(int)RE5;sprintf(s,"%4d",uo);//把需要显示的数据转换成4位ASII码,且放入数//组S中display();179}}180。
等精度数字频率计的设计

等精度数字频率计的设计(Design of equal precision digital frequency meter)作者:李欢(电子工程学院光信息科学与技术 1103班)指导教师:惠战强摘要:伴随着集成电路(IC)技术的发展,电子设计自动化(EDA)逐渐成为重要的设计手段,已经广泛应用于模拟与数字电路系统等许多领域。
电子设计自动化是一种实现电系统或电子产品自动化设计的技术,它与电子技术、微电子技术的发展密切相关,它吸收了计算机科学领域的大多数最新研究成果,以高性能的计算机作为工作平台,促进了工程发展。
数字频率计是一种基本的测量仪器。
它被广泛应用于航天、电子、测控等领域。
采用等精度频率测量方法具有测量精度保持恒定,不随所测信号的变化而变化的特点。
本文首先综述了EDA技术的发展概况,FPGA/CPLD开发的涵义、优缺点,VHDL语言的历史及其优点,然后介绍了频率测量的一般原理。
关键字:电子设计自动化;VHDL语言;频率测量;数字频率计AbstractThe Electronic Design Automation (EDA) technology has become an important design method of analog and digital circuit system as the integrated circuit's growing. The EDA technology, which is closely connected with the electronic technology, microelectronics technology and computer science, can be used in designing electronic product automatically.Digital frequency meter is a basic measuring instruments. It is widely used in aerospace, electronics, monitoring and other fields. With equal precision frequency measurement accuracy to maintain a constant, and not with the measured signal varies.We firstly present some background information of EDA, FPGA/CPLD and VHDL;then introduced the general principle of frequency measurement. Keywords: Electronic Design Automation,VHDL, Frequency measurement,digital frequency meter.目录摘要................................................... 错误!未定义书签。
计算机毕业论文_基于FPGA的等精度频率计的设计与实现

目录前言...............................................................1 第一章 FPGA及Verilog HDL..........................................2 1.1 FPGA简介.....................................................2 1.2 Verilog HDL 概述.............................................2 第二章数字频率计的设计原理........................................3 2.1 设计要求.....................................................3 2.2 频率测量.....................................................3 2.3.系统的硬件框架设计..............................................4 2.4系统设计与方案论证............................................5 第三章数字频率计的设计............................................8 3.1系统设计顶层电路原理图........................................8 3.2频率计的VHDL设计.............................................9 第四章软件的测试...............................................15 4.1测试的环境——MAX+plusII.....................................15 4.2调试和器件编程...............................................15 4.3频率测试.....................................................16基于FPGA的等精度频率计的设计与实现摘要:本文详细介绍了一种基于FPGA的高精度频率计。
CPLD数字频率计中C语言编程

1 引言为了实现智能化的电子计数测频,实现一个宽领域、高精度的频率计,一种有效的方法是运用单片机测量频率。
采用单片机、接口芯片以及分频电路实现频率的自动分频。
根据计数值、分频系数,求出周期T,得到待测频率。
2 C51语言使用中几个关键问题在数字频率计中,没有采用常用的汇编语言,全部软件用C语言编程。
8051单片机的C 语言编译器简称C51。
C51程序有且仅有一个名为main的主程序。
(l)用#include在C语言源程序中包含库文件。
例如:#include〈reg51.h〉(2)为了能直接访问特殊功能寄存器SFR,C51提供了一种自主形式的定义方法,这是标准C语言中所没有的,仅适于单片机编程。
例如:sfr TMOD=OX89;(3)对于片外的I/O扩展,用“#define‘,语句进行定义。
如:#define PORT A XBYTE[0xffc 0];(4)实时中断程序的编程方法。
中断函数的声明方法如下:void<函数名>(void)interrupt【中断向量代号][using[内部寄存器组代号]3 数字频率计主程序设计在主程序中声明库文件,定义8155的口地址和所有全局变量。
显示函数说明以及定时器和8155的初始化。
点亮启动标志灯。
设置外部中断为边沿触发。
设置分频系数初值并测周期。
进行分频系数的判断,读周期值并将其转换成频率。
调用显示程序,完成显示频率的功能。
在使用C51语言中,absacc.h和reg51.h是不可缺少的。
这两个文件定义了单片机的所有寄存器和端口。
上述程序中还定义8155的各个口地址,便于C51编译器按8155的实际硬件结构,建立I/O变量名与其实际地址的对应关系。
下面程序是函数说明和初始化:4 数字频率计显示程序设计在显示程序中,要设定字型数码数组,判断频率值的单位,并将其分为Hz,KHz,MHz。
判断频率值的整数部分和小数部分的位数,显示频率值和单位数量级标志灯。
等精度测频法的频率计设计

摘要摘要频率测量是电子学测量中最为基本的测量之一。
频率计主要是由信号输入和放大电路、单片机模块、分频模块及显示电路模块组成。
AT89C52单片机是频率计的控制核心,来完成它待测信号的计数,译码,显示以及对分频比的控制。
利用它内部的定时/计数器完成待测信号频率的测量。
在整个设计过程中,所制作的频率计采用外部分频,实现1Hz-1kHz的频率测量及1ms-100ms的脉宽测量,而且可以实现量程自动切换流程。
以AT89C52单片机为核心,通过单片机内部定时/计数器的门控时间,方便对频率计的测量。
其待测频率值使用LCD液晶显示器显示,并可以自动切换量程。
本次采用单片机技术设计一种数字显示的频率计,具有测量准确度高,响应速度快,体积小等优点。
关键词:频率计,单片机,LCD液晶显示器。
I西安交通大学城市学院本科生毕业设计(论文)I IABSTRACTABSTRACTFrequency measurement is one of the most basic measurement electronics measurement. Frequency counter is dominated by the signal input and the amplifier circuit, microcontroller module, frequency module and the display circuit module. AT89C52 microcontroller is to control the core frequency meter to complete its measured signal counting, decoding, display and control divider ratio. Use its internal timer / counter to complete the test signal frequency measurements.Throughout the design process, by making use of external parts of the frequency meter frequency to achieve frequency measurement and pulse width measurement 1ms-100ms of 1Hz-1kHz, and can realize automatic range switching processes. To AT89C52 microcontroller as the core, through the internal microcontroller timer / counter gate time, easy measurement of the frequency meter. Its measured frequency value using the LCD display, and can automatically switch range. The use of microcomputer technology to design a digital display of frequency meter, have a measurement of high accuracy, fast response, small size and so on.KEYWORDS: Frequency meter, Single chip, LCD display.III西安交通大学城市学院本科生毕业设计(论文)I V目录目录1 绪论 (1)1.1 数字频率计简介 (1)1.2 单片机系统的研究现状 (2)1.3 频率计的研究现状 (2)1.4设计的技术要求和主要内容 (3)2 等精度频率计的原理与应用 (5)2.1 等精度频率计测量的原理 (5)2.2 脉冲宽度的测量方法 (6)2.3 等精度频率计的误差分析 (6)2.4 本章小结 (8)3 硬件电路设计 (9)3.1单片机周边电路 (9)3.2 51单片机及AT89C52介绍 (9)3.2.1 单片机简介 (9)3.2.2 AT89C52简介 (10)3.2.3 管脚说明 (11)3.2.4 AT89C52主要性能 (13)3.3 各部分电路图及电路工作原理分析 (13)3.3.1 时钟脉冲电路 (13)3.3.2 同步门逻辑控制电路 (14)3.3.3 LCD显示电路 (15)3.3.4 复位电路 (17)4 软件设计 (19)4.1 KEIL51软件简介 (19)4.2 软件的模块化设计及各部说明 (19)4.2.1 定时中断模块 (19)4.2.2 测量模块 (20)4.2.3 显示模块 (20)V西安交通大学城市学院本科生毕业设计(论文)V I 4.2.4 软件流程图 (20)5 系统仿真与调试 (21)5.1 Proteus软件简介 (21)5.2 Proteus的电路仿真 (22)5.3误差分析 (24)总结 (27)致谢 (29)参考文献 (31)附录 (33)1 程序 (33)2 附图 (41)3 外文翻译 (44)绪论1 绪论1.1 数字频率计简介数字频率计是计算机、通讯设备、音频视频等科研生产领域不可缺少的测量仪器。
基于SOPC的等精度数字频率计设计

De i n o qu lp e ii n di ia r q e y m e e a e n S PC s g f e a r c so g t lf e u nc t r b s d o O
己 口 l 口I年 己月
第己 卷 第 【 g 己期
基 于 S C 的 等 精 度 数 字 频 率 OP
林建英 高苗苗 杨 素英
( 连 理 工 大 学 电 子 信 息 与 电 气工 程 学部 大 连 1 62 ) 大 1 0 4 摘 要 : 出了 一 种 等 精 度 数 字频 率计 的 S P 提 O C实 现 方 法 。该 方 法 的 关 键 是 从 性 能 和 成 本 的要 求 出 发 配 置 嵌 入 式 NisI软 o I
Li in ig Ga io io Ya g Su ig nJa yn oM am a n yn
( a l fE e to i a d E e t ia En i e rn Dain Un v r i fTe h o o y Dain 1 2 Ch n ) F u t o l cr n c n l crc l g n e ig, l ie st o c n l g , l 6 4, ia y a y a 10 Ab t a t s r c :A t o o d s g q a r cso r q e c t ri r p s d i hi p p r Th y o h sm e h d i t o me h d t e i n e u l e ii n f e u n y me e sp o o e n t s a e . p eke ft i t o o c n— s f u e t e e e d d Ni s I o t c r c 0 r c s o y t m a e n t e r q ie n s o h e f r a c n o t a d i r h mb d e o I s f o e mi r p o e s r s s e b s d o h e u r me t ft e p r o m n ea d c s , n g t c iv h e ml s n e r to fFPGA n c o r c s o . e m e s r me to a h p r m e e s r a ie y FP— o a he et es a e sit g a in o a d mir p 。 e s r Th a u e n fe c a a t r i e l d b z GA o i , n h a c l to c n r la d d s l y a e i p e e t d b c o r c s o . l g c a d t e c l u a i n, o to n i p a r m l m n e y mi r p o e s r Th o e c mb n t n o GA n i i a i fFP o a dm — co r e so o r p o e s r c mp e e h e s r me t o h r q e c p r d, u y c c e a d t e p le wi t . l t s t e m a u e n ft e f e u n y, e i o d t y l n h u s d h Th e u t h w h t er s ls s o t a , t e f e u n y me e s o i h p e ii n, o d s a i t l w O t a d s l sz . ti e i e h t t eSOPC r a ia i n o h r q e c t r i fh g r cso g o t b l y,o c S , n ma l ie I sv rf d t a , h i i e l to f z e u 1 r cso r q e c t r i a fe tv e m e h d q a e ii n f e u n y me e S n e f c i e n w t o . p
Msp430频率计c语言代码实现

Msp430频率计c语言代码实现#include <msp430x14x.h>#define uint unsigned intuint i,f;unsigned char table[] = " Hz";//******************延时函数*******************************void delay(uint z){uint t,y;for(t=z;t>0;t--)for(y=110;y>0;y--);}//*******************写命令********************************** void write_com(unsigned char com){P3OUT&=~BIT0; //作为RS选择端低电平有效P3OUT&=~BIT1; //rw位置低P4OUT = com;delay(5);P3OUT|=BIT2; //E选择端置高电平;P3OUT&=~BIT2; //E置低电平}//*******************写数据********************************** void write_data(unsigned char date){P3OUT|=BIT0; //作为RS选择端高电平有效P3OUT&=~BIT1 ; //rw位置低P4OUT=date;delay(5);P3OUT|=BIT2; //E选择端置高电平;P3OUT&=~BIT2; //E置低电平}//********************初始化***********************************void init(){P3DIR=0xff; //P3输出作控制口P3SEL=0;P3OUT=0x00;P3OUT&=~BIT2; //EP3OUT&=~BIT0; //RSP4DIR=0XFF; //P4输出作数据口P4SEL=0;P4OUT=0X00;write_com(0x38); //显示模式设置write_com(0x0c); //开显示,不显光标write_com(0x06); //数据地址指针write_com(0x01); //清屏_BIS_SR(GIE); //开总中断}//********************液晶显示函数************************void display(unsigned char x,unsigned char *p){unsigned int NUM;write_com(x);for(NUM=0;NUM<10;NUM++){write_data(table[NUM]);}}//***********************主函数**************************************************void main(void){WDTCTL = WDT_ADLY_250; // WDT 250ms, ACLK, interval timer IE1 |= WDTIE; // Enable WDT interruptTACTL = TASSEL_0 + TACLR + TAIE + MC1; //定时器A选择外部时钟源,开中断,连续计数模式P1DIR &= ~BIT0; //P1.0输入P1SEL |= BIT0; //P1.0做定时器A的外部信号源输入端口_EINT(); //开总中断while(1){if(f != 0){IE1 &= ~WDTIE; //关看门狗中断table[0] = f/100000 + '0'; //设置液晶输出数组table[1] = f/10000 - 10*(f/100000) + '0';table[2] = f/1000 - 10*(f/10000) + '0';table[3] = f/100 - 10*(f/1000) + '0';table[4] = f/10 - 10*(f/100) + '0';table[5] = f - 10*(f/10) + '0';init();while(1){display(0x80,table); //液晶显示}}}}// Watchdog Timer interrupt service routine#pragma vector=WDT_VECTOR__interrupt void watchdog_timer(void){i = TAR;f = 4*i;}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1 #include <reg51.h>
2 #include <string.h>
3 #include <math.h>
4 #include <stdlib.h>
5 #include <stdio.h>
6 #define uchar unsigned char
7 #define uint unsigned int
8 #define ulong unsigned long
9
10 code uchar m[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,0x00};
11 // 0 1 2 3 4 5 6 7 8 9 灭
12 data uchar NS[]={0x0,0x0,0x0,0x0};//标准频率计数
13 data uchar NX[]={0x0,0x0,0x0,0x0};//待测频率计数
14 data ulong NSS,NXX,MM,F;
15 data ulong temp1,temp2;
16 data uchar shuju[]={0,0,0,0,0,0,0,0};//数码管数据
17 sbit CLR = P2^3;
18 sbit SEL2 = P2^2;
19 sbit SEL1 = P2^1;
20 sbit SEL0 = P2^0;
21 sbit CL = P2^4;
22 sbit START = P2^7;
23 //int i,j,k,l;
24 char *pNS;
//清零
25 char *pNSS;
26 char *pNX;
27 char *pNXX;
28
29 void delay(uint x);
30 void display();
31 void operation();
32 void outdata();
33
34 long powcyc(long c1,long c2)
35 {
36 long c3=1;
37 uchar ii;
38 for(ii=0;ii<c2;ii++)
39 {
40
41
c3*=c1; }
42 return c3;
43 }
44
45 void delay(uint x)
46 {
47 uchar j;
48 while((x--)!=0)
49 {
50 for(j=0;j<125;j++)
51
52
{;} }
53 }
54
55 void display()
56 {
57 uchar i;
58 for(i=0;i<8;i++)
59 {
60 TI=0;
61
62
63
SBUF=m[shuju[i]];
while(TI==0);
}
64 }
65
66
67 void outdata()
68 {
69
70
71
72
73
74
75
76
77
78 uchar i;
for(i=0;i<8;i++)
{
if(i==0)
{
shuju[0]=F/powcyc(10,7);
temp1=F%powcyc(10,7);
}
{
else
79 shuju[i]=temp1/powcyc(10,7-i);temp1=F%powcyc(10,7-i);
80 }
81 }
82 }
83 main()
84 {
85
86 uchar j,i,k,l; P0=0xff;
87 P2=0xff;
88
89 //Added by john 20060623 for(j=0;j<8;j++)
90 {
91 shuju[j] = 10; //all off
92 }
93 display();
94 delay(500); //delay 500ms
95
96 for(j=0;j<8;j++)
97 {
98
99
shuju[j] = j;
}
//0-7
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
display();
delay(500); //delay 500ms
for(j=0;j<8;j++)
{
shuju[j] = j + 2;
}
display();
delay(500);
//2-9
//delay 500ms for(i=0;i<3;i++)
{
for(j=0;j<8;j++)
{
shuju[j] = 11;
}
display();
delay(500);
//all on
//delay 500ms
for(j=0;j<8;j++)
{
shuju[j] = 10;
}
display();
delay(500);
}
//Added by john 20070623
while(1)
{
P0=0xff;
P2=0xff;
START=1;
display();
pNS=NS;
pNSS=&NSS;
pNX=NX;
pNXX=&NXX;
CLR=0;
CLR=1;
CLR=0;
CL=0;
CL=1;
delay(100);
CL=0;
//all off
//delay 500ms
if(START==0);
{
SEL2=SEL1=SEL0=0;
for(i=0;i<4;i++)
{NS[3-i]=P0;P2+=1;}
SEL2=1;SEL1=0;SEL0=0;
for(j=0;j<4;j++)
{NX[3-j]=P0;P2+=1;}
for(k=0;k<4;k++)
{*(pNSS+k)=*(pNS+k);}
for(l=0;l<4;l++)
157 {*(pNXX+l)=*(pNX+l);} 158 MM=NSS/NXX;
159 F=50000000/MM; 160 outdata();
161 162 } }
163 164 } 165。