字心率計(jì)設(shè)計(jì):從脈搏波采集到數(shù)碼管顯示的完整方案)
簡(jiǎn)介這份畢業(yè)設(shè)計(jì)文檔面向電子信息、自動(dòng)化等專業(yè)的本科畢業(yè)生提供一套基于AT89S52單片機(jī)的數(shù)字心率計(jì)完整設(shè)計(jì)方案可用于課程設(shè)計(jì)、畢設(shè)參考或嵌入式入門實(shí)踐。資源包內(nèi)僅含1個(gè)doc文件約2.38MB即整篇畢業(yè)論文正文涵蓋摘要、總體方案設(shè)計(jì)、元器件選型、硬件電路圖、程序流程圖及系統(tǒng)測(cè)試等章節(jié)。文中詳細(xì)闡述了以AT89S52為核心配合紅外光電傳感器OPT101采集人體信號(hào)經(jīng)OP07與LM324N雙重放大電路提升信噪比再由A/D轉(zhuǎn)換器將模擬信號(hào)轉(zhuǎn)為數(shù)字量最終由四位數(shù)碼管實(shí)時(shí)顯示心率的完整鏈路并采用主程序、信號(hào)采集、放大處理、顯示等模塊化軟件結(jié)構(gòu)。目前已有50人學(xué)習(xí)下載適合需要低成本、高精度心率測(cè)量方案或想了解單片機(jī)信號(hào)采集與處理流程的讀者參考借鑒。1. 從光電脈搏波到四位數(shù)字這套 AT89S52 心率計(jì)方案到底解決了什么很多做過(guò) 51 單片機(jī)課程設(shè)計(jì)的人都有個(gè)共同體會(huì)數(shù)碼管動(dòng)態(tài)掃描、按鍵消抖、串口收發(fā)這些模塊單獨(dú)調(diào)都能跑一旦把模擬前端和單片機(jī)拼在一起讀數(shù)就開始亂跳。這套基于 AT89S52 的數(shù)字心率計(jì)設(shè)計(jì)核心難點(diǎn)其實(shí)不在單片機(jī)本身而在“怎么把手指尖那點(diǎn)微弱的半透明度變化變成單片機(jī)外部中斷能穩(wěn)定識(shí)別的方波”。方案用 OPT101 紅外光電傳感器采集脈搏波經(jīng) OP07 與 LM324N 兩級(jí)放大、比較整形后送入單片機(jī)計(jì)數(shù)最后用四位數(shù)碼管顯示心率值。它適合正在做單片機(jī)畢業(yè)設(shè)計(jì)、想搞懂模擬前端與數(shù)字處理如何銜接的讀者也適合已經(jīng)會(huì)寫 51 程序、但對(duì)傳感器信號(hào)調(diào)理沒(méi)底的人。整套設(shè)計(jì)成本低、器件常見(jiàn)Proteus 能仿真大半是典型的“麻雀雖小、五臟俱全”的嵌入式入門項(xiàng)目。2. 脈搏波采集與雙重放大電路的參數(shù)設(shè)計(jì)2.1 為什么選紅外光電法而不是壓電法設(shè)計(jì)里對(duì)比過(guò)兩種采集方案壓電陶瓷片測(cè)手腕搏動(dòng)和紅外光電測(cè)指尖半透明度。壓電方案結(jié)構(gòu)簡(jiǎn)單但輸出阻抗高、易受運(yùn)動(dòng)偽跡干擾手指稍微一動(dòng)基線就漂。紅外光電法的物理基礎(chǔ)是心臟搏動(dòng)時(shí)血液周期性充盈指尖組織導(dǎo)致組織對(duì)紅外光的吸收率變化透射光強(qiáng)隨之波動(dòng)。這個(gè)波動(dòng)頻率與心率嚴(yán)格成正比且信號(hào)在指尖、耳垂這類組織較薄處最明顯。OPT101 把光敏二極管和跨阻放大器集成在一個(gè)封裝里片內(nèi)反饋電阻 Rf1MΩ單電源 2.7V 到 36V 都能工作省掉了分立光電二極管加運(yùn)放的第一級(jí)設(shè)計(jì)對(duì)課程設(shè)計(jì)來(lái)說(shuō)能少調(diào)一個(gè)環(huán)節(jié)。2.2 OPT101 輸出到底有多弱OPT101 在 650nm 處響應(yīng)度約 0.45A/W響應(yīng)帶寬 14kHzRf1MΩ 時(shí)。實(shí)際戴在手指上透射光強(qiáng)的交流分量只有直流分量的百分之幾輸出交流幅度通常在毫伏級(jí)。更麻煩的是脈搏基頻很低50 次/分對(duì)應(yīng) 0.78Hz200 次/分對(duì)應(yīng) 3.33Hz屬于典型的超低頻弱信號(hào)。這意味著放大電路必須同時(shí)滿足兩個(gè)條件足夠高的增益以及足夠低的截止頻率來(lái)抑制工頻和日光燈閃爍干擾。2.3 兩級(jí)放大的增益分配與耦合電容取值設(shè)計(jì)采用 OP07 做第一級(jí)、LM324N 做第二級(jí)的雙重放大結(jié)構(gòu)。OP07 的特點(diǎn)是輸入失調(diào)電壓低最大 75μV 級(jí)別、輸入偏置電流小、噪聲低適合做前級(jí)LM324N 是四運(yùn)放單電源 3V 到 32V 工作共模范圍包含負(fù)電源適合做后級(jí)和比較整形。第一級(jí)放大倍數(shù)由反饋網(wǎng)絡(luò)決定理論設(shè)計(jì)值約 200 倍。原文提到實(shí)際因 -5V 供電不足和器件限制實(shí)測(cè)只有 20 倍左右——這是這類設(shè)計(jì)里非常真實(shí)的坑。耦合電容 C2、C3 取 10μF目的是讓 0.78Hz 的低頻信號(hào)也能順利通過(guò)高通截止頻率約為fc 1 / (2 * π * R * C)若 R 取 10kΩ、C 取 10μFfc ≈ 1.59Hz剛好低于最低脈搏頻率不會(huì)把有用信號(hào)削掉。后級(jí)與 R7、C6 組成截止頻率約 10Hz 的低通濾波器進(jìn)一步濾除殘留高頻干擾。這個(gè)“高通 1.6Hz 低通 10Hz”的帶通窗口是脈搏信號(hào)調(diào)理的常見(jiàn)做法。2.4 比較整形與單片機(jī)接口放大后的正弦波經(jīng) C10、R14 微分形成尖脈沖再由單穩(wěn)態(tài)電路轉(zhuǎn)成同頻率的長(zhǎng)脈沖送到單片機(jī)外部中斷引腳。AT89S52 用 12MHz 晶振外部中斷 0 檢測(cè)脈沖下降沿定時(shí)器 T0 做 1 秒閘門計(jì)數(shù)T1 負(fù)責(zé)數(shù)碼管動(dòng)態(tài)掃描。這里有個(gè)設(shè)計(jì)細(xì)節(jié)值得注意原文提到對(duì)心跳脈沖做了 100 倍頻處理配合 0.6 秒閘門使計(jì)數(shù)值直接等于心率。比如心率 76 次/分倍頻后 127Hz127×0.676.2顯示 76。這種“倍頻閘門”的換算方式本質(zhì)是用數(shù)字手段換取更短的測(cè)量時(shí)間滿足“5 秒內(nèi)顯示”的指標(biāo)。參數(shù)取值作用晶振頻率12MHz定時(shí)器基準(zhǔn)機(jī)器周期 1μs第一級(jí)增益理論 200 倍實(shí)測(cè)約 20 倍OP07 前級(jí)放大高通截止約 1.6HzC2/C310μF 配合輸入電阻低通截止約 10HzR7、C6 濾高頻閘門時(shí)間0.6s配合 100 倍頻直接讀心率提示第一級(jí)增益遠(yuǎn)低于理論值時(shí)先查運(yùn)放供電是否對(duì)稱。OP07 需要正負(fù)雙電源-5V 若由 7905 提供注意 7905 的接地引腳不能懸空否則負(fù)壓建立不起來(lái)增益會(huì)大幅縮水。3. ADC0809 采樣與 AT89S52 定時(shí)器中斷的軟件實(shí)現(xiàn)3.1 ADC0809 在這套設(shè)計(jì)里的角色ADC0809 是 8 通道、8 位逐次逼近型 A/D 轉(zhuǎn)換器DIP28 封裝轉(zhuǎn)換時(shí)間約 100μs時(shí)鐘 640kHz 時(shí)。設(shè)計(jì)里用它把放大整形后的模擬信號(hào)轉(zhuǎn)成數(shù)字量送入單片機(jī)。需要說(shuō)明的是如果比較電路已經(jīng)把信號(hào)整形成方波理論上可以直接進(jìn)外部中斷計(jì)數(shù)ADC0809 更多用于需要讀取信號(hào)幅度的場(chǎng)合比如判斷信號(hào)是否有效、做閾值檢測(cè)。接線要點(diǎn)START 和 ALE 連在一起由 P2.0 控制OE 接 P2.1EOC 接 P2.2 查詢或接中斷通道選擇 A、B、C 接地選 IN0。3.2 定時(shí)器 T0 做閘門、T1 做數(shù)碼管掃描AT89S52 有三個(gè) 16 位定時(shí)器這里 T0 和 T1 分工明確。T0 工作在方式 116 位定時(shí)初值計(jì)算// 12MHz 晶振機(jī)器周期 1us // 定時(shí) 50ms初值 65536 - 50000 15536 0x3CB0 TMOD 0x11; // T0 方式1定時(shí)T1 方式1定時(shí) TH0 0x3C; TL0 0xB0; TH1 0xFC; // T1 用于數(shù)碼管掃描約 1ms 中斷一次 TL1 0x18; ET0 1; ET1 1; EA 1; TR0 1; TR1 1;T0 中斷 20 次為 1 秒或 12 次為 0.6 秒在中斷里累加計(jì)數(shù)脈沖T1 中斷里切換數(shù)碼管位選并送段碼。這種“一個(gè)定時(shí)器管時(shí)間基準(zhǔn)、一個(gè)管顯示刷新”的分工是 51 單片機(jī)課程設(shè)計(jì)里最穩(wěn)的寫法避免在主循環(huán)里用延時(shí)函數(shù)導(dǎo)致計(jì)數(shù)丟脈沖。3.3 外部中斷計(jì)數(shù)與防抖脈搏脈沖從 INT0P3.2輸入配置為下降沿觸發(fā)IT0 1; // 下降沿觸發(fā) EX0 1; // 開外部中斷0中斷服務(wù)程序里對(duì) pulse_count 加一。實(shí)際調(diào)試時(shí)比較器輸出邊沿可能因信號(hào)毛刺多次觸發(fā)常見(jiàn)做法是在中斷里加一個(gè)短延時(shí)再確認(rèn)電平或者硬件上在比較器輸出加 100nF 電容到地做簡(jiǎn)單濾波。軟件防抖會(huì)占用中斷時(shí)間脈搏頻率低最高 3.33Hz影響可以接受。3.4 心率換算與顯示刷新計(jì)數(shù)值到心率值的換算取決于是否倍頻。若未倍頻1 秒閘門計(jì)數(shù)值 N 對(duì)應(yīng)心率 N×60若按原文 100 倍頻、0.6 秒閘門則顯示值直接等于計(jì)數(shù)值。顯示部分用四位共陽(yáng)數(shù)碼管P0 口送段碼需上拉電阻AT89S52 的 P0 是開漏P2 口低四位做位選。動(dòng)態(tài)掃描頻率約 1kHz人眼無(wú)閃爍。void display(unsigned int hr) { unsigned char buf[4]; buf[0] hr / 1000; // 千位 buf[1] hr / 100 % 10; // 百位 buf[2] hr / 10 % 10; // 十位 buf[3] hr % 10; // 個(gè)位 // 位選和段碼輸出在 T1 中斷中輪流進(jìn)行 }注意P0 口驅(qū)動(dòng)數(shù)碼管段碼時(shí)必須接 10kΩ 上拉排阻否則段碼亮度極低甚至不亮。這是 51 單片機(jī)新手最常踩的坑之一。4. 從 Proteus 仿真到整機(jī)聯(lián)調(diào)的排錯(cuò)路徑4.1 分模塊仿真驗(yàn)證順序不要一上來(lái)就整圖仿真。合理順序是先單獨(dú)仿真放大電路用信號(hào)發(fā)生器給 1Hz、5mV 正弦波看輸出是否放大且無(wú)明顯失真再仿真比較電路確認(rèn)方波邊沿干凈最后把單片機(jī)最小系統(tǒng)、ADC、數(shù)碼管拼起來(lái)聯(lián)調(diào)。Proteus 里 OPT101 沒(méi)有現(xiàn)成模型常用做法是用一個(gè)受控電流源加運(yùn)放搭等效電路或者直接用信號(hào)源替代傳感器輸出先把數(shù)字部分跑通。4.2 焊接與整機(jī)調(diào)試的典型問(wèn)題原文提到試驗(yàn)與焊接階段分開進(jìn)行這是對(duì)的。焊接時(shí)先焊電源部分上電測(cè)各路電壓正常后再焊模擬前端最后焊數(shù)字部分。整機(jī)調(diào)試常見(jiàn)問(wèn)題有三類一是數(shù)碼管顯示亂碼多半是段碼表寫錯(cuò)或位選接反二是心率讀數(shù)偏高且不穩(wěn)定通常是比較器閾值沒(méi)調(diào)好把噪聲也計(jì)進(jìn)去了三是讀數(shù)始終為零檢查 OPT101 輸出是否被手指完全遮光導(dǎo)致飽和或者外部中斷引腳虛焊。4.3 干擾來(lái)源與抑制手段設(shè)計(jì)里明確提到幾種主要干擾工頻 50Hz 干擾、日光燈閃爍、手指抖動(dòng)。抑制手段包括模擬部分用屏蔽線、電源加 100μF 和 0.1μF 去耦電容、比較器加遲滯正反饋電阻避免邊沿抖動(dòng)、軟件上對(duì)連續(xù)兩次測(cè)量值差異過(guò)大的數(shù)據(jù)做丟棄。遲滯比較器的正反饋電阻一般取反饋電阻的 1/100 到 1/10太小不起作用太大靈敏度下降。故障現(xiàn)象可能原因排查動(dòng)作數(shù)碼管全暗P0 無(wú)上拉、位選未使能測(cè) P0 電壓、查位選三極管讀數(shù)偏高比較器閾值過(guò)低、噪聲計(jì)數(shù)調(diào)閾值、加遲滯讀數(shù)跳動(dòng)大手指移動(dòng)、電源紋波固定手指、加去耦電容無(wú)計(jì)數(shù)INT0 無(wú)脈沖、中斷未開示波器看 P3.2、查 EA/EX04.4 測(cè)量精度與響應(yīng)時(shí)間的權(quán)衡“5 秒內(nèi)顯示”和“讀數(shù)穩(wěn)定”本身有矛盾。閘門時(shí)間越長(zhǎng)計(jì)數(shù)越準(zhǔn)但響應(yīng)越慢。原文用 100 倍頻加 0.6 秒閘門是在兩者間取的折中。如果自己做可以改成 1 秒閘門不倍頻讀數(shù)更直觀代價(jià)是響應(yīng)慢一點(diǎn)。對(duì)課程設(shè)計(jì)而言能穩(wěn)定顯示且誤差在 ±3 次/分以內(nèi)就算達(dá)標(biāo)。5. 用定時(shí)器 T1 中斷做數(shù)碼管動(dòng)態(tài)掃描的進(jìn)階寫法很多 51 教程把數(shù)碼管掃描放在主循環(huán)里用 delay 函數(shù)一旦主循環(huán)里加了其他耗時(shí)操作顯示就閃。這套設(shè)計(jì)把掃描放進(jìn) T1 中斷是更工程化的做法。具體實(shí)現(xiàn)是T1 每 1ms 中斷一次中斷里關(guān)閉當(dāng)前位、送下一位段碼、開新位四個(gè)位輪流4ms 刷新一輪刷新率 250Hz遠(yuǎn)高于人眼閃爍閾值。unsigned char code seg[] {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; unsigned char digit 0; unsigned int hr_val 0; void T1_ISR() interrupt 3 { TH1 0xFC; TL1 0x18; // 重裝 1ms 初值 P2 0xFF; // 消隱關(guān)閉所有位 switch(digit) { case 0: P0 seg[hr_val/1000]; P2 0xFE; break; case 1: P0 seg[hr_val/100%10]; P2 0xFD; break; case 2: P0 seg[hr_val/10%10]; P2 0xFB; break; case 3: P0 seg[hr_val%10]; P2 0xF7; break; } digit (digit 1) 0x03; }這段代碼的關(guān)鍵點(diǎn)有三個(gè)一是每次切換前先P2 0xFF消隱避免上一位的段碼串到下一位造成“鬼影”二是段碼表按共陽(yáng)接法編寫若用共陰數(shù)碼管需取反三是digit用位與運(yùn)算循環(huán)比 if-else 鏈更省周期。把顯示和計(jì)數(shù)徹底解耦后主循環(huán)只負(fù)責(zé)心率換算和報(bào)警判斷邏輯清晰很多。驗(yàn)證方法也簡(jiǎn)單把hr_val固定賦一個(gè)值如 1234燒錄后看四位是否穩(wěn)定顯示且無(wú)鬼影再用信號(hào)發(fā)生器給 INT0 輸入已知頻率方波比如 2Hz1 秒閘門應(yīng)顯示 120誤差超過(guò) ±2 就檢查晶振和定時(shí)器初值。這套掃描寫法稍作修改就能移植到 STC 或 STM32 的課程設(shè)計(jì)里是 51 單片機(jī)顯示模塊里比較耐用的一個(gè)模板。本文還有配套的精品資源點(diǎn)擊獲取