單片機原理與應用課程設計基于單片機活動門控制系統的設計與實現_第1頁
單片機原理與應用課程設計基于單片機活動門控制系統的設計與實現_第2頁
單片機原理與應用課程設計基于單片機活動門控制系統的設計與實現_第3頁
單片機原理與應用課程設計基于單片機活動門控制系統的設計與實現_第4頁
單片機原理與應用課程設計基于單片機活動門控制系統的設計與實現_第5頁
已閱讀5頁,還剩26頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、基于單片機活動門控制系統的設計與實現信息與電氣工程學院課程設計說明書(2010 /2011 學年第 2 學期)課程名稱 :單片機原理與應用課程設計題 目 :基于單片機活動門控制系 統的設計與實現 專業班級 :電子信息工程08級1班 學生姓名 : 學 號 : 指導教師 : 設計周數 : 2周 設計成績 : 2011 年 6月 23日目錄1 課程設計主要任務與技術要求 31.1主要任務 31.2技術要求 32 系統分析與設計 3 2.1 系統分析 3 2.2 活動門總體設計方案 43 單片機簡介 53.1 80c51單片機功能與引紹 64 主要硬件電路 74.1電機驅動電路 74.2門限電路 94

2、.3按鍵去抖電路 9 4.3.1 作用 9 4.3.2 技術方案 95 單片機與pc串口通信 106 單片機設計與驗 106.1 單片機程序設計 106.1.1程序流程圖 116.1.2源程序代碼 126.2上位機程序設計 166.2.1控制界面 176.2.2程序代碼 177 課程設計總結 21參考文獻 21附錄1 電路圖 22附錄2 pcb板 24附錄2 實物圖 251.課設主要任務與技術要求1.1主要任務(1)系統分析與設計:對系統進行調研,詳細分析系統,設計出基于單片機的活動門控制系統的技術方案;(2)設計實現系統的關系技術:電機驅動、門限電路、軟件控制;(3)系統電路的設計與實現:器

3、件選擇、地址分配和硬件連接;(4)系統軟件的設計與實現:單片機代碼的實現,計算機控制代碼的實現;(5)系統調試:調試串口、調試按鍵、調試驅動;(6)系統聯調。1.2技術要求(1)實現活動門的開關動作:在單片機的作用下,通過活動門上安裝的控制按鈕,控制外部電機實現活動門的開關動作(即用單片機控制電機的正反轉);(2)實現上位機軟件控制活動門:利用計算機的軟件實現對活動門的開關動作(即單片機與上位機的通信,完成對活動門的正確控制);(3)使用單一供電電源,控制電機使用直流電機,活動門必須安裝限位開關,實現門的自動控制。2系統分析與設計2.1系統分析5單片機與pc機串口通訊51單片機有一個全雙工的串

4、行通訊口,所以單片機和電腦之間可以方便地進行串口通訊。進行串行通訊時要滿足一定的條件,比如電腦的串口是rs232電平的,而單片機的串口是ttl電平的,兩者之間必須有一個電平轉換電路,我們采用了專用芯片max232進行轉換,我們采用了三線制連接串口,也就是說和電腦的9針串口只連接其中的3根線:第5腳的gnd、第2腳的rxd、第3腳的txd。這是最簡單的連接方法,但是對我們來說已經足夠使用了,電路如下圖所示,max232的第10腳和單片機的11腳連接,第9腳和單片機的10腳連接,第15腳和單片機的20腳連接。全雙工的串行通訊口原理圖如圖4.1所示:圖4.1全雙工的串行通訊口原理圖6. 程序設計與實

