51单片机的数字频率计

51单片机的数字频率计,第1张

系统由定时器0中断子函数、定时器1中断子函数、延时子函数、按键消抖子函数、闸门控制子函数、主函数和数据定义这几部分组成。

      闸门时间由定时器1控制,初始为2s,可以通过按键加减,范围为2s到7秒。闸门时间就是采样时间,闸门时间越长,测量精度越准确。

      由P3.4输入信号,低电平有效,触发T0外部中断。当T0触发中断的时候执行的程序。这里只进行了一个 *** 作,t0++。所以,t0的值表示触发了几次中断,也就表示接受到的脉冲几次从0到65536。所以会有t0*65536。 另外,由于计时的机制是THO++、TL0++,所以,THOTL0就表示当前的计数值。THOTLO- 初值就可以确定没有触发中断定时多少。TH0*256==TH0*2^8,实质就是左移8位,就是拼接TH0跟TL0的处理。

所以频率的核心算法为

 

daimao=(t0*65536+TH0*256+TL0)/n

程序框图

总源程序

#include "reg52.h"

#define uchar unsigned char

typedef unsigned int uint

sbit w1=P2^0

sbit w2=P2^1

sbit w3=P2^2

sbit w4=P2^3

sbit w5=P2^4

sbit w6=P2^5

sbit jia=P1^6

sbit jian=P1^7

sbit s=P3^7//启动

bit flag//标签

uchar s1,s2,s3,s4,s5,s6, shu=1//控制数组取值

uchar t0,t1,t2,a

unsigned long m=5,n//m为闸门时间

int y

unsigned long daimao//频率

unsigned char code table1[]={0xc0,0xf9,0xa4,0xb0, //闸门时间数组0-f

0x99,0x92,0x82,0xf8,

0x80,0x90,0x88,0x83,

0xc6,0xa1,0x86,0x8e}

