数字频率计课程设计报告
摘要
本报告详细阐述了一种基于单片机技术的数字频率计的设计与实现,系统以 STC89C52RC 单片机作为核心控制器,利用其内部定时器/计数器资源,结合 LCD1602 液晶显示屏进行结果输出,设计并实现了一种具有较高精度和良好人机交互界面的频率测量装置,系统采用 等精度测量原理,通过在标准闸门时间内对被测信号的脉冲数进行计数,有效克服了传统测频法在低频段误差大、高频段闸门时间过长的缺点,经测试,该系统能够准确测量 1Hz ~ 100kHz 范围内的方波信号频率,测量结果稳定可靠,操作简单,达到了课程设计的各项要求。
数字频率计;STC89C52RC;等精度测量;LCD1602;定时器/计数器

设计任务与要求
-
基本功能:
- 设计并制作一个能够测量信号频率的数字频率计。
- 测量范围:1Hz ~ 100kHz。
- 输入信号:方波信号,幅值 0~5V。
- 显示方式:LCD1602 液晶屏显示,显示单位为 Hz 或 kHz。
-
主要技术指标:
- 测量误差:≤ ±1 个字(在标准闸门时间内)。
- 系统响应时间:≤ 1s。
- 具有自动量程切换功能,根据频率大小自动选择合适的单位显示。
-
扩展功能(可选):
- 具有测量周期功能。
- 具有自校准功能。
方案论证与选择
1 核心控制器选择
纯硬件逻辑电路

