一、設計功能與技術指標
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 語言編寫,采用中斷驅動機制,軟件總體流程圖如下:
2.png (33.24 KB, 下載次數: 0)
下載附件
2025-6-28 17:30 上傳
圖 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)
2025-6-28 17:35 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|