找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 61|回复: 0
打印 上一主题 下一主题
收起左侧

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)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表