5、驗活動門控制的程序包括兩方面的內容;一個是單片機方面的編程,包括對活動門狀態的監測和控制,以及微機指令的接收;另一方面是計算機軟件編程,包括人機控制界面的編寫和控制指令的發送。計算機軟件編程方面的內容已在上一章作了詳細介紹。下面主要介紹單片機的程序設計。6.1 單片機程序設計單片機的程序完成兩個功能,首先是監測活動門開關狀態,并以此為依據輸出活動門的控制指令。6.1.1程序流程圖主程序main的流程圖: 外部中斷零程序int的流程圖:使發光二極l1和l2管都滅設置串口工作方式設置定時器t1工作方式并賦值開串口中斷并設置串口中斷觸發方式開cpu中斷和外部中斷零等待中斷保護現場p2.0=1?ny中

6、斷返回是否有鍵按下?y電機正轉l1亮l2滅n電機反轉l1滅l2亮調用延時4秒程序電機停止l1和l2滅恢復現場中斷返回開始中斷入口串口中斷程序d流程圖:中斷入口保護現場和清ri從sbuf中讀數送累加器aa=10?ynp3.2=0?把01寫入sbuf送到上位機ny電機正轉l1亮p3.2=0?ny電機反轉l2亮把10寫入sbuf送到上位機調用4秒的延時程序電機停轉燈滅清ri恢復現場中斷返回6.1.2源程序的代碼1系統分析與設計1.1系統分析要想實現微數字溫度計的顯示,從理論上分析,最簡單的方法就是用開關控數碼管的亮滅來控制溫度的顯示與否,也可以直接將溫度顯示在液晶顯示屏上。也就是說,只要用單片機直接

7、控制數碼管的顯示溫度就可以了。為了實現更加人性化的便捷操作,通過pc上位機來顯示溫度更加的便利,pc上位機的顯示界面可以同時顯示多個溫度值,極大地提高了需要嚴格控制溫度時的場合,便于工作人員及時的調整需要,也提高了工作人員的工作效率,實現了現代工業的自動化與便利性。1.2 數字溫度計總體設計方案2.軟件控制2.1作用利用單片機實現數字溫度計一個優點是可以利用軟件控制溫度的顯示與否,從而將計算機軟件和硬件動作聯系起來,通過上位機的界面顯示溫度更加方便用戶對環境的溫度的測定。采用串口通信的方式連接上位計算機和單片機有若干好處。首先,對于危機而言,控制外部設備的接口有多種多樣,如并口、串口、pci、

8、isa等。從電路設計的簡便性考慮,利用串口最為理想這是因為,一般的微機均帶有4個以上的串行接口,而并口只有一個,機箱和微機的生產廠家不可能僅僅為了活動門而占用微機有限的并口資源。同樣,使用pci、isa插槽不僅占用了主板資源,更是需要開發獨立的驅動,開發成本較高;此外,從開發的成本和復雜性上考慮,采用串口無疑是最為簡便而低廉的設計方案。2.2技術方案用戶通過軟件界面直接觀測溫度值。控制界面和單片機相當于是上、下位機的關系。控制界面通過串口通信接受來至下位機數據并且可以對數據進行保存。2.3 rs232通訊原理串行端口的本質功能是作為cpu和串行設備間的編碼轉換器。當數據從cpu經過串行端口發送

9、出去時,字節數據轉換為串行的位。在接收數據時,串行的位被轉換為字節數據。串口是計算機上一種非常通用設備通信的協議(不要與通用串行總線universal serial bus或者usb混淆)。大多數計算機包含兩個基于rs232的串口。串口同時也是儀器儀表設備通用的通信協議;很多gpib兼容的設備也帶有rs-232口。同時,串口通信協議也可以用于獲取遠程采集設備的數據。串口通信的概念非常簡單,串口按位(bit)發送和接收字節。盡管比按字節(byte)的并行通信慢,但是串口可以在使用一根線發送數據的同時用另一根線接收數據。它很簡單并且能夠實現遠距離通信。比如ieee488定義并行通行狀態時,規定設備

