一、设计功能与技术指标
1.1 设计目标本项目旨在基于 PIC16F18877 单片机,设计并实现一个单片机频率测量仪(频率计)。该系统可通过捕捉外部输入的方波信号,统计单位时间内脉冲数,并在 LCD1602 显示屏上以 Hz 为单位实时显示被测信号的频率值。系统采用软件定时+硬件捕捉的组合方式,兼顾响应速度和测量精度,适用于中低频率信号的测量需求。
1.2 系统功能具备 10 Hz ~ 10 kHz 范围的方波信号频率测量能力; 采用 CCP1 模块的上升沿捕捉方式进行脉冲统计; 利用定时器 TMR1 提供精确的时间基准(1s 周期); 通过 LCD1602 实时显示频率值; 支持频率范围异常判断与错误提示显示(Err Out); 测频结果刷新周期为 1 秒,可连续稳定工作; 支持中断方式工作,系统实时性强,资源占用低。
1.3 关键技术指标关键技术指标如下: 表 1 频率计关键技术指标及详细说明 | | 测量信号类型 | 方波、TTL 电平信号(0V-5V) | 测量范围 | 10 Hz ~ 10.00 kHz | 分辨率 | 1 Hz(基于单位时间内计数法) | 显示方式 | LCD1602 液晶屏,5 位十进制频率数字 + 单位“Hz” | 刷新周期 | 1 秒 | 测量误差 | ±1 Hz(不考虑输入信号抖动与干扰) | 捕捉方式 | CCP1 模块上升沿捕捉,中断响应计数 | 时间基准 | 定时器 TMR1,周期 5ms,累计 200 次构成 1 秒 | | 若频率 <10Hz 或 >10kHz,LCD 显示“Err Out” | 1.4 技术实现说明1. 使用内部时钟频率为 16 MHz,TMR1 工作在 Fosc/4(即 4MHz)下; 2. TMR1 每次计时 5ms,共 200 次形成 1 秒时间基准; 3. CCP1 模块配置为捕捉模式,每次接收到一个上升沿即触发中断,累计脉冲数; 4. 将 1 秒内捕获的脉冲数即视为频率值(单位:Hz); 5. 所得频率值由主循环中定时调用的LCD1602 模块进行显示刷新; 6. 若频率值超出设定量程,系统通过设定频率为0xFFFF 触发 LCD 显示“Err Out”,提示用户超出测量范围。 二、 设计思路本系统以 PIC16F18877 单片机为核心,结合其 CCP 捕捉模块、TMR1 定时器和 LCD1602 显示模块,构建一个高精度、低复杂度、易实现的数字频率计系统。系统通过在1秒时间基准内统计外部输入脉冲信号的个数,从而直接计算出信号频率。 2.1 整体架构系统主要由以下三个核心模块组成: 信号输入捕捉模块:使用 CCP1 模块捕捉输入方波的上升沿; 时间基准模块:采用 TMR1 定时器,每 5ms 计时一次,200 次构成 1 秒; 数据显示模块:通过 LCD1602 显示测得频率,若超限则显示错误信息。 2.2 硬件设计思路硬件设计基于Proteus平台完成,采用最小系统电路结构实现: 2.2.1 PIC16F18877 单片机最小系统时钟:外部晶振 16MHz(配置为 Fosc/4 模式); 电源:+5V 供电,带电容滤波; IO资源分配如下:RC2 作为CCP1捕捉输入(频率信号)端口,RD0–RD7是LCD1602数据口,RA3–RA5接LCD1602 控制引脚:EN、RW、RS。 2.2.2 输入信号模拟使用仿真器提供的信号源模块生成 10Hz~10kHz 的方波信号输入至 RC2; 2.3 软件设计思路系统软件基于 C 语言编写,采用中断驱动机制,软件总体流程图如下:
图 1 软件总体流程图 2.3.1 核心代码说明关键初始化配置如下: CCP1PPS =0x12; // 将RC2设置为CCP1输入 CCP1CON =0x85; // CCP1上升沿捕捉 CCPTMRS0 =0x01; // 将TMR1作为CCP1的时钟源 T1CLK =0x01; // Fosc/4为TMR1时钟,周期 = 1us TMR1H = (65536-20000)/256; TMR1L =(65536-20000)%256; TMR1IE = 1; // 开启TMR1中断 中断服务程序如下: void__interrupt() ISR(void) { if(CCP1IF) { CCP1IF = 0; pulse++; }
if(TMR1IF) { TMR1IF = 0; counter++; if(counter == 200) { counter = 0; if(pulse < 10 || pulse >10000) k = 0xFFFF; // 标记为错误 else k = pulse; pulse = 0; } } } LCD显示更新: if (k == 0xFFFF){ LCD1602cmd(0x80); // 显示首行 LCD1602Write('E'); LCD1602Write('r');LCD1602Write('r'); LCD1602Write(' '); LCD1602Write('O');LCD1602Write('u'); LCD1602Write('t'); } else { 显示频率数值(5位) }
Proteus仿真程序:
频率计.7z
(27.07 KB, 下载次数: 0)
|