導航:首頁 > 操作系統 > 單片機系統的解決方案

單片機系統的解決方案

發布時間:2023-05-31 20:41:12

❶ 喚醒越頻繁 單片機功耗怎麼越低

是不是聽反了啊

喚醒越頻繁,功耗反而越高

喚醒越不頻繁,功耗越低

單片機低功耗的解決方案常用方法如下:

目前單片機的種類很多,大多數都是針對某一類特定應用而設計的,合適的單片機系統選擇與設計是節點微功耗設計的關鍵。單片機的微功耗設計可從下列幾個因素考慮。

(1) 盡量選擇集成度高的單片機。隨著微電子技術的發展,單片機的集成度越來越高,實現了真正意義上的單片化。很多單片機都集成了大量的外圍功能模塊,如ADC、DAC、程序存儲器、定時器、串列介面(RS232、SPI、I2C等)等。選擇這樣的器件,可有效加快開發進度、降低系統成本、減小體積、提高可靠性和抗干擾能力,同時SOC技術進一步降低了器件介面間的功耗。

(2) 考慮到有些場合單片機的工作特點,選擇單片機不光要關注工作電流,更應該關注單片機休眠時的靜態電流。單片機豐富的低功耗模式和極低的靜態電流,在滿足特定應用功能的同時,有效降低系統的功耗。

(3) 在滿足應用要求的前提下,選擇配較低的單片機,較小的RAM/ROM、較低的ADC解析度、較低的ADC速率,較少的IO管腳都可以降低單片機的整體功耗。當然了,這個得能滿足你產品需求的前提下

(4) 對於一個數字系統而言,其功耗大致滿足公式:P=CV2f。其中C為系統的負載電容,V為電源電壓,f為系統工作頻率[2]。功耗與電源電壓的平方成正比,因此電源電壓對系統的功耗影響最大,其次是工作頻率,再次就是負載電容。負載電容對設計人員而言,一般是不可控的,因此設計一個低功耗系統,在不影響系統性能的前提下,盡可能地降低電源的電壓和工作頻率。

(5) 對於大多數低功耗單片機來說,工作頻率越低,意味著消耗的電流也越小,但是不能認為頻率越低,系統整體功耗越小,因為工作頻率降低,意味著需要更長的處理時間,其他外圍電路消耗的電能就越多。目前有很多單片機都允許有兩個或者兩個以上的時鍾源,低頻時鍾作為如UART、定時器等外圍功能器件的時鍾源,高頻時鍾作為系統的主時鍾。在不需要高速運行的場合下,低頻時鍾也可以作為系統主時鍾使用。

(6) 對於需要在工作狀態與空閑狀態之間頻繁切換的應用,在考慮單片機本身低功耗的同時,應該考慮切換時間和切換電流。

❷ 單片機系統軟體抗干擾方法

在提高硬體系統抗干擾能力的同時 軟體抗干擾以其設計靈活 節省硬體資源 可靠性好越來越受到重視 下面以MCS 單片機系統為例 對微機系統軟體抗干擾方法進行研究

軟體抗干擾方法的研究

在工程實踐中 軟體抗干擾研究的內容主要是 一 消除模擬輸入信號的嗓聲(如數字濾波技術) 二 程序運行混亂時使程序重入正軌的方法 本文針對後者提出了幾種有效的軟體抗干擾方法

指令冗餘

CPU取指令過程是先取操作碼 再取操作數 當PC受干擾出現錯誤 程序便脫離正常軌道 亂飛 當亂飛到某雙位元組指令 若取指令時刻落在操作數上 誤將操作數當作操作碼 程序將出錯 若 飛 到了三位元組指令 出錯機率更大

在關鍵地方人為插入一些單位元組指令 或將有效單位元組指令重寫稱為指令冗餘 通常是在雙位元組指令和三位元組指令後插入兩個位元組以上的NOP 這樣即使亂飛程序飛到操作數上 由於空操作指令NOP的存在 避免了後面的指令被當作操作數執行 程序自動納入正軌

此外 對系統流向起重要作用的指令如RET RETI LCALL LJMP JC等指令之前插入兩條NOP 也可將亂飛程序納入正軌 確保這些重要指令的執行

攔截技術

所謂攔截 是指將亂飛的程序引向指定位置 再進行出錯處理 通常用軟體陷阱來攔截亂飛的程序 因此先要合理設計陷阱 其次要將陷阱安排在適當的位置

軟體陷阱的設計

當亂飛程序進入非程序區 冗餘指令便無法起作用 通過軟體陷阱 攔截亂飛程序 將其引向指定位置 再進行出錯處理 軟體陷阱是指用來將捕獲的亂飛程序引向復位入口地址 H的指令 通常在EPROM中非程序區填入以下指令作為軟體陷阱

NOP

NOP

LJMP H

其機器碼為

陷阱的安排

