标题: PIC16F18877单片机频率计设计 Proteus仿真程序 [打印本页]
作者: nullllllllllll 时间: 2025-6-28 12:09
标题: PIC16F18877单片机频率计设计 Proteus仿真程序
一、设计功能与技术指标
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)
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |