第一篇:基于單片機的數字PID控制直流電機PWM調壓調速器系統
題目: 基于單片機的數字PID控制直流電機PWM 調壓調速器系統
目錄
一、PID簡介··································(6)
二、設計原理··································(7)
三、設計方案··································(8)
四、心得體會
·······························(16)
五、參考文獻 ·······························(16)
二、設計原理
基本的設計核心是運用PID調節器,從而實現直流電機的在帶動負載的情況下也能穩定的運行。運用A/D轉換芯片將滑動變阻器的模擬電壓轉換為數字量作為控制直流電機速度的給定值;用壓控振蕩器模擬直流電機的運行(電壓高-轉速高-脈沖多),單片機在單位時間內對脈沖計數作為電機速度的檢測值;應用數字PID模型作單片機控制編程,其中P、I、D參數可按鍵輸入并用LED數碼顯示;單片機PWM調寬輸出作為輸出值,開關驅動、電子濾波控制模擬電機(壓控振蕩器)實現對直流電機的PID調壓調速功能。
基于以上的核心思想,我們把這次設計看成五個環節組成,其具體的原理如下見原理圖2.0
圖2.0 PID調速設計原理圖
如圖可以知道,這是一個閉環系統,我們借助單片機來控制,我們現運用AD芯片,運用單片機來控制AD芯片來轉換模擬電壓到數字電壓,AD給定的電壓越大,則產生的數字量越大,單片機再控制這個數字量來產生一個PWM,PWM占空比越大,就驅動晶體管導通的時間越長,這樣加到壓頻轉換器的電壓也就越大,電壓越大,則壓頻轉換器輸出的計數脈沖再單位時間也就越多,這樣就相當于電機的電壓越大,其轉速也就會越快,我們再用單片機對壓頻轉換器的輸出脈沖計數,PID調節器就把這個計數脈沖和預先設定的 值進行比較,比設定值小,這樣就會得到一個偏差,再把這個偏差加到AD的給定電壓,這樣就相當于加大了PWM的占空比,要是比設定值大,這樣也會得到一個偏差,就把這個變差與給定的電壓向減,這樣就可以減少PWM的占空比,通過改變占空比來改變晶體管的導通時間,就可以改變壓頻轉換器的輸入電壓,也就改變壓頻轉換器的單位計數脈沖,達到調電動機速度的目的。
三、設計方案
3.1 PWM的調制
AD芯片給定一定的電壓,應用單片機來控制來產生一個PWM,給定的電壓不同,就會的得到不同的PWM波形。在產生PWM波形我們采用ADC0808芯片和AT89C51兩個核心器件。
ADC0808芯片是要外加電壓和時鐘,當輸入不同的電壓的時候,就可以把不同的電壓模擬量轉化為數字值,輸入的電壓越大,其轉換的相應的數字也就會越大,ADC0808芯片有8個通道輸入和8個通道輸出。其具體的管腳圖見3.01
圖3.01 ADC0808芯片管腳圖
AT89C51是一種帶4K字節閃爍可編程可擦除只讀存儲器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低電壓,高性能CMOS8位微處理器,俗稱單片機。AT89C2051是一種帶2K字節閃爍可編程可擦除只讀存儲器的單片機。單片機的可擦除只讀存儲器可以反復擦除100次。該器件采用ATMEL高密度非易失存儲器制造技術制造,與工業標準的MCS-51指令集和輸出管腳相兼容。由于將多功能8位CPU和閃爍存儲器組合在單個芯片中,ATMEL的AT89C51是一種高效微控制器,AT89C2051是它的一種精簡版本。AT89C單片機為很多嵌入式控制系統提供了一種靈活性高且價廉的方案。外形及引腳排列如圖3.02所示
圖3.02 AT89C51芯片管腳圖
3.2基于單片機的數字PID控制直流電機PWM調壓調速器系統 3.21調速原理
當基于以上產生一個PWM后,就可以借助PWM脈沖來控制晶體管的導通和關斷,來給壓頻轉換器來提供一定的電壓,在PROTUES中仿真中,給定一個+12V的電壓,就通過晶體管的導通和關斷來給壓頻轉換器供電,壓頻轉換器就會輸出很多的脈沖,借助單片機P3.5來計數,其計數送給P0來顯示,通過給定不同的ADC的輸入電壓,就可以的得到不同的計數顯示,電壓越大,其計數顯示也就越大,通過改變計數脈沖的周期和硬件壓頻轉換器(LM331)的電阻和電容,就可以得到與輸入電壓接近的數值顯示,可能由于干擾的原因,其顯示值和實際值有一點偏差,這是在沒有什么負載的情況下,或者說是在空載的情況下,這樣就可以得到一個很理想的開環系統,也為閉環PWM調節做好準備。
當開環系統穩定后,加上一個擾動,或者說是加上負載,這樣就使的壓頻轉換器的電壓減少,在給定一定電壓的時候,當負載分壓的時候,也就相當于直流電機的電壓就會減少,這樣直流電機的轉速就會下降,或者說當有負載的時候,壓頻轉換器的輸入電壓就會減少,這樣輸入的脈沖在單位時間就會減少,這樣PID調節器,通過改變PID的參數,PID控制器由比例單元(P)、積分單元(I)和微分單元(D)組成。其輸入e(t)與輸出u(t)的關系為 u(t)=kp(e((t)+1/TI∫e(t)dt+TD*de(t)/dt)式中積分的上下限分別是0和t 因此它的傳遞函數為:G(s)=U(s)/E(s)=kp(1+1/(TI*s)+TD*s)其中kp為比例系數; TI為積分時間常數; TD為微分時間常數這樣就會得到一個偏差,通過這個偏差來改變原來的PWM的占空比,使得晶體管的導通時間加長或減少,這樣就改變了直流電機的輸入電壓,也就是該變了在PROTUES壓頻轉換器的輸入電壓,使得輸出的計數脈沖在單位時間發生改變,也就是模擬了直流電機的轉速的改變,我們希望通過PID的調節,使得輸出的計數脈沖的顯示值和預先設定的值接近,由于偏差的存在,使得PID調節器不斷的去修正,使得顯示值近可能的接近我們所預期的設定值。
3.22基于單片機的數字PID控制直流電機PWM調壓調速器系統原理圖
圖3.07 PID調速原理圖 3.23波形仿真
在不同的給定電壓下開換系統會有不同的PWM波形和計數脈沖個數。在不同的波形中從上之下以此為pwm波形,經過驅動后的波形,LM331的輸入電壓,LM331的輸出脈沖。
當給定電壓為較高(E8H)其波形見如下圖3.08、圖3.09 中電壓給定對應的波形
PID波形
圖3.10 低電壓給定對應的波形
;
圖3.11 PID 控制LM331的輸入電壓波形
3.24 PID調速程序 PWM 輸出驅動程序
ADC
EQU
35H
CLK
BIT
P2.4
ST
BIT
P2.5
EOC
BIT
P2.6
OE
BIT
P2.7
PWM
BIT
P3.7
;
PID 調節設置
EK0
EQU
40H
EK1
EQU
41H
EK2
EQU
42H
PP
EQU
43H
II
EQU
44H
DD
EQU
45H
UK0
EQU
70H
UK1
EQU
71H
ORG
00H
SJMP
START
ORG
0BH
LJMP
INT_TO
START:
MOV
TMOD, #62H
MOV
TH0, #00H
MOV
TL0, #00H
MOV
IE, #86H
SETB
TR0
;SETB
TR1
MOV
R0, #00
MOV
R1, #00
MOV
R2, #00
MOV
R3, #00
MOV
R4, #00
MOV
R5, #00
MOV
R6, #00
MOV
R7, #00
;PID 賦值
MOV
PP, #05
MOV
II, #03
MOV
DD, #02
MOV
EK0,#00H
MOV
EK1,#00H
MOV
EK2,#00H
MOV
UK0,#00H
MOV
UK1,#00H WAIT:
CLR
OE
INC
R7
CLR
ST
SETB
ST
CLR
ST
JNB
EOC, $
SETB
OE
MOV
ADC, P1
MOV
R0,ADC
MOV
A,70H
ADDC
A,ADC
MOV
ADC ,A
;CLR
OE
SETB
PWM
SETB TR1
MOV
A, ADC
LCALL
DELAY
CLR
PWM
;等待轉換完成;高電平延時 8
MOV
A, #255
SUBB
A, ADC
LCALL
DELAY
;低電平延時
CJNE
R7, #20, WA2 WA1:
CLR
TR1
MOV
R7, #00
MOV
A, TL1
MOV 50H,A
mov P0,50H
;PID求偏差
MOV A,EK1
MOV EK2,A
MOV A,EK0
MOV EK1,A
MOV A,R0
SUBB A,50H
MOV EK0,A
;PP的計算
MOV
A,EK0
SUBB A,EK1
MOV B,PP
MUL AB
MOV R1,A
MOV R2,B
AJMP X
WAIT1:AJMP WAIT
;II的計算
X: MOV A,EK0
MOV B,II
MUL AB
MOV R3,A
MOV R4,B
;DD的計算
MOV A,EK1
RL A
MOV EK1,A
MOV A,EK0
SUBB A,EK1
ADDC A,EK2
MOV B,DD
MUL AB
MOV R5,A
MOV R6,B
;PID總的計算
MOV A,R1
ADDC A,R3
ADDC A,R5
MOV 60H,A
MOV A,R2
ADDC A,R4
ADDC A,R6
MOV 61H,A
MOV A,60H
ADDC A,70H
MOV
70H,A
MOV A,61H
ADDC A,71H
MOV
71H,A
MOV TL0,#00H
MOV
TL1,#00H
;SETB TR1
WA2:
SJMP
WAIT1
INT_TO:
CPL
CLK
RETI
DELAY:
MOV
R6, #1 D1:
DJNZ
R6, D1
DJNZ
ACC, D1
RET
END 10
四、心得體會
我們進行了為期一周的計算機控制技術課程設計。通過這兩周的課程設計,我拓寬了知識面,鍛煉了能力,綜合素質得到了提高。
剛剛拿到課題,我感到有些茫然,對于以前沒有做過的人來說要全部做完的確有一定的難度。由于我對計算機控制不是很熟悉,在設計的過程中走了不少彎路。
通過親身體驗做課程設計,我覺得安排課程設計的基本目的,在于通過理論與實際的結合,進一步提高觀察、分析和解決問題的實際工作能力,以便培養成為能夠主動適應社會主義現代化建設需要的高素質的復合型人才。運用學習成果,把課堂上學到的系統化的理論知識,嘗試性地應用于實際設計工作,并從理論的高度對設計工作的現代化提出一些有針對性的建議和設想。檢驗學習成果,看一看課堂學習與實際工作到底有多大距離,并通過綜合分析,找出學習中存在的不足,以便為完善學習計劃,改變學習內容與方法提供實踐依據。我的收獲有一下幾點:
第一,我對所學專業有了一些了解,增強了自己的興趣和對以后可能從事的職業的熱愛。第二,通過課程設計我明白到了理論到實踐有一段很遠的路程。設計過程中的每一步都是一門學問,我終于知道了每一個實現的過程,每一個認識的過程都存有人類無數的的汗水與對待事物一絲不茍得,縝密的思考以及不懈的努力,只有這樣才會有一個新生事物的誕生。而以上種種的過程必須要你親自去體會去認識去發現,那才是屬于你的“收獲”,只有這時才會對自己的作品無比的驕傲。
第三,通過這次設計加強了我們的設計創新能力。使我們的理論知識與實踐充分地結合。第四,通過兩周的課程設計,我學到了很多書本上學習不到的知識。兩周的時間很短,但是我學到比兩年的還多,在以后的學習生活中,我需要更努力地讀書和實踐。
對我們電氣專業的學生來說,實際能力的培養至關重要,而這種實際能力的培養單靠課堂教學是遠遠不夠的,必須從課堂走向實踐。通過課程設計,讓我們找出自身狀況與實際需要的差距,并在以后的學習期間及時補充相關知識,為求職與正式工作做好充分的知識、能力準備,從而縮短從校園走向社會的心理轉型期。
在設計過程中,體會到了設計一項課題的不易,也體會到了設計成功之后的小小成就感和同學之間相互合作的默契。更重要的是,通過課程設計,我發現了自身存在的更多不足之處和實際應用能力方面的欠缺,這些不足之處在今后的學習之中要有意識的彌補和改變。
最后,感謝在課程設計過程中關心幫助我的老師同學。
五、參考文獻
許翏、王淑英主編.計算機技術.北京:機械工業出版社2005 2 王炳實主編.單片機技術.第3版.北京:機械工業出版社2004 3 易泓可主編,基于數字PID設計.北京:機械工業出版社 2004
第二篇:基于FPGA的直流電機PWM調速系統設計與實現
FPGA課程設計
題目:基于FPGA的直流電機PWM調速系統設計與實現 班級:微電子學1202班 姓名:杜英 學號:1206080201 日期:2016年3月24日
基于FPGA的直流電機PWM調速系統設計與實現
1設計任務與要求
1.1設計任務
完成基于FPGA的直流電機PWM調速系統設計與實現,實現對直流電機的閉環調速,速度值采用LCD或數碼管顯示。
1.2設計要求
1.2.1了解PWM控制方法及應用;掌握PWM直流電機調速控制原理;掌握直流電機調速及驅動控制原理;完成基于FPGA的直流電機PWM調速系統設計。采用PWM(脈沖寬度調制)技術,速度值采用LCD或數碼管顯示。
1.2.2通過課程設計的實踐,進一步了解和掌握硬件描述語言(VHDL或Verilog)和TOP-DOWN的設計流程,提高對實際項目的分析和設計能力,體會FPGA項目開發的過程,熟悉實驗報告的編寫規范。
2設計原理分析
2.1直流電機結構如下圖1.1所示
圖2.1 直流電機的構造
將直流電源通過電刷接通線組線圈,使線組線圈導體(電樞導體)有電流通過,在電磁的作用下,線組線圈將會產生磁場,同時產生的磁場與主磁極的磁場產生電磁力,這個電磁力作用于轉子,使轉子以一定的速度開始旋轉,電機就開始工作。
在電機的外部電路加入開關型的霍爾元件,同時在電子轉子的轉盤上加入一個使霍爾元件產生輸出的帶有磁場的磁鋼片。當直流電機旋轉時轉盤與磁鋼片一起旋轉,當磁鋼片轉到霍爾元件上方時,可以使霍爾元件的輸出端高電平變為低電平。當磁鋼片離開霍爾元件上方后,霍爾元件輸出端又恢復高電平。如此,點擊每旋轉一周,會使霍爾元件的輸出端產生一個低脈沖,可以通過檢測單位時間內霍爾元件輸出端低脈沖的個數推算出直流電機的轉速。
本次設計中,調節PWM占空比進而控制直流電機轉速,在本次設計中,為了保護霍爾元件,故設定程序每6秒刷新一次數據,所以在數碼管顯示的數據乘以10就是在該占空比時的直流電機每分鐘轉速。在這次的實驗中數碼管采用的8位共陰極數碼管,通過鎖存器輸入數據使得數碼管的8個段碼數字顯示,再通過選擇輸出數據對所需數碼管進行選擇。
2.2電路原理圖
圖2.2 電路原理圖 3 設計方案
上述原理圖中包含PWM模塊、測速模塊、計數模塊、電機模塊、濾波模塊。電機的外部電路加入開關型的霍爾元件,同時在電子轉子的轉盤上加入一個使霍爾元件產生輸出的帶有磁場的磁鋼片。當直流電機旋轉時轉盤與磁鋼片一起旋轉,當磁鋼片轉到霍爾元件上方時,可以使霍爾元件的輸出端高電平變為低電平。當磁鋼片離開霍爾元件上方后,霍爾元件輸出端又恢復高電平。如此,點擊每旋轉一周,會使霍爾元件的輸出端產生一個低脈沖,可以通過檢測單位時間內霍爾元件輸出端低脈沖的個數推算出直流電機的轉速。本次設計為六秒記一次數,乘十就是每分鐘轉速值。再通過驅動模塊顯示數碼管數據。
4設計步驟
(1)首先確定整體設計方案,確定設計需要使用的軟件;(2)設計電路模塊,編寫各模塊程序代碼并進行仿真編譯;(3)完成整體電路圖設計后,使用QuartusⅡ軟件對整體電路進行仿真調試;
(4)連接硬件,使用示波器觀察產生的波形,對不足之處進行改進調試。
5調試結果說明
連接好試驗箱,把硬件與實驗箱接通,將程序下載到實驗箱中。進行實驗,示波器觀察PWM脈沖波形(占空比),看實驗結果與預期效果是否相同,若相同,則實驗無誤。其波形如下: 占空比為50%時
占空比為90%時
將程序下載到實驗箱中后,其實際操作過程如下: K12為使能鍵,使K12=‘1’;輸入時鐘信號為1MHZ;(1)K4=1時,示波器和LED的顯示如下:
示波器顯示的是霍爾元件單位時間內計數的個數為31.011 顯示器是每六秒電機轉的圈數為186轉
結論:31.011*6=186.066于186近似,所以結論符合要求。(2)K4=1,k3=1時,示波器和LED的顯示如下:
結論:68.6338*6=411.8028于412近似,所以結論符合要求。(3)K4=1,k3=1,K2=1時,示波器和LED的顯示如下:
結論:85.516*6=513.096于513近似,所以結論符合要求。(4)K4=1,k3=1,K2=1,K1=1時,示波器和LED的顯示如下:
結論:90.0339*6=540.2034于541近似,所以結論符合要求。通過以上的比較,發現示波器中的結果與數碼管上數據大概一致,即實驗結果基本達到要求。
6心得體會
本次課程設計,用FPGA控制直流電機,完成直流電機PWM調速系統設計,實現對直流電機的閉環調速,速度值采用LCD或數碼管顯示。是一次很好的學習和實踐的機會。通過課程設計,我明白了電機工作的原理,以及用FPGA控制電機的原理。最重要的是,對如何設計一個系統有了更進一步的了解,積累了很多經驗。
從下載測試的結果來看,設計的要求基本上都實現了。但是仍存在不少問題。每個模塊生成基本電路后,把各個模塊的進行連接,仿真結果是正確的。但是當連接到試驗箱后,電機正常轉動,LED卻無法顯示。檢查電路和程序還有電路圖,并發現什么問題。無意中發現LED偶爾會出現數字,但也只是閃一下。最后才發現是因為電機轉動太快了,LED無法及時顯示或者是一直在閃,人眼無法識別。在程序中加入了濾波模塊,才解決了問題。
在設計的過程中,開始照著EDA課本上的原理設計,后來才發現所設計的電路有很多地方都滿足不了設計要求,使設計一度遭遇了很大困難。通過與同學討論請教,逐步改進了設計,終于使設計的電路和設計要求相吻合。在這中間,通過不斷提出問題,解決問題,我對這次設計的原理有了更深的了解,也給我分析問題,解決問題提供了很多好的方法,好的思路。同時,我也發現了自己存在的很多不足。發現自己在設計一個系統的時候不能夠統籌兼顧,不能夠從總體上把握設計的思路,也不能看清問題的核心與關鍵所在。這些都需要在下面不斷學習實踐,理論畢竟只是理論,要多參加實踐,這樣才能提高自己的能力,積累經驗。
附錄一
PWM模塊程序 Library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity PWM is port(clock:in std_logic;
duty_cycle:in std_logic_vector(3 downto 0);
pwm_en:in std_logic;
pwm_out:out std_logic);end entity;architecture art of PWM is
signal pwm_out_io:std_logic;
signal count:std_logic_vector(3 downto 0);begin
pwm_out<=pwm_out_io;
process(clock)
begin
if rising_edge(clock)then
if pwm_en='1' then
count<=count+1;
end if;
end if;
end process;
process(clock)
begin
if rising_edge(clock)then
if pwm_en='1' and count pwm_out_io<='1'; else pwm_out_io<='0'; end if; end if; end process;end; 測速模塊程序 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity cesu is port(clk : in std_logic; --時鐘輸入1Mhz ena : out std_logic; --允許計數 clr : out std_logic; --計數器清零信號產生 load : out std_logic);--鎖存、顯示輸出允許高有效 end cesu;architecture behav of cesu is signal clkk :std_logic; --1HZ時鐘信號 signal count :integer range 0 to 7;--6秒計數 signal clr1 :std_logic; --清零信號 signal ena1 :std_logic; --允許計數信號 signal load1 :std_logic; --允許計數信號 --signal cq1,cq2,cq3,cq4 : INTEGER RANGE 0 TO 15;--計數數據 begin process(clk) variable c:std_logic; variable cnt:integer range 0 to 500000; begin if clk'event and clk='1' then cnt:=cnt+1; if cnt=500000 then cnt:=0;c:=not c; end if; end if; clkk<=c; end process; process(clkk) --6秒計數 begin if clkk'event and clkk='1' then count<=count+1; if count<6 then ena1<='1';load1<='0';clr1<='0'; elsif count=6 then ena1<='0';load1<='1';clr1<='0'; elsif count=7 then ena1<='0';load1<='1';clr1<='1'; end if; end if; ena<=ena1; load<=load1; clr<=clr1; end process;end behav; 計數模塊程序 library ieee;use ieee.std_logic_1164.all; entity cnt10 is port(clk:in std_logic; --計數時鐘信號 clr:in std_logic; --清零信號 ena:in std_logic; --計數使能信號 cq :out integer range 0 to 15;--4位計數結果輸出 carry_out:out std_logic); --計數進位 end cnt10;architecture behav of cnt10 is signal cq1:integer range 0 to 15;begin process(clk,ena)begin if clr= '1' then cq1<= 0; ----計數器異步清零 elsif clk'event and clk= '1' then if ena= '1' then if cq1=10 then cq1<=1; else cq1<=cq1+1; end if; ----等于9,則計數器清零 end if; end if;end process;process(cq1) begin if cq1=10 then carry_out<= '1'; ----進位輸出 else carry_out<= '0'; end if;end process; cq<=cq1;end behav; 驅動模塊程序 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity qudong_8 is port(clk:in std_logic; --動態顯示刷新速度時鐘 QQ1,QQ2,QQ3:in std_logic_vector(3 downto 0);--32位BCD碼輸入,最0~3低位,28~31最高位 qudong1:out std_logic_vector(7 downto 0);--驅動信號輸出,0~7分別為abcdefgp contrl:buffer std_logic_vector(2 downto 0));--數碼管位選輸出,000最低位數碼管有效,111最高位數碼管有效 end qudong_8;architecture behavior of qudong_8 is signal disp:std_logic_vector(3 downto 0);signal temp:std_logic_vector(2 downto 0);begin process(clk)begin if clk'event and clk='1' then temp<=temp+1; end if; contrl<=temp;end process; process(contrl) --位選信號產生進程 begin case contrl is --when“000”=>disp<=QQ7; --when“001”=>disp<=QQ6; --when“010”=>disp<=QQ5; --when“011”=>disp<=QQ4; when“100”=>disp<=QQ3; when“101”=>disp<=QQ2; when“110”=>disp<=QQ1; --when“111”=>disp<=“0000”; when others=>disp<=“0000”; end case;end process;process(disp) --譯碼進程 begin case disp is when“0000”=>qudong1<=“00111111”; when“0001”=>qudong1<=“00000110”; when“0010”=>qudong1<=“01011011”; when“0011”=>qudong1<=“01001111”; when“0100”=>qudong1<=“01100110”; when“0101”=>qudong1<=“01101101”; when“0110”=>qudong1<=“01111101”; when“0111”=>qudong1<=“00000111”; when“1000”=>qudong1<=“01111111”; when“1001”=>qudong1<=“01101111”; when others=>qudong1<=“00000110”; end case;end process;end behavior; 消抖模塊程序 library ieee;use ieee.std_logic_1164.all; entity xiaodou is port(clk,input: in std_logic;output: out std_logic);end xiaodou; architecture behav of xiaodou is signal cp:std_logic;signal count:integer range 0 to 3;begin process(clk)begin if(clk'event and clk='1')then--檢測上升沿 if(input='1')then--如果有輸入信號 if(count=3)then count<=count;--當計數達到3時,保持計數值不變 else count<=count+1;--當其小于3時,進行加1處理 end if;if(count=2)then cp<='1';--如果計數達到2,cp置1 else cp<='0';--其余情況全部為0 end if;else count<=0;--如果計數出現非法狀況,進行清零復位 end if;end if;output<=cp;--信號輸出 end process;end behav; 基于單片機控制的交通燈設計系統 班級: 姓名: 學號: 第一章 概述 1.設計內容 本系統需要采用AT89C51單片機AT89C5中心器件來設計交通燈控制器,實現以下功能: 1.1初始東西綠燈亮,南北紅燈亮,東西方向通車。1.2黃燈閃爍后,東西路口紅燈亮同時南北路口綠燈亮,南北方向開始通車。1.3延時27s,南北方向綠燈滅,黃燈閃爍3次,然后又切換成東西方向通車,如此重復。 設計交通燈控制系統硬件電路與軟件控制程序,對硬件電路與軟件程序分別進行調試,并進行軟硬件聯調,要求獲得調試成功的仿真圖。2.設計目的 2.1 了解交通燈管理的基本工作原理。2.2 熟悉AT89C51工作原理和應用編程。 2.3 熟悉AT89C51行接口的各種工作方式和應用。 2.4 熟悉AT89C51數器/定時器的工作方式和應用編程外部中斷的方法。2.5 掌握多位LED顯示問題的解決。3.設計原理 AT89C51片機具有控制二連體共陰極數碼管和發光二極管的輸出顯示以及檢測按鍵輸入的功能。利用AT89C51片機模仿制作室外十字路口多功能交通燈,實現室內控制與室外顯示的功能。合理控制交通繁忙,交通特殊情況和恢復交通正常的三種情況。 本設計用4個共陽極LED數碼管的分別表示東、西、南、北四個方向路口,以數碼管的上、中、下3個橫段分別代表紅、黃、綠3盞燈,用P0、P1口分別輸出控制模擬交通燈的狀態顯示的數碼管和倒計時顯示數碼管的狀態碼,P3^ 1、P3^ 2、P3^4-P3^7控制數碼管的位選,P2^0-P2^4接收中斷信號并反饋給INT0接口進行中斷處理。 第二章 硬件設計 1.設計框圖 如圖2-1所示 此處要有文字說明 圖2-1設計框圖 2.元器件選擇及其功能介紹 AT89C51是一種帶4K字節LASH存儲器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低電壓、高性能CMOS 8位微處理器,俗稱單片機。AT89C2051是一種帶2K字節閃存可編程可擦除只讀存儲器的單片機。單片機的可擦除只讀存儲器可以反復擦除1000次。該器件采用ATMEL高密度非易失存儲器制造技術制造,與工業標準的MCS-51指令集和輸出管腳相兼容。由于將多功能8位CPU和閃爍存儲器組合在單個芯片中,ATMEL的AT89C51是一種高效微控制器,AT89C2051是它的一種精簡版本。AT89C51單片機為很多嵌入式控制系統提供了一種靈活性高且價廉的方案。AT89C51片引腳圖如下圖2-2所示。 圖2-2 AT89C51片引腳圖 主要特性: ·與MCS-51 兼容 ·4K字節可編程閃爍存儲器 ·壽命:1000寫/擦循環 ·數據保留時間:10年 ·全靜態工作:0Hz-24MHz ·三級程序存儲器鎖定 ·128×8位內部RAM ·32可編程I/O線 ·兩個16位定時器/計數器,5個中斷源 ·可編程串行通道 ·低功耗的閑置和掉電模式 ·片內振蕩器和時鐘電路 3.設計原理圖 硬件電路圖通過Proteus 仿真之后如圖2-3所示,其中: 按鈕K0連接P2^0端口實現紅燈全亮,處理交通意外 按鈕K1連接P2^1端口實現南北方向亮燈時間+1s 按鈕K2連接P2^2端口實現南北方向亮燈時間-1s 按鈕K3連接P2^3端口實現東西方向亮燈時間+1s 按鈕K4連接P2^4端口實現東西方向亮燈時間-1s 圖2-3整體連接電路原理圖 第三章 軟件設計 1.各個程序段介紹 1.1數碼管顯示 void Display(uchar j)//j控制顯示table中連續位的起始點 { char h,l;if(j<11)//根據狀態判定時間 { h=Time_EW/10;//EW通行時間十位 l=Time_EW%10;//EW通行時間個位 } else if(j<23){ h=Time_SN/10;//SN通行時間十位 l=Time_SN%10;//SN通行時間個位 } for(i=0;i<4;)//按位顯示通行狀況及時間 { P0=table1[j];//通行狀況顯示 P3=tab[i];//位選顯示 i++; j++; if(i%2)//兩位計時顯示 { P1=table[l]; Delay(400); } else { P1=table[h]; Delay(400); } } Delay(5);} 1.2 INT0外部中斷服務程序 void EXINT0(void)interrupt 0//INT0外部中斷 { EX0=0;//關中斷 if(Busy_Button==0){ P0=0xFE;//意外按鈕按下全顯示紅燈 for(;Busy_Button!=1;)//意外按鈕彈起時恢復之前狀態 Display(24);} /*四個時間控制按鈕分別控制SN、EW方向初始通行時間加減,最長不超過s,最少不低于s*/ if(SN_Add==0)//SN+1 { SN1+=1; if(SN1>99) SN1=99;} if(SN_Red==0)//SN-1 { SN1-=1; if(SN1<20) SN1=20;} if(EW_Add==0)//EW+1 { EW1+=1; if(EW1>99) EW1=99;} if(EW_Red==0)//EW-1 { EW1-=1; if(EW1<20) EW1=20;} EX0=1;//開中斷 } 1.3延時子程序 void Delay(uchar a)//循環a次 { uchar x;x=a;while(x--){;} } 2.程序 #define uchar unsigned char #include uchar x;x=a;while(x--){;} } void Display(uchar j){ char h,l;if(j<11){ h=Time_EW/10; l=Time_EW%10;} else if(j<23){ h=Time_SN/10; l=Time_SN%10;} for(i=0;i<4;){ P0=table1[j]; P3=tab[i]; i++; j++; if(i%2) { P1=table[l]; Delay(400); } else { P1=table[h]; Delay(400); } } Delay(5);} void EXINT0(void)interrupt 0 { EX0=0;if(Busy_Button==0){ P0=0xFE; for(;Busy_Button!=1;)Display(24);} if(SN_Add==0){ SN1+=1; if(SN1>99) SN1=99;} if(SN_Red==0){ SN1-=1; if(SN1<20) SN1=20;} if(EW_Add==0){ EW1+=1; if(EW1>99) EW1=99;} if(EW_Red==0){ EW1-=1; if(EW1<20) EW1=20;} EX0=1; } void timer0(void)interrupt 1 using 1 { TH0=0x3C;TL0=0xB0;count++;if(count==20){ Time_EW--; Time_SN--; count=0;} } 第四章 仿真結果及其總結 1.仿真結果圖 1.1正常狀態的仿真結果如圖4-1所示 圖4-1正常狀態 1.2黃燈狀態的仿真結果如圖4-2所示 圖4-2黃燈狀態 1.3緊急狀態的仿真結果如圖4-3所示 圖4-3 緊急狀態 1.4延長通行時間的仿真結果如圖4-4所示 圖4-4延長通行時間 2.總結 通過這次交通燈的課程設計,使我得到了一次用專業知識、專業技能分析和解決現實問題的能力。使我在單片機的基本原理、單片機應用學習過程中,以及在常用編程設計思路技巧的掌握方面都能向前邁了一大步,為日后成為一名合格的應用型人才打下良好的基礎。綜合課程設計讓我把以前學習到的知識得到鞏固和進一步的提高認識,對已有知識有了更深層次的理解和認識。在此,由于自身能力有限,在課程設計中碰到了很多的問題,我通過查閱相關書籍、資料以及和周圍同學交流得到解決。 通過這次交通燈的課程設計,使我了解了寫畢業設計的流程和方法。為自己以后的畢業論文的設計做一次練習,具有積極的意義。還有交通燈是我們生活中非常常見的一種東西,對于我們學以致用的這種能力得到了很好鍛煉,能夠為我們以后的工作于學習打下基礎。 由于本人的水平有限,設計中難免會有一些不合理的部分,系統的穩定性還有待提高,望批評更正。第三篇:基于單片機控制的交通燈設計系統