西工大課程設計1a
『壹』 集成直流穩壓電源 課程設計
<電子技術課程設計>
直流穩壓電源課程設計任務書
一:設計任務及要求:
1. 設計任務
設計一集成直流穩壓電源,滿足:
(1)當輸入電壓在220V交流時,輸出直流電壓為6V。
(2)輸出紋波電壓小於5mv,穩壓系數<=0.01;
(3)具有短路保護功能。
(4) 最大輸出電流為:Imax=1.0A;
2.通過集成直流穩壓電源的設計,要求學會:
(1)選擇變壓器、整流二極體、濾波電容及集成穩壓器來設計直流穩壓電源。
(2)掌握直流穩壓電源的調試及主要技術指標的測試方法。
3.設計要求
(1) 電源變壓器只做選擇性設計;
(2) 合理選擇集成穩壓器;
(3) 完成全電路理論設計、繪制電路圖;
(4)撰寫設計報告。
目錄
一.設計任務及要求:
二.基本原理與分析
三.三端集成穩壓器
四.穩壓電源的技術指標及對穩壓電源的要求
五.集成電路選用時應注意的問題
六.參數性能指標及測試方法
七.心得體會
八.參考文獻
附:部分
二、原理與分析
1.直流穩壓電源的基本原理
直流穩壓電源一般由電源變壓器T、整流濾波電路及穩壓電路所組成,基本框圖如下。各部分的作用:
(1)電源變壓器T的作用是將電網220V的交流電壓變換成整流濾波電路所需要的交流電壓Ui。變壓器副邊與原邊的功率比為P2/ P1=η,式中η是變壓器的效率。
(2)整流濾波電路:整流電路將交流電壓Ui變換成脈動的直流電壓。再經濾波電路濾除較大的紋波成分,輸出紋波較小的直流電壓U1。常用的整流濾波電路有全波整流濾波、橋式整流濾波等。
各濾波電容C滿足RL-C=(3~5)T/2,或中T為輸入交流信號周期,RL為整流濾波電路的等效負載電阻。
(3)三端集成穩壓器:常用的集成穩壓器有固定式三端穩壓器與可調式三端穩壓器。常用可調式正壓集成穩壓器有CW317(LM317)系列,它們的輸出電壓從1.25V-37伏可調,最簡的電路外接元件只需一個固定電阻和一隻電位器。其晶元內有過渡、過熱和安全工作區保護,最大輸出電流為1.5A。其典型電路如圖2,其中電阻R1與電位器R2組成輸出電壓調節器,輸出電壓Uo的表達式為:Uo=1.25(1+R2/R1)
式中R1一般取120-240歐姆,輸出端與調整端的壓差為穩壓器的基準電壓(典型值為1.25V)。
2.穩壓電流的性能指標及測試方法
穩壓電源的技術指標分為兩種:一種是特性指標,包括允許輸入電壓、輸出電壓、輸出電流及輸出電壓調節范圍等;另一種是質量指標,用來衡量輸出直流電壓的穩定程度,包括穩壓系數(或電壓調整率)、輸出電阻(或電流調整率)、紋波電壓(紋波系數)及溫度系數。測試電路如圖3。
圖3 穩壓電源性能指標測試電路
(1) 紋波電壓:疊加在輸出電壓上的交流電壓分量。用示波器觀測其峰峰值一般為毫伏量級。也可用交流毫伏表測量其有效值,但因紋波不是正弦波,所以有一定的誤差。
(2)穩壓系數:在負載電流、環境溫度不變的情況下,輸入電壓的相對變化引起輸出電壓的相對變化,即:
(3) 電壓調整率:輸入電壓相對變化為±10%時的輸出電壓相對變化量,穩壓系數和電壓調整率均說明輸入電壓變化對輸出電壓的影響,因此只需測試其中之一即可。
(4) 輸出電阻及電流調整率
輸出電阻與放大器的輸出電阻相同,其值為當輸入電壓不變時,輸出電壓變化量與輸出電流變化量之比的絕對值.電流調整率:輸出電流從0變到最大值時所產生的輸出電壓相對變化值。輸出電阻和電流調整率均說明負載電流變化對輸出電壓的影響,因此也只需測試其中之一即可。
直流穩壓電源設計 (未經整理僅供參考)
直流穩壓電源設計
一. 設計任務與設計的基本要求:
(1).直流穩壓電源的任務:
利用所學的知識設計並製作交流變換為直流的穩壓電源.
(2)直流穩壓電源的基本要求:
A.穩壓電源 在輸入電壓為220V.50HZ. 電壓變化范圍為+10%~-10%條件下:
a. 輸出電壓可調范圍為:+9V~+12V;
b. 最大輸出電流為:Imax=1.5A;
c. 電壓調整率≤0.2%(輸入電壓220V變化范圍+10%~-10%下,滿載);
d. 負載調整率≤2%(最低輸入電壓下,空載到滿載);
e. 紋波電壓(峰-峰值) ≤5mV(最低輸入電壓下,滿載);
f. 效率≥40%(輸出電壓為+9V,輸入電壓為220V下,滿載);
g. 具有過流保護及短路保護功能;
B. 穩流電源 在輸入電壓固定為直流+12V的條件下;
a. 輸出電流為:4~20mA可調;
b. 負載調整率≤2%(輸入電壓+12V,負載電阻由200Ω~300Ω變化時,輸出電流為20mA時的相對變化率);
C. DC-DC變換器 在輸入電壓為+9V~+12V條件下:
a. 輸出電壓為+100V,輸出電流為10mA;
b. 電壓調整率≤2%(輸入電壓變化范圍+9V~+12V);
c. 負載調整率≤2%(輸入電壓+12V下,空載到滿載);
d. 紋波電壓(峰-峰值) ≤100mA(輸入電壓+9V下,滿載);
註:以下是本電路的發揮部分:
(1)擴充功能:
a. 排除短路故障後,自動恢復為正常狀態; b. 過熱保護;
c. 防止開, 關機時產生的」過沖」;
(2)提高穩壓電源的技術指標;
a. 提高穩壓調整率和負載調整率;
b. 擴大輸出電壓調節范圍和提高最大輸出電流值.
(3)改善DC-DC變換器的性能;
a. 提高效率(在100V, 100mA下測試);
b. 提高輸出電壓.
(4)用數字顯示輸出電壓和輸出電流.
摘 要
本系統穩壓電源部分採用電壓調整器uA723外加調整管2SC3280實現此功能,再通過單片機MCS-51(89C51)來起控制電路,實現了擴充多種功能.穩流部分採用了三端穩壓調整器LM317T實現.DC-DC變換器採用了兩片PFM控制晶元MAX770來實現,使輸出電壓提高到+100V,輸出電流最大可以達到100mA.電壓調整,負載調整率及紋波電壓均優於指標要求.可以說本系統比其它同類產品要好的多.
二.方案論證與比較
1.穩壓電源部分
方案一:簡單的並聯型穩壓電源;
並聯型穩壓電源的調整元件與負載並聯,因而具有極低的輸出電阻,動態特性好,電路簡單,並具有自動保護功能;負載短路時調整管截止,可靠性高,但效率低,尤其是在小電流時調整管需承受很大的電流,損耗過大,因而不能採用此方案.
方案二:輸出可調的開關電源;
開關電源的功能元件工作在開關狀態,因而效率高,輸出功率大;且容易實現短路保護與過流保護,但是電路比較復雜,設計繁瑣,在低輸出電壓時開關頻率低,紋波大,穩定度極差,因而也不能採用此方案.
方案三:由uA723組成的零伏起調電源;
uA723內部設有高精度基準電壓源和高增益的放大器,外圍電路比較簡單,電壓穩定度也比較高,其典型電壓調整率為0.01%,負載調整率為0.03%,且熱穩定性好,輸出雜訊也很小,還內設有過電流控制電路,使用安全可靠,具有較高的性價比,為首選方案,所以此方案為必選題.
2.穩流電源部分
方案一: 採用7805三端穩壓器電源;
固定式三端穩壓電源(7805)是由輸出腳Vo,輸入腳Vi和接地腳GND組成,它的穩壓值為+5V,它屬於CW78xx系列的穩壓器,輸入端接電容可以進一步的濾波,輸出端也要接電容可以改善負載的瞬間影響,此電路的穩定性也比較好,只是採用的電容必須要漏電流要小的鉭電容,如果採用電解電容,則電容量要比其它的數值要增加10倍,但是它不可以調整輸出的直流電源;所以此方案不易採用.
方案二:採用LM317可調式三端穩壓器電源;
LM317可調式三端穩壓器電源能夠連續輸出可調的直流電壓.
不過它只能連續可調的正電壓,穩壓器內部含有過流,過熱保護電路;由一個電阻(R)和一個可變電位器(RP)組成電壓輸出調節電路,輸出電壓為:Vo=1.25(1+RP/R).由此可見此穩壓器的性能和穩壓穩定都比上一個三端穩壓電源要好,所以此此方案可選,此電源就選用了LM317三端穩壓電源,也就是方案二.
3.DC-DC變換部分;
方案一:用正弦信號(幾十赫茲以下)驅動硅鋼型互感耦合變壓器,經整流濾波後輸出.由於硅鋼的磁滯特性,這種電源的開關頻率不算高,易出現磁飽和,因而不利於製作高效率的開關電源.
方案二:採用高頻磁芯和開關特性好的VMOS管的PFM或PWM型開關電源,負載調整特性好,效率高,性能優良,但製作調試復雜,所以此方案也不於採納,
方案三:採用充電泵型變換器,該類電源以電容代替電感作貯能元件,為一個或多個電容供電.該類電源的最大特點是元件易得,體積小,電路比較簡單,無電感;但由於對充電泵的要求嚴格,不適合於工作在大負載條件下,因而在大多數電源中沒有被廣泛使用.
綜合考慮效率,輸出功率,輸入輸出電壓,負載調整率,紋波系數,本設計選用方案二.考慮到PWM對磁性元件,開關元件特性的要求較低,因而較易實現.對於效率和紋波的要求可以通過仔細調整磁性元件的參數(L,Q,M等)使其工作在最佳狀態,所以我們在選擇方案的時候考慮到電路要簡單,元件要容易找,還有在電路設計的時候避免遇到某些不必要的問題,所以我們選擇了上述的方案中的第二個方案;第二個方案就能夠達到我們的要求,的所以方案二我們採用了,利用開關特性和負載調整特性好及效率高,性能優良,而採用了它.(方案二)
三.直流穩壓電源電路的方框圖如下:
220V電源部分---變壓部分---整流濾波部分---穩壓電源穩流電源部分---+9V^+12V
直流穩壓電源方框圖
四.電路原理及各部的分離電路;
1.穩壓電路部分;
採用精密電壓調整器uA723,外加大功率調整管以提供大電流輸出.uA723的特點如下:
①無外接調整管時最大輸出電流為:I=150mA;
②外接調整管時,輸出電流最大可達到12A以上;
③最大輸入電壓為:Vmax=40V;
④輸出電壓可調整范圍為: +9V~+12V;
具體的電路圖如下圖所示:
電源變壓器的效率如下所示:(小型變壓器)
副邊功率P2/vA <1010^30 30^80 80^200
效率 η 0.6 0.7 0.8 0.85
由uA723的特性可知:要使電路實現零伏起調,uA723的7腳至少要獲得-2V的附加電壓,本方案不採用多抽頭的變壓器,該-2V電壓可通過由電容C1,C2和二極體D1,D2組成的倍壓電路獲得.其輸出電壓由電阻R1和齊納二極體Z1固定-5.6V
,使uA723中的差分放大器在輸出電壓為0時仍能工作,主要的正電壓通過整流橋和濾波電容C3從變壓器獲得.uA723的供電電壓由齊納二極體Z2固定在33V,以防止超過其極限電壓值(40V).由BG2,BG3組成的達林頓管將輸出電流提高到超過1A的范圍.
在12腳和3腳間加0.6V的電壓可調節極限電流值,該電壓是電阻R9和電位器VR3是壓降的總和,VR3的壓降是VR3的電阻值與晶體管三極體BG1的集電極電流值的乘積,極限電流值可以通過電位器VR3連續調節.
輸出電壓由電位器VR2進行線性調節,電位器VR1用於調節零輸出電壓.
本設計還通過單片來實現了短路過流保護,過熱保護,具體的電路圖如下:
過熱保護:溫度開關KT一端通過一個上拉電阻接正電源,另一端接地,當溫度過高時開關斷開,產生一個零電平跳變送給單片來進行處理.
過流檢測和短路保護原理:採用單片機MCS-51(89C51)對輸出電流進行周期性的檢測,可以方便地實現短路保護及短路故障排除後自恢復的所有功能.過流或短路時,檢測電路向單片P1口發出報警信號,單片證實後啟動它的保護電路,經過短時間延時後繼續查詢P1口上的內容,如無報警信號,則電路又恢復到正常狀態.
過熱保護,發聲報警等功能也直接由單片機(89C51)來實現控制.
2.穩流電源部分;
LM317是三端可調式正電壓調整器,正常工作時在其調整端與輸出端之間有一個高穩定度的1.25V電壓,利用該電壓即可以獲得可調的電流輸出.實際中,
LM317輸出端與電位器之間串接了一個10Ω/1W的電阻,使最大電流限制在125mA左右,以免發生過流現象.
具體的電路圖如下所示:
3.DC-DC變換部分;
DC-DC變換器的核心部件是兩片升壓開關調節器MAX770,MAX770結合了PFM低的吸取電流和PWM大功率應用下效率高的特點,能比以往的PWM器件提供更大的電流.
MAX770有以下的特點:
①開關頻率較高(300KHZ),減小了電感的尺寸;
②在較寬輸出電流范圍內可以達到87%的效率;
③功耗比較低;
用MAX770製成的升壓器如下圖所示;由於MAX770對VMOS管的驅動能力有限,使用了一片MAX770很難實現本電路的性能指標,因此本電路採用了兩級MAX770.
五. 測試方法與調試過程;
1.穩壓電源部分;
(1) 輸出電壓范圍測試
調節可調電位器,用數字型萬用表測出電阻兩端的輸出電壓,最小值為0.821V,最大值為:24.61V.
(2) 最大輸出電流測試 將輸出電壓調整至9V,輸出端接通可調電阻,串入數字萬用表,測得最大輸出電流為:2.06A.
(3) 電壓調整率測試
將調壓變壓器輸出端接穩壓電源的輸入端,將穩壓電源輸出電壓調整至9V,調節調壓變壓器,使其輸出從176V升至到253V,用數字萬用表測量負載兩端的電壓,測得最大電壓變化量為:10mV,計算得電壓調整率為:(0.01/9)*100%=0.11%.
(4)負載調整率測試
空載時將輸出電壓調整至9V,在負載端接入300Ω/120W的變阻器,將變阻器從6Ω調整至100Ω,用數字萬用表監視輸出電壓的變化,測得最大電壓變化量為:0.04V,因此負載調整率為:(0.04/9)*100%=0.44%.
(5)紋波電壓測試 將電壓輸出調整至9V,外接一個6Ω的電阻,將示波器置於AC/5mV輸入擋,測得負載上的紋波電壓為:1mV.
(6)效率測試
將電壓輸出調整至9V,外接一個6Ω的電阻,其輸出功率P0=81/6=13.5W.在負載不變的情況下,測出穩壓電源的交流輸入電壓為:12V,交流電流為:2.05A.因此輸入功率Pi=12*2.05=24.7W(設功率因數為1),電源效率為(P0/Pi)*100%=(13.5/24.7)*100%=40%,達到上述所要求的指標.
(7)過流保護及短路保護功能測試
將電壓輸出調至為9V,外接一個6Ω的電阻,用萬用表測得輸出電流為:0.說明過流保護功能正常.再將輸出短路,現象如同上,說明短路保護功能一切正常.
(8)採用單片機(89C51)來實現保護,檢測 短路故障排除自恢復,過熱保護,防止關機時產生的」過沖」均測試通過;一切正常.
2.穩流電源部分;
(1) 輸出電流測試 輸入電壓為+12V,改變外接電阻的大小,記錄最小電流值Imin與最大電流Imax.Imax=45.40mA,
Imin=1.46mA.
(2) 負載調整率的測量
輸入電壓+12V,負載電阻由220Ω至300Ω之間變化,設定輸出電流20mA,每上升20Ω測輸出電流,數據如下所示:
電阻/Ω 200 220 240 260 280 300
電流/mA 19.71 19.72 19.70 19.70 19.70 19.70
負載調整率≈0.02/20.00=0.1%.
3. DC-DC變換器部分;
(1) 輸出電壓電流測試
輸入電壓由+9V至+12V變化,負載接3.6KΩ/10W電阻,測得輸出電壓為+100.11V,輸出電流為:30.7mA.
(2) 電壓調整率的測試 空載,輸入電壓由+9V至+12V變化,測得最大電壓變化為:0.1V.
(3) 負載調整率的測試 輸入電壓+12V,空載,測得輸出電壓 +100.1V;10KΩ/5W電阻,測得輸出電壓為:
+100.0V.
(4) 紋波電壓測試 輸入電壓 +9V,接3.6KΩ/10W的電阻,示波置於交流AC/250mV擋,測得紋波電壓.Vpp≈80mV.
(5) 效率的測試
輸入電流為:5A,輸入電壓為:11.8V時,測得輸出電壓為100.08V(3.6KΩ的電阻,電流為:27.8mA),計算可得出:
η=64.3%.
六. 電路的結果分析
1. 穩壓電路部分;
(1) 輸出電壓的可調范圍
由於本電路中uA723的7腳接-2V,因此可以實現從零伏起調,這也是本電路的特色之一,本電路實現了0^20V可調,超過指標要求.
(2)最大輸出電流
它由uA723的3腳所接電阻R9決定,計算公式為:Imax=0.6/R9,由於本電路中R9為0.33Ω,因此Imax限制為2A左右.
(3)電壓和負載調整率及紋波電壓 優於指標要求,這是由uA723優良特性與方案設計思路決定的.
(4)效率的測試 輸出為9V,而輸入為17V左右,因此有一部分功率被調整管吸收,從而導致了效率並不是很高.
2. 穩流電路部分;
(1) Rmin=10Ω, Rmax=1010Ω
I』min=1.25/1010≈1.24mA > Imin
受輸入電壓+12V與LM317內部壓降約為1.7V的影響,可能的最大電流為: I』max=(12-1.7)/220≈46.82mA >
Imax
Imin>I』min是由於LM317在小電流負載下穩壓性能變差造成的.
Imax<I』max是由於LM317內部的損耗而造成的.
(2) 負載調整率 LM317的典型負載調整率為:0.1%,本電源在工作時工作在小電流負載情況下,與理論值吻合.
3. DC-DC變換電路;
由於該變換部分輸入電壓為12V,輸出電壓為100V,升壓比較大,要保證電流輸出能力,多級並聯式開關升壓器是一種較好的選擇.
在保證第二級滿載輸出時,第一級至少應留有80%的裕量,且第一級電壓波動應不大於5%.
在實際電路中前級由於是升至次高壓,故要求開關管的Ron足夠小,Ids足夠大,Cis足夠小(否則將對驅動電路產生不利的影響);後級應對反向擊穿電壓有較高的要求,應不低於500V,取該級開關管耐壓值為:900V,以防止高壓毛刺擊穿.對磁芯的選擇決定了電源的功率容量,在實際中,高於200KHZ時採用鐵粉芯等帶空氣隙的磁芯可獲得良好的功率容量和磁滯特性,有利於大L值電感的充放電的完成,即提高Q值.在該模塊的測試中,可以看到在大DC變換比的指標下,採用了多級串聯主從式開關電源是一種較好的解決方案.
七. 此電路的誤差分析
綜合分析可以知道在測試電路的過程中可能帶來的誤差因素有:
① 測得輸出電流時接觸點之間的微小電阻造成的誤差;
② 電流表內阻串入迴路造成的誤差;
③ 測得紋波電壓時示波器造成的誤差;
④ 示波器, 萬用表本身的准確度而造成的系統誤差;
可以通過以下的方法去改進此電路:
① 減小接觸點的微小電阻;
② 根據電流表的內阻對測量結果可以進行修正;
③ 測得紋波時示波器採用手動同步;
④ 採用更高精確度的儀器去檢測;
八. 對此電路的綜合總結
通過本次設計,讓我們更進一步的了解到直流穩壓電源的工作原理以及它的要求和性能指標.也讓我們認識到在此次設計電路中所存在的問題;而通過不斷的努力去解決這些問題.在解決設計問題的同時自己也在其中有所收獲.我們這次設計的這個直流穩壓電源電路;採用了電壓調整管(uA723)外加調整管(2SC3280)來實現電壓的調整部分;還通過單片機(89C51)來實現電路的控制,也實現了擴充多功能;而穩流部分採用了LM317可調式三端穩壓電源管,通過LM317來實現
了電路中的穩流部分,至於電路的最後一部分(DC-DC變換部分)我們是採用兩片升壓開關調節器(MAX770)來實現了電路中的DC-DC變換部分.本次設計在電壓調整器的電路中,採用了適當的聯接方法,可以實現電壓」零」伏起調;測試方法與過程也比較充分,同時也實現了電壓的可調.同時我們四個人在設計此電路的時候也付出了不少,我們幾個分工完成了此電路,雖然電路不是很完善,我們已經盡力的去把它給做好了;由於時間的關系此電路只有硬體,軟體沒有時間來完成.
(注:由於時間的原因本電路的軟體部分沒有在報告上體現出來).
九. 參考文獻資料:
◆何立民編著 . MCS-51系列單片機應用系統設計--------系統配置與介面技術, 北京航空航天大學出版社, 1991.
◆王樹勛,潘承武,朱英傑編著. MCS—51單片微型計算機原理與開發. 機械出版社,1990.
◆<<電子線路基礎>>,華東師范大學物理系萬嘉若,林康運等編著,高等教育出版社,1986年3月.
◆ <<電子技術基礎>>,華中工學院電子學教研室編,康華光主編,高等教育出版社,1982年6月.
◆<<電子線路設計>>,(第二版)華中科技大學謝自美主編,華中科技大學出版社,2000年5月.
『貳』 C語言課程設計
給你一個簡單的吧
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc, char* argv[])
{
int u;
int count=0;
int n;
srand((unsigned)time(NULL));
u=1+rand()%10;
printf("系統產生了一個1~10之間的整數,猜猜它是幾?\n");
printf("請輸入一個1~10之間的整數:");
for(int i=0;i<10;i++)
{
scanf("%d",&n);
if(n>u)
printf("輸入你輸入的數大了,再猜:");
count++;
if(n<u)
printf("輸入你輸入的數小了,再猜:");
count++;
if(n==u)
{
if(count<=4)
{
printf("恭喜你,猜對了!你真牛");
break;
}
if(count>4&&count<=6)
{
printf("猜對了!只是次數有點多哈哈");
break;
}
if(count>6)
{
printf("笨笨,這么多次才猜對");
break;
}
}
}
return 0;
}
『叄』 多路輸出直流穩壓電源課程設計
一個變壓器,整流抄後濾波襲,並兩電容,再接上(並上)7812(out+12V),7912(-12V),7805,7905分別輸出+5V,-5V電壓,電流都是1A的,呵呵,然後再濾波一次,電容參數取一般的濾波電容參數就可以了,我想這個辦法滿簡易的,如果你要可調有數字顯示而且輸出更穩定的話.........那自然就用到單片機了,那樣就..........呵呵,給你推薦主要晶元,AT89C52(51管腳太多,52就夠了),MAX532..................
『肆』 c語言程序課程設計
給你代碼,你自己去研究吧
#include <stdio.h>
#define SIZE 10
typedef struct student
{
int num;
char name[20];
int score[3];
float average;
}student;
void indata(student *stu)
{
int i;
for (i = 0; i < SIZE; i++)
{
scanf("%d %s %d %d %d%*c", &stu[i].num, stu[i].name, &stu[i].score[0],
&stu[i].score[1], &stu[i].score[2]);
}
}
void outdata(student *stu)
{
int i;
for (i = 0; i < SIZE; i++)
{
printf("%d %s %d %d %d %f\n", stu[i].num, stu[i].name, stu[i].score[0],
stu[i].score[1], stu[i].score[2], stu[i].average);
}
}
int main()
{
student stu[SIZE];
int i, j;
int t;
student temp;
printf("請輸入信息:\n");
indata(stu);
for (i = 0; i < SIZE; i++) //算平均分
{
stu[i].average = 0;
for (j = 0; j < 3; j++)
stu[i].average += stu[i].score[j];
stu[i].average /= 3;
}
for (i = 0; i < SIZE - 1; i++) //按平均分進行排序
{
t = i;
for (j = i + 1; j < SIZE; j++)
{
if (stu[t].average > stu[j].average)
t = j;
}
if (t == i)
continue;
else
{
temp = stu[i];
stu[i] = stu[t];
stu[t] = temp;
}
}
printf("排序後信息為:\n");
outdata(stu);
return 0;
}
『伍』 c語言課程設計
字數受限,只能打這多了或看看這個http://wenku..com/view/92d3d138376baf1ffc4fad1a.html#include "stdio.h" #include "stdlib.h" #include "string.h" #include "conio.h" #include "mem.h" #include "ctype.h" /#include "alloc.h" #define N 3 typedef struct z1
{
char no[11];
char name[15];
int score[N];
float sum;
float average;
int order;
struct z1 *next;
}STUDENT;
STUDENT *init();
STUDENT *create();
STUDENT *delete(STUDENT *h);
void print(STUDENT *h); /* 顯示所有記錄*/
void search(STUDENT *h); /*查找*/
void save(STUDENT *h); /*保存*/
STUDENT *load(); /*讀入記錄*/
void computer(STUDENT *h); /*計算總分和均分*/
STUDENT *insert(STUDENT *h); /*插入記錄*/
void append(); /*追加記錄*/
void (); /*復制文件*/
STUDENT *sort(STUDENT *h); /*排序*/
STUDENT *index(STUDENT *h); /*索引*/
void total(STUDENT *h); /*分類合計*/
int menu_select(); /*菜單函數*/
/******主函數開始*******/
main()
{
int i;
STUDENT *head; /*鏈表定義頭指針*/
head=init(); /*初始化鏈表*/
clrscr(); /*清屏*/
for(;;) /*無限循環*/
{
switch(menu_select()) /*調用主菜單函數,返回值整數作開關語句的條件*/
{ /*值不同,執行的函數不同,break 不能省略*/
case 0:head=init();break;
case 1:head=create();break;
case 2:head=delete(head);break;
case 3:print(head);break; /*顯示全部記錄*/
case 4:search(head);break; /*查找記錄*/
case 5:save(head);break; /*保存文件*/
case 6:head=load(); break; /*讀文件*/
case 7:computer(head);break; /*計算總分和均分*/
case 8:head=insert(head); break; /*插入記錄*/
case 9:();break; /*復制文件*/
case 10:head=sort(head);break; /*排序*/
case 11:append();break; /*追加記錄*/
case 12:head=index(head);break; /*索引*/
case 13:total(head);break; /*分類合計*/
case 14:exit(0); /*如菜單返回值為14程序結束*/
}
}
}
/*菜單函數,返回值為整數*/
menu_select()
{
char *menu[]={"***************MENU***************", /*定義菜單字元串數組*/
" 0. init list", /*初始化*/
" 1. Enter list", /*輸入記錄*/
" 2. Delete a record from list", /*從表中刪除記錄*/
" 3. print list ", /*顯示單鏈表中所有記錄*/
" 4. Search record on name", /*按照姓名查找記錄*/
" 5. Save the file", /*將單鏈表中記錄保存到文件中*/
" 6. Load the file", /*從文件中讀入記錄*/
" 7. compute the score", /*計算所有學生的總分和均分*/
" 8. insert record to list ", /*插入記錄到表中*/
" 9. the file to new file", /*復制文件*/
" 10. sort to make new file", /*排序*/
" 11. append record to file", /*追加記錄到文件中*/
" 12. index on nomber", /*索引*/
" 13. total on nomber", /*分類合計*/
" 14. Quit"}; /*退出*/
char s[3]; /*以字元形式保存選擇號*/
int c,i; /*定義整形變數*/
gotoxy(1,25); /*移動游標*/
printf("press any key enter menu......\n"); /*壓任一鍵進入主菜單*/
getch(); /*輸入任一鍵*/
clrscr(); /*清屏幕*/
gotoxy(1,1); /*移動游標*/
textcolor(YELLOW); /*設置文本顯示顏色為黃色*/
textbackground(BLUE); /*設置背景顏色為藍色*/
gotoxy(10,2); /*移動游標*/
putch(0xc9); /*輸出左上角邊框┏*/
for(i=1;i<44;i++)
putch(0xcd); /*輸出上邊框水平線*/
putch(0xbb); /*輸出右上角邊框 ┓*/
for(i=3;i<20;i++)
{
gotoxy(10,i);putch(0xba); /*輸出左垂直線*/
gotoxy(54,i);putch(0xba);
} /*輸出右垂直線*/
gotoxy(10,20);putch(0xc8); /*輸出左上角邊框┗*/
for(i=1;i<44;i++)
putch(0xcd); /*輸出下邊框水平線*/
putch(0xbc); /*輸出右下角邊框┛*/
window(11,3,53,19); /* 製作顯示菜單的窗口,大小根據菜單條數設計*/
clrscr(); /*清屏*/
for(i=0;i<16;i++) /*輸出主菜單數組*/
{
gotoxy(10,i+1);
cprintf("%s",menu[i]);
}
textbackground(BLACK); /*設置背景顏色為黑色*/
window(1,1,80,25); /*恢復原窗口大小*/
gotoxy(10,21); /*移動游標*/
do{
printf("\n Enter you choice(0~14):"); /*在菜單窗口外顯示提示信息*/
scanf("%s",s); /*輸入選擇項*/
c=atoi(s); /*將輸入的字元串轉化為整形數*/
}while(c<0||c>14); /*選擇項不在0~14之間重輸*/
return c; /*返回選擇項,主程序根據該數調用相應的函數*/
}
STUDENT *init()
{
return NULL;
}
/*創建鏈表*/
STUDENT *create()
{
int i; int s;
STUDENT *h=NULL,*info; /* STUDENT指向結構體的指針*/
for(;;)
{
info=(STUDENT *)malloc(sizeof(STUDENT)); /*申請空間*/
if(!info) /*如果指針info為空*/
{
printf("\nout of memory"); /*輸出內存溢出*/
return NULL; /*返回空指針*/
}
inputs("enter no:",info->no,11); /*輸入學號並校驗*/
if(info->no[0]=='@') break; /*如果學號首字元為@則結束輸入*/
inputs("enter name:",info->name,15); /*輸入姓名,並進行校驗*/
printf("please input %d score \n",N); /*提示開始輸入成績*/
s=0; /*計算每個學生的總分,初值為0*/
for(i=0;i<N;i++) /*N門課程循環N次*/
{
do{
printf("score%d:",i+1); /*提示輸入第幾門課程*/
scanf("%d",&info->score[i]);
if(info->score[i]>100||info->score[i]<0)
printf("bad data,repeat input\n");
}while(info->score[i]>100||info->score[i]<0);
s=s+info->score[i];
}
info->sum=s;
info->average=(float)s/N;
info->order=0;
info->next=h;
h=info; }
return(h); /*返回頭指針*/
}
/*輸入字元串,並進行長度驗證*/
inputs(char *prompt, char *s, int count)
{
char p[255];
do{
printf(prompt); /*顯示提示信息*/
scanf("%s",p); if(strlen(p)>count)printf("\n too long! \n"); }while(strlen(p)>count);
strcpy(s,p); }
void print(STUDENT *h)
{
int i=0; /* 統計記錄條數*/
STUDENT *p; /*移動指針*/
clrscr(); /*清屏*/
p=h; /*初值為頭指針*/
printf("\n\n\n****************************STUDENT********************************\n");
printf("|rec|nO | name | sc1| sc2| sc3| sum | ave |order|\n");
printf("|---|----------|---------------|----|----|----|--------|-------|-----|\n");
while(p!=NULL)
{
i++;
printf("|%3d |%-10s|%-15s|%4d|%4d|%4d| %4.2f | %4.2f | %3d |\n", i, p->no,p->name,p->score[0],p->score[1],
p->score[2],p->sum,p->average,p->order);
p=p->next;
}
printf("**********************************end*********************************\n");
}
/*刪除記錄*/
STUDENT *delete(STUDENT *h)
{
STUDENT *p,*q; /*p為查找到要刪除的結點指針,q為其前驅指針*/
char s[11]; /*存放學號*/
clrscr(); /*清屏*/
printf("please deleted no\n"); /*顯示提示信息*/
scanf("%s",s); /*輸入要刪除記錄的學號*/
q=p=h; /*給q和p賦初值頭指針*/
while(strcmp(p->no,s)&&p!=NULL) /*當記錄的學號不是要找的,或指針不為空時*/
{
q=p; /*將p指針值賦給q作為p的前驅指針*/
p=p->next; /*將p指針指向下一條記錄*/
}
if(p==NULL) /*如果p為空,說明鏈表中沒有該結點*/
printf("\nlist no %s student\n",s);
else /*p不為空,顯示找到的記錄信息*/
{
printf("*****************************have found***************************\n");
printf("|no | name | sc1| sc2| sc3| sum | ave |order|\n");
printf("|----------|---------------|----|----|----|--------|-------|-----|\n");
printf("|%-10s|%-15s|%4d|%4d|%4d| %4.2f | %4.2f | %3d |\n", p->no,
p->name,p->score[0],p->score[1],p->score[2],p->sum,
p->average,p->order);
printf("********************************end*******************************\n");
getch(); /*壓任一鍵後,開始刪除*/
if(p==h) /*如果p==h,說明被刪結點是頭結點*/
h=p->next; /*修改頭指針指向下一條記錄*/
else
q->next=p->next; /*不是頭指針,將p的後繼結點作為q的後繼結點*/
free(p); /*釋放p所指結點空間*/
printf("\n have deleted No %s student\n",s);
printf("Don't forget save\n");/*提示刪除後不要忘記保存文件*/
}
return(h); /*返回頭指針*/
}
/*查找記錄*/
void search(STUDENT *h)
{
STUDENT *p; char s[15]; clrscr();
printf("please enter name for search\n");
scanf("%s",s); /*輸入姓名*/
p=h; /*將頭指針賦給p*/
while(strcmp(p->name,s)&&p!=NULL) /*當記錄的姓名不是要找的,或指針不為空時*/
p=p->next; /*移動指針,指向下一結點*/
if(p==NULL) /*如果指針為空*/
printf("\nlist no %s student\n",s); /*顯示沒有該學生*/
else /*顯示找到的記錄信息*/
{
printf("\n\n*****************************havefound***************************\n");
printf("|nO | name | sc1| sc2| sc3| sum | ave |order|\n");
printf("|----------|---------------|----|----|----|--------|-------|-----|\n");
printf("|%-10s|%-15s|%4d|%4d|%4d| %4.2f | %4.2f | %3d |\n", p->no,
p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);
printf("********************************end*******************************\n");
}
}
/*插入記錄*/
STUDENT *insert(STUDENT *h)
{
STUDENT *p,*q,*info; /*p指向插入位置,q是其前驅,info指新插入記錄*/
char s[11]; /*保存插入點位置的學號*/
int s1,i;
printf("please enter location before the no\n");
scanf("%s",s); /*輸入插入點學號*/
printf("\nplease new record\n"); /*提示輸入記錄信息*/
info=(STUDENT *)malloc(sizeof(STUDENT)); /*申請空間*/
if(!info)
{
printf("\nout of memory"); /*如沒有申請到,內存溢出*/
return NULL; /*返回空指針*/
}
inputs("enter no:",info->no,11); /*輸入學號*/
inputs("enter name:",info->name,15); /*輸入姓名*/
printf("please input %d score \n",N); /*提示輸入分數*/
s1=0; /*保存新記錄的總分,初值為0*/
for(i=0;i<N;i++) /*N門課程循環N次輸入成績*/
{
do{ /*對數據進行驗證,保證在0~100之間*/
printf("score%d:",i+1);
scanf("%d",&info->score[i]);
if(info->score[i]>100||info->score[i]<0)
printf("bad data,repeat input\n");
}while(info->score[i]>100||info->score[i]<0);
s1=s1+info->score[i]; /*計算總分*/
}
info->sum=s1; /*將總分存入新記錄中*/
info->average=(float)s1/N; /*計算均分*/
info->order=0; /*名次賦值0*/
info->next=NULL; /*設後繼指針為空*/
p=h; /*將指針賦值給p*/
q=h; /*將指針賦值給q*/
while(strcmp(p->no,s)&&p!=NULL) /*查找插入位置*/
{
q=p; /*保存指針p,作為下一個p的前驅*/
p=p->next; /*將指針p後移*/
}
if(p==NULL) /*如果p指針為空,說明沒有指定結點*/
if(p==h) /*同時p等於h,說明鏈表為空*/
h=info; /*新記錄則為頭結點*/
else
q->next=info; else
if(p==h) {
info->next=p; h=info; }
else
{
info->next=p; q->next=info;
}
printf("\n ----have inserted %s student----\n",info->name); printf("---Don't forget save---\n"); /*提示存檔*/
return(h); /*返回頭指針*/
}
/*保存數據到文件*/
void save(STUDENT *h)
{
FILE *fp; /*定義指向文件的指針*/
STUDENT *p; /* 定義移動指針*/
char outfile[10]; /*保存輸出文件名*/
printf("Enter outfile name,for example c:\\f1\\te.txt:\n"); /*提示文件名格式信息*/
scanf("%s",outfile);
if((fp=fopen(outfile,"wb"))==NULL) /*為輸出打開一個二進制文件,如沒有則建立*/
{
printf("can not open file\n");
exit(1);
}
printf("\nSaving file......\n"); /*打開文件,提示正在保存*/
p=h; /*移動指針從頭指針開始*/
while(p!=NULL) /*如p不為空*/
{
fwrite(p,sizeof(STUDENT),1,fp);/*寫入一條記錄*/
p=p->next; /*指針後移*/
}
fclose(fp); /*關閉文件*/
printf("-----save success!!-----\n"); /*顯示保存成功*/
}
/* 從文件讀數據*/
STUDENT *load()
{
STUDENT *p,*q,*h=NULL; /*定義記錄指針變數*/
FILE *fp; /* 定義指向文件的指針*/
char infile[10]; /*保存文件名*/
printf("Enter infile name,for example c:\\f1\\te.txt:\n"); scanf("%s",infile); /*輸入文件名*/
if((fp=fopen(infile,"rb"))==NULL) /*打開一個二進制文件,為讀方式*/
{
printf("can not open file\n"); /*如不能打開,則結束程序*/
exit(1);
}
printf("\n -----Loading file!-----\n");
p=(STUDENT *)malloc(sizeof(STUDENT)); /*申請空間*/
if(!p)
{
printf("out of memory!\n"); /*如沒有申請到,則內存溢出*/
return h; /*返回空頭指針*/
}
h=p; /*申請到空間,將其作為頭指針*/
while(!feof(fp)) /*循環讀數據直到文件尾結束*/
{
if(1!=fread(p,sizeof(STUDENT),1,fp))
break; /*如果沒讀到數據,跳出循環*/
p->next=(STUDENT *)malloc(sizeof(STUDENT)); /*為下一個結點申請空間*/
if(!p->next)
{
printf("out of memory!\n"); return h;
}
q=p; p=p->next; }
q->next=NULL; /*最後一個結點的後繼指針為空*/
fclose(fp); /*關閉文件*/
printf("---You have success read data from file!!!---\n");
return h; /*返回頭指針*/
}
/*追加記錄到文件*/
void append()
{
FILE *fp; /*定義指向文件的指針*/
STUDENT *info; /*新記錄指針*/
int s1,i;
char infile[10]; /*保存文件名*/
printf("\nplease new record\n");
info=(STUDENT *)malloc(sizeof(STUDENT)); /*申請空間*/
if(!info)
{
printf("\nout of memory"); /*沒有申請到,內存溢出本函數結束*/
return ;
}
inputs("enter no:",info->no,11); /*調用inputs輸入學號*/
inputs("enter name:",info->name,15); /*調用inputs輸入姓名*/
printf("please input %d score \n",N); /*提示輸入成績*/
s1=0;
for(i=0;i<N;i++)
{
do{
printf("score%d:",i+1);
scanf("%d",&info->score[i]); /*輸入成績*/
if(info->score[i]>100||info->score[i]<0)printf("bad data,repeat input\n");
}while(info->score[i]>100||info->score[i]<0); /*成績數據驗證*/
s1=s1+info->score[i]; /*求總分*/
}
info->sum=s1; /*保存總分*/
info->average=(float)s1/N; /*求均分*/
info->order=0; /*名次初始值為0*/
info->next=NULL; /*將新記錄後繼指針賦值為空*/
printf("Enter infile name,for example c:\\f1\\te.txt:\n"); scanf("%s",infile); /*輸入文件名*/
if((fp=fopen(infile,"ab"))==NULL) /*向二進制文件尾增加數據方式打開文件*/
{
printf("can not open file\n"); /*顯示不能打開*/
exit(1); /*退出程序*/
}
printf("\n -----Appending record!-----\n");
if(1!=fwrite(info,sizeof(STUDENT),1,fp)) /*寫文件操作*/
{
printf("-----file write error!-----\n");
return; /*返回*/
}
printf("-----append sucess!!----\n");
fclose(fp); /*關閉文件*/
}
/*文件拷貝*/
void ()
{
char outfile[10],infile[10];
FILE *sfp,*tfp; /*源和目標文件指針*/
STUDENT *p=NULL; /*移動指針*/
clrscr(); /*清屏*/
printf("Enter infile name,for example c:\\f1\\te.txt:\n");
scanf("%s",infile); /*輸入源文件名*/
if((sfp=fopen(infile,"rb"))==NULL) /*二進制讀方式打開源文件*/
{
printf("can not open input file\n");
exit(0);
}
printf("Enter outfile name,for example c:\\f1\\te.txt:\n"); /*提示輸入目標文件名*/
scanf("%s",outfile); /*輸入目標文件名*/
if((tfp=fopen(outfile,"wb"))==NULL) /*二進制寫方式打開目標文件*/
{
printf("can not open output file \n");
exit(0);
}
while(!feof(sfp)) /*讀文件直到文件尾*/
{
if(1!=fread(p,sizeof(STUDENT),1,sfp))
break; /*塊讀*/
fwrite(p,sizeof(STUDENT),1,tfp); /*塊寫*/
}
fclose(sfp); /*關閉源文件*/
fclose(tfp); /*關閉目標文件*/
printf("you have success file!!!\n"); /*顯示成功拷貝*/
}
/*排序*/
STUDENT *sort(STUDENT *h)
{
int i=0; /*保存名次*/
STUDENT *p,*q,*t,*h1; /*定義臨時指針*/
h1=h->next; /*將原表的頭指針所指的下一個結點作頭指針*/
h->next=NULL; /*第一個結點為新表的頭結點*/
while(h1!=NULL) /*當原表不為空時,進行排序*/
{
t=h1; /*取原表的頭結點*/
h1=h1->next; /*原表頭結點指針後移*/
p=h; /*設定移動指針p,從頭指針開始*/
q=h; /*設定移動指針q做為p的前驅,初值為頭指針*/
while(t->sum<p->sum&&p!=NULL) /*作總分比較*/
{
q=p; /*待排序點值小,則新表指針後移*/
p=p->next;
}
if(p==q) /*p==q,說明待排序點值大,應排在首位*/
{
t->next=p; /*待排序點的後繼為p*/
h=t; /*新頭結點為待排序點*/
}
else /*待排序點應插入在中間某個位置q和p之間,如p為空則是尾部*/
{
t->next=p; /*t的後繼是p*/
q->next=t; /*q的後繼是t*/
}
}
p=h; /*已排好序的頭指針賦給p,准備填寫名次*/
while(p!=NULL) /*當p不為空時,進行下列操作*/
{
i++; /*結點序號*/
p->order=i; /*將名次賦值*/
p=p->next; /*指針後移*/
}
printf("sort sucess!!!\n"); /*排序成功*/
return h; /*返回頭指針*/
}
/*計算總分和均值*/
void computer(STUDENT *h)
{
STUDENT *p; /*定義移動指針*/
int i=0; /*保存記錄條數初值為0*/
long s=0; /*總分初值為0*/
float average=0; /*均分初值為0*/
p=h; /*從頭指針開始*/
while(p!=NULL) /*當p不為空時處理*/
{
s+=p->sum; /*累加總分*/
i++; /*統計記錄條數*/
p=p->next; /*指針後移*/
}
average=(float)s/i;/* 求均分,均分為浮點數,總分為整數,所以做類型轉換*/
printf("\n--All students sum score is:%ld average is %5.2f\n",s,average);
}
/*索引*/
STUDENT *index(STUDENT *h)
{
STUDENT *p,*q,*t,*h1; /*定義臨時指針*/
h1=h->next; /*將原表的頭指針所指的下一個結點作頭指針*/
h->next=NULL; /*第一個結點為新表的頭結點*/
while(h1!=NULL) /*當原表不為空時,進行排序*/
{
t=h1; /*取原表的頭結點*/
h1=h1->next; /*原表頭結點指針後移*/
p=h; /*設定移動指針p,從頭指針開始*/
q=h; /*設定移動指針q做為p的前驅,初值為頭指針*/
while(strcmp(t->no,p->no)>0&&p!=NULL) /*作學號比較*/
{
q=p; p=p->next;
}
if(p==q) /*p==q, {
t->next=p; h=t; }
else {
t->next=p; /*t的後繼是p*/
q->next=t; /*q的後繼是t*/
}
}
printf("index sucess!!!\n"); /*索引排序成功*/
return h; /*返回頭指針*/
}
/*分類合計*/
void total(STUDENT *h)
{
STUDENT *p,*q; /*定義臨時指針變數*/
char sno[9],qno[9],*ptr; /*保存班級號的*/
float s1,ave; /*保存總分和均分*/
int i; clrscr(); /*清屏*/
printf("\n\n *******************Total*****************\n");
printf("---class---------sum--------------average----\n");
p=h; while(p!=NULL)
{
memcpy(sno,p->no,8); /*從學號中取出班級號*/
sno[8]='\0'; /*做字元串結束標記*/
q=p->next; /*將指針指向待比較的記錄*/
s1=p->sum; /*當前班級的總分初值為該班級的第一條記錄總分*/
ave=p->average; /*當前班級的均分初值為該班級的第一條記錄均分*/
i=1; /*統計當前班級人數*/
while(q!=NULL) /*內循環開始*/
{
memcpy(qno,q->no,8); /*讀取班級號*/
qno[8]='\0'; /*做字元串結束標記*/
if(strcmp(qno,sno)==0) /*比較班級號*/
{
s1+=q->sum; /*累加總分*/
ave+=q->average; /*累加均分*/
i++; /*累加班級人數*/
q=q->next; /*指針指向下一條記錄*/
}
else
break; }
printf("%s %10.2f %5.2f\n",sno,s1,ave/i);
if(q==NULL)
break; else
p=q; }
printf("---------------------------------------------\n");
}
『陸』 模電課程設計直流穩壓電源設計0~12 1A 總電路原理圖即可 謝謝
將變壓器換成交流輸出15伏的即可。c1取耐壓35伏2200微法。
『柒』 模擬電子技術課程設計
這么簡單的東西也拿來這里問?隨便找本模電書,別的不看,就看看直流穩壓這一章就足夠,貌似你的要求是要寫成實驗報告的形式,慢慢努力,只有自己親自動手做的才能掌握好
『捌』 電子課程設計
數字電子鍾的設計(由數字IC構成)
一、設計目的
1. 熟悉集成電路的引腳安排。
2. 掌握各晶元的邏輯功能及使用方法。
3. 了解麵包板結構及其接線方法。
4. 了解數字鍾的組成及工作原理。
5. 熟悉數字鍾的設計與製作。
二、設計要求
1.設計指標
時間以24小時為一個周期;顯示時、分、秒;有校時功能,可以分別對時及分進行單獨校時,使其校正到標准時間;計時過程具有報時功能,當時間到達整點前5秒進行蜂鳴報時;為了保證計時的穩定及准確須由晶體振盪器提供表針時間基準信號。
2.設計要求
畫出電路原理圖(或模擬電路圖);元器件及參數選擇;電路模擬與調試;PCB文件生成與列印輸出。
3.製作要求 自行裝配和調試,並能發現問題和解決問題。
4.編寫設計報告 寫出設計與製作的全過程,附上有關資料和圖紙,有心得體會。
三、設計原理及其框圖
1.數字鍾的構成
數字鍾實際上是一個對標准頻率(1HZ)進行計數的計數電路。由於計數的起始時間不可能與標准時間(如北京時間)一致,故需要在電路上加一個校時電路,同時標準的1HZ時間信號必須做到准確穩定。通常使用石英晶體振盪器電路構成數字鍾。圖 3-1所示為數字鍾的一般構成框圖。圖3-1 數字鍾的組成框圖
⑴晶體振盪器電路
晶體振盪器電路給數字鍾提供一個頻率穩定準確的32768Hz的方波信號,可保證數字鍾的走時准確及穩定。不管是指針式的電子鍾還是數字顯示的電子鍾都使用了晶體振盪器電路。⑵分頻器電路
分頻器電路將32768Hz的高頻方波信號經32768( )次分頻後得到1Hz的方波信號供秒計數器進行計數。分頻器實際上也就是計數器。
⑶時間計數器電路
時間計數電路由秒個位和秒十位計數器、分個位和分十位計數器及時個位和時十位計數器電路構成,其中秒個位和秒十位計數器、分個位和分十位計數器為60進制計數器,而根據設計要求,時個位和時十位計數器為12進制計數器。
⑷解碼驅動電路
解碼驅動電路將計數器輸出的8421BCD碼轉換為數碼管需要的邏輯狀態,並且為保證數碼管正常工作提供足夠的工作電流。
⑸數碼管
數碼管通常有發光二極體(LED)數碼管和液晶(LCD)數碼管,本設計提供的為LED數碼管。
2.數字鍾的工作原理
1)晶體振盪器電路
晶體振盪器是構成數字式時鍾的核心,它保證了時鍾的走時准確及穩定。
圖3-2所示電路通過CMOS非門構成的輸出為方波的數字式晶體振盪電路,這個電路中,CMOS非門U1與晶體、電容和電阻構成晶體振盪器電路,U2實現整形功能,將振盪器輸出的近似於正弦波的波形轉換為較理想的方波。輸出反饋電 阻R1為非門提供偏置,使電路工作於放大區域,即非門的功能近似於一個高增益的反相放大器。電容C1、C2與晶體構成一個諧振型網路,完成對振盪頻率的控制功能,同時提供了一個180度相移,從而和非門構成一個正反饋網路,實現了振盪器的功能。由於晶體具有較高的頻率穩定性及准確性,從而保證了輸出頻率的穩定和准確。
晶體XTAL的頻率選為32768HZ。該元件專為數字鍾電路而設計,其頻率較低,有利於減少分頻器級數。
從有關手冊中,可查得C1、C2均為30pF。當要求頻率准確度和穩定度更高時,還可接入校正電容並採取溫度補償措施。
由於CMOS電路的輸入阻抗極高,因此反饋電阻R1可選為10MΩ。較高的反饋電阻有利於提高振盪頻率的穩定性。
非門電路可選74HC00。
圖3-2 COMS晶體振盪器
2)分頻器電路
通常,數字鍾的晶體振盪器輸出頻率較高,為了得到1Hz的秒信號輸入,需要對振盪器的輸出信號進行分頻。
通常實現分頻器的電路是計數器電路,一般採用多級2進制計數器來實現。例如,將32768Hz的振盪信號分頻為1HZ的分頻倍數為32768(215),即實現該分頻功能的計數器相當於15極2進制計數器。常用的2進制計數器有74HC393等。
本實驗中採用CD4060來構成分頻電路。CD4060在數字集成電路中可實現的分頻次數最高,而且CD4060還包含振盪電路所需的非門,使用更為方便。
CD4060計數為14級2進制計數器,可以將32768HZ的信號分頻為2HZ,其內部框圖如圖3-3所示,從圖中可以看出,CD4060的時鍾輸入端兩個串接的非門,因此可以直接實現振盪和分頻的功能。
圖3-3 CD4046內部框圖
3)時間計數單元
時間計數單元有時計數、分計數和秒計數等幾個部分。
時計數單元一般為12進制計數器計數器,其輸出為兩位8421BCD碼形式;分計數和秒計數單元為60進制計數器,其輸出也為8421BCD碼。
一般採用10進制計數器74HC390來實現時間計數單元的計數功能。為減少器件使用數量,可選74HC390,其內部邏輯框圖如圖2.3所示。該器件為雙2—5-10非同步計數器,並且每一計數器均提供一個非同步清零端(高電平有效)。
圖3-4 74HC390(1/2)內部邏輯框圖
秒個位計數單元為10進制計數器,無需進制轉換,只需將QA與CPB(下降沿有效)相連即可。CPA(下降沒效)與1HZ秒輸入信號相連,Q3可作為向上的進位信號與十位計數單元的CPA相連。
秒十位計數單元為6進制計數器,需要進制轉換。將10進制計數器轉換為6進制計數器的電路連接方法如圖3-5所示,其中Q2可作為向上的進位信號與分個位的計數單元的CPA相連。
圖3-5 10進制——6進制計數器轉換電路分個位和分十位計數單元電路結構分別與秒個位和秒十位計數單元完全相同,只不過分個位計數單元的Q3作為向上的進位信號應與分十位計數單元的CPA相連,分十位計數單元的Q2作為向上的進位信號應與時個位計數單元的CPA相連。
時個位計數單元電路結構仍與秒或個位計數單元相同,但是要求,整個時計數單元應為12進制計數器,不是10的整數倍,因此需將個位和十位計數單元合並為一個整體才能進行12進制轉換。利用1片74HC390實現12進制計數功能的電路如圖3-6所示。
另外,圖3-6所示電路中,尚余-2進制計數單元,正好可作為分頻器2HZ輸出信號轉化為1HZ信號之用。 圖3-6 12進制計數器電路
4)解碼驅動及顯示單元
計數器實現了對時間的累計以8421BCD碼形式輸出,選用顯示解碼電路將計數器的輸出數碼轉換為數碼顯示器件所需要的輸出邏輯和一定的電流,選用CD4511作為顯示解碼電路,選用LED數碼管作為顯示單元電路。
5)校時電源電路
當重新接通電源或走時出現誤差時都需要對時間進行校正。通常,校正時間的方法是:首先截斷正常的計數通路,然後再進行人工出觸發計數或將頻率較高的方波信號加到需要校正的計數單元的輸入端,校正好後,再轉入正常計時狀態即可。
根據要求,數字鍾應具有分校正和時校正功能,因此,應截斷分個位和時個位的直接計數通路,並採用正常計時信號與校正信號可以隨時切換的電路接入其中。圖3-7所示即為帶有基本RS觸發器的校時電路,
圖3-7 帶有消抖動電路的校正電路
6)整點報時電路
一般時鍾都應具備整點報時電路功能,即在時間出現整點前數秒內,數字鍾會自動報時,以示提醒。其作用方式是發出連續的或有節奏的音頻聲波,較復雜的也可以是實時語音提示。
根據要求,電路應在整點前10秒鍾內開始整點報時,即當時間在59分50秒到59分59秒期間時,報時電路報時控制信號。報時電路選74HC30,選蜂鳴器為電聲器件。
四、元器件
1.實驗中所需的器材:
5V電源。麵包板1塊。示波器。萬用表。鑷子1把。剪刀1把。網路線2米/人。
共陰八段數碼管6個。CD4511集成塊6塊。CD4060集成塊1塊。74HC390集成塊3塊。
74HC51集成塊1塊。74HC00集成塊5塊。74HC30集成塊1塊。10MΩ電阻5個。
500Ω電阻14個。30p電容2個。32.768k時鍾晶體1個。蜂鳴器。 詳情請訪問 http://www.51dz.com/index.asp?i=kjf888
『玖』 課程設計要設計一個直流穩壓電源,需要直流穩壓電源課程設計電路,
我將我的課程設計要設計-----數控直流穩壓電源資料已發給你,這是我大學時的一個課程設計,可以參考一下。