10、線總常不得超過20米,并且任意兩個設備間的長度不得超過2米;而對于串口而言,長度可達1200米。典型地,串口用于ascii碼字符的傳輸。通信使用3根線完成:a地址線、b發送、c接收。由于串口通信是異步的,端口能夠在一根線上發送數據同時在另一根線上接收數據。其他線用于握手,但是不是必須的。串口通信最重要的參數是波特率、數據位、停止位和奇偶校驗。對于兩個進行通行的端口,這些參數必須匹配:(1)波特率:這是一個衡量通信速度的參數。它表示每秒鐘傳送的bit的個數。(2)數據位:這是衡量通信中實際數據位的參數。(3)停止位:用于表示單個包的最后一位。典型的值為1,1.5和2位。(4)奇偶校驗位:在串口通

11、信中一種簡單的檢錯方式。有四種檢錯方式:偶、奇、高和低。2.4單片機與pc機串口通訊51單片機有一個全雙工的串行通訊口,所以單片機和電腦之間可以方便地進行串口通訊。進行串行通訊時要滿足一定的條件,比如電腦的串口是rs232電平的,而單片機的串口是ttl電平的,兩者之間必須有一個電平轉換電路,我們采用了專用芯片max232進行轉換,雖然也可以用幾個三極管進行模擬轉換,但是還是用專用芯片更簡單可靠。我們采用了三線制連接串口,也就是說和電腦的9針串口只連接其中的3根線:第5腳的gnd、第2腳的rxd、第3腳的txd。這是最簡單的連接方法,但是對我們來說已經足夠使用了,電路如下圖所示,max232的第

12、10腳和單片機的11腳連接,第9腳和單片機的10腳連接,第15腳和單片機的20腳連接。全雙工的串行通訊口原理圖如圖4.1所示: 3.3 sci串行通信接口 dsp控制器串行通信接口(sci)是一個標準的通用異步接收/發送(uart)通信接口。它的接收器和發送器都是雙緩沖的。dsp控制器串行通信接口(sci)有自已的使能和中斷位,它們可以半雙工或全雙工方式工作。為了保證數據的完整性,串行通信接口對接收的數據進行間斷檢測、奇偶性、超時和幀錯誤的檢查。位速率(波特率)可通過一個16位的比特率選擇寄存器進行編程,因此,可以有超過65000種不同的速率。sci模塊是一個8位片內外設,通過dsp的16位外

13、部數據總線的低8位與外部設備通信。sci的物理描述:(1)兩個i/o引腳。*scirxd(sci接收數據輸入)*scitxd(sci發送數據輸出)(2)通過一個16位波特率選擇寄存器的編程,可得到超過65000種不同的可編程位速率。*波特率的數量:64k(3)18的可編程數據字長。(4)長度為1位或2位的可編程停止位。(5)內部產生的串行時鐘。(6)四個錯誤檢測標志。*奇偶性錯誤*超限錯誤*幀錯誤*間斷檢驗(7)兩種喚醒多處理器模式,可與任意通信格式一起使用。*空閑線路喚醒*位尋址喚醒(8)半雙工或全雙工操作。(9)雙緩沖接收和發送功能。(10)接收和發送操作均可通過中斷或查詢操作進行,相應的

14、狀態標志如下:發送器:txrdy標志(發送器緩沖寄存器準備好接收另一個字符)和txempty標志(發送移位寄存器空)。接收器:rxrdy標志(準備從接收緩沖寄存器中讀出一個新字符)、brkdt標志(間斷條件發生)和rxerror,可用來監視四個中斷條件。(11)發送器和接收器中斷的分立的使能位(間斷除外)。(12)sci數據,不管是接收的、還是發送的,都是nrz(非歸零)格式的。3.3.1 串行通信的工作原理空閑位(某一位的擴展)scirxdscitxdsciclk起始位數據位校驗位停止位12345678低位高位rs232dsp 控 制 器pc機mc1489mc1488txdtxdrxdrxd

15、gndgnd為了保證異步串行通信主、從機之間的同步,除了要有前面的通信數據格式外,還必須要求主、從機的發送和接收時鐘具有相同的周期,既相同的波特率。為了保證同步,除了格式與周期外,還需解決的一個基本問題是主、從機必須按照統一的電氣和物理接口標準來連接,如信號電平、信號定義與電纜特性等都必須按照統一的標準。如果主從機之間的電氣和物理接口標準不一致,一定要進行電氣和物理接口的轉換。最典型的是dsp控制器與pc機串口連接時,前者是ttl(5v)電平,后者是rs232(15v)電平,必須進行電平轉換,如圖3.23所示。ttl電平的“1”和“0”分別為2.4和0.4v,因此需外接電路實現電平轉換。傳輸線

16、驅動器 mc1488 和傳輸線接收器 mc1489 可實現這種轉換。rs-232輸出mc1488ttl輸入+12v12vrs232輸入ttl輸出mc1489+5v16位的波特率數值用brr表示。sci使用16位的波特率選擇寄存器值來選擇64k種不同的串行時鐘頻率中的一種。選擇可以通過以下方法來確定:當 brr =165535時(brr=波特率選擇寄存器中的16位值):波特率是按位計算的,而每位需要8個sciclk周期。當 brr = 0 時表1 一般sci位速度的波特率選擇值理想的波特率brr實際的波特率誤差(%)24002080(822h)2400048001040(411h)48030.0

17、69600520(208h)9597-0.0319200259(103h)192310.1638400129(81h)384620.16圖4.1全雙工的串行通訊口原理圖上位機主要是對數字溫度計的多個溫度值的顯示。(1) 控制界面如下(2) 上位機程序如下:using system;using system.collections.generic;using system.componentmodel;using system.data;using system.drawing;using system.text;using system.windows.forms;using system.i

18、o;using system.io.ports;namespace weuduceliang public partial class form1 : form public form1() initializecomponent(); timer1.interval = 1000;/設置timer控件時間間隔 timer1.enabled = false; serialport1.databits = 8; serialport1.stopbits = system.io.ports.stopbits.one; serialport1.readbuffersize = 500000; ser