unsigned char code table2[]={0xc0,0xf9,0xa4,0xb0, //频率数组0-f

0x99,0x92,0x82,0xf8,

0x80,0x90,0x88,0x83,

不知道你这程序是哪弄来的,里面有错误且代码风格不好,锁存器只能是电平锁存,触发器才用边缘触发的。要是做项目的话,这样的代码风格具有易读性,易维护性,和可移植性。还要多多学习哈,我为你提供下我写的代码风格,可以供你参考。

我针对【例 11.4】频率计锁存器模块来讲(提醒:锁存器只能是电平锁存),所以你这书上是错误的,并且时序电路只能用非阻塞赋值。

//=====================================================

//Author :XXXXXXXX

//Date:XXXXXXXX

//Function :XXXXXXXX

//=====================================================

module latch(

//Input ports

DI,

LOAD,

//Output ports

DO

)

//=====================================================

//Input and output declaration

//=====================================================

input [15:0] DI

input LOAD

output [15:0] DO

//=====================================================

//Wire and reg declaration

//=====================================================

wire [15:0] DI

wire LOAD

reg [15:0] DO//方法一

wrie [15:0] DO//方法二

//=====================================================

//Logic

//=====================================================

由于锁存器是电平锁存,因此是组合逻辑电路。而组合逻辑电路有两种实现方法,

针对这两种方法我都写出来供你参考。

注意事项:用always实现组合逻辑电路,被赋值的变量必须为reg型变量,因此在声明的时候为

reg[15:0] DO

用asssign实现组合逻辑电路,被赋值的变量必须为wire型变量,因此在声明的时候为

wire [15:0] DO 已在上面的声明中注明。

方法一:

always @ (*)

begin

if(LOAD)

DO<=DI

end

方法二:

assignDO = (LOAD) ? DI : DO

摘 要:文中运用VHDL语言,采用Top To Down的方法,实现8位数字频率计,并利用Isp Expert集成开发环境进行编辑、综合、波形仿真,并下载到CPLD器件中,经实际电路测试,该系统系统性能可靠。

关键词:EDA;VHDL;数字频率计;波形仿真;CPLD�

1引言

VHDL(Very High Speed Integrated Circuit Hardware Description Language,超高速集成电路硬件描述语言)诞生于1982年,是由美国国防部开发的一种快速设计电路的工具,目前已经成为IEEE(The Institute of Electrical and Electronics Engineers)的一种工业标准硬件描述语言。相比传统的电路系统的设计方法,VHDL具有多层次描述系统硬件功能的能力,支持自顶向下(Top to Down)和基于库(LibraryBased)的设计的特点,因此设计者可以不必了解硬件结构。从系统设计入手,在顶层进行系统方框图的划分和结构设计,在方框图一级用VHDL对电路的行为进行描述,并进行仿真和纠错,然后在系统一级进行验证,最后再用逻辑综合优化工具生成具体的门级逻辑电路的网表,下载到具体的CPLD器件中去,从而实现可编程的专用集成电路(ASIC)的设计。

数字频率计是数字电路中的一个典型应用,实际的硬件设计用到的器件较多,连线比较复杂,而且会产生比较大的延时,造成测量误差、可靠性差。随着复杂可编程逻辑器件(CPLD)的广泛应用,以EDA工具作为开发手段,运用VHDL语言。将使整个系统大大简化。提高整体的性能和可靠性。

本文用VHDL在CPLD器件上实现一种8 b数字频率计测频系统,能够用十进制数码显示被测信号的频率,不仅能够测量正弦波、方波和三角波等信号的频率,而且还能对其他多种物理量进行测量。具有体积小、可靠性高、功耗低的特点。

2数字频率计的基本设计原理

数字频率计的原理框图如图1所示。他主要由5个模块组成,分别是:脉冲发生器电路、测频控制信号发生器电路、计数模块电路、锁存器、译码驱动电路。�

当系统正常工作时,脉冲发生器提供的1 Hz的输入信号,经过测频控制信号发生器进行信号的变换,产生计数信号,被测信号通过信号整形电路产生同频率的矩形波,送入计数模块,计数模块对输入的矩形波进行计数,将计数结果送入锁存器中,保证系统可以稳定显示数据,显示译码驱动电路将二进制表示的计数结果转换成相应的能够在七段数码显示管上可以显示的十进制结果。在数码显示管上可以看到计数结果。�

3设计实现�

3.1系统方框图的划分和结构设计

根据数字频率计的系统原理框图(图1虚线框内),设计系统的顶层电路图如图2所示。�

图2中TESTCTL为测频控制信号发生器。TESTCTL的计数使能信号TSTEN能产生一个1 s宽的周期信号,并对频率计的每一计数器CNT10的ENA使能端进行同步控制:当TSTEN高电平时允许计数、低电平时停止计数。

REG32B为锁存器。在信号Load的上升沿时,立即对模块的输入口的数据锁存到REG32B的内部,并由REG32B的输出端输出,然后,七段译码器可以译码输出。在这里使用了锁存器,好处是可以稳定显示数据,不会由于周期性的清零信号而不断闪烁。

CNT10为十进制计数器。有一时钟使能输入端ENA,用于锁定计数值。当高电平时允许计数,低电平时禁止计数。图2中将8个十进制计数器CNT10级联起来实现8 b十进制计数功能。

SEVYM为七段译码显示驱动电路,可以将频率计数的结果译成能在数码管上显示相对应的阿拉伯数字,便于读取测量的结果。

为了实现系统功能,测频控制信号发生器TESTCTL、计数器CNT10、锁存器REG32B存在一个工作时序的问题,设计时需要综合考虑。

图3给出了系统的工作时序。图3中CLK是由图1中脉冲发生器产生的频率为1 Hz的标准时钟信号,当测频控制信号发生器TESTCTL的TSTEN端为高电平时允许计数、低电平时停止计数,在停止计数期间,测频控制信号发生器TESTCTL的Load端产生一个上升沿,将计数器在前1 s的计数值锁存进32 b锁存器REG32B中,并由8个7段译码器将计数结果译出稳定显示。锁存信号之后经过半个CLK周期,测频控制信号发生器TESTCTL的CLR�_CNT端产生一个上升沿,对计数器进行清零。为下1 s的计数 *** 作做准备。

为了产生这个时序图,首先有一个D触发器构成二分频器,在每次时钟CLK的上升沿到来使其值翻转。D触发器的输出高电平正好是1 s,因此可以作为测频控制信号发生器TESTCTL的TSTEN端,用来控制计数。而Load信号正好是TSTEN端信号的翻转。在计数结束后半个CLK周期,CLK与TSTEN都为低电平,这时CLR�_CNT产生一个上升沿作为清零信号。�

3.2各模块的VHDL源程序

采用VHDL描述数字频率计的电路时,根据图2所示的数字频率计系统顶层电路图,按照自顶向下的设计思路,编写各个模块的VHDL源程序,最后再对各个模块进行组合,编写顶层描述的VHDL源程序,由于篇幅所限,本文仅介绍数字频率计顶层描述的源程序,各个模块的VHDL源程序编写较为简单,可以根据各自的功能,相应地写出。

8位数字频率计的顶层描述VHDL源程序为:

4系统的功能仿真

Lattice公司推出的Isp Expert的数字系统设计软件,是一套完整的EDA软件,能够对所设计的数字电子系统进行时序仿真和功能仿真。

采用Lattice公司推出的Isp Expert EDA软件,对所编写数字频率计VHDL源程序进行编译、逻辑综合,自动地把VHDL描述转变为门级电路。然后进行波形仿真,编写的仿真测试向量文件如下(为仿真简单起见,测试一个66 Hz的周期信号):

仿真后得到的波形图如图4所示,从仿真波形上看测量的结果是准确的。还可以进一步修改测试向量文件,进行波形仿真。最后通过编程电缆,将所设计的内容下载到CPLD器件中,进行实物仿真。�

5结语

本文介绍了使用VHDL语言设计数字频率计的方法,并下载到CPLD中组成实际电路,这样可以简化硬件的开发和制造过程,而且使硬件体积大大缩小,并提高了系统的可靠性。同时在基本电路模块基础上,不必修改硬件电路,通过修改VHDL源程序,增加一些新功能,满足不同用户的需要,实现数字系统硬件的软件化。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/7736097.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-09
下一篇 2023-04-09

发表评论

登录后才能评论

评论列表(0条)

保存