版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
基于eda的數(shù)字鐘程序設(shè)計(jì)【實(shí)用文檔】doc文檔可直接使用可編輯,歡迎下載
基于eda的數(shù)字鐘程序設(shè)計(jì)【實(shí)用文檔】doc文檔可直接使用可編輯,歡迎下載一、課題要求:(1)技術(shù)要求:1、掌握多功能數(shù)字鐘的工作原理.2、應(yīng)用EDA技術(shù),VHDL語言編寫程序。3、層次化設(shè)計(jì),設(shè)計(jì)原理框圖.4,、硬件設(shè)計(jì)及排版。(2)功能要求:1、基本功能:能進(jìn)行正常的時(shí)、分、秒計(jì)時(shí)功能,分別由6個(gè)數(shù)碼管顯示24小時(shí)、60分鐘、60秒的計(jì)數(shù)器顯示。2、擴(kuò)展功能:(1)能夠利用按鍵實(shí)現(xiàn)“校時(shí)”“校分"“清零”功能。(2)能利用揚(yáng)聲器做整點(diǎn)報(bào)時(shí),整點(diǎn)前五秒短聲,整點(diǎn)長聲.(3)本人工作:負(fù)責(zé)軟件部分,,編寫各部分模塊的VHDL程序,并且鎖定引腳,將程序下載到芯片中。二、設(shè)計(jì)方案:原理框圖:數(shù)字鐘原理框圖一共有11個(gè)小模塊:分頻,片選,按鍵,小時(shí),分,秒,顯示模塊,七段顯示譯碼器,報(bào)時(shí),揚(yáng)聲,36譯碼器。左邊第一個(gè)是時(shí)鐘信號輸入端,50Mhz到分頻模塊。第二個(gè)為清零按鍵,第三個(gè)為校分按鍵,第四個(gè)為校時(shí)按鍵。右邊第一個(gè)為七段顯示譯碼器輸出端,第二個(gè)為揚(yáng)聲器輸出端,第三個(gè)為6個(gè)數(shù)碼管輸出端。中間模塊為數(shù)字鐘的核心,有計(jì)時(shí),報(bào)時(shí),校時(shí)功能。三、單元模塊設(shè)計(jì)1、分頻模塊該模塊是將時(shí)鐘脈沖50Mhz分頻到1000、500和1,分別給報(bào)時(shí)模塊和及時(shí)模塊。2、秒模塊仿真圖該模塊為60進(jìn)制計(jì)數(shù)器,有分頻模塊得到的1hz進(jìn)行計(jì)時(shí),計(jì)時(shí)輸出為秒的數(shù)值,在計(jì)時(shí)到59時(shí)進(jìn)位1到co端。當(dāng)按下s3時(shí),秒清零。3。、分模塊仿真圖該模塊也為60進(jìn)制計(jì)數(shù)器,計(jì)時(shí)輸出為分的數(shù)值.在EN信號有效且時(shí)鐘來時(shí),計(jì)數(shù)器加1、在s2按下時(shí),EN使能端有效,實(shí)現(xiàn)校分功能。4、時(shí)模塊仿真圖該模塊為24進(jìn)制計(jì)數(shù)器,計(jì)時(shí)輸出為小時(shí)的數(shù)值,在EN信號到來時(shí),計(jì)數(shù)器加1,在S1按下時(shí),EN信號有效,實(shí)現(xiàn)校時(shí)功能。5、片選模塊仿真圖該模塊提供數(shù)碼管片選信號。6、按鍵模塊仿真圖該模塊是有幾個(gè)門電路組成,把它編寫成一個(gè)模塊,到時(shí)寫程序方便。該模塊連接幾個(gè)按鍵,由按鍵控制。7、報(bào)時(shí)模塊仿真圖該模塊為整點(diǎn)報(bào)時(shí)提供控制信號,當(dāng)59分時(shí),秒為50,52,54,56,58時(shí),Q500輸出“1”;秒為00時(shí),Q1000輸出“1”。這兩個(gè)信號經(jīng)過邏輯門實(shí)現(xiàn)報(bào)時(shí)功能。8、BBB模塊仿真圖該模塊對應(yīng)不同的片選信號送出不同的要顯示的數(shù)據(jù).9、36譯碼器模塊仿真圖該模塊為36譯碼器,為輸出到數(shù)碼管對應(yīng)功能.10、七段譯碼器模塊仿真圖該模塊為七段譯碼器,輸出到數(shù)碼管的每一個(gè)引腳,可以正確的點(diǎn)亮每一個(gè)數(shù)碼管。11、揚(yáng)聲模塊仿真圖該模塊也為幾個(gè)門電路組合,控制著對揚(yáng)聲器的輸入,當(dāng)時(shí)間到達(dá)某一點(diǎn)時(shí),輸出不同的脈沖信號到揚(yáng)聲器,給予揚(yáng)聲器信號.四、頂層模塊設(shè)計(jì)程序圖:總體框圖頂層文件將上面11個(gè)小模塊集合到一起構(gòu)成了總的程序,最終也是將這個(gè)頂層文件寫到FPGA芯片中.五、硬件電路設(shè)計(jì)由另一位同學(xué)負(fù)責(zé),收集好器件,將器件排版在電路板上,并將其焊接成成品。六、硬件電路安裝及調(diào)試在EDA中,將頂層文件各個(gè)輸入與輸出端口鎖定引腳。鎖定好引腳后將整個(gè)頂層文件下載到FPGA芯片中。注:在下載時(shí),要注意先安裝USB程序,再設(shè)置IDE環(huán)境設(shè)置,然后再programmer中選擇自己要的文件,下載時(shí)必須先安裝好芯片再接電源,下載成功后,先拔電源,再拔下USB。下載好以后,用杜邦線將硬件和芯片的引腳連接好,檢查無誤后進(jìn)行測試。七、調(diào)試結(jié)果為了每個(gè)模塊的正確性,將一一對每個(gè)模塊進(jìn)行測試.將芯片與硬件連接好,檢查無誤后,打開電源,此時(shí)硬件上的數(shù)碼管開始計(jì)時(shí),等到秒為59時(shí),下一秒,分為1,秒為00。然后用校時(shí)功能按鍵將分校分到59分,此時(shí)當(dāng)秒為50時(shí),揚(yáng)聲器開始響,并且到整點(diǎn)時(shí),揚(yáng)聲器持續(xù)響一段時(shí)間。按下S3,秒清零。調(diào)試結(jié)束,基本功能能夠計(jì)時(shí),并且進(jìn)位到分和時(shí),擴(kuò)展功能,按下S2和S3后能夠進(jìn)行分和時(shí)的校時(shí),并且到整點(diǎn)時(shí)開始報(bào)時(shí)。八、設(shè)計(jì)中遇到的問題及解決方案我負(fù)責(zé)軟件部分,開始在編寫程序時(shí)根本無從下手,再找了一些資料后終于對數(shù)字鐘有些了解。用EDA設(shè)計(jì)每一個(gè)模塊,都需要一個(gè)一個(gè)的去仿真,看程序?qū)Σ粚?經(jīng)常在一些小程序上出現(xiàn)問題。本來有好多門電路,發(fā)現(xiàn)放在頂層文件中比較麻煩,所以將這些門電路組成兩個(gè)模塊,按鍵模塊和揚(yáng)聲模塊,這樣方便頂層文件的編寫。分頻模塊,由于要將50MHz的脈沖分到1000Hz,500Hz,和1Hz,分頻量比較大,不能仿真,只能先改小一下數(shù)據(jù),驗(yàn)證程序是否正確.36譯碼器部分,本來使用的是38譯碼器,發(fā)現(xiàn)多了2個(gè)輸入,有6個(gè)數(shù)碼管,但是38譯碼器并不影響輸出.在下載過程,鎖定引腳,發(fā)現(xiàn)芯片上的引腳與硬件上的引腳是反的,數(shù)碼管顯示的是亂碼.當(dāng)數(shù)字鐘的時(shí)分秒順序錯(cuò)了以后,不需要重新鎖定引腳,只要將對應(yīng)的杜邦線對調(diào)一下就行了。我們校時(shí)用的按鍵是自鎖開關(guān),其實(shí)只要改成下拉電阻就可以了。九、收獲與體會經(jīng)過兩個(gè)星期的數(shù)電課程設(shè)計(jì),收獲很大,讓我們自己設(shè)計(jì)了數(shù)電模型,從軟件和硬件上學(xué)到了很多知識.兩個(gè)同學(xué)一個(gè)設(shè)計(jì)軟件,一個(gè)設(shè)計(jì)硬件,不僅提高了學(xué)習(xí)能力,還培養(yǎng)了團(tuán)隊(duì)合作能力.我負(fù)責(zé)的是軟件部分,這學(xué)期正好學(xué)習(xí)了EDA技術(shù),把它應(yīng)用到了軟件的程序編寫中來。我們設(shè)計(jì)的是數(shù)字鐘,雖然數(shù)字鐘看起來很簡單,但是要把每個(gè)模塊全部搞在一起還是有點(diǎn)難度的。開始經(jīng)過上網(wǎng)及圖書館借書來了解數(shù)字鐘的結(jié)構(gòu)與工作原理,把它每一部分的模塊摸透清楚后,在開始編程,寫入芯片.同時(shí)還要把軟件與硬件結(jié)合起來,在各自做各自的工作時(shí)還要緊密結(jié)合自己組員的工作,只有兩個(gè)人的東西做完后,組合起來才算真正的完成。首先明確好數(shù)字鐘的功能,基本功能:能進(jìn)行正常的時(shí)、分、秒計(jì)時(shí)功能,分別由6個(gè)數(shù)碼管顯示24小時(shí)、60分鐘、60秒的計(jì)數(shù)器顯示.擴(kuò)展功能:(1)能夠利用按鍵實(shí)現(xiàn)“校時(shí)”“校分”“清零"功能。(2)能利用揚(yáng)聲器做整點(diǎn)報(bào)時(shí),整點(diǎn)前五秒短聲,整點(diǎn)長聲。然后設(shè)計(jì)好總的原理圖,將功能全部覆蓋進(jìn)去,設(shè)計(jì)每個(gè)模塊,用EDA中的VHDL編寫程序,然后再仿真,根據(jù)仿真圖檢測自己的程序是否正確。當(dāng)每個(gè)模塊在電腦中仿真無誤時(shí),編寫頂層文件,把各個(gè)小模塊連接到一起,然后將整個(gè)程序畫出原理框圖,與自己預(yù)測的相比較。當(dāng)軟件做好后,用下載線將自己寫的程序?qū)戇M(jìn)芯片中,不過此時(shí)要注意先連接好線才能開電源,當(dāng)下載后,要先關(guān)電源,再拔USB接口。下載后與同組同學(xué)用杜邦線連接開始測試,第一次先將整個(gè)程序?qū)懭?,發(fā)現(xiàn)沒有正確顯示,然后一個(gè)一個(gè)模塊檢測后,發(fā)現(xiàn)了問題,終于數(shù)字鐘做好了,基本功能與擴(kuò)展功能都出來了。這次課程設(shè)計(jì)后,軟件方面有著明顯的提高,而且合作啊能力也提高了,作品完成的還是很好的.首先要感謝老師的細(xì)心教導(dǎo),讓我學(xué)習(xí)到了好多知識,從硬件到軟件,不僅僅是知識上,還有能力上,還要感謝同組同學(xué),沒有他的硬件,這次數(shù)字鐘也完不成。這次收獲還是很大的,自己的努力與汗水終于沒有出,總結(jié)這次課程設(shè)計(jì)的經(jīng)驗(yàn),在以后的課程設(shè)計(jì)中能夠更好的發(fā)揮!十、參考文獻(xiàn):1、《EDA技術(shù)與VHDL》清華大學(xué)出版社2、《數(shù)字系統(tǒng)設(shè)計(jì)與VerilogHDL(第三版)》王金明編著3、《EDA技術(shù)與應(yīng)用(第2版)》江國強(qiáng)編著4、《EDA技術(shù)實(shí)用教程》科學(xué)出版社 開放性實(shí)驗(yàn)報(bào)告題目:基于ARM的多線程應(yīng)用程序設(shè)計(jì)院系名稱:電氣工程學(xué)院專業(yè)班級:自動(dòng)1302學(xué)生姓名:張鵬濤學(xué)號:201323020219指導(dǎo)教師:張曉東成績:成績:指導(dǎo)老師簽名:目錄TOC\o"1-3”\h\uHYPERLINK\l_Toc233581系統(tǒng)概述與設(shè)計(jì)要求PAGEREF_Toc233581HYPERLINK\l_Toc46671.1系統(tǒng)概述PAGEREF_Toc46671HYPERLINK\l_Toc121361.2設(shè)計(jì)要求PAGEREF_Toc121362286422方案論證PAGEREF_Toc2864222。1實(shí)現(xiàn)方法PAGEREF_Toc284922.2線程優(yōu)勢PAGEREF_Toc300312HYPERLINK\l_Toc197593硬件設(shè)計(jì)PAGEREF_Toc197593HYPERLINK\l_Toc255393.1樹莓派接口驅(qū)動(dòng)LED電路設(shè)計(jì)934軟件設(shè)計(jì)PAGEREF_Toc248624HYPERLINK\l_Toc47954。1驅(qū)動(dòng)三色LED燈PAGEREF_Toc47954HYPERLINK\l_Toc312464.1.1驅(qū)動(dòng)實(shí)現(xiàn)方法PAGEREF_Toc3124644。1.2wiringPi庫安裝和軟件編程PAGEREF_Toc922044.2服務(wù)器和客戶端PAGEREF_Toc1868754.2。1服務(wù)器設(shè)計(jì)方法PAGEREF_Toc269845HYPERLINK\l_Toc128844.2.2客戶端設(shè)計(jì)方法PAGEREF_Toc128845HYPERLINK\l_Toc42335系統(tǒng)調(diào)試PAGEREF_Toc42336HYPERLINK\l_Toc25772設(shè)計(jì)心得PAGEREF_Toc257726HYPERLINK\l_Toc3827參考文獻(xiàn)PAGEREF_Toc38277HYPERLINK\l_Toc829附錄1(LED驅(qū)動(dòng)程序)8298HYPERLINK\l_Toc22383附錄2(服務(wù)器程序)PAGEREF_Toc2238310附錄3(客戶端程序代碼)PAGEREF_Toc26713161系統(tǒng)概述與設(shè)計(jì)要求1.1系統(tǒng)概述本系統(tǒng)設(shè)計(jì)是基于樹莓派開發(fā)板上實(shí)現(xiàn)的,樹莓派由注冊于英國的慈善組織“RaspberryPi基金會"開發(fā),Eben·Upton/埃·厄普頓為項(xiàng)目帶頭人。2012年3月,英國劍橋大學(xué)埃本·阿普頓(EbenEpton)正式發(fā)售世界上最小的臺式機(jī),又稱卡片式電腦,外形只有信用卡大小,卻具有電腦的所有基本功能,這就是RaspberryPi電腦板,中文譯名"樹莓派".它是一款基于ARM的微型電腦主板,以SD/MicroSD卡為內(nèi)存硬盤,卡片主板周圍有1/2/4個(gè)USB接口和一個(gè)10/100以太網(wǎng)接口(A型沒有網(wǎng)口),可連接鍵盤、鼠標(biāo)和網(wǎng)線,同時(shí)擁有視頻模擬信號的電視輸出接口和HDMI高清視頻輸出接口,以上部件全部整合在一張僅比信用卡稍大的主板上,具備所有PC的基本功能。而樹莓派2具有900MHz內(nèi)核頻率,4核ARMCortex—A7,1GB內(nèi)存,帶MicroSD卡插槽(支持通過它啟動(dòng)Linux操作系統(tǒng),如Fedora),40PIN接口(可以增加驅(qū)動(dòng)外設(shè))。本系統(tǒng)設(shè)計(jì)正式在樹莓派2環(huán)境下開發(fā)實(shí)現(xiàn)多線程設(shè)計(jì),設(shè)計(jì)的主要功能就是兩個(gè)客戶端通過服務(wù)器互相收發(fā)信息。1.2設(shè)計(jì)要求要求多個(gè)客戶端能夠同時(shí)連接服務(wù)器,而服務(wù)器需要?jiǎng)?chuàng)建線程來管理這多個(gè)客戶端,并且能夠把一個(gè)客戶端發(fā)來的數(shù)據(jù)進(jìn)行解析,發(fā)給另一個(gè)客戶端,實(shí)現(xiàn)兩個(gè)甚至多個(gè)客戶端互相收發(fā)信息。能夠通過驅(qū)動(dòng)三色燈來發(fā)現(xiàn)系統(tǒng)運(yùn)行的狀態(tài),紅色說明有錯(cuò)誤發(fā)生,綠色說明正在正常運(yùn)行,藍(lán)色說明有用戶連接,綠色說明有客戶端互相收發(fā)信息。2方案論證2.1實(shí)現(xiàn)方法要實(shí)現(xiàn)服務(wù)器同時(shí)管理兩個(gè)甚至多個(gè)客戶端,就必須引入進(jìn)程或線程。2.2線程優(yōu)勢一是和進(jìn)程相比,它是一種非常”節(jié)儉"的多任務(wù)操作方式。進(jìn)程是系統(tǒng)中程序執(zhí)行和資源分配的基本單位。我們知道,在Linux系統(tǒng)下,啟動(dòng)一個(gè)新的進(jìn)程必須分配給它獨(dú)立的地址空間,建立眾多的數(shù)據(jù)表來維護(hù)它的代碼段、堆棧段和數(shù)據(jù)段,這就導(dǎo)致了進(jìn)程在進(jìn)行切換等操作起到了現(xiàn)場保護(hù)作用,這是一種"昂貴"的多任務(wù)工作方式。但是為了進(jìn)一步減少處理機(jī)的空轉(zhuǎn)時(shí)間支持多處理器和減少上下文切換開銷,進(jìn)程演化中出現(xiàn)了另外一個(gè)概念,這就是線程,也被人稱為輕量級的進(jìn)程。它是一個(gè)進(jìn)程內(nèi)的基本調(diào)度單位。線程是在共享的內(nèi)存空間中并發(fā)的多道執(zhí)行路徑,它們共享一個(gè)進(jìn)程的資源,比如文件描述符和信號處理等。因此,大大減少了上下文切換的開銷。二是線程間方便的通信機(jī)制。對不同進(jìn)程來說,它們具有獨(dú)立的數(shù)據(jù)空間,要進(jìn)行數(shù)據(jù)的傳遞只能通過通信的方式進(jìn)行,這種方式不僅費(fèi)時(shí),而且很不方便。線程則不然,由于同一進(jìn)程下的線程之間共享數(shù)據(jù)空間,所以一個(gè)線程的數(shù)據(jù)可以直接為其它線程所用,這不僅快捷,而且方便。當(dāng)然,數(shù)據(jù)的共享也帶來其他一些問題,有的變量不能同時(shí)被兩個(gè)線程所修改,有的子程序中聲明為static的數(shù)據(jù)更有可能給多線程程序帶來災(zāi)難性的打擊,這些正是編寫多線程程序時(shí)最需要注意的地方.3硬件設(shè)計(jì)3.1樹莓派接口驅(qū)動(dòng)LED電路設(shè)計(jì)圖3.1從圖3.1可以知道,要想讓三色燈的紅色亮起來,首先控制樹莓派GPIO.27引腳輸出低電平,同理可以控制GPIO.28、GPIO29引腳電瓶來控制綠、藍(lán)LED的啟動(dòng)和關(guān)閉。樹莓派開發(fā)板上的相關(guān)引腳如圖3.2。圖3.24軟件設(shè)計(jì)4.1驅(qū)動(dòng)三色LED燈4.1.1驅(qū)動(dòng)實(shí)現(xiàn)方法控制引腳電瓶的高低就能實(shí)現(xiàn)控制LED燈的變化,實(shí)際上三色LED可以顯示無數(shù)種顏色,要想超過三種顏色的顯示實(shí)現(xiàn),就必須引入PWM.PWM是模擬脈寬調(diào)制來控制輸出引腳的實(shí)際輸出電瓶大小,此系統(tǒng)可以控制引腳從0~3.3V變化來顯示不同的顏色.wiringPi適合那些具有C語言基礎(chǔ),在接觸樹莓派之前已經(jīng)接觸過單片機(jī)或者嵌入式開發(fā)的人群。wiringPi的API函數(shù)和arduino非常相似,這也使得它廣受歡迎。作者給出了大量的說明和示例代碼,這些示例代碼也包括UART設(shè)備,I2C設(shè)備和SPI設(shè)備等。4.1。2wiringPi庫安裝和軟件編程首先需要在樹莓派上安裝wiringPi庫,我們選擇直接在網(wǎng)上下載安裝源碼,輸入命令:cd~進(jìn)入根目錄下,輸入命令:gitclonegit://git.drog/wiringPi從網(wǎng)上下載源碼包,輸入命令cdwiringPi進(jìn)入安裝包目錄下,依次輸入命令:configuremakemakeinstall來配置、編譯和安裝,最后輸入命令sudo./build來執(zhí)行編譯之后生成的可執(zhí)行文件,完成安裝。最后輸入命令:gpioreadall會出來引腳圖來確定已經(jīng)安裝成功。接下來就需要運(yùn)用庫的軟件編程來驅(qū)動(dòng)led燈啦,在寫C文件時(shí)首先要加入庫的頭文件:#include<wiringPi。h>和C語言必要的頭文件:#include〈stdio.h>,然后還需要加入實(shí)現(xiàn)軟件PWM的頭文件:#include<softPwm。h〉。接下來我們就需要運(yùn)用庫的API函數(shù)wiringPiSetup()初始化wiringPi,若初始化失敗會返回—1;然后運(yùn)用庫的API函數(shù)softPwmCreate()創(chuàng)建軟件PWM,此函數(shù)有3個(gè)輸入?yún)?shù),分別是控制引腳號,PWM最小值,PWM最大值;運(yùn)用庫的API函數(shù)softPwmWrite()寫PWM的值,此函數(shù)有2個(gè)輸入?yún)?shù),分別是控制那個(gè)引腳號,寫入的PWM的值,此值需要在最小最大值之間。完整代碼如附錄1。4.2服務(wù)器和客戶端4.2.1服務(wù)器設(shè)計(jì)方法為了方便起見,我們把服務(wù)器和客戶端都定義在本地IP上進(jìn)行測試,服務(wù)器端的話,首先我們需要把主函數(shù)傳入的端口號記錄下來,并且利用C語言標(biāo)準(zhǔn)函數(shù)at(yī)oi轉(zhuǎn)換成整型值.接著我們定義兩個(gè)整型數(shù)組來存放兩個(gè)客戶端的套接字,然后我們根據(jù)端口去創(chuàng)建服務(wù)器,創(chuàng)建服務(wù)器需要幾個(gè)函數(shù)來實(shí)現(xiàn),第一個(gè)就是socket()函數(shù)來創(chuàng)建一個(gè)服務(wù)器的套接字,此函數(shù)有3個(gè)輸入?yún)?shù),我們選擇ipv4協(xié)議族,流式Socket,TCP協(xié)議類型。然后根據(jù)端口號和本地IP配置服務(wù)器,之后就是調(diào)用綁定bind(),監(jiān)聽listen()函數(shù)來完成服務(wù)器的創(chuàng)建.之后就是根據(jù)創(chuàng)建的套接字來進(jìn)行循環(huán),如果有客戶端連接,就保存客戶端套接字創(chuàng)建一個(gè)線程去處理,此處我們以兩個(gè)客戶端為例來進(jìn)行操作。若是套接字編號0發(fā)來消息,我們就轉(zhuǎn)發(fā)給套接字編號1,若是超過2個(gè)的客戶端連接進(jìn)來我們直接關(guān)閉創(chuàng)建的線程就行,之后要是有客戶端掉線,就把線程和客戶端一塊銷毀。具體代碼實(shí)現(xiàn)見附錄24。2。2客戶端設(shè)計(jì)方法首先我們封裝三個(gè)函數(shù),分別是連接、讀數(shù)據(jù)、寫數(shù)據(jù),開始就調(diào)用連接函數(shù),在連接函數(shù)里我們創(chuàng)建客戶端并通過輸入的服務(wù)器ip和端口去連接服務(wù)器,然后我們創(chuàng)建兩個(gè)線程分別是讀和寫,在讀函數(shù)里我們不間斷讀鍵盤數(shù)據(jù)并發(fā)送給服務(wù)器,在寫函數(shù)里不間斷的讀服務(wù)器發(fā)來的數(shù)據(jù)并顯示在屏幕上.具體代碼實(shí)現(xiàn)見附錄3。5系統(tǒng)調(diào)試此系統(tǒng)的調(diào)試,我們選擇Linux虛擬機(jī)模擬調(diào)試,首先運(yùn)行服務(wù)器和兩個(gè)客戶端,然后客戶端連接服務(wù)器,之后兩個(gè)客戶端互相收發(fā)數(shù)據(jù).為了方便起見,我在PC機(jī)上運(yùn)行和仿真,首先安裝虛擬機(jī)VMware8。0,然后安裝VMwareTools,虛擬機(jī)的工具是為了共享電腦上的文件,這樣可以在電腦上編寫代碼,在虛擬機(jī)上編譯運(yùn)行。編譯服務(wù)器的代碼,輸入命令gccserver.c—oserver.exe-lpthread,回車之后會生成server.exe可執(zhí)行文件,之后我們運(yùn)行服務(wù)器,輸入命令./server.exe6789,運(yùn)行服務(wù)器,其中6789為輸入的端口號。之后編譯客戶端代碼,輸入命令gccclient。c-oclient。exe—lpthread,回車之后會生成client.exe可執(zhí)行文件,我們事先查看虛擬機(jī)ip,輸入命令ifconfig回車就能看到虛擬機(jī)本機(jī)ip,為我們客戶端連接服務(wù)器所用。之后我們運(yùn)行客戶端一,輸入命令。/client.exe192.168。20。1096789,回車,然后用同樣的命令運(yùn)行客戶端二,之后我們在一個(gè)客戶端輸入信息回車,在另一個(gè)客戶端就能接收到,具體運(yùn)行結(jié)果如圖5.1,5。2,5.3。圖5。1圖5.2圖5.3設(shè)計(jì)心得此次開發(fā)性試驗(yàn)設(shè)計(jì)讓我收獲甚多.一是要有一個(gè)積極的心態(tài),獨(dú)立解決問題的意識,培養(yǎng)扎實(shí)基礎(chǔ)的認(rèn)識。不要什么東西都感覺跟簡單(很多東西可能是看似簡單)就不去做了或者不屑一做,以至于性網(wǎng)上搜搜就可以了,這樣很不好。有自己的東西有自己的付出才會有程序運(yùn)行成功時(shí)的喜悅和小自豪,這樣也有助于培養(yǎng)自己的興趣.要時(shí)刻牢記態(tài)度決定一切。其次是興趣,感覺學(xué)習(xí)工作中興趣很關(guān)鍵,只是一個(gè)引發(fā)人積極性的問題,有了興趣就自覺了,效率自然就高了。再次要敢于嘗試和挑戰(zhàn)。不要安于現(xiàn)成的程序,而且不要害怕失敗,在程序調(diào)試的過程中這點(diǎn)尤為重要,“發(fā)現(xiàn)出問題然后解決問題”是一個(gè)積累經(jīng)驗(yàn)的過程,而且很高效。最后要不懈追求。對于源代碼進(jìn)行不斷的完善,要盡可能的實(shí)現(xiàn)課題所要求的功能.對于初學(xué)者或者開發(fā)較少的人來說,大量大寫程序還是有必要的,但同時(shí)要注意思考,理解其實(shí)現(xiàn)的內(nèi)在意義。還可以自己添加一些有意義的功能來實(shí)現(xiàn)。當(dāng)看到自己編寫的程序正常運(yùn)行時(shí),興趣也會隨之而來,樂此不疲,形成一個(gè)良性循環(huán).
短短一周的開放性ARM多線程設(shè)計(jì)很快結(jié)束了,我發(fā)現(xiàn)我對嵌入式這個(gè)方向、對嵌入式技術(shù)、對Linux都有了新的認(rèn)識。通過這次的編程,我了解到,要真真正正的掌握計(jì)算機(jī)程序還不是一件簡單容易的事兒,但真正掌握后,它帶給我們的將是無窮的便捷與科技,我喜歡高端便捷的生活。我希望我能做計(jì)算機(jī)這個(gè)萬能機(jī)器人的主人而不是奴隸,我會努力加油的!參考文獻(xiàn)[1]徐千洋.Linux
C函數(shù)庫參考手冊.[M]中國青年出版社.2002
[2]馬忠梅,馬廣云,徐英慧,田譯.ARM嵌入式處理結(jié)構(gòu)與應(yīng)用基礎(chǔ)[M].北京航空航天大學(xué)出版社。2002
[3]鄒思鐵。嵌入式Linux設(shè)計(jì)與應(yīng)用[M].北京清華大學(xué)出版社。2002
[4]杜春雷。ARM體系結(jié)構(gòu)與編程[M].清華大學(xué)出版社。2003
[5]田澤。嵌入式系統(tǒng)開發(fā)與應(yīng)用[M]。北京航空航天大學(xué)出版社。2005
[11]陳鑫。嵌入式軟件技術(shù)的現(xiàn)狀與發(fā)展動(dòng)向[M].軟件世界。2001
[6]田澤。嵌入式系統(tǒng)開發(fā)與應(yīng)用實(shí)驗(yàn)教程[M].北京航空航天大學(xué)出版社.2004
[7]Alessandro
Rubini,Jonat(yī)han
Corbet.Linux設(shè)備驅(qū)動(dòng)程序[M].中國電力出版社.2002附錄1(LED驅(qū)動(dòng)程序)#include<wiringPi.h>#include〈softPwm.h>#include〈stdio.h>#defineucharunsignedchar#defineLedPinRed27#defineLedPinGreen28#defineLedPinBlue29voidledInit(void){softPwmCreat(yī)e(LedPinRed,0,100);softPwmCreat(yī)e(LedPinGreen,0,100);softPwmCreate(LedPinBlue,0,100);}voidledColorSet(ucharr_val,ucharg_val,ucharb_val){softPwmWrite(LedPinRed,r_val);softPwmWrite(LedPinGreen,g_val);softPwmWrite(LedPinBlue,b_val);}intmain(void){inti;if(wiringPiSetup()==—1){printf("setupwiringPifailed?。ⅲ籸eturn1;}ledInit();while(1){ledColorSet(0xff,0x00,0x00);//reddelay(500);ledColorSet(0x00,0xff,0x00);//greendelay(500);ledColorSet(0x00,0x00,0xff);//bluedelay(500);}return0;}附錄2(服務(wù)器程序)#include<stdio.h>#include<stdlib.h〉#include<string.h>#include<signal.h>#include〈unistd.h>#include<error。h>#include<errno。h>#include〈fcntl.h〉#include<sys/types。h>#include<sys/socket。h>#include<sys/epoll.h>#include<netinet/in.h〉#include〈arpa/inet。h>#include<pthread。h>#defineBUFSIZE1024intsocket_client[2];intsocket_creat(yī)e(intport){intst=socket(AF_INET,SOCK_STREAM,0);inton=1;if(setsockopt(st,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on))==—1){printf("setsockoptisfailed%s\n",strerror(errno));return0;}structsockaddr_inaddr;memset(&addr,0,sizeof(addr));addr.sin_family=AF_INET;addr。sin_port=htons(port);addr。sin_addr。s_addr=htonl(INADDR_ANY);if(bind(st,(structsockaddr*)&addr,sizeof(addr))==-1){printf("zhang.pt:bindisfailed%s\n",strerror(errno));return0;}if(listen(st,300)==-1){printf(”zhang。pt:listenisfailed%s\n",strerror(errno));return0;}returnst;}voiddeliver(intindex,constchar*buf,ssize_tlen){ssize_trc=0;if(index==0){if(socket_client[1]==0){printf("%d:usernotonline\n",index);}else{rc=send(socket_client[1],buf,len,0);printf(”send:%s,send:%ubytes\n",buf,rc);if(rc<=0){if(rc==0)printf("zhang.pt:sendfailed,disconnection,\n");elseprintf("zhang.pt:sendfailed,%s\n",strerror(errno));}}}if(index==1){if(socket_client[0]==0){printf("%d:usernotonline\n”,index);}else{rc=send(socket_client[0],buf,len,0);printf("send:%s,send:%ubytes\n",buf,rc);if(rc〈=0){if(rc==0)printf("zhang.pt:sendfailed,disconnection,\n”);elseprintf(”zhang.pt:sendfailed,%s\n",strerror(errno));}}}}voidsocket_work(intindex){charbuf[BUFSIZE];ssize_trc=0;while(1){memset(buf,0,sizeof(buf));rc=recv(socket_client[index],buf,sizeof(buf),0);if(rc<=0){if(rc==0)printf(”%d:recvdisconnection\n",index);elseprintf(”%d:recvfailed,%s\n”,index,strerror(errno));close(socket_client[index]);socket_client[index]=0;break;}else{printf(”%d:recv:%s,recv:%ubytes\n",index,buf,rc);deliver(index,buf,rc);}}}void*socket_handle(void*arg){intclient_st=*(int*)arg;free((int*)arg);printf("zhang.pt:handle_threadisbegin\n");intindex=0;if(socket_client[0]==0){socket_client[0]=client_st;}else{if(socket_client[1]==0){socket_client[1]=client_st;index=1;}else{close(client_st);returnNULL;}}socket_work(index);printf("zhang。pt:handle_threadisend\n");returnNULL;}voidsockaddr_toa(conststructsockaddr_in*addr,char*IPAddr){unsignedchar*p=(unsignedchar*)&(addr—>sin_addr.s_addr);sprintf(IPAddr,"%u。%u。%u.%u",p[0],p[1],p[2],p[3]);}voidsocket_accept(intst){pthread_tthr_d;pthread_attr_tattr;pthread_attr_init(&at(yī)tr);pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);structsockaddr_inclient_addr;socklen_tlen=sizeof(client_addr);while(1){memset(&client_addr,0,sizeof(client_addr));intclient_st=accept(st,(void*)&client_addr,&len);if(client_st==-1){printf("zhang.pt:acceptfailed%s\n",strerror(errno));break;}else{charsIP[32];memset(sIP,0,sizeof(sIP));sockaddr_toa(&client_addr,sIP);printf(”zhang.pt:acceptby%s\n",sIP);int*tmp=malloc(sizeof(int));*tmp=client_st;pthread_create(&thr_d,&attr,socket_handle,tmp);}}pthread_attr_destroy(&attr);}intmain(intarg,char*args[]){if(arg〈2){printf("zhang.pt:serverporterror!\n”);return0;}intiport=atoi(args[1]);if(iport==0){printf(”zhang。pt:port%disinvalid?。埽睢保琲port);return0;}printf("zhang。pt:serverisbegin*v*!\n");memset(socket_client,0,sizeof(socket_client));intst=socket_creat(yī)e(iport);if(st==0)return0;socket_accept(st);close(st);printf("zhang.pt:serverisend\n");return0;}附錄3(客戶端程序代碼)#include<stdio。h>#include<stdlib。h〉#include〈string。h〉#include<errno.h>#include〈unistd。h〉#include〈arpa/inet.h〉#include<sys/types.h>#include〈sys/socket.h>#include〈pthread.h>#defineBUFSIZE1024void*socket_read(void*arg){intst=*(int*)arg;charbuf[BUFSIZE];while(1){memset(buf,0,sizeof(buf));ssize_trc=recv(st,buf,sizeof(buf),0);if(rc〈=0){printf("zhang。pt:recvfailed,%s\n”,strerror(errno));break;}else{printf(”zhang.pt:recv:%s,recv:%ubyte\n”,buf,rc);}}returnNULL;}void*socket_write(void*arg){intst=*(int*)arg;charbuf[BUFSIZE];while(1){memset(buf,0,sizeof(buf));read(STDIN_FILENO,buf,sizeof(buf));intilen=strlen(buf);if(buf[ilen-1]=='\n'){buf[ilen-1]=0;}ssize_trc=send(st,buf,sizeof(buf),0);printf(”zhang.pt:send:%s,send:%ubyte\n”,buf,rc);if(rc〈=0){printf("zhang.pt:sendfailed,%s\n",strerror(errno));}}returnNULL;}intsocket_connect(constchar*hostname,intiport){intst=socket(AF_INET,SOCK_STREAM,0);structsockaddr_inaddr;memset(&addr,0,sizeof(addr));addr.sin_family=AF_INET;addr。sin_port=htons(iport);addr。sin_addr.s_addr=inet_addr(hostname);if(connect(st,(structsockaddr*)&addr,sizeof(addr))==-1){printf(”zhang。pt:connectfailed%s\n",strerror(errno));}else{printf("zhang。pt:connectsuccess\n”);}returnst;}intmain(intarg,char*args[]){if(arg〈3){printf("zhang.pt:serverip&porterror!\n”);return0;}intiport=at(yī)oi(args[2]);if(iport==0){printf("zhang。pt:port%disinvalid\n”,iport);return0;}printf("zhang。pt:clientisbegin\n");intst=socket_connect(args[1],iport);if(st==0)return0;pthread_tthr_read,thr_write;pthread_create(&thr_read,NULL,socket_read,&st);pthread_create(&thr_write,NULL,socket_write,&st);pthread_join(thr_read,NULL);close(st);printf(”zhang.pt:clientisend\n");return0;}基于AT89s52的多功能數(shù)字鐘引言單片機(jī)(Single—ChipMicrocomputer),是集CPU,RAM,ROM,定時(shí),計(jì)數(shù)和多種接口于一體的微控制器。它體積小,成本低,功能強(qiáng),廣泛應(yīng)用于工業(yè)自動(dòng)化上和智能產(chǎn)品。時(shí)鐘,自從它被發(fā)明的那天起,就成為了人類的好朋友,但隨著時(shí)間的推移,科學(xué)技術(shù)的不斷發(fā)展,時(shí)鐘的應(yīng)用越來越廣范,人們對時(shí)間計(jì)量的精度要求也越來越高。怎樣讓時(shí)鐘更好的為人民服務(wù),怎樣讓我們的老朋友再次煥發(fā)青春呢?這就要求我們不斷設(shè)計(jì)出新型的時(shí)鐘,來不斷滿足人們的日常生活需要。然而市場上的時(shí)鐘便宜的比較笨重,簡單實(shí)用的又比較昂貴。那么,有沒有一款既簡單實(shí)用價(jià)格又便宜的時(shí)鐘呢?我們設(shè)計(jì)小組設(shè)想:可不可以利用單片機(jī)功能集成化高,價(jià)格又便宜的特點(diǎn)設(shè)計(jì)一款結(jié)構(gòu)既簡單,價(jià)格又便宜,功能又強(qiáng)大的單片機(jī)電子時(shí)鐘呢?基于這種情況,我們課程設(shè)計(jì)小組成員多方查閱資料,反復(fù)論證設(shè)計(jì)出了這款集時(shí)鐘顯示、鬧鈴提醒和秒表功能于一體的單片機(jī)數(shù)字時(shí)鐘?!菊勘驹O(shè)計(jì)由數(shù)碼管顯示模塊、單片機(jī)處理模塊、鬧鈴提醒模塊、按鍵控制模塊和電源模塊等組成。通過單片機(jī)軟件運(yùn)算方式進(jìn)行時(shí)鐘計(jì)時(shí),外部獲得的按鍵信息進(jìn)行模式切換和控制,輸出到信號數(shù)碼管顯示模塊,從而控制數(shù)碼管顯示內(nèi)容,實(shí)現(xiàn)時(shí)鐘顯示、鬧鈴提醒和秒表等功能。【關(guān)鍵詞】數(shù)字鐘;AT89s52;PNP9012;數(shù)碼管【Abstract】Thedesignconsistsofthedigitaldisplaymodule,MCUprocessingmodule,alarmremindingmodule,keycontrolmoduleandpowermoduleandothercomponents.ThroughthewayMCU’ssoftwareoperationtotime,externalinformationonaccesstokeydat(yī)aprocessingtomodechangingandcontrol,outputsignaltodigitaldisplaymoduletocontrolthedigitaldisplaycontent,andthen,realizingtheclockdisplayandalarmremindingandstopwatch,andotherfunctions.【Keywords】Dgitalclock;AT89s52;PNP9012;nixietube目錄TOC\o”1—3”\h\z\uHYPERLINK\l_Toc30296目錄PAGEREF_Toc302963一、課程選題及設(shè)計(jì)目的PAGEREF_Toc1706341。1課程選題及相關(guān)設(shè)計(jì)要求PAGEREF_Toc102804HYPERLINK\l_Toc312461.1.1課程題目PAGEREF_Toc312464HYPERLINK\l_Toc61571.1.2設(shè)計(jì)要求PAGEREF_Toc61574HYPERLINK\l_Toc292261.1.3本設(shè)計(jì)功能完成情況PAGEREF_Toc2922641.2課程設(shè)計(jì)目的PAGEREF_Toc148395HYPERLINK\l_Toc186481。3課程設(shè)計(jì)所用軟件PAGEREF_Toc186485HYPERLINK\l_Toc28490二、硬件設(shè)計(jì)與實(shí)現(xiàn)PAGEREF_Toc2849062.1課題分析PAGEREF_Toc125156HYPERLINK\l_Toc7002.1.1元件選擇PAGEREF_Toc7006HYPERLINK\l_Toc268692.1。2工作原理PAGEREF_Toc268697HYPERLINK\l_Toc10072。1.3系統(tǒng)的硬件構(gòu)成及功能PAGEREF_Toc100782.2由原理設(shè)計(jì)實(shí)際電路PAGEREF_Toc2643210HYPERLINK\l_Toc23022.2.1搶答器實(shí)際電路圖PAGEREF_Toc230210HYPERLINK\l_Toc182722.2。2PCB圖設(shè)計(jì)PAGEREF_Toc1827211HYPERLINK\l_Toc198023。1軟件功能需求PAGEREF_Toc1980212HYPERLINK\l_Toc133683.2系統(tǒng)主程序設(shè)計(jì)PAGEREF_Toc13368124.1仿真電路設(shè)計(jì)PAGEREF_Toc836319HYPERLINK\l_Toc55994。2功能仿真結(jié)果PAGEREF_Toc559919HYPERLINK\l_Toc280434.2.1時(shí)間顯示PAGEREF_Toc2804319HYPERLINK\l_Toc194204.2。2鬧鈴設(shè)定PAGEREF_Toc19420204。2。3時(shí)間設(shè)定PAGEREF_Toc802820HYPERLINK\l_Toc159264.2.4秒表使用PAGEREF_Toc1592620附錄課程選題及設(shè)計(jì)目的1課程選題及相關(guān)設(shè)計(jì)要求1。1.1課程題目基于AT89s52的多功能數(shù)字鐘1.1.2設(shè)計(jì)要求1.顯示時(shí)間:用數(shù)碼管顯示時(shí):分,時(shí)間可用硬件調(diào)整。2.定時(shí)功能,可硬件調(diào)整(時(shí)分)定時(shí),定時(shí)到驅(qū)動(dòng)蜂鳴器(或LED)提示.3。計(jì)時(shí)功能:精確到0.1秒,結(jié)果在數(shù)碼管顯示.4。設(shè)計(jì)出相應(yīng)電路并用protel出圖。5.給出完整的匯編語言(或C語言)源程序。1.1。3本設(shè)計(jì)功能完成情況1.顯示時(shí)間:完整實(shí)現(xiàn)并自由發(fā)揮。用數(shù)碼管顯示,按照時(shí)—分-秒的格式顯示,時(shí)間可用硬件調(diào)整,比照設(shè)計(jì)要求增加了秒顯示功能。2。定時(shí)功能,完整實(shí)現(xiàn)??捎布{(diào)整(時(shí)分)定時(shí),定時(shí)到驅(qū)動(dòng)蜂鳴器(或LED)提示,本設(shè)計(jì)采用了LED提示(亮1min)。3.計(jì)時(shí)功能:完整實(shí)現(xiàn)并自由發(fā)揮。精確到0.01秒,結(jié)果在數(shù)碼管顯示,比照設(shè)計(jì)要求秒表精度提高了10倍。4。設(shè)計(jì)出相應(yīng)電路并用protel出圖,完整實(shí)現(xiàn).。5.給出完整的匯編語言(或C語言)源程序,完整實(shí)現(xiàn)。6.仿真,此步驟為自行添加,用于驗(yàn)證了設(shè)計(jì)的可行性。1。2課程設(shè)計(jì)目的(1)學(xué)習(xí)使用protel設(shè)計(jì)電子線路原理圖和PCB圖的方法。(2)學(xué)習(xí)使用protues仿真并調(diào)試電路及程序的方法。(3)學(xué)習(xí)使用以AT89s52為核心設(shè)計(jì)外圍電路及實(shí)現(xiàn)預(yù)期功能的思想和方法.(4)學(xué)習(xí)查找電路所用元件封裝方式的查找和自行制作的方法.(5)學(xué)習(xí)使用KeilC設(shè)計(jì)相應(yīng)程序?qū)崿F(xiàn)硬件控制和功能的方法。1.3課程設(shè)計(jì)所用軟件軟件工具:AltiumDesignerSummer09、Protel99用于設(shè)計(jì)電路原理圖和PCB圖。KeiluVision4用于軟件的編寫、編譯以及hex文件的生成.Protues7。5用于軟件的仿真。硬件設(shè)計(jì)與實(shí)現(xiàn)2。1課題分析2.1。1元件選擇本設(shè)計(jì)使用到的元器件包括:AT89s52芯片、數(shù)碼管、PNP9012、電容、電阻、晶振、按鍵開關(guān)、。AT89s52芯片是系統(tǒng)的核心,它主要負(fù)責(zé)控制各個(gè)部分的協(xié)調(diào)工作。選擇該芯片的原因主要有以下幾點(diǎn):(1)該芯片在以前的電子設(shè)計(jì)中使用過一次,手頭恰好有,便于節(jié)省課程設(shè)計(jì)資金。(2)內(nèi)部資源豐富,功能強(qiáng)大,片上Flash允許程序存儲器在系統(tǒng)可編程,亦適于常規(guī)編程器.(3)能工作在3.5~5。5V,其工作電壓范圍寬泛,便于使用.在AT89s52芯片外圍接上復(fù)位電路,外部時(shí)序電路、上拉電阻,數(shù)碼管,按鈕等外部設(shè)備,通過數(shù)碼管、PNP9012搭配實(shí)現(xiàn)功能的顯示。P3。3為蜂鳴器(用LED代替)輸出口,P0為數(shù)碼管段選顯示輸出,P2為數(shù)碼管位選顯示輸出,P3.0—P3。2為按鍵控制接口.原件列表:AT89s521片四位共陽極數(shù)碼管2片PNP9012三極管8個(gè)22μF電容1個(gè)30pF電容2個(gè)1K?電阻12個(gè)4.7K?電阻8個(gè)12M晶振1個(gè)導(dǎo)線、焊錫若干2.1。2工作原理基于上述設(shè)計(jì)要求,根據(jù)功能要求,設(shè)計(jì)中除了必要的單片機(jī)復(fù)位和時(shí)序電路外,還需要有鬧鈴提醒電路、顯示電路、按鍵控制電路等部分。各個(gè)電路都有其自己的功能。電路進(jìn)入就緒狀態(tài)后,開始計(jì)時(shí).然后由按鍵控制進(jìn)行模式切換和控制狀態(tài)。在電路中P3。0-P3。2為按鍵控制部分的3個(gè)按鍵,P3.0對應(yīng)模式切換功能,P3。1在時(shí)鐘顯示和鬧鈴模式下起到加1功能,P3。2在時(shí)鐘顯示和鬧鈴模式下起到減1功能,在秒表模式下起到控制秒表開始和暫停的功能。P3.3為鬧鈴輸出口,鬧鈴時(shí)間到,則該輸出口置高,保持1min,使LED保持高亮達(dá)到鬧鈴提醒功能。P0為數(shù)碼管段選顯示輸出,同個(gè)8個(gè)口電平高低不同,控制單個(gè)數(shù)碼管的顯示,;P2為數(shù)碼管位選顯示輸出,通過8個(gè)口的輸出電平高低不同,控制相連的PNP9012的導(dǎo)通狀態(tài),從而控制共陽數(shù)碼管的顯示.AT89s52的針腳定義如下:2.1.3系統(tǒng)的硬件構(gòu)成及功能(1)搶答器的電路框圖P3.0-3.2P0口P3.0-3.2P0口單片機(jī)P2口數(shù)碼管顯示模塊外圍驅(qū)動(dòng)電路電源模塊按鍵控制模塊鬧鈴提醒模塊復(fù)位電路及時(shí)序電路搶答器電路功能框圖2.2由原理設(shè)計(jì)實(shí)際電路2.2。1搶答器實(shí)際電路圖搶答器工作電路原理圖2.2.2PCB圖設(shè)計(jì)(注明:因?yàn)闇贤ǖ脑?,?shí)際作出的PCB圖未按照此圖制作,而是制作了第一版設(shè)計(jì)的一個(gè)PCB,其中有錯(cuò)誤,故在實(shí)際應(yīng)用時(shí),自行焊接了設(shè)計(jì)電路.)三、電子線路軟件設(shè)計(jì)與實(shí)現(xiàn)3.1軟件功能需求為了能夠計(jì)時(shí)準(zhǔn)確,顯示無閃爍,按鍵響應(yīng)及時(shí)無抖動(dòng)等功能需求,根據(jù)設(shè)計(jì)要求,可以得出相應(yīng)的軟件功能可分為以下部分:(1)初始化部分(2)顯示部分(3)鍵盤掃描判斷部分(4)數(shù)碼管驅(qū)動(dòng)部分(5)主程序(6)定時(shí)器計(jì)時(shí)設(shè)計(jì)3.2系統(tǒng)主程序設(shè)計(jì)基于以上軟件需求,以及ATMega16L指令集特點(diǎn),編寫了如附錄程序來實(shí)現(xiàn)逾期功能。初始化部分.#include<reg52。h>sbitKEY1=P3^0;sbitKEY2=P3^1;sbitKEY3=P3^2;sbitled=P3^3;codeunsignedchartab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陰數(shù)碼管0-9unsignedcharStrTab[8];//定義緩沖區(qū)Unsignedcharminute=30,hour=12,second,msecond,miao,key1flag=0,key2flag=0;//定義并且初始化值12:30:00unsignedcharkeytemp1=0,keytemp2=0,clockhor=0,clockmin=0,clocksec=0,clockflag,keycount,keyflag1,t;顯示部分。voidDisplaypro(void){StrTab[0]=tab[hour/10];//顯示正常時(shí)間StrTab[1]=tab[hour%10];StrTab[2]=0xbf;StrTab[3]=tab[minute/10];StrTab[4]=tab[minute%10];StrTab[5]=0xbf;StrTab[6]=tab[second/10];StrTab[7]=tab[second%10];}voiddisplaymiao(){StrTab[6]=tab[msecond/10];//顯示秒表時(shí)間StrTab[7]=tab[msecond%10];StrTab[2]=0xbf;StrTab[3]=tab[miao/10];StrTab[4]=tab[miao%10];StrTab[5]=0xbf;StrTab[0]=tab[0];StrTab[1]=tab[0];}voidtiming(void){StrTab[0]=tab[hour/10];//顯示正常時(shí)間StrTab[1]=tab[hour%10];StrTab[2]=0xff;StrTab[3]=tab[minute/10];StrTab[4]=tab[minute%10];StrTab[5]=0xff;StrTab[6]=tab[second/10];StrTab[7]=tab[second%10];}voidclock(void){StrTab[0]=tab[clockhor/10];//顯示鬧鈴時(shí)間StrTab[1]=tab[clockhor%10];StrTab[2]=0x7f;StrTab[3]=tab[clockmin/10];StrTab[4]=tab[clockmin%10];StrTab[5]=0x7f;StrTab[6]=tab[clocksec/10];StrTab[7]=tab[clocksec%10];}voidzero(void){StrTab[0]=tab[0];//顯示零時(shí)間StrTab[1]=tab[0];StrTab[2]=0xbf;StrTab[3]=tab[0];StrTab[4]=tab[0];StrTab[5]=0xbf;StrTab[6]=tab[0];StrTab[7]=tab[0];}鍵盤掃描判斷部分.voidkeyjudge()//模式切換鍵掃描{keyflag1=0;delay(1000);if(keyflag1=1){if(key1flag〈=4){key1flag++;}if(key1flag>=4){key1flag=0;}}keyflag1=0;}數(shù)碼管驅(qū)動(dòng)部分。voidtime1_isr(void)interrupt3using0//定時(shí)器1用來動(dòng)態(tài)掃描{stat(yī)icunsignedcharnum;TH1=0xf8;//重入初值TL1=0xf0;switch(num){case0:P2=0xfe;P0=StrTab[num];break;//分別調(diào)用緩沖區(qū)的值進(jìn)行掃描case1:P2=0xfd;P0=StrTab[num];break;case2:P2=0xfb;P0=StrTab[num];break;case3:P2=0xf7;P0=StrTab[num];break;case4:P2=0xef;P0=StrTab[num];break;case5:P2=0xdf;P0=StrTab[num];break;case6:P2=0xbf;P0=StrTab[num];break;case7:P2=0x7f;P0=StrTab[num];break;default:break;}num++;//掃描8次,使用8個(gè)數(shù)碼管if(num==8)num=0;}延時(shí)程序。voiddelay(unsignedintcnt)//延時(shí)函數(shù){while(--cnt);}主程序。main()//主函數(shù){TMOD|=0x01;//定時(shí)器0用于計(jì)時(shí)TH0=0xd8;TL0=0xf0;ET0=1;TR0=1;TMOD|=0x10;//定時(shí)器1用于動(dòng)態(tài)掃描TH1=0xF8;TL1=0xf0;ET1=1;TR1=1;EA=1;EX0=1;IT0=1;t=0;Displaypro();while(1)//主循環(huán){while((key1flag==0)){Displaypro();}while((key1flag==1)){zero();if(!KEY3)//按鍵去抖以及動(dòng)作{delay(10000);if(!KEY3){msecond=0;miao=0;}while((key1flag==1)){displaymiao();}}}while((key1flag==2)){timing();if(key2flag==0){if(!KEY3)//按鍵去抖以及動(dòng)作{delay(10000);if(!KEY3){minute++;if(minute==59)minute=0;//分加1timing();}}}if(key2flag==1){if(!KEY3)//按鍵去抖以及動(dòng)作{delay(10000);if(!KEY3){hour++;if(hour==24)hour=0;//分減1timing();}}}timing();}while((key1flag==3)){clock();if(key2flag==0){if(!KEY3)//按鍵去抖以及動(dòng)作{delay(10000);if(!KEY3){clockmin++;if(clockmin==59)clockmin=0;//分加1clock();}}}if(key2flag==1){if(!KEY3)//按鍵去抖以及動(dòng)作{delay(10000);if(!KEY3){clockhor++;if(clockhor==24)clockhor=0;//分減1clock();}}}clock();}}}////////////////////////////////////////////////////////////////voidinter()interrupt0{if(key1flag==1){if(t==0){t=1;}elset=0;}}鬧鈴響應(yīng)設(shè)計(jì)if((hour==clockhor)&&(minute==clockmin)){clockflag=1;}else{clockflag=0;}if(clockflag==1){led=1;}else{led=0;}秒表設(shè)計(jì)voidtim(void)interrupt1using1{staticunsignedintcount;//定義內(nèi)部靜態(tài)變量TH0=0xf8;//重新賦值TL0=0x30;count++;keycount++;if(!KEY1){keyflag1=1;keyjudge();}if(!KEY2){if(key2flag〈=2){key2flag++;}if(key2flag>=2){key2flag=0;}}if((count%5)==0){if(t==1)msecond++;if(msecond==100){msecond=0;miao++;//秒加1if(miao==100)miao=0;}}(9)走時(shí)設(shè)計(jì)if(count==500){count=0;second++;//秒加1if(second==60){second=0;minute++;//分加1if(minute==60){minute=0;hour++;//時(shí)加1if(hour==24)hour=0;}}}}四、系統(tǒng)功能仿真4.1仿真電路設(shè)計(jì)因?yàn)槭褂肞rotues7.5進(jìn)行電路仿真時(shí),默認(rèn)單片機(jī)正常工作同時(shí)電路驅(qū)動(dòng)能力無限大,因此可以省略掉復(fù)位和時(shí)序電路以及三極管驅(qū)動(dòng)部分,仿真電路圖設(shè)計(jì)如下:4。2功能仿真結(jié)果4。2.1時(shí)間顯示4。2.2鬧鈴設(shè)定4。2.3時(shí)間設(shè)定4。2.4秒表使用附錄:完整程序設(shè)計(jì)#include〈reg52.h〉sbitKEY1=P3^0;sbitKEY2=P3^1;sbitKEY3=P3^2;sbitled=P3^3;codeunsignedchartab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陰數(shù)碼管0-9unsignedcharStrTab[8];//定義緩沖區(qū)unsignedcharminute=30,hour=12,second,msecond,miao,key1flag=0,key2flag=0;//定義并且初始化值12:30:00unsignedcharkeytemp1=0,keytemp2=0,clockhor=0,clockmin=0,clocksec=0,clockflag,keycount,keyflag1,t;voiddelay(unsignedintcnt)//延時(shí)函數(shù){while(-—cnt);}voidDisplaypro(void){StrTab[0]=tab[hour/10];//顯示正常時(shí)間StrTab[1]=tab[hour%10];StrTab[2]=0xbf;StrTab[3]=tab[minute/10];StrTab[4]=tab[minute%10];StrTab[5]=0xbf;StrTab[6]=tab[second/10];StrTab[7]=tab[second%10];}voiddisplaymiao(){StrTab[6]=tab[msecond/10];//顯示秒表時(shí)間StrTab[7]=tab[msecond%10];StrTab[2]=0xbf;StrTab[3]=tab[miao/10];StrTab[4]=tab[miao%10];StrTab[5]=0xbf;StrTab[0]=tab[0];StrTab[1]=tab[0];}voidtiming(void){StrTab[0]=tab[hour/10];//顯示正常時(shí)間StrTab[1]=tab[hour%10];StrTab[2]=0xff;StrTab[3]=tab[minute/10];StrTab[4]=tab[minute%10];StrTab[5]=0xff;StrTab[6]=tab[second/10];StrTab[7]=tab[second%10];}voidclock(void){StrTab[0]=tab[clockhor/10];//顯示鬧鈴時(shí)間StrTab[1]=tab[clockhor%10];StrTab[2]=0x7f;StrTab[3]=tab[clockmin/10];StrTab[4]=tab[clockmin%10];StrTab[5]=0x7f;StrTab[6]=tab[clocksec/10];StrTab[7]=tab[clocksec%10];}voidzero(void){StrTab[0]=tab[0];//顯示零時(shí)間StrTab[1]=tab[0];StrTab[2]=0xbf;StrTab[3]=tab[0];StrTab[4]=tab[0];StrTab[5]=0xbf;StrTab[6]=tab[0];StrTab[7]=tab[0];}voidkeyjudge(){keyflag1=0;delay(1000);if(keyflag1=1){if(key1flag<=4){key1flag++;}if(key1flag〉=4){key1flag=0;}}keyflag1=0;}main()//主函數(shù){TMOD|=0x01;//定時(shí)器0用于計(jì)時(shí)TH0=0xd8;TL0=0xf0;ET0=1;TR0=1;TMOD|=0x10;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《材料加工創(chuàng)新》教學(xué)大綱
- 《電池質(zhì)量管理B》教學(xué)大綱
- 五下語文園地七課件
- 教師的安全認(rèn)識教學(xué)課件教學(xué)課件教學(xué)
- 玉溪師范學(xué)院《小學(xué)科學(xué)課程與教學(xué)》2022-2023學(xué)年第一學(xué)期期末試卷
- 100句經(jīng)典勵(lì)志詩詞名句
- 文書模板-工作經(jīng)歷證明
- 國貿(mào)實(shí)務(wù)教案
- 幕墻工程質(zhì)量通病及其防治措施
- 2024年社會福利收養(yǎng)服務(wù)項(xiàng)目成效分析報(bào)告
- 橋梁結(jié)構(gòu)健康監(jiān)測系統(tǒng)實(shí)施和驗(yàn)收規(guī)范
- 眼視光技術(shù)職業(yè)規(guī)劃
- 2024安徽交控集團(tuán)所屬企業(yè)校園招聘筆試參考題庫附帶答案詳解
- 高級綜合英語智慧樹知到期末考試答案2024年
- 退休項(xiàng)目經(jīng)理返聘合同-工程管理
- 銀行柜員外包的可行性方案
- 電磁輻射EMF健康影響和測量技術(shù)及方法綜述樣本
- 種子投資計(jì)劃書
- 春季煙花爆竹的儲存和運(yùn)輸安全要求課件
- 第四章《中國的經(jīng)濟(jì)發(fā)展》-人教版八年級上學(xué)期地理期末考點(diǎn)復(fù)習(xí)
- 境外腐敗治理專項(xiàng)工作總結(jié)
評論
0/150
提交評論