通常在程序中未使用的EPROM空間填 最後一條應填入 當亂飛程序落到此區 即可自動入軌 在用戶程序區各模塊之間的空餘單元也可填入陷阱指令 當使用的中斷因干擾而開放時 在對應的中斷服務程序中設置軟體陷阱 能及時捕獲錯誤的中斷 如某應用系統雖未用到外部中斷 外部中斷 的中斷服務程序可為如下形式

NOP

NOP

RETI

返回指令可用 RETI 也可用 LJMP H 如果故障診斷程序與系統自恢復程序的設計可靠 完善 用 LJMP H 作返回指令可直接進入故障診斷程序 盡早地處理故障並恢復程序的運行

考慮到程序存貯器的容量 軟體陷阱一般 K空間有 個就可以進行有效攔截

軟體 看門狗 技術

若失控的程序進入 死循環 通常採用 看門狗 技術使程序脫離 死循環 通過不斷檢測程序循環運行時間 若發現程序循環時間超過最大循環運行時間 則認為系統陷入 死循環 需進行出錯處理

看門狗 技術可由硬體實現 也可由軟體實現 在工業應用中 嚴重的干擾有時會破壞中斷方式控制字 關閉中斷 則系統無法定時 喂狗 硬體看門狗電路失效 而軟體看門狗可有效地解決這類問題

筆者在實際應用中 採用環形中斷監視系統 用定時器T 監視定時器T 用定時器T 監視主程序 主程序監視定時器T 採用這種環形結構的軟體 看門狗 具有良好的抗干擾性能 大大提高了系統可靠性 對於需經常使用T 定時器進行串口通訊的測控系統 則定時器T 不能進行中斷 可改由串口中斷進行監控(如果用的是MCS 系列單片機 也可用T 代替T 進行監視) 這種軟體 看門狗 監視原理是 在主程序 T 中斷服務程序 T 中斷服務程序中各設一運行觀測變數 假設為MWatch T Watch T Watch 主程序每循環一次 MWatch加1 同樣T T 中斷服務程序執行一次 T Watch T Watch加1 在T 中斷服務程序中通過檢測T Watch的變化情況判定T 運行是否正常 在T 中斷服務程序中檢測MWatch的變化情況判定主程序是否正常運行 在主程序中通過檢測T Watch的變化情況判別T 是否正常工作 若檢測到某觀測變數變化不正常 比如應當加 而未加 則轉到出錯處理程序作排除故障處理 當然 對主程序最大循環周期 定時器T 和T 定時周期應予以全盤合理考慮 限於篇幅不贅述

系統故障處理 自恢復程序的設計

單片機系統因干擾復位或掉電後復位均屬非正常復位 應進行故障診斷並能自動恢復非正常復位前的狀態

非正常復位的識別

程序的執行總是從 H開始 導致程序從 H開始執行有四種可能 一 系統開機上電復位 二 軟體故障復位 三 看門狗超時未喂狗硬體復位 四 任務正在執行中掉電後來電復位 四種情況中除第一種情況外均屬非正常復位 需加以識別

硬體復位與軟體復位的識別

此處硬體復位指開機復位與看門狗復位 硬體復位對寄存器有影響 如復位後PC= H SP= H PSW= H等 而軟體復位則對SP SPW無影響 故對於微機測控系統 當程序正常運行時 將SP設置地址大於 H 或者將PSW的第 位用戶標志位在系統正常運行時設為 那麼系統復位時只需檢測PSW 標志位或SP值便可判此是否硬體復位 圖 是採用PSW 作上電標志位判別硬 軟體復位的程序流程圖

圖 硬 軟體復位識別流程圖

此外 由於硬體復位時片內RAM狀態是隨機的 而軟體復位片內RAM則可保持復位前狀態 因此可選取片內某一個或兩個單元作為上電標志 設 H用來做上電標志 上電標志字為 H 若系統復位後 H單元內容不等於 H 則認為是硬體復位 否則認為是軟體復位 轉向出錯處理 若用兩個單元作上電標志 則這種判別方法的可靠性更高

開機復位與看門狗故障復位的識別

開機復位與看門狗故障復位因同屬硬體復位 所以要想予以正確識別 一般要藉助非易失性RAM或者EEROM 當系統正常運行時 設置一可掉電保護的觀測單元 當系統正常運行時 在定時喂狗的中斷服務程序中使該觀測單元保持正常值(設為 AAH) 而在主程中將該單元清零 因觀測單元掉電可保護 則開機時通過檢測該單元是否為正常值可判斷是否看門狗復位

正常開機復位與非正常開機復位的識別

識別測控系統中因意外情況如系統掉電等情況引起的開機復位與正常開機復位 對於過程式控制制系統尤為重要 如某以時間為控制標準的測控系統 完成一次測控任務需 小時 在已執行測控 分鍾的情況下 系統電壓異常引起復位 此時若系統復位後又從頭開始進行測控則會造成不必要的時間消耗 因此可通過一監測單元對當前系統的運行狀態 系統時間予以監控 將控制過程分解為若干步或若干時間段 每執行完一步或每運行一個時間段則對監測單元置為關機允許值 不同的任務或任務的不同階段有不同的值 若系統正在進行測控任務或正在執某時間段 則將監測單元置為非正常關機值 那麼系統復位後可據此單元判系統原來的運行狀態 並跳到出錯處理程序中恢復系統原運行狀態

非正常復位後系統自恢復運行的程序設計

對順序要求嚴格的一些過程式控制制系統 系統非正常復位否 一般都要求從失控的那一個模塊或任務恢復運行 所以測控系統要作好重要數據單元 參數的備份 如系統運行狀態 系統的進程值 當前輸入 輸出的值 當前時鍾值 觀測單元值等 這些數據既要定時備份 同時若有修改也應立即予以備份

當在已判別出系統非正常復位的情況下 先要恢復一些必要的系統數據 如顯示模塊的初始化 片外擴展晶元的初始化等 其次再對測控系統的系統狀態 運行參數等予以恢復 包括顯示界面等的恢復 之後再把復位前的任務 參數 運行時間等恢復 再進入系統運行狀態

應當說明的是 真實地恢復系統的運行狀態需 要極為細致地對系統的重要數據予以備份 並加以數據可靠性檢查 以保證恢復的數據的可靠性

其次 對多任務 多進程測控系統 數據的恢復需考慮恢復的次序問題 筆者實際應用的數據恢復過程流程圖如圖 所示

圖 系統自恢復程序流程圖

圖中恢復系統基本數據是指取出備份的數據覆蓋當前的系統數據 系統基本初始化是指對晶元 顯示 輸入輸出方式等進行初始化 要注意輸入輸出的初始化不應造成誤動作 而復位前任務的初始化是指任務的執行狀態 運行時間等

結束語

lishixin/Article/program/qrs/201311/11074

❸ 求單片機直流電機調速系統的設計的方案和意義

一.電機調速模塊. 我們的設計思路是先產生占空比可調的方波(方法有多種,一是用555構成多諧振盪器.二可以利用單片機產生PWM方波)+4功率器件構成的H橋電路,用以驅動直流電機轉動.當然還許多驅動方案,比如三極體-電阻作柵極驅動\低壓驅動電路的簡易柵極驅動,還有可以直接用個MCU產生PWM外加一個MOS管驅動也可以. 1.1直流電機驅動電路的設計目標 在直流電機驅動電路的設計中,主要考慮一下幾點: 1. 功能:電機是單向還是雙向轉動?需不需要調速?對於單向的電機驅動,只要用一個大功率三極體或場效應管或繼電器直接帶動電機即可,當電機需要雙向轉動時,可以使用由4個功率元件組成的H橋電路或者使用一個雙刀雙擲的繼電器。如果不需要調速,只要使用繼電器即可;但如果需要調速,可以使用三極體,場效應管等開關元件實現PWM(脈沖寬度調制)調速。 2. 性能:對於PWM調速的電機驅動電路,主要有以下性能指標。 1)輸出電流和電壓范圍,它決定著電路能驅動多大功率的電機。 2)效率,高的效率不僅意味著節省電源,也會減少驅動電路的發熱。要提高電路的效率,可以從保證功率器件的開關工作狀態和防止共態導通(H橋或推挽電路可能出現的一個問題,即兩個功率器件同時導通使電源短路)入手。 3)對控制輸入端的影響。功率電路對其輸入端應有良好的信號隔離,防止有高電壓大電流進入主控電路,這可以用高的輸入阻抗或者光電耦合器實現隔離。 4)對電源的影響。共態導通可以引起電源電壓的瞬間下降造成高頻電源污染;大的電流可能導致地線電位浮動。 5)可靠性。電機驅動電路應該盡可能做到,無論加上何種控制信號,何種無源負載,電路都是安全的。 考慮到以上的因素我們採用555多諧振盪器產生占空比可調的方波+4功率器件構成的H橋來驅動直流電機.電路圖如下: 1.2、電機調速模塊的電路圖功能分析 555通過可調電阻可以實現占空比可調的方波,即組成占空比可調的多諧振盪器。 多諧振盪器實現占空比可調的方波的功能分析: 電源接通瞬間,電容C2上的初始電壓為0,施密特觸發器輸出電壓為U為高電平,與此同時由於集電極開路輸出端(7腳)對地斷開,電源通過R5、R7開始對電容C充電,電路進入暫穩態I狀態。此後電路按下列四個階段周而復始地循環,產生周期性的輸出脈沖。 (1) 暫穩態I階段,VCC通過R5。R7向電容C充電,電容C的電壓Uc按指數上升,在UC高於2/3VCC之前,定時器暫時維持『1』的狀態,輸出為高電位。 (2) 翻轉I階段,電容C繼續充電,當Uc高於2/3VCC後,定時器翻轉為『0』的狀態,輸出為低電位。此時,集電極開路輸出端(7腳)由對地斷開變為導通。 (3) 暫穩態II階段,電容C開始經歷R7、R6對地(7腳)放電,Uc按照指數下降,在Uc低於1/3VCC之前,定時器依然維持『0』的狀態。輸出為低電位。 (4) 翻轉II階段,電容C繼續放電,當Uc低於1/3VCC後,定時器翻轉為『1』狀態,輸出為高電位。此時,集電極開路輸出端(7腳)由對地導通變為對地斷開。此後,振盪器又回復到暫穩態I狀態。 (5) 可以通過調節R6的大小來調節定時器輸出方波的占空比。 Uln2003晶元是16腳七路電機驅動晶元,這塊晶元在這里可以看作是七非門晶元,作用是保證10腳和14腳的輸出SINGLE1和SINGLE2的輸出為一高一低。晶元中的二極體起到分流的作用。電路圖的右部分的作用是通過調節電機的正轉與反轉來調節電機的轉速,當SINGLE1為高 SINGLE2為低時,三極體Q2,Q3,Q5導通,Q1,Q4,Q6截止,電機1端通過Q5接地,Vcc通過Q2直接押在電機2端,此時電機2端電位高於1端,電機反轉;當SINGLE1為低SINGLE2為高時,電機正轉。當某一時刻占空比大於50%時,電機呈現正轉加速或是反轉減速狀態;某一時刻占空比小於50%時,電機呈現正轉減速或是反轉加速狀態。電機就是通過矩形波占空比的不同來調節轉速的,電機呈現出來的轉速是平均速度。 二.電機測速模塊電路以及功能分析 我們的設計思路是利用光電隔離器件以及BCD計數器實現直流電機測速模塊電路.利用電機轉動時帶動紙片遮擋光耦,使其發光二極體發出的紅外光被其中的光敏三極體所接收,通過BCD計數器最後將在單位時間內轉動的轉數給顯示出來.電路圖如下: 1.3、電機測速模塊整個電路以及其他功能分析 1.3.1晶元功能分析 CD40192: 可預置BCD加/減計數器(雙時鍾) NSC\TI///J1J2J3J4是可以預設數字的輸入,Q1Q2Q3Q4是加減計數的輸出。C0是進位端接高位的UP(加計數器)。BO是借位端圖上不接,為空腳。ENABLE是使能端。VSS接地,VCC接電源。DOWN是減計數器。 CD4511 BCD鎖存、7段解碼,驅動器: //A、B、C、D分別接BCD加減計數器的輸出端,鎖存數字。再7段解碼將其輸出到數碼管。 CD40106 六施密特觸發器: NSC\TI //輸入信號為A,輸出信號為A反,對輸入的脈沖進行整形並取反,使高位計數器的加計數能夠計數。 1.4、接受板子整個電路圖功能分析 光電耦合器OPTOISO1,當其接受到光信號,LED放光,三極體飽和導通,晶體管Q1導通,因為電阻R3 為47K,大部分的電壓分壓在電阻上了,A為低電平。若沒有接受到光的話,A為一高點平,這樣在A端形成了一個負脈沖,再經過CD40106 六施密特觸發器對脈沖進行整形並且取反,得到A的非為一正脈沖(指的是沒有光的時候為低電平,有光信號的時候為高電平)。 經過六施密特觸發器的脈沖信號再接到CD40192的UP端使BCD計數器件1為加計數器。又兩個CD40192ENABLE是使能端一起接在enable信號上。 REST信號也相連一起通過按鍵S1接VCC高電平/通過R9 10K接地。這樣只要按S1就可以實現REST重置清零。不按S1的就照常計數。 Enable使能信號的產生:是通過按鍵S1和555晶元以及相應的RC電路,實現一定時間的延時,也就是意味著一按S1,在定時T(由RC值確定)的時間內,計數器在計數,將光電耦合器接受到的恆定脈沖個人給計數,定時時間到的話就停止.這樣的話可以將電機的速度給測出來.定時時間為0.5S~1.0S. 驅動CD40192工作,我們對照圖2來分析這個定時器的功能。 當一上電的時候, 3 (OUT)腳輸出一個高電平,

❹ [電子百科] 單片機系統中對電源干擾的抑制方法有哪些麻煩告訴我

除此之外,由於交流電源共用,各電子設備之間通過電源也會產生相互干擾,因此抑制電源干擾尤其重要。電源干擾主要有以下幾類:1)電源線中的高頻干擾供電電力線相當於一個接收天線檔歲,能把雷電、電弧、廣播電台等輻射的高頻干擾信號通過電源變壓器初級耦蠢耐合行檔睜到次級,形成對單片機系統的干擾。2)感性負載產生的瞬變雜訊切斷大容量感性負載時,能產生很大的電流和電壓變化率,從而形成瞬變雜訊干擾,成為電磁干擾的主要形式。3)晶閘管通斷時的干擾晶閘管通斷時的電流變化率很大,使晶閘管在導通瞬間流過一個具有高次諧波的大電流,在電源阻抗上產生很大的壓降,從而使電網電壓出現缺口,這種畸變的電壓波形含有高次諧波,可以向空間輻射或通過傳導耦合,干擾其他設備。此外,還有電網電壓波動或電壓瞬時跌落產生千擾等。

❺ 單片機開發中應掌握的幾個技巧

一、 如何提高C語言編程代碼的效率
鄧宏傑指出,用C語言進行單片機程序設計是單片機開發與應用的必然趨勢。他強調:「如果使用C編程時,要達到最高的效率,最好熟悉所使用的C編譯器。
先試驗一下每條C語言編譯以後對應的匯編語言的語句行數,這樣就可以很明確的知道效率。在今後編程的時候,使用編譯效率最高的語句。」
他指出,各家的C編譯器都會有一定的差異,故編譯效率也會有所不同,優秀的嵌入式系統C編譯器代碼長度和執行時間僅比以匯編語言編寫的同樣功能程度長

5-20%。他說:「對於復雜而開發時間緊的項目時,可以採用C語言,但前提是要求你對該MCU系統的C語言和C編譯器非常熟悉,特別要注意該C編譯系統

所能支持的數據類型和演算法。雖然C語言是最普遍的一種高級語言,但由於不同的MCU廠家其C語言編譯系統是有所差別的,特別是在一些特殊功能模塊的操作
上。所以如果對這些特性不了解,那麼調試起來問題就會很多,反而導致執行效率低於匯編語言。」
二、 如何減少程序中的bug?
對於如何減少程序的bug,鄧宏傑給出了一些建議,他指出系統運行中應考慮的超范圍管理參數有:
1.物理參數。這些參數主要是系統的輸入參數,它包括激勵參數、採集處理中的運行參數和處理結束的結果參數。合理設定這些邊界,將超出邊界的參數都視為非正常激勵或非正常回應進行出錯處理。
2.資源參數。這些參數主要是系統中的電路、器件、功能單元的資源,如記憶體容量、存儲單元長度、堆疊深度。在程式設計中,對資源參數不允許超范圍使用。
3.應用參數。這些應用參數常表現為一些單片機、功能單元的應用條件。如E2PROM的擦寫次數與資料存儲時間等應用參數界限。
4.過程參數。指系統運行中的有序變化的參數。
三、如何解決單片機的抗干擾性問題
鄧宏傑指出:防止干擾最有效的方法是去除干擾源、隔斷干擾路徑,但往往很難做到,所以只能看單片機抗干擾能力夠不夠強了。單片機干擾最常見的現象就是

復位;至於程序跑飛,其實也可以用軟體陷阱和看門狗將程序拉回到復位狀態;所以單片機軟體抗干擾最重要的是處理好復位狀態。一般單片機都會有一些標志寄存

器,可以用來判斷復位原因;另外你也可以自己在RAM中埋一些標志。在每次程序復位時,通過判斷這些標志,可以判斷出不同的復位原因;還可以根據不同的標
志直接跳到相應的程序。這樣可以使程序運行有連續性,用戶在使用時也不會察覺到程序被重新復位過。
四、 如何測試單片機系統的可靠性
有讀者希望了解用用什麼方法來測試單片機系統的可靠性,鄧宏傑指出:「當一個單片機系統設計完成,對於不同的單片機系統產品會有不同的測試項目和方法,但是有一些是必須測試的:
1.測試單片機軟體功能的完善性。這是針對所有單片機系統功能的測試,測試軟體是否寫的正確完整。
2.上電、掉電測試。在使用中用戶必然會遇到上電和掉電的情況,可以進行多次開關電源,測試單片機系統的可靠性。
3.老化測試。測試長時間工作情況下,單片機系統的可靠性。必要的話可以放置在高溫,高壓以及強電磁干擾的環境下測試。
4、ESD和EFT等測試。可以使用各種干擾模擬器來測試單片機系統的可靠性。例如使用靜電模擬器測試單片機系統的抗靜電ESD能力;使用突波雜訊模擬器進行快速脈沖抗干擾EFT測試等等。
鄧宏傑強調:「還可以模擬人為使用中,可能發生的破壞情況。例如用人體或者衣服織物故意摩擦單片機系統的接觸埠,由此測試抗靜電的能力。用大功率電鑽靠近單片機系統工作,由此測試抗電磁干擾能力等。

❻ 如果單片機系統檢測到埠的信號不太穩定,可能存在的問題在哪裡怎麼解決

1.信號加相應的濾波電容,吸收干擾
2.埠接上拉電阻,一般用4.7K
3.信號採集可用光耦等隔離
4.在單片機軟體中對檢測的埠進行數字濾波處理,比如連續採集10個數,用塵衫冒泡法對10數進行從小到大排序,取中間一位值,或去掉最大最小值再取平均指兄叢值。
5.找出干擾源,比如附唯櫻近有高頻線路、電磁干擾,離遠一些。

❼ 請簡述單片機系統的設計過程是怎樣的

單片機應用系統設計分為硬體設計與軟體設計兩部分及系統調試三個部分,大致過程如下:一、硬體電路設計1、根據任務需求規劃確定單片機類型及外圍介面電路方案;2、根據方案設計具體電路。二、軟體設計1、根據目標任務的功能需求,結合硬體電路控制方式,規劃設計軟體功能模塊;2、將功能模塊細化成流程圖;3、根據流程圖編寫程序代碼;4、將編譯後的目標代碼下載到實物單片機或虛擬單片機進行軟體模擬調試;三、系統調試1、將初調成功的目標的代碼下載到單片機目標試驗板進行軟硬體聯調及功能驗證;2、驗證成功符合設計要求,就可以進入小批量測試了。

❽ 畢業設計做單片機應該怎麼做

1、單片機的硬體系統是由單片機、A/D轉換器和顯示驅動電路等組成。一般在硬體電路設計完成時,應選擇標准化、模塊化的典型電路和符合單片機應用系統的常規電路在系統中.相關器件以及相關電路一定要做到性能匹配.當外接電路較多時.還應考慮驅動能力。在硬體設計中.必不可少的是可靠性和干擾性.這與自身的硬體系統有關.因此應認真對待。

2、針對於硬體的電路總體設計和各部分電路的組成.系統軟體可分為數據採集、數據顯示、數據傳輸和數據存儲這4個基本功能。軟體系統包括主程序、系統監控、定時/中斷等子程序。

主程序為整個通用數據採集系統的主體部分.它由若干個模塊組成:自檢與初始化模塊、MD轉換程序模塊、顯示驅動模塊、監控程序模塊、按鍵程序模塊、數據上傳通訊模塊、數據定時存儲模塊。

其中有些模塊還包含有子模塊,使用時下一級模塊被高一級模塊調用,各部分既相互獨立.又相互聯系主程序首先是系統初始化.當運行正常後.進入數據採集軟體的主程序運行.使用默認配置參數來設定系統的採集通道數,完成數據採集、數據顯示、數據傳輸及數據定時存儲等基本功能。

(8)單片機系統的解決方案擴展閱讀

通常,在各種工業設計環境中遇至不同形式的干擾.單片機數據採集系統是軟硬體的結合.因此設計者應從軟硬兩方面消除.結合各種抵抗干擾的方法互相補充和完善.才能確保系統可靠、安全、正確地運行。

單片機系統被干擾後會集中表現在幾個方面:控制狀態失效、採集數據誤差大、數據發生亂碼以及程序的運行失控這些干擾有內、外因素的干擾.所以軟硬體都應當採取有效的措施進行解決。

硬體系統的干擾就是防和抗的概念.即消除和抑制干擾源:降低系統對干擾信號的敏感性;切斷干擾對系統的耦合。而相應的措施有隔離、屏蔽、接地、提高信噪比、濾波以及電壓保護等軟體抗於擾主要是通過軟體的合理編制降低單片機系統對干擾的靈敏度。解決的技術有指令冗餘技術、軟體陷阱技術、「看門狗」技術、數字濾波技術等方法。

❾ 關於單片機AT89S51溫度控制系統的溫度的滯後怎麼處理

嘿嘿 俺來幫你想想辦法
1 可以靠硬體方法解決:
可以採用史密斯補償器,以消除溫度滯後,給系統帶來的穩定性的影響。
2 可以靠軟體方法解決:
在程序中 增加史密斯補償演算法 以消除溫度滯後,給系統帶來的穩定性的影響。
也可以採用大林演算法

呵呵 也沒有加分呀 就給個滿意回答吧

❿ 單片機溫度控制系統設計方案

#include<reg52.H>

externGetTemp(); //聲明引用外部函數

; //聲明引用外部變數

voiddelay(unsignedinti);

//elseIO

sbitLS138A=P2^2;//管腳定義

sbitLS138B=P2^3;

sbitLS138C=P2^4;

//此表為LED的字模,共陰數碼管0-9-

unsignedcharcodeDisp_Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};

unsignedlongLedOut[5],LedNumVal;

voidsystem_Ini()

{

TMOD|=0x11;

TH1=0xD8;//10

TL1=0xF0;

IE=0x8A;

TR1=1;

}

main()

{unsignedchari;

system_Ini();

while(1)

{

GetTemp();

/********以下將讀18b20的數據送到LED數碼管顯示*************/

LedNumVal=Temperature;//把實際溫度送到LedNumVal變數中

LedOut[0]=Disp_Tab[LedNumVal%10000/1000];

LedOut[1]=Disp_Tab[LedNumVal%1000/100];

LedOut[2]=Disp_Tab[LedNumVal%100/10]; //十位

LedOut[3]=Disp_Tab[LedNumVal%10];//個位

for(i=0;i<4;i++)

{

P0=LedOut[i];

switch(i)

{ //138解碼

case0:LS138A=0;LS138B=0;LS138C=0;break;

case1:LS138A=1;LS138B=0;LS138C=0;break;

case2:LS138A=0;LS138B=1;LS138C=0;break;

case3:LS138A=1;LS138B=1;LS138C=0;break;

}

delay(100);

}

P0=0;

}

}

//延時程序

voiddelay(unsignedinti)

{

charj;

for(i;i>0;i--)

for(j=200;j>0;j--);

}

/*************************此部分為18B20的驅動程序*************************************/

#include<reg52.H>

#include<intrins.h>

sbitD18B20=P3^7;

#defineNOP()_nop_()/*定義空指令*/

#define_Nop()_nop_()/*定義空指令*/

voidTempDelay(unsignedcharidataus);

voidInit18b20(void);

voidWriteByte(unsignedcharidatawr);//單位元組寫入

voidread_bytes(unsignedcharidataj);

unsignedcharCRC(unsignedcharj);

voidGemTemp(void);

voidConfig18b20(void);

voidReadID(void);

voidTemperatuerResult(void);

bitflag;

unsignedintidataTemperature;

unsignedcharidatatemp_buff[9];//存儲讀取的位元組,readscratchpad為9位元組,readromID為8位元組

unsignedcharidataid_buff[8];

unsignedcharidata*p,TIM;

unsignedcharidatacrc_data;

unsignedcharcodeCrcTable[256]={

0,94,188,226,97,63,221,131,194,156,126,32,163,253,31,65,

157,195,33,127,252,162,64,30,95,1,227,189,62,96,130,220,

35,125,159,193,66,28,254,160,225,191,93,3,128,222,60,98,

190,224,2,92,223,129,99,61,124,34,192,158,29,67,161,255,

70,24,250,164,39,121,155,197,132,218,56,102,229,187,89,7,

219,133,103,57,186,228,6,88,25,71,165,251,120,38,196,154,

101,59,217,135,4,90,184,230,167,249,27,69,198,152,122,36,

248,166,68,26,153,199,37,123,58,100,134,216,91,5,231,185,

140,210,48,110,237,179,81,15,78,16,242,172,47,113,147,205,

17,79,173,243,112,46,204,146,211,141,111,49,178,236,14,80,

175,241,19,77,206,144,114,44,109,51,209,143,12,82,176,238,

50,108,142,208,83,13,239,177,240,174,76,18,145,207,45,115,

202,148,118,40,171,245,23,73,8,86,180,234,105,55,213,139,

87,9,235,181,54,104,138,212,149,203,41,119,244,170,72,22,

233,183,85,11,136,214,52,106,43,117,151,201,74,20,246,168,

116,42,200,150,21,75,169,247,182,232,10,84,215,137,107,53};

//

/************************************************************

*Function:延時處理

*parameter:

*Return:

*Modify:

*************************************************************/

voidTempDelay(unsignedcharidataus)

{

while(us--);

}

/************************************************************

*Function:18B20初始化

*parameter:

*Return:

*Modify:

*************************************************************/

voidInit18b20(void)

{

D18B20=1;

_nop_();

D18B20=0;

TempDelay(80);//delay530uS//80

_nop_();

D18B20=1;

TempDelay(14);//delay100uS//14

_nop_();

_nop_();

_nop_();

if(D18B20==0)

flag=1;//detect1820success!

else

flag=0;//detect1820fail!

TempDelay(20);//20

_nop_();

_nop_();

D18B20=1;

}

/************************************************************

*Function:向18B20寫入一個位元組

*parameter:

*Return:

*Modify:

*************************************************************/

voidWriteByte(unsignedcharidatawr)//單位元組寫入

{

unsignedcharidatai;

for(i=0;i<8;i++)

{

D18B20=0;

_nop_();

D18B20=wr&0x01;

TempDelay(3);//delay45uS//5

_nop_();

_nop_();

D18B20=1;

wr>>=1;

}

}

/************************************************************

*Function:讀18B20的一個位元組

*parameter:

*Return:

*Modify:

*************************************************************/

unsignedcharReadByte(void)//讀取單位元組

{

unsignedcharidatai,u=0;

for(i=0;i<8;i++)

{

D18B20=0;

u>>=1;

D18B20=1;

if(D18B20==1)

u|=0x80;

TempDelay(2);

_nop_();

}

return(u);

}

/************************************************************

*Function:讀18B20

*parameter:

*Return:

*Modify:

*************************************************************/

voidread_bytes(unsignedcharidataj)

{

unsignedcharidatai;

for(i=0;i<j;i++)

{

*p=ReadByte();

p++;

}

}

/************************************************************

*Function:CRC校驗

*parameter:

*Return:

*Modify:

*************************************************************/

unsignedcharCRC(unsignedcharj)

{

unsignedcharidatai,crc_data=0;

for(i=0;i<j;i++)//查表校驗

crc_data=CrcTable[crc_data^temp_buff[i]];

return(crc_data);

}

/************************************************************

*Function:讀取溫度

*parameter:

*Return:

*Modify:

*************************************************************/

voidGemTemp(void)

{

read_bytes(9);

if(CRC(9)==0)//校驗正確

{

Temperature=temp_buff[1]*0x100+temp_buff[0];

// Temperature*=0.625;

Temperature/=16;

TempDelay(1);

}

}

/************************************************************

*Function:內部配置

*parameter:

*Return:

*Modify:

*************************************************************/

voidConfig18b20(void)//重新配置報警限定值和解析度

{

Init18b20();

WriteByte(0xcc);//skiprom

WriteByte(0x4e);//writescratchpad

WriteByte(0x19);//上限

WriteByte(0x1a);//下限

WriteByte(0x7f);//set11bit(0.125)

Init18b20();

WriteByte(0xcc);//skiprom

WriteByte(0x48);//保存設定值

Init18b20();

WriteByte(0xcc);//skiprom

WriteByte(0xb8);//回調設定值

}

/************************************************************

*Function:讀18B20ID

*parameter:

*Return:

*Modify:

*************************************************************/

voidReadID(void)//讀取器件id

{

Init18b20();

WriteByte(0x33);//readrom

read_bytes(8);

}

/************************************************************

*Function:18B20ID全處理

*parameter:

*Return:

*Modify:

*************************************************************/

voidTemperatuerResult(void)

{

p=id_buff;

ReadID();

Config18b20();

Init18b20();

WriteByte(0xcc);//skiprom

WriteByte(0x44);//Temperatureconvert

Init18b20();

WriteByte(0xcc);//skiprom

WriteByte(0xbe);//readTemperature

p=temp_buff;

GemTemp();

}

voidGetTemp()

{

if(TIM==100)//每隔1000ms讀取溫度

{TIM=0;

TemperatuerResult();

}

}

/*************************************

[t1(10ms)中斷]中斷

*************************************/

voidT1zd(void)interrupt3

{

TH1=0xD8;//10

TL1=0xF0;

TIM++;

}

/*************************此部分為74HC595的驅動程序使用SPI匯流排連接*************************************/

#include<reg52.h>

#include<intrins.h>

#defineNOP()_nop_()/*定義空指令*/

#define_Nop()_nop_()/*定義空指令*/

voidHC595SendData(unsignedintSendVal);

//SPIIO

sbitMOSIO=P1^5;

sbitR_CLK=P1^6;

sbitS_CLK=P1^7;

sbitIN_PL=P3^4;//74HC165shiftload把數據載入到鎖存器中

sbitIN_Dat=P3^5;//74HC165output數據移出

sbitOE=P3^6;

/*********************************************************************************************************

**函數名稱:HC595SendData

**功能描述:向SPI匯流排發送數據

*********************************************************************************************************/

voidHC595SendData(unsignedintSendVal)

{

unsignedchari;

for(i=0;i<16;i++)

{

if((SendVal<<i)&0x8000)MOSIO=1;//setdatalinehigh

elseMOSIO=0;

S_CLK=0;

NOP();

NOP();

S_CLK=1;

}

R_CLK=0;//setdatalinelow

NOP();

NOP();

R_CLK=1;//片選

OE=0;

}

閱讀全文

與單片機系統的解決方案相關的資料

熱點內容
程序員涉黃 瀏覽:698
maven編譯resources下的js 瀏覽:519
ubuntu文件移動命令 瀏覽:227
安卓i怎麼查找蘋果手機 瀏覽:949
雲伺服器宕機概率 瀏覽:229
在線買葯用什麼app知乎 瀏覽:813
ubuntu解壓xz文件 瀏覽:674
宏傑加密時電腦關機 瀏覽:388
自己寫單片機編譯器 瀏覽:598
單片機按鍵閃爍 瀏覽:380
為什麼icloud總是顯連接伺服器失敗 瀏覽:888
如何設置域控伺服器 瀏覽:738
想在上海租房子什麼app好 瀏覽:184
編譯程序各部分是必不可少的嗎 瀏覽:885
編程不超過十行 瀏覽:764
數電編譯器的作用 瀏覽:337
時間演算法與現在有什麼區別 瀏覽:164
7zip解壓後沒文件夾 瀏覽:904
為什麼安卓送玫瑰ios收不到 瀏覽:10
美篇文章加密是什麼意思 瀏覽:84