19、ialport1.rtsenable = true; /如果是rs232轉rs485,此句必須要,否則不能通訊 serialport1.newline = rn; private void button1_click(object sender, eventargs e) if (!serialport1.isopen) /如果串口是關閉的 /設定串口信息和波特率 serialport1.portname = bobox1.selecteditem.tostring(); serialport1.baudrate = convert.toint32(bobox2.selecteditem.to

20、string(); serialport1.parity = parity.none; serialport1.databits = convert.toint16(bobox4.selecteditem.tostring(); serialport1.stopbits = stopbits.one; try serialport1.open(); /打開串口 btnopen.text = 關閉串口; /改變按鈕上的字符 combobox1.enabled = false; combobox2.enabled = false; combobox3.enabled = false; combob

21、ox4.enabled = false; combobox5.enabled = false; catch messagebox.show(串口打開失敗!n可能是串口已被占用!); else /如果串口是打開的 serialport1.close(); /關閉串口 btnopen.text = 打開串口; /改變按鈕上的字符 combobox1.enabled = true ; combobox2.enabled = true; combobox3.enabled = true; combobox4.enabled = true; combobox5.enabled = true; priva

22、te void btncj_click(object sender, eventargs e) try if (serialport1.isopen) serialport1.write(rn); if (convert.toint32(serialport1.readline() != 1820) messagebox.show(沒有找到您要找的設備); return; serialport1.write(rn); double k = convert.todouble(serialport1.readline(); double wendu = k * 0.0001; textbox1.t

23、ext = 溫度: + wendu.tostring() + ; + 時間: + datetime.now.tostring(); btncj.text = 停止采集; timer1.start(); else timer1.stop(); messagebox.show(串口未打開請先打開串口!); catch messagebox.show(沒找到設備); timer1.stop(); serialport1.close(); serialport1.dispose(); btncj.text = 開始采集; private void button2_click(object sender

24、, eventargs e) /清除listbox控件中的內容 textbox1.text = ; private void button3_click(object sender, eventargs e) /保存溫度數據 system.io.filestream objfile; savefiledialog1.showdialog(); objfile = system.io.file.create(savefiledialog1.filename); objfile.close(); objfile.close(); objfile.dispose(); system.io.strea

25、mwriter objfiles = new streamwriter(savefiledialog1.filename); objfiles.write(textbox1.text); objfiles.close(); objfiles.dispose(); private void timer1_tick(object sender, eventargs e) serialport1.write(rn); double k = convert.todouble(serialport1.readline(); double wendu = k * 0.0001; textbox1.text

26、 = 溫度: + wendu.tostring() + ; + 時間: + datetime.now.tostring(); btncj.text = 停止采集; private void combobox1_selectedindexchanged(object sender, eventargs e) this.serialport1.portname = bobox1.selecteditem.tostring(); private void combobox2_selectedindexchanged(object sender, eventargs e) this.serialpor

27、t1.baudrate = convert.toint32(bobox2.selecteditem); private void combobox3_selectedindexchanged(object sender, eventargs e) switch (bobox3.selecteditem.tostring() case none: this.serialport1.parity = parity.none; break; case even: this.serialport1.parity = parity.even; break; case odd: this.serialpo

28、rt1.parity = parity.odd; break; default: this.serialport1.parity = parity.none; break; private void combobox4_selectedindexchanged(object sender, eventargs e) this.serialport1.databits = convert.toint16(bobox4.selecteditem); private void combobox5_selectedindexchanged(object sender, eventargs e) swi

29、tch (convert.toint16(bobox5.selecteditem) case 1: this.serialport1.stopbits = stopbits.one; break; case 2: this.serialport1.stopbits = stopbits.two; break; default: this.serialport1.stopbits = stopbits.one; break; private void form1_load(object sender, eventargs e) #region -以下各賦值語句都會觸發相應的selectedind

30、exchanged事件,同時會對串口進行初始化設- bobox1.selecteditem = bobox1.items0; /com1; bobox2.selecteditem = bobox2.items3; /9600; bobox3.selecteditem = bobox3.items0; /8; bobox4.selecteditem = bobox4.items0; /parity.none; bobox5.selecteditem = bobox5.items0; /stopbits.one #endregion 3.課程設計總結通過此次課程設計,使我更加扎實的掌握了有關高頻電

31、子線路方面的知識,在設計過程中雖然遇到了一些問題,但經過一次又一次的思考,一遍又一遍的檢查終于找出了原因所在,也暴露出了前期我在這方面的知識欠缺和經驗不足。實踐出真知,通過親自動手制作,使我們掌握的知識不再是紙上談兵。過而能改,善莫大焉。在課程設計過程中,我們不斷發現錯誤,不斷改正,不斷領悟,不斷獲取。最終的檢測調試環節,本身就是在踐行“過而能改,善莫大焉”的知行觀。這次課程設計終于順利完成了,在設計中遇到了很多問題,最后在老師的指導下,終于游逆而解。在今后社會的發展和學習實踐過程中,一定要不懈努力,不能遇到問題就想到要退縮,一定要不厭其煩的發現問題所在,然后一一進行解決,只有這樣,才能成功的

32、做成想做的事,才能在今后的道路上劈荊斬棘,而不是知難而退,那樣永遠不可能收獲成功,收獲喜悅,也永遠不可能得到社會及他人對你的認可!課程設計誠然是一門專業課,給我很多專業知識以及專業技能上的提升,同時又是一門講道課,一門辯思課,給了我許多道,給了我很多思,給了我莫大的空間。同時,設計讓我感觸很深。使我對抽象的理論有了具體的認識。通過這次課程設計,我掌握了常用元件的識別和測試;熟悉了常用儀器、儀表;了解了電路的連線方法;以及如何提高電路的性能等等,掌握了焊接的方法和技術,通過查詢資料,也了解了收音機的構造及原理。我認為,在這學期的實驗中,不僅培養了獨立思考、動手操作的能力,在各種其它能力上也都有了

33、提高。更重要的是,在實驗課上,我們學會了很多學習的方法。而這是日后最實用的,真的是受益匪淺。要面對社會的挑戰,只有不斷的學習、實踐,再學習、再實踐。這對于我們的將來也有很大的幫助。以后,不管有多苦,我想我們都能變苦為樂,找尋有趣的事情,發現其中珍貴的事情。就像中國提倡的艱苦奮斗一樣,我們都可以在實驗結束之后變的更加成熟,會面對需要面對的事情。回顧起此課程設計,至今我仍感慨頗多,從理論到實踐,在這段日子里,可以說得是苦多于甜,但是可以學到很多很多的東西,同時不僅可以鞏固了以前所學過的知識,而且學到了很多在書本上所沒有學到過的知識。通過這次課程設計使我懂得了理論與實際相結合是很重要的,只有理論知識

34、是遠遠不夠的,只有把所學的理論知識與實踐相結合起來,從理論中得出結論,才能真正為社會服務,從而提高自己的實際動手能力和獨立思考的能力。在設計的過程中遇到問題,可以說得是困難重重,但可喜的是最終都得到了解決。 實驗過程中,也對團隊精神的進行了考察,讓我們在合作起來更加默契,在成功后一起體會喜悅的心情。果然是團結就是力量,只有互相之間默契融洽的配合才能換來最終完美的結果。此次設計也讓我明白了思路即出路,有什么不懂不明白的地方要及時請教或上網查詢,只要認真鉆研,動腦思考,動手實踐,就沒有弄不懂的知識,收獲頗豐。4.參考文獻1 曹克澄.單片機原理及應用. 機械工業出版社.2005.2 馬俊編著.c#網

35、絡應用高級編程.2007.53 靳達編著.單片機應用系統開發實例導航.北京:人民郵電出版社,20034 南建輝、熊鳴、王軍茹.mcs-51單片機原理及應用實例.清華大學出版社,2004課程設計評 語課程設計成 績指導教師(簽字) 年 月 日end6.2 上位機程序設計軟件控制活動門需要實現兩個功能:一是人機控制界面的編寫,二是活動門控制信號的傳送和執行。第一個功能的主要內容是windows環境下可視化程序的開發;第二個功能主要是微機與單片機之間的通信。6.2.1控制界面6.2.2程序代碼:using system;using system.collections.generic;using s

36、ystem.componentmodel;using system.data;using system.drawing;using system.text;using system.windows.forms;using system.io.ports;namespace hdmkz public partial class form1 : form public form1() initializecomponent(); private void form1_load(object sender, eventargs e) combobox1.selectedindex = 0; byte

37、 dout = new byte1; byte din = new byte1; private void button1_click(object sender, eventargs e) if (serialport1.isopen) serialport1.close(); button1.text = 關閉串口; textbox1.text = 串口未打開,不可以進行串口通信!; listbox1.items.add(初始化失敗,禁止可以進行通信!); else try textbox3.text = 9600bps; textbox4.text = 8; textbox6.text

38、= 0; serialport1.portname = (string)combobox1.selecteditem; serialport1.baudrate = 9600; serialport1.databits = 8; serialport1.stopbits = stopbits.one; serialport1.parity = parity.none; serialport1.rtsenable = true; serialport1.open(); button1.text = 打開串口; textbox1.text = 串口已打開,可以進行串口通信!; listbox1.i

39、tems.add(初始化成功,可以進行通信!); catch messagebox.show(串口未打開!, 出錯啦!, messageboxbuttons.ok, messageboxicon.error); private void listbox1_selectedindexchanged(object sender, eventargs e) private void button2_click(object sender, eventargs e) try if ( serialport1.isopen) dout0 = 10; this.serialport1.write(dout, 0, dout.length); listbox1.items.add(已發送控制信號使電機正轉!); catch messagebox.show(發送命令失敗!, 出錯啦!, messageboxbuttons.ok, messageboxicon.error); private void button3_click(object sender, eventargs e) try if ( serialport1.isopen) dout0 = 01; this.serialport1.write(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論