基于单片机IP核的等精度频率计设计.doc
大学本科生毕业设计(论文)基于单片机IP核的等精度频率计设计摘要FPGA就是目前最受欢迎的可编程逻辑器件之一。IP核是将一些在数字电路中常用但比较复杂的功能模块,设计成可修改参数的模块,让用户可以直接调用这些模块。随着FPGA的规模越来越大,使用IP核是一个发展趋势。传统测频原理的频率计的测量精度将随被测信号频率的下降而下降,在使用中有较大的局限性,而等精度频率计不但具有较高的测量精度,而且整个频率区域能保持恒定的测试精度。本文结合FPGA与8051单片机的优点实现了基于FPGA的8051 IP核应用,设计一个等精度频率计。关键词:FPGA,8051IP核,等精度频率计设计Abstract Field Programmable Gate Array(FPGA)is one of the most welcomed programmable logic devicesIP core is a module which has changeable parametersWith the IP core we can implement some complex functional module in digital circuitsWith the increasing scale in the FPGA,Using IP core is becoming more and more popularTraditional frequency measurement principle of the frequency accuracy will decline with the decline of the signal frequency.It Has a greater limitations in use. Equal precision frequency meter not only has high measurement accuracy, and the whole frequency region can maintain a constant test accuracyCombining the advantages of FPGA and 805 l MCU,the paper mainly realize the application of 8051 IP core based on FPGA that design a same accuracy frequency.Key words: FPGA,8051 IP core,same accuracy frequency目录第一章 绪论31.1 课题研究背景及意义31.2 主要任务3第二章 杭州康芯公司KX2C5F+开发板介绍52.1 KX2C5F+系统简介52.2 主要应用5第三章 系统设计73.1 8051单片机介绍73.2 8051单片机IP软核介绍73.3 8051单片机IP软核实用系统构建93.4 等精度频率计设计103.4.1等精度测频原理103.4.2等精度测频实现113.4.3测量占空比的原理133.4.4测量占空比的实现133.5单片机的功能143.5.1数据传输143.5.2 液晶显示153.6单片机与FPGA的组合应用16第四章 程序调试174.1 等精度频率计程序174.2 单片机程序和VHDL程序编译在一起下载到FPGA中17第五章 结果讨论19总结20致谢21参考文献22附录23附录1:等精度频率计相关程序23附录2 单片机相关程序25第一章 绪论1.1 课题研究背景及意义随着可编程逻辑设计技术的发展,每个逻辑器件中门电路的数量越来越多,一个逻辑器件就可以完成本来由很多分立逻辑器件和存储芯片完成的功能。这样做减少了系统的功耗和成本,提高了性能和可靠性。FPGA(Fild Programmable Gate Array)就是目前最受欢迎的可编程逻辑器件之一。IP就是知识产权核或知识产权模块的意思,在EDA技术开发中具有十分重要的地位。著名的美国Dataquest咨询公司将半导体产业的IP定义为用于ASIC或FPGA/CPLD中的预先设计好的电路模块。随着FPGA的规模越来越大,设计越来越复杂,使用IP核是一个发展趋势。现在很多电子系统都是由单片机+FPGA实现的。长期以来,单片机以其性价比高、体积小、功能灵活等方面的独特优点被广泛应用。但受其内部资源的限制,单片机需要在片外扩展相关资源。为了达到处理速度和控制灵活性方面的需求,采用微控制器和可编程逻辑器件设计单片机嵌入式系统。将单片机做在FPGA中,不但减少了电路中间连线,而且整个系统的可靠性得到加强,同时由于FPGA的速度快,FPGA中的单片机的速度可达100MHZ以上,整个系统的性能也能得到充分地改善。基于传统测频原理的频率计的测量精度将随被测信号频率的下降而下降,即测量精度随被测信号的频率的变化而变化,在使用中有较大的局限性,而等精度频率计不但具有较高的测量精度,而且整个频率区域能保持恒定的测试精度。本课题主要是应用已做好的8051 IP核设计等精度频率计。1.2 主要任务在了解数字频率计的基础上分析等精度频率计相对于传统频率计的优越性,研究等精度频率计的工作原理和实现方法,在FPGA开发板提供的硬件环境上设计程序运行的流程框图。用VHDL编写测频模块,对FPGA中的单片机核编写输入、显示等程序,完成等精度频率计的设计。系统总框架图如图1-1所示。图1-1 实验系统总框架图第二章 杭州康芯公司KX2C5F+开发板介绍2.1 KX2C5F+系统简介KX2C5F+系统是康芯公司电子设计竞赛作品板,其系统硬件结构组成如下:1、KX2C5F+系统选用Altera公司CycloneII系列EP2C5T144 FPGA。其包含4608个逻辑宏单元、两个锁相环,约20万门、约12万RAM bit。2、含全兼容工业级8051核、其主频最高可达250MHz,是普通单片机速度的20倍。3、EPM3032CPLD、1M EPCS1 Flash、蜂鸣器、20MHz晶振、8键、1数码管,HS162-4LCD液晶显示器。4、JTAG、VGA、RS232接口、PS2口、USB电源口。5、FPGA编程器、字符型液晶驱动口(可直接接多种类型字符型液晶)、点阵型液晶驱动口(可直接接数字彩色或黑白点阵型液晶)。根据任务要求设计主要应用到EP2C5T144 FPGA、USB电源口、JTAG下载口以及字符型液晶驱动口,其硬件系统结构框图如图2-1所示:图2-1 硬件系统结框图构图2.2 主要应用可配置于KX2C5F+系统FPGA的单片机CPU核与传统MCS-51单片机高度兼容(极个别指令不兼容),但速度约为传统单片机的20倍,在FPGA芯片优化良好的条件下,主频最高可达250MHz;同样用C或汇编语言完成软件设计。目前许多实用SOC应用系统都使用此类通用CPU实现设计。 电子设计竞赛中,需要实现高速算法或高速控制的项目越来越多,如此高速的单片机核,几乎可以用来完成某些DSP功能,如语音处理,压缩和频谱分析等。再加上FPGA本身的高速性能,完成许多高性能指标的系统功能将变得十分容易;而把CPU、锁相环、数据RAM、程序ROM、接口模块、通信模块、显示控制模块、数据采样和信号发生模块等等,都放在同一片FPGA内,从而构成SOC系统,这将使系统的设计效率和系统性能获得极大的提高,这也是现代电子设计技术的发展方向。KX2C5F+系统开发板可以应用于很多设计。这里,根据论文的目的,在完成设计任务时,用8051 IP核加上锁相环、RAM以及ROM构成一个单片机。通过锁相环将单片机时钟设置为40MHz。此单片机的任务是将测得的频率在LCD显示。第三章 系统设计3.1 8051单片机介绍MSC-51系列单片机的内部结构由八部分组成,以80C51单片机为例,其内部按功能可划分为CPU、存储器、I/O端口、定时/计数器、中断系统等模块。MSC-51系列单片机芯片有40个引脚,是采用HMOS工艺制造,双列直插(DIP)方式封装的芯片,其引脚如图3-1所示。图3-1 MCS-51系列单片机引脚3.2 8051单片机IP软核介绍CPU8051V1是康芯公司提供的8051单片机核,由VQM原码(Verilog Quartus Mapping File)表述:CPU8051V1.vqm,可直接调用。与普通MCS-51系列单片机一样,8051单片机核也含有8位复杂指令CPU,其结构框图如图3-2所示。8051单片机核的指令系统与8051/2、8031/2等完全兼容,硬件部分也基本相同,例如可接64KB外部存储器,可接256字节内部数据RAM,含两个16位定时/计数器,全双工串口,含节省功耗工作模式,中断响应结构等等。不同之处主要有:1、8051V1是以网表文件的方式存在的,只有通过编译综合,并载入FPGA中才以硬件的方式工作,而普通8051总是以硬件方式存在的;2、8051V1无内部ROM和RAM,所有程序ROM和内部RAM都必须外接。从图3-2可见,它包含了“数据RAM端口”和“程序存储器端口”,是连接外接ROM、RAM的专用端口(此ROM和RAM都能用LPM_ROM和LPM_RAM在同一片FPGA中实现)。然而普通8051芯片的内部RAM是在芯片内的,而外部ROM的连接必须以总线方式与其P0、P2口相接(AT89S51的ROM在芯片内,CPU核外)。3、以软核方式存在能进行硬件修改和编辑;能对其进行仿真和嵌入式逻辑分析仪实现实时时序测试;能根据设计者的意愿将CPU、RAM、ROM、硬件功能模块和接口模块等实现于同一片FPGA中(即SOC)。4、与普通8051不同,8051单片机核的4个I/O口是分开的。例如P1口,其输入端P1I和输出端P1O是分开的,如果需要使用P1口的双向口功能,必须外接一些电路才能实现。 图3-2 8051V1原理图元件3.3 8051单片机IP软核实用系统构建8051V1核在接上了ROM和RAM后就成为一个完整的8051单片机了,图3-3是根据任务要求绘制的8051V1核实用系统的最基本构建顶层原理图,主要由4个部件构成:1、8051V1核。图中的CPU8051V1即单片机核,由VQM原码表述:CPU8051V1.vqm,可以直接调用。该元件可以与其他不同语言表述的元件一同综合与编译。2、嵌入式锁相环PLL50。载入锁相环,设置其输入频率为20MHz,输出频率为40MHz,8051V1能接受的工作时钟频率上限取决于FPGA的速度级别。3、程序ROM,LPM_ROM。采用ROM容量的大小也取决于FPGA所含的嵌入RAM的大小。图3-3中设置的ROM容量是4K字节,对于一般的应用足够了。此ROM可以加载HEX格式文件作为单片机的程序代码。HEX程序代码可以直接使用普通8051单片机程序编译器生成。4、数据RAM,LPM_RAM。图3-3中设置的LPM_RAM容量是256字节。高128字节须用间接寻址方式访问。这里的LPM_ROM和LPM_RAM调用方法参见其它资料。图3-3中,P0I7.0、P1I7.0、P2I7.0、P3I7.0分别为P0、P1、P2、P3口的输入口;P0O7.0、P1O7.0、P2O7.0、P3O7.0分别为P0、P1、P2、P3口的输出口。各口的应用再根据任务要求进行连线。 图3-3 基本8051CPU核应用 3.4 等精度频率计设计3.4.1等精度测频原理等精度测频的实现方法可简化为图3-4所示。CNT1和CNT2是两个可控计数器,标准频率信号设定为40MHz从CNT1的时钟输入端CLK输入,经过整形后的被测信号从CNT2的时钟输入端CLK输入,当预置门控信号为高电平时,经过整形后的被测信号的上升沿通过D触发器的Q端同时启动CNT1和CNT2。CNT1、CNT2同时对标准频率信号和经整形后的被测信号进行计数,分别为Ns与Nx。当预置门信号为低电平的时候,后面而来的被测信号的上升沿将使两个计数器同时关闭,所测得的频率为(Fs/Ns)*Nx.则等精度测量方法测量精度与预置门宽度的标准频率有关,与被测信号的频率无关。图3-4 等精度测频实现原理等精度测频方法是在直接测频方法的基础上发展起来的。它的闸门时间不是固定值,而是被测信号周期的整数倍,即与被测信号同步。因此除了对被测信号计数所产生的1个周期误差,并且达到了在整个测试频率阶段的等精度测量。如图3-5在测试过程中,有两个计数器分别对标准信号和被测信号同时计数。首先由单片机给出给出闸门信号,在t1时间内保持高电平,当单片机赋给预置门高电平信号时实际闸门并未打开此时计数器并不开始计数,而是等到被测信号的上升沿到来时才打开实际闸门,计数器才真正开始计数,然后单片机发给预置闸门低电平关闭信号,计数器并不立即停止计数,而是等到被测信号的上升沿到来时才关闭实际闸门信号开始结束计数,完成一次测试过程。可以看出,实际闸门时间为t1,预置闸门时间为t,两个闸门时间并不严格相等,但是差值不超过被测信号的一个周期。图3-5 等精度测频原理设在一次实际闸门时间t中计数器对被测信号的计数值为Nx,对标准信号的计数值为Ns。标准信号的频率为fs,则被测信号的频率如下式: fx=(Nx/Ns)*fs 在测量中,由于fx计数的启停时间都是由该信号的上升沿出发的,在闸门时间t内对fx的计数Nx无误差,对fs的计数Ns最多相差一个数的误差, =1/fs 由上式可以看出,测量频率的相对误差与被测信号频率的大小无关,仅与标准信号频率有关,即实现了整个测量频段的等精度。标准频率越高,测量的相对误差越小。在保证精度测量不变的前提下,提高标准信号频率,可是闸门时间缩短,即提高测试速度。 3.4.2等精度测频实现等精度频率计的实现可以简单地用图3-6和波形图3-7来说明设。图3-4中“预置门控信号”CL可由单片机发出,可以证明,在1秒至0.1秒间的选择范围内,CL的时间宽度对测量精度几乎没有影响,在此设其宽度为Tpr。BZH和TF模块是两个可控的32位高速计数器,BENA和ENA分别是它们的计数允许信号端,高电平有效。标准频率信号40MHz从BZH的时钟输入端BCLK输入,设置频率为Fs;经整形后的被测信号从与BZH相似的32位计数器TF的时钟输入端TCLK输入,设置真实频率值为Fxe,被测频率为Fx。等精度频率计原理如下图3-6所示:图3-6 等精度频率计设计原理图 bclk为标准频率信号设定为40MHz,tclk为被测信号,被测信号的范围为1Hz到40MHz。clr为清零信号,cl为预置门信号,start为实际闸门信号,sel为数据选择器的控制端口,data为数据传送端口。测试开始前,首先发出一个清零信号CLR,使两个计数器和D触发器置0,同时D触发器通过信号ENA,禁止两个计数器计数。这是初始化操作。然后由单片机发出允许测频命令,即令预置门控信号CL为高电平这时D触发器要一直等到被测信号的上升沿通过Q端时才把start置1,与此同时,将同时开启计数器BHZ和TF,进行计数,当Tpr秒后,预置门信号CL被单片机置为低电平,但此时两个计数器并没有停止计数,一直等到随后而至的被测信号的上升沿到来时start为0,才通过D触发器将这两个计数器同时关闭图3-7等精度频率计波形仿真设在一次预置门时间中对被测信号的计数值为Nx,对标准频率计数值为Ns,则下式成立:Fx/Nx=Fs/Ns不难得到测得的频率为:Fx=(Fs/Ns)*Nx3.4.3测量占空比的原理设定中间信号pl,分别取被测信号的一个正脉宽和一个负脉宽作为门控信号,对标准频率进行计数,对正脉宽的计数值为N1,对负脉宽的计数值为N2,则周期计数值为N1+N2,于是占空比为:占空比=N1*100%)/(N1+N2)图3-83.4.4测量占空比的实现 对于占空比的测量,可以通过测量正反两脉宽的计数值来获得。设BZH对正脉宽的计数值为N1,对负脉宽的计数值为N2,则周期计数值为N1+N2,于是占空比为:占空比=(N1*100%)/(N1+N2)占空比的测量流程如下图3-9所示:图3-9 占空比测量流程图测量占空比的波形仿真见下图3-10占空比仿真波形,BCLK为标准频率信号为40MHz,TCLK为被测频率信号,CL预置门信号设置为低电平,给清零信号CLR一个有效电平(高电平有效),等待EEND由低电平跳变为高电平时表示对被测信号的一个负脉宽计数结束,此时读取标准计数器的数据标记为N1,然后再给出清零信号CLR一个有效电平,预置门控信号设置为高电平,等待EEND由低电平跳变为高电平时表示对被测信号的一个正脉宽计数结束,此时再读取标准计数器的数据标记为N2,对N1,N2进行简单的算术运算就可以得到占空比。图3-10占空比仿真波形3.5单片机的功能3.5.1数据传输与计算首先用VHDL语言编写一个八选一数据选择器,其封装模块如图3-8所示,其主要功能是由P0口的3根输出信号控制,将32位测频数据分成8个四位依次送进单片机P2的输入口。图3-11 八选一数据选择器BZQ接标准频率计数器的数据口,TSQ接被测信号计数器的数据口,sel2、sel1、sel0接单片机的P0.6、P0.5、P0.4,DATA7.0接单片机的P2口,单片机程序在Keil C 环境下开发,实现将32位二进制测频数据分成8个四位由高位到低位的顺序依次送到单片机。单片机程序设计思想:设置P0.6、P0.5、P0.4作为数据选择器的地址输入端,设置从000-111情况下依次将标准频率计数器和被测频率计数器的数据分别送到单片机。定义一个32位的数据类型,把每次接受的8位数据通过“位移”指令和简单的加法还原为32位,再进行算术运算,得到想要的结果,驱动液晶显示出来。3.5.2 液晶显示液晶显示器以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,在袖珍式仪表和低功耗应用系统中得到越来越广泛的应用。本实验使用字符型液晶模块HS162-4。HS162-4 液晶模块是一种用5x7点阵图形来显示字符的液晶显示器,根据显示的容量可以分为1行16个字、2 行16个字等。HS162-4采用标准的16脚接口,其中VSS为地电源,VDD接5V正电源。V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“阴影”,使用时可以通过一个10K 的电位器调整对比度。RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。LEDA和LEDK为背光电源,LEDA接5V正电源,LEDK接GND。D0D7为8位双向数据线。液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,表3-1 是HS162-4 的内部显示地址。 表1-1 HS162-4内部显示地址表即,第1行的显示开始地址应为:80H;第2行的显示开始地址应为:C0H。液晶的三个控制信号RS、RW、E,分别接单片机的P3.0、P3.1、P3.2,8位数据线接P1口,在程序中设置三个按键切换不同的功能:K2(复位)显示“Qing Guang Ming ” “ Bi Ye She Ji ”K3(测频率)- 显示“FREQ: ” “测量所得的频率 ”K4(测占空比)-显示“DUTY: ” “所测得的占空比”按键控制的液晶显示流程图如下图3-12所示:图3-12按键控制液晶显示流程图3.6单片机与FPGA的组合应用把FPGA程序和单片机程序分别调试好后再组合起,锁定引脚、编译、下载进行联合调试。整体流程图如下图所示,bclk接标准频率信号40MHz,tclk接被测信号,clr接P0.0口,cl接P0.1口,spul接P0.2口,sel2、sel1、sel0分别接单片机P0.6、P0.5、P0.4口,start接P.7口,eend接P0.3口,data接P2口,按键K2是复位开关显示初始化内容,按键K3接P3.3测频显示,按键K4接P3.4测占空比显示。图3-13总体框图第四章 程序调试4.1 等精度频率计程序把等精度频率计模块与单片机系统正确确连接,锁定好引脚,特别注意不用的单片机I/O口要接地。连线与引脚锁定分别见下图4-11、4-12。图4-11图4-124.2 单片机程序和VHDL程序编译在一起下载到FPGA中点击ROM,文件路径该成如图4-21所示点“./ASM”表示把单片机的hex文件存在当前工程ASM中。图4-21点击“Tool”选择“Programmer”,再点击“start”进行下载“progress”显示100%表示下载成功,如下图4-22图4-22第五章 结果讨论信号发生器发发出的频率实际值测量值误差16MHz1999799Hz1997929Hz0.0116%10MHz9999213Hz9989659Hz0.095%9MHz8999195Hz89906830.094%100K99970Hz99897Hz0.037%50K49985Hz49948Hz0.074%20K19994Hz19979Hz0.075%10K9997Hz9990Hz0.07%1K999Hz999Hz0500Hz499Hz499Hz0300Hz2999Hz299Hz0200Hz199.9Hz199Hz070Hz69.9Hz69Hz0总结本课题实现了用FPGA中的单片机IP核设计等精度频率计的系统。用VHDL语言设计采集频率的部分,将测频结果送到8051单片机IP核中处理,8051单片机软核再驱动液晶显示测频和占空比数据。本课题主要目的是学会8051单片机IP软核的应用,了解其与传统MCS-51单片机高度兼容(极个别指令不兼容),但速度为传统单片机的20倍,优化良好的条件下,主频最高可达250MHz,可实现SOC片上系统设置的优势。此外,等精度频率计设计、单片机C语言的编写,也让我受益很多。致 谢在这次毕业设计的过程中,我得到很多老师和同学的帮助,我的指导老师孙妍老师一直对我耐心指导,遇到问题时给我指出很有效的解决方法。物理学院全体电子教研组的老师都为我们全班同学的毕业设计付出了辛勤的劳动。在此,谨向导师表示崇高的敬意和衷心的感谢!同时,也对我们08届电子信息科学专业的各位领导和老师的辛苦劳动表示由衷感谢!参考文献1. 潘松 黄继业,EDA技术实用教程,科学出版社,20092. 阎石等,数字电子技术基础,高等教育出版社,20053. 李云 侯传教等,VHDL电路实用教材,机械工业出版社,20094. 谭浩强,C程序设计,清华大学出版社,20075. 倪云峰等,单片机原理与应用,西安电子科技大学出版社,20096. 陈海宴,51单片机原理及应用,北京航空航天大学出版社,2010附录附录1:等精度频率计相关程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity etester is port(bclk:in std_logic; tclk:in std_logic; clr:in std_logic; cl:in std_logic; spul:in std_logic; start:out std_logic; eend:out std_logic; sel:in std_logic_vector(2 downto 0); data:out std_logic_vector(7 downto 0); end etester; architecture behav of etester is signal bzq:std_logic_vector(31 downto 0); signal tsq:std_logic_vector(31 downto 0); signal ena:std_logic; signal ma,clk1,clk2,clk3:std_logic; signal q1,q2,q3,bena,pul:std_logic; signal ss:std_logic_vector(1 downto 0); begin start<=ena; data<=bzq(7 downto 0) when sel="000" else bzq(15 downto 8) when sel="001" else bzq(23 downto 16) when sel="010" else bzq(31 downto 24) when sel="011" else tsq(7 downto 0) when sel="100" else tsq(15 downto 8) when sel="101" else tsq(23 downto 16) when sel="110" else tsq(31 downto 24) when sel="111" else tsq(31 downto 24);bzh:process(bclk,clr) begin if clr='1' then bzq<=(others=>'0'); elsif bclk'event and bclk='1' then if bena='1' then bzq<=bzq+1; end if; end if; end process;tf:process(tclk,clr,ena) begin if clr='1' then tsq<=(others=>'0'); elsif tclk'event and tclk='1' then if ena='1' then tsq<=tsq+1; end if; end if ; end process; process(tclk,clr) begin if clr='1' then ena<='0' elsif tclk'event and tclk='1' then ena<=cl; end if; end process; ma<=(tclk and cl)or not(tclk or cl); clk1<=not ma; clk2<=ma and q1; clk3<=not clk2; ss<=q2&q3; dd1:process(clk1,clr)beginif clr='1' then q1<='0'elsif clk1'event and clk1='1' then q1<='1'end if;end process;dd2:process(clk2,clr)beginif clr='1' then q2<='0'elsif clk2'event and clk2='1' then q2<='1'end if;end process;dd3:process(clk3,clr)beginif clr='1' then q3<='0'elsif clk3'event and clk3='1' then q3<='1'end if;end process;pul<='1' when ss="11" else '0'eend<='1'when ss="11" else '0'bena<=ena when spul='1' else pul when spul='0' else pul;end behav;附录2 单片机相关程序#include<reg52.h> #include<stdio.h> #include<intrins.h>/*等精度频率计端口定义*/sbit clr=P00;sbit cl =P01;sbit spul=P02;sbit sel2=P06;sbit sel1=P05;sbit sel0=P04;sbit start=P07;sbit eend=P03;sbit k3=P33;sbit k4=P34;/*液晶的控制端口定义*/sbit RS = P30; sbit RW = P31; sbit E = P32; #define d P2 /等精度频率计的数据口#define Data P1 /液晶的数据口 char data Test1=" "char data TimeNum=" "void DelayUs(unsigned int us) unsigned int uscnt; uscnt=us>>1; while(-uscnt);void DelayMs(unsigned int ms) while(-ms) DelayUs(250); DelayUs(250); DelayUs(250); DelayUs(250); /*液晶显示程序*/void WriteCommand(unsigned char c) DelayMs(5); E=0; RS=0; RW=0; _nop_(); E=1; Data=c; E=0;void WriteData(unsigned char c) DelayMs(5); E=0; RS=1; RW=0; _nop_(); E=1; Data=c; E=0; RS=0;void ShowChar(unsigned char pos,unsigned char c) unsigned char p; if (pos>=0x10) p=pos+0xb0; else p=pos+0x80; WriteCommand (p); WriteData (c); void ShowString (unsigned char line,char *ptr) unsigned char l,i; l=line<<4; for (i=0;i<16;i+) ShowChar (l+,*(ptr+i);void InitLcd() WriteCommand(0x38); WriteCommand(0x38); WriteCommand(0x06); WriteCommand(0x0c); WriteCommand(0x01); void init()cl=0;clr=1;spul=1;DelayMs(2);clr=0;DelayMs(2);/*主程序*/void main(void)unsigned long b,t,s,n1,n2;InitLcd(); sprintf(Test1,"Qing Guang Ming "); /初始化界面显示ShowString(0,Test1);sprintf(TimeNum,"Bi Ye She Ji ");ShowString(1,TimeNum); while(1) if(k3=0); /按键K3按下,测量频率DelayMs(5);if(k3=0) init();cl=1;DelayMs(821);cl=0;while(start=1);sel2=0;sel1=1;sel0=1;b=d;sel2=0;sel1=1;sel0=0;b <<= 8;b=b+d;sel2=0;sel1=0;sel0=1;b<<=8;b=b+d;sel2=0;sel1=0;sel0=0;b<<=8;b=b+d;sel2=1;sel1=1;sel0=1;t=d;sel2=1;sel1=1;sel0=0;t<<=8;t=t+d;sel2=1;sel1=0;sel0=1;t<<=8;t=t+d;sel2=1;sel1=0;sel0=0; t<<=8;t=t+d;s=(40000000/b)