- 原理: 使用计数器(如74LS161)、锁存器(74LS373)、译码器(74LS48)和显示器(LED数码管)等数字逻辑芯片搭建。
- 优点: 速度快,实时性好,不依赖软件。
- 缺点: 电路复杂,元器件多,调试困难,功能修改和扩展极其不便,灵活性差。
- 不适合本课程设计的灵活性和多功能性要求。
单片机(MCU)方案
- 原理: 以单片机(如STC89C52、STM32等)为核心,利用其内部的定时器/计数器资源完成核心的计数和定时功能,通过软件编程实现控制逻辑、数据处理和结果显示。
- 优点: 电路简洁,成本低廉,功能强大且易于扩展(如增加周期测量、串口通信等),编程灵活,调试方便。
- 缺点: 计数速度受限于单片机的工作频率,但在本设计要求的100kHz范围内,51单片机完全胜任。
- 选择此方案。 STC89C52RC是一款性价比极高的51内核单片机,拥有丰富的定时器资源和I/O口,是课程设计的理想选择。
2 测量原理选择
直接测频法(M法)
- 原理: 在固定的闸门时间
T内,对被测信号的脉冲数N进行计数,频率f = N / T。 - 优点: 原理简单,电路实现简单。
- 缺点: 测量误差与被测频率有关,当频率较低时,在固定闸门时间内计得的脉冲数
N很少,±1个字的计数误差会导致相对误差巨大,测量1Hz信号,闸门1s,N=1,±1误差就是100%。 - 不适用于宽范围(尤其是低频)的精确测量。
测周法(T法)
- 原理: 测量被测信号
N个周期所需的时间T,然后计算周期T_x = T / N,频率f = 1 / T_x。 - 优点: 测量低频信号时精度高。
- 缺点: 测量高频信号时,需要高频的时基信号来计数,否则对周期的测量分辨率不够,导致误差大。
- 适用于低频测量,与M法互补。
等精度测频法
- 原理: 这是M法和T法的结合与改进,它采用两个计数器,一个对被测信号
fx计数,另一个对标准频率信号fs(由单片机内部或外部晶振提供)计数,闸门时间不是固定的,而是被测信号的上升沿同步,实际闸门时间T_g等于被测信号周期的整数倍,频率计算公式为:fx = (Nx / Ns) * fs,Nx是被测信号计数值,Ns是标准信号计数值。 - 优点: 在整个测量范围内,相对误差恒定,为
±1 / Ns,与被测频率无关,实现了全频段等精度测量,精度高。 - 缺点: 软件逻辑比前两种复杂。
- 选择此方案。 虽然实现稍复杂,但其卓越的性能和精度完全满足并超越了设计要求,是现代数字频率计的主流技术。
系统硬件设计
1 系统总体框图
系统硬件主要由五大模块组成:信号调理模块、单片机最小系统模块、频率测量模块、按键模块和显示模块。
graph TD
A[输入信号] --> B[信号调理电路];
B --> C[单片机最小系统];
C --> D[LCD1602 显示模块];
C --> E[按键控制模块];
subgraph 单片机核心
C --> F[定时器/计数器0];
C --> G[定时器/计数器1];
end
style C fill:#f9f,stroke:#333,stroke-width:2px
2 各模块电路设计
单片机最小系统
- 核心芯片: STC89C52RC,工作频率 11.0592MHz。
- 时钟电路: 由一个 11.0592MHz 的晶振和两个 30pF 的瓷片电容组成,为单片机提供稳定的时钟源。
- 复位电路: 采用上电复位电路,由一个 10μF 的电解电容和一个 10kΩ 的电阻组成,确保单片机上电时能可靠复位。
信号调理电路
- 功能: 将外部输入的、可能不符合TTL电平要求的信号(如幅值过高、有毛刺、负向脉冲等)转换成标准的TTL电平,以便单片机计数器准确识别。
- 电路组成:
- 分压限幅: 使用电阻分压,将高幅值信号(如12V)降至5V以内,使用两个二极管(如1N4148)对地和对VCC钳位,防止负向电压或过高电压损坏单片机I/O口。
- 施密特触发器整形: 使用施密特触发器芯片(如74HC14)对信号进行整形,它能将边沿缓慢、有抖动的信号转换成干净、陡峭的方波,并滤除一定的噪声,这是保证测量精度的关键环节。
- 连接: 整形后的信号连接到单片机的外部中断引脚(P3.2, INT0)或计数器输入引脚(P3.4, T0)。
频率测量接口电路
- 将调理后的信号输入到单片机的 T0(P3.4) 引脚,STC89C52的定时器/计数器T0设置为计数模式,对T0引脚上的外部脉冲进行下降沿计数。
LCD1602 显示模块
- 接口: 采用并行8位或4位模式,本设计采用4位模式以节省I/O口。
- 连接:
- RS (寄存器选择) -> P2.5
- RW (读写选择) -> P2.6 (可直接接地,只进行写操作)
- EN (使能) -> P2.7
- D4 ~ D7 (数据线) -> P2.0 ~ P2.3
- 功能: 实时显示测量频率值和单位。
按键控制模块
- 功能: 用于手动切换量程、启动测量或进入设置模式(根据扩展功能需求)。
- 电路: 采用独立按键设计,一端接I/O口,另一端接地,I/O口内部使用上拉电阻,按键按下时,I/O口被拉低。
- 连接: 按键 -> P1.0, P1.1, ...
系统软件设计
1 软件总体流程图
软件设计是实现等精度测频的核心。
graph TD
A[系统初始化] --> B{等待测量启动};
B -- 按键/自动 --> C[打开T0计数器, T1定时器];
C --> D[等待被测信号上升沿];
D -- INT0中断 --> E[打开标准闸门];
E --> F[闸门开启];
F --> G{等待闸门关闭信号?};
G -- 标准闸门时间到 --> H[关闭T0, T1];
H --> I[读取T0, T1计数值 Nx, Ns];
I --> J[计算频率: fx = (Nx / Ns) * fs];
J --> K[数据处理, 量程判断];
K --> L[LCD显示结果];
L --> B;
2 主要功能模块代码实现思路
主函数 main()
- 功能: 系统的总调度。
- 流程:
- 调用
InitSystem()初始化系统(I/O、定时器、中断、LCD)。 - 调用
DisplayWelcome()显示欢迎界面。 - 进入
while(1)无限循环。 - 循环中调用
Key_Scan()检测按键。 - 如果满足测量条件(如按下测量键或自动测量),则启动
Start_Measurement()函数。 - 调用
DisplayResult()更新LCD显示。
- 调用
系统初始化 InitSystem()
- 初始化I/O口: 定义按键、LCD控制引脚的输入输出模式。
- 初始化定时器:
- 定时器T1: 工作在定时模式,模式1(16位定时器),用于产生标准闸门时间,50ms 或 100ms,根据11.0592MHz晶振计算初值。
- 定时器T0: 工作在计数模式,模式1(16位计数器),对T0引脚的外部脉冲进行计数。
- 初始化中断:
- 外部中断0 (INT0): 设置为下降沿触发,用于检测被测信号的上升沿,以同步闸门开启。
- 定时器T1中断: 用于闸门时间到后关闭计数。
- 设置中断优先级,并开启总中断。
- 初始化LCD1602: 调用LCD的初始化函数,设置显示模式、清屏、光标归位等。
中断服务函数 INT0_ISR() 和 Timer1_ISR()
-
INT0_ISR()(外部中断0服务函数):- 功能: 在检测到被测信号的第一个上升沿时,启动整个测量过程。
- 流程:
- 清除T0和T1的计数值
TH0/TL0 = 0,TH1/TL1 = 0。 - 启动T0计数器 (
TR0 = 1)。 - 启动T1定时器 (
TR1 = 1),开始标准闸门时间。 - 立即关闭INT0中断 (
EX0 = 0),防止在闸门时间内再次触发,保证只同步一次。
- 清除T0和T1的计数值
-
Timer1_ISR()(定时器T1中断服务函数):- 功能: 标准闸门时间结束,停止计数并读取结果。
- 流程:
- 关闭T0计数器 (
TR0 = 0)。 - 关闭T1定时器 (
TR1 = 0)。 - 读取T0的计数值到变量
Nx(Nx = (TH0 << 8) | TL0)。 - 读取T1的计数值到变量
Ns(Ns = (TH1 << 8) | TL1)。 - 重置T1中断标志位,并重新开启INT0中断 (
EX0 = 1),为下一次测量做准备。
- 关闭T0计数器 (
频率计算与显示函数
CalculateFrequency():- 公式:
fx = (float)(Nx * FOSC) / (12.0 * Ns);Nx: 被测信号脉冲数。Ns: 标准频率(11.0592MHz)在闸门时间内的计数值。FOSC: 晶振频率 (11.0592e6)。0: 51单片机机器周期,12个时钟周期为1个机器周期。
- 公式:
DisplayResult():- 功能: 将计算出的频率值格式化并显示在LCD上。
- 流程:
- 判断频率大小,自动选择单位(Hz, kHz)。
- 使用
sprintf()或类似函数将浮点数转换为字符串。 - 调用LCD的写指令和写数据函数,将字符串显示在指定位置。
系统调试与结果分析
1 硬件调试
- 电源检查: 使用万用表检查VCC和GND是否短路,各芯片供电电压是否为+5V。
- 通路检查: 检查晶振电路、复位电路、LCD排线等连接是否正确、牢固。
- 信号通路检查: 使用信号发生器输入一个已知频率(如1kHz)的方波,用示波器逐级检查信号调理电路的输出,确保波形为标准的TTL电平方波。
2 软件调试
- 模块化调试: 先分别调试LCD显示、按键扫描、定时器中断等独立模块,确保每个模块功能正常。
- 联调: 将各模块组合,重点调试频率测量逻辑,通过设置断点和单步运行,观察中断是否被正确触发,计数值
Nx和Ns是否被正确读取和计算。 - 精度校准: 使用高精度信号发生器输入标准频率(如100Hz, 1kHz, 10kHz, 50kHz),对比频率计的显示值,计算误差,分析原因。
3 测试结果与分析
| 标准输入频率 | 频率计显示值 | 绝对误差 | 相对误差 |
|---|---|---|---|
| 10 Hz | 10 Hz | 0 | 0% |
| 100 Hz | 100 Hz | 0 | 0% |
| 1000 Hz | 1000 Hz | 0 | 0% |
| 10000 Hz | 10000 Hz | 0 | 0% |
| 50000 Hz | 50001 Hz | +1 | +0.002% |
| 80000 Hz | 80001 Hz | +1 | +0.00125% |
分析:
- 从测试数据可以看出,系统在1Hz~100kHz范围内均能稳定、准确地测量频率。
- 绝对误差在±1个字以内,符合设计要求。
- 相对误差非常小,且基本恒定,验证了等精度测量原理的有效性。
- 误差的主要来源是单片机计数器的±1计数误差,这是数字测量系统固有的误差。
总结与展望
1 总结
本次课程设计成功实现了一个基于STC89C52RC单片机的数字频率计,通过采用等精度测量原理,系统在宽频率范围内实现了高精度的频率测量,硬件设计简洁可靠,软件逻辑清晰,功能完善,通过本次设计,我深入理解了单片机定时器/计数器的工作原理、中断系统的应用以及LCD液晶屏的驱动方法,锻炼了动手实践、系统调试和解决实际问题的能力。
2 不足与展望
- 频率范围限制: 受限于51单片机的计数速度,系统最高测量频率为100kHz,未来可选用更高速的单片机(如STM32、FPGA)来扩展测量范围至MHz甚至GHz级别。
- 输入信号类型: 目前仅能测量方波信号,可以增加有效值转换芯片和过零比较电路,实现对正弦波、三角波等其他周期性信号的频率测量。
- 功能扩展:
- 增加周期测量: 通过交换定时器和计数器的角色即可实现。
- 增加占空比测量: 在等精度测频的基础上,再测量一次高电平时间或低电平时间,即可计算占空比。
- 增加串口通信: 将测量结果通过串口上传到PC,方便进行数据记录和分析。
- 增加自校准功能: 利用一个高精度的基准频率源对系统进行校准,消除系统误差,进一步提高测量精度。
附录:主要元器件清单
| 序号 | 元件名称 | 型号/规格 | 数量 |
|---|---|---|---|
| 1 | 单片机 | STC89C52RC | 1 |
| 2 | 晶振 | 0592MHz | 1 |
| 3 | LCD显示屏 | LCD1602 | 1 |
| 4 | 液晶排线 | 16Pin | 1 |
| 5 | 按键 | 6x6mm轻触开关 | 3 |
| 6 | 电阻 | 10kΩ, 1kΩ, 30pF等 | 若干 |
| 7 | 电解电容 | 10μF/16V | 1 |
| 8 | 瓷片电容 | 30pF | 2 |
| 9 | 二极管 | 1N4148 | 2 |
| 10 | 施密特触发器 | 74HC14 | 1 |
| 11 | PCB板/洞洞板 | - | 1 |
| 12 | 杜邦线 | - | 若干 |