久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 21737|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)32位心形流水燈課程設(shè)計報告與源碼(word格式 可編輯)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:313389 發(fā)表于 2018-4-21 21:41 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
  


課程設(shè)計說明書


         課程名稱:       《單片機(jī)技術(shù)》     

         設(shè)計題目:       心形流水燈設(shè)計

         學(xué)    院:   電子信息與電氣工程學(xué)院

         學(xué)生姓名:

         學(xué)    號:

         專業(yè)班級:

         指導(dǎo)教師:   

課程設(shè)計任務(wù)書

設(shè)計題目
心形流水燈設(shè)計
學(xué)生姓名

所在學(xué)院
電子信息與電氣工程學(xué)院
專業(yè)、年級、班

設(shè)計要求:

  • 設(shè)計一個用單片機(jī)控制的的心形流水燈系統(tǒng);
  • LED燈數(shù)量為32個;
  • 可以實(shí)現(xiàn)循環(huán)點(diǎn)亮、依次熄滅的基本功能;
  • 可以實(shí)現(xiàn)對角閃亮、間隔閃亮、順時針閃亮、逆時針閃亮等多種功能。

學(xué)生應(yīng)完成的任務(wù):

完成心形流水燈電路設(shè)計,利用Keil軟件編寫程序,Proteus軟件進(jìn)行電路功能仿真,利用Altium Designer軟件繪制電路原理圖,設(shè)計制作電路的PCB板,對電路進(jìn)行安裝、調(diào)試,并提交課程設(shè)計報告。


工作計劃:

4月20日—4月22日,擬定系統(tǒng)硬件方案;4月23—4月24日,完成系統(tǒng)軟件設(shè)計;4月25日—4月26日,編寫程序;4月27日—4月28日,燒錄程序并制作系統(tǒng)硬件電路;4月29日—4月30日,書寫課程設(shè)計報告并提交。

任務(wù)下達(dá)日期:        2015年4月20日
任務(wù)完成日期:        2015年4月30日

                               指導(dǎo)教師(簽名):           學(xué)生(簽名):

心形流水燈設(shè)計

摘  要:設(shè)計了一個心形流水燈電路,該電路可以實(shí)現(xiàn)32個LED燈循環(huán)閃亮、依次熄滅、對角閃亮、對角熄滅、間隔閃亮、間隔熄滅等多種功能。該電路主要由單片機(jī)芯片STC89C52、電源電路、時鐘電路、復(fù)位電路和顯示電路組成。利用Keil軟件編寫C語言程序,并生成目標(biāo)代碼Hex文件。使用Proteus軟件設(shè)計仿真電路,并調(diào)入已編譯好的目標(biāo)代碼,即可在仿真圖中看到模擬實(shí)物的運(yùn)行狀態(tài)和過程。使用Altium Designer軟件對電路進(jìn)行原理圖設(shè)計和PCB設(shè)計,并對該電路行安裝和調(diào)試,調(diào)試結(jié)果可以實(shí)現(xiàn)流水燈的多種亮滅循環(huán)的功能。本人主要負(fù)責(zé)程序設(shè)計。











目錄

1. 設(shè)計背景

1.1 流水燈在生活中的應(yīng)用

1.2 單片機(jī)在生產(chǎn)及生活中的應(yīng)用

2. 設(shè)計方案              1

2.1 方案對比

2.2  STC89C52芯片功能

2.3 方案論證              4

3. 方案實(shí)施

3.1 電路原理圖設(shè)計

3.2 程序設(shè)計

3.3 電路功能仿真              10

3.4 電路PCB設(shè)計

3.5 安裝與調(diào)試

4. 結(jié)果與結(jié)論

5. 收獲與致謝

6. 參考文獻(xiàn)

7. 附件

7.1 元器件清單

7.2 電路仿真圖

7.3 電路原理圖

7.4 PCB布線圖

7.5 實(shí)物圖

7.6 程序代碼                        


1.設(shè)計背景

1.1 流水燈在生活中的應(yīng)用

隨著現(xiàn)代科學(xué)技術(shù)的持續(xù)進(jìn)步和發(fā)展以及人們生活水平的不斷提高,以大規(guī)模、超大規(guī)模集成電路為首的電子工藝技術(shù)的使用也越來越廣泛,結(jié)合單片機(jī)技術(shù)設(shè)計的電子電路也層出不窮。 LED彩燈由于其豐富的燈光色彩、低廉的造價以及控制簡單等特點(diǎn)而得到了廣泛的應(yīng)用,用彩燈來裝飾街道和城市建筑物已經(jīng)成為一種時尚。利用控制電路可使彩燈按一定的規(guī)律不斷的改變狀態(tài),不僅可以獲得良好的觀賞效果,而且可以省電。

    彩燈的運(yùn)用已經(jīng)遍布于人們的生活中,從歌舞廳到卡拉OK包房,從節(jié)日的祝賀到日常生活中的點(diǎn)綴,這些不僅說明了我們對生活的要求有了質(zhì)的飛躍,也說明科技在現(xiàn)實(shí)生活中的運(yùn)用有了較大的發(fā)展。在這一設(shè)計中我們將運(yùn)用單片機(jī)技術(shù),與單片機(jī)芯片STC89C52的功能,對心形流水燈系統(tǒng)進(jìn)行設(shè)計,來實(shí)現(xiàn)流水燈的多種亮與滅的循環(huán),給人帶來美感。

1.2單片機(jī)在生產(chǎn)及生活中的應(yīng)用

單片微計算機(jī)自20世紀(jì)70年代問世以來,已對人類生活產(chǎn)生了巨大的影響。尤其是美國Intel公司生產(chǎn)的MCS-51系列單片機(jī),由于其具有集成度高、可靠性強(qiáng)、系統(tǒng)結(jié)構(gòu)簡單、價格低廉、易于使用等優(yōu)點(diǎn),在世界范圍內(nèi)已經(jīng)得到了廣泛的普及和應(yīng)用。也正是由于單片機(jī)的這些特點(diǎn),它的出現(xiàn)是集成電路技術(shù)與微型計算機(jī)技術(shù)高速發(fā)展的產(chǎn)物,給工業(yè)自動化等領(lǐng)域帶來了一場重大的革命。

單片機(jī)體積小,很容易嵌入到系統(tǒng)之中,以實(shí)現(xiàn)各種方式的檢測、計算或控制,而一般的微型計算機(jī)無法做到。由于單片機(jī)本身就是一個微型計算機(jī),因此只要在單片機(jī)的外部適當(dāng)?shù)脑黾右恍┍匾耐鈬鷶U(kuò)展電路,就可以靈活的構(gòu)成各種應(yīng)用系統(tǒng),如工業(yè)自動檢測監(jiān)控系統(tǒng)、數(shù)據(jù)采集系統(tǒng)、自動控制系統(tǒng)、智能儀器儀表等。除此之外,單片機(jī)在家用電器中的應(yīng)用也很普及,例如,洗衣機(jī)、電冰箱、空調(diào)機(jī)、電風(fēng)扇、電視機(jī)、微波爐、加濕機(jī)、消毒柜等,在這些設(shè)備中嵌入了單片機(jī)之后,其功能和性能大大提高,并可實(shí)現(xiàn)智能化和最優(yōu)化控制。

2.設(shè)計方案

2.1 方案對比

1、單片機(jī)芯片的比較與選擇

單片機(jī)作為該電路的主要控制器芯片,即整個系統(tǒng)的控制核心部分,主要是負(fù)責(zé)控制LED燈的不同變化速度以及變化效果。因此對單片機(jī)芯片的選擇,必須要求其功耗低、數(shù)據(jù)轉(zhuǎn)換速率快。

方案一:采用STC89C52單片機(jī)。STC89C52單片機(jī)是一種低耗、可編程、高性能的8位微控制處理器,其內(nèi)部包括微處理器、具有8K的系統(tǒng)可編程Flash存儲器、 看門狗定時器、輸入/輸出口、中斷系統(tǒng)等,其具有價格低廉、技術(shù)成熟、操作簡單等特點(diǎn),滿足本系統(tǒng)的要求。

方案二:選擇TI公司生產(chǎn)的MSP430F149系列單片機(jī)系統(tǒng)。此款單片機(jī)具有低電壓、超低功耗的特點(diǎn),工作電壓在3.6-1.8V之間,具有強(qiáng)大的功能和高效的運(yùn)算處理能力。

方案選擇:由于STC89C52芯片價格便宜,支持在線下載程序而且MSP430F149系列單片機(jī)的功能已經(jīng)遠(yuǎn)遠(yuǎn)高于我們本系統(tǒng),操作不便。

    綜合考慮,我們選擇方案一。

2、LED燈控制方式的比較與選擇

方案一:選用單片機(jī)I/O口一對一直接控制LED燈,正好控制32個LED燈。

方案二:采用74HC573鎖存器控制LED燈,當(dāng)運(yùn)用兩片74HC573鎖存器就可以控制32個LED燈,只占用了單片機(jī)的10個I/O口,這樣可以減少I/O口數(shù)量。

為了操作方便,減少復(fù)雜的步驟,我們采取方案一。

2.2  STC89C52芯片功能

STC89C52是STC公司生產(chǎn)的一種低功耗、高性能的微控制器,具有8K的系統(tǒng)可編程Flash存儲器,其具有傳統(tǒng)51單片機(jī)不具備的功能,在經(jīng)典的MCS-51內(nèi)核上做了很多的改進(jìn),使得STC89C52在處理嵌入式控制應(yīng)用系統(tǒng)時更加高效、靈活。STC89C52具有以下標(biāo)準(zhǔn)功能:4個外部中斷、全雙工串行口、一個7向量4級中斷結(jié)構(gòu)、3個16位定時器/計數(shù)器、8K字節(jié)Flash、512字節(jié)RAM(隨機(jī)存儲器)、看門狗定時器,其12周期和6周期可以任意選擇,其工作電壓在3V~5.5V之間,工作頻率在0~40MHZ,實(shí)際工作頻率可達(dá)48MHZ。其管腳的封裝圖如圖1所示。


圖1  單片機(jī)管腳封裝圖

1、電源引腳

(1)VCC(38腳):芯片電源,接+5V;

(2)GND(16腳):接地端;

2、時鐘引腳

(1)XTAL1(15腳):片內(nèi)振蕩器反相放大器和時鐘發(fā)生器電路的輸入端。當(dāng)使用片內(nèi)振蕩器時,該引腳連接外部石英晶體和微調(diào)電容;當(dāng)采用外接時鐘源時,該引腳接外部時鐘振蕩器的信號。

(2)XTAL2(14腳):片內(nèi)振蕩器反相放大器的輸出端。當(dāng)使用片內(nèi)振蕩器時,該引腳連接外部石英晶體和微調(diào)電容;當(dāng)采用外部時鐘源時,該引腳懸空。
3、控制引腳
(1)ALE(27腳):用來鎖存P0口送出的低8位地址

(2)PSEN(26腳:外部ROM讀選通信號。
(3)RST(4腳):復(fù)位信號輸入端。
(4)EA’/Vpp(29腳):內(nèi)外ROM選擇/片內(nèi)EPROM編程電源。
4、并行I/O引線

(1)P0口:8位,漏極開路的雙向I/O口。

當(dāng)STC89C52擴(kuò)展外部存儲器及I/O接口芯片時,P0口作為地址總線(低8位)及數(shù)據(jù)總線的分時復(fù)用端口。P0口也可作為通用的I/O口使用,但需要上拉電阻,這時為準(zhǔn)雙向口。當(dāng)作為通用的I/O輸入時,應(yīng)先向端口輸出鎖存器寫入1,P0口可驅(qū)動8個TTL負(fù)載。

(2)P1口:8位,準(zhǔn)雙向I/O口,具有內(nèi)部上拉電阻。

P1是專為用戶使用的準(zhǔn)雙向I/O口。當(dāng)作為通用的I/O口輸入時,應(yīng)先向端口鎖存器輸入1,P1口可驅(qū)動4個LS型TTL負(fù)載。

(3)P2口:8位,準(zhǔn)雙向I/O口,具有內(nèi)部上拉電阻。

當(dāng)STC89C52擴(kuò)展外部存儲器及I/O口時,P2作為高8位地址總線用,輸出高8位地址。P2口也可作為普通的I/O口使用。當(dāng)作為普通的I/O口使用時,應(yīng)先向端口鎖存器輸入1,P1口可驅(qū)動4個LS型TTL負(fù)載。

(4)P3口:8位,準(zhǔn)雙向I/O口,具有內(nèi)部上拉電阻。

P3口可作為普通的I/O口使用,當(dāng)作為普通的I/O輸入時,應(yīng)先向端口輸出鎖存器輸入1,P3口可驅(qū)動4個LS型TTL負(fù)載。P3 口還可提供第二功能,其第二功能定義見表1。

表1   P3 口第二功能定義表

引腳

第二功能

說明

P3.0

RXD

串行數(shù)據(jù)輸入口

P3.1

TXD

串行數(shù)據(jù)輸出口

P3.2

INT0’

外部中斷0輸入

P3.3

INT1’

外部中斷1輸入

P3.4

T0

定時器0外部計數(shù)輸入

P3.5

T1

定時器1外部計數(shù)輸入

P3.6

WR’

外部數(shù)據(jù)存儲器寫選通輸入

P3.7

RD’

外部數(shù)據(jù)存儲器讀選通輸入

      

(4)P4口:可實(shí)現(xiàn)位尋址。

2.3 方案論證

按照單片機(jī)系統(tǒng)擴(kuò)展與系統(tǒng)配置狀況,單片機(jī)應(yīng)用系統(tǒng)可分為最小系統(tǒng)、最小功耗系統(tǒng)及典型系統(tǒng)等。STC89C52單片機(jī)是本次課程設(shè)計運(yùn)用的主要元件。心形流水燈設(shè)計使用一個帶有32個發(fā)光二極管的單片機(jī)最小應(yīng)用系統(tǒng),即為發(fā)光二極管、晶振、復(fù)位、電源等電路和必要的軟件組成的單個單片機(jī)。如果要讓接在P0、P1、P2、P3口的LED燈亮起來,只要將P0、P1、P2、P3口的電平變?yōu)榈碗娖骄涂梢粤恕R虼耍獙?shí)現(xiàn)流水燈功能,要將LED依次點(diǎn)亮、熄滅,32只LED燈便會一亮一暗做流水燈了。由于人眼的視覺暫留效應(yīng)以及單片機(jī)執(zhí)行每條指令的時間很短,在控制LED亮滅的時候應(yīng)該延時一段時間,否則就看不到"流水"效果了。硬件設(shè)計框圖如圖2所示。



                                    圖2  硬件設(shè)計框圖

  • 方案實(shí)施

3.1 電路原理圖設(shè)計

1、電源電路

本次課程設(shè)計,單片機(jī)正常工作要求輸出電壓為穩(wěn)定的5V,輸出電壓能夠適應(yīng)所帶負(fù)載的啟動項(xiàng)能。并且電路還必須簡單可靠,能夠輸出足夠大的電流,但是不至于會燒壞元器件。我們采用USB取電,4.8V鋰電池供電。電源電路如圖所示,C1和C2起到濾波作用,R18和R19的作用是平衡電路中的電流,以免在只有1個LED燈亮?xí)r燒壞元器件。電源電路如圖3所示。

圖3  電源電路圖

2、時鐘電路

單片機(jī)內(nèi)有一個由反相放大器所構(gòu)成的振蕩電路,XTAL1和XTAL2分別為振蕩電路的輸入端和輸出端。在XTAL1和XTAL2引腳上外接石英晶體和微調(diào)電容構(gòu)成并聯(lián)振蕩回路。晶振頻率設(shè)置為11.0592MHZ,作用是產(chǎn)生時鐘信號。單片機(jī)晶振提供的時鐘頻率越高,那么單片機(jī)運(yùn)行速度就越快,單片接的一切指令的執(zhí)行都是建立在單片機(jī)晶振提供的時鐘頻率。電容值為30pF,可以起到頻率微調(diào)作用。時鐘電路如圖4所示。

圖4  時鐘電路圖

3、復(fù)位電路

單片機(jī)RST接口為復(fù)位信號輸入端,高電平有效。在該引腳上加上持續(xù)時間大于兩個機(jī)器周期的高電平,就可以使單片機(jī)復(fù)位。在單片機(jī)正常工作時,此引腳應(yīng)為小于或等于0.5V的低電平。復(fù)位電路接單片機(jī)RST端口,在RST輸入端出現(xiàn)高電平時實(shí)現(xiàn)復(fù)位和初始化。復(fù)位電路如5所示。

圖5  復(fù)位電路

4、顯示電路

    單片機(jī)的P0口為8位的漏極開路的雙向I/O口,當(dāng)P0口作為普通的I/O口使用時,需要上拉電阻,這時為準(zhǔn)雙向口。P1 、P2、 P3 都為8位的準(zhǔn)雙向口,具有內(nèi)部上拉電阻。圖6為顯示電路,單片機(jī)I/O口一對一直接控制LED燈,顯示電路中的32個電阻既為上拉電阻,也起到電路分壓作用,防止燒壞元器件。顯示電路如圖6 所示。

                                    圖6  顯示電路圖

3.2 程序設(shè)計

  • Keil軟件介紹

本次課程設(shè)計,我們采用Keil軟件進(jìn)行C語言編程。Keil軟件是美國Keil Software公司開發(fā)的,它適合WindowsXP、Win7等系統(tǒng),具有可視化操作界面,使用方便簡單,并且支持C51語言、匯編語言以及兩者混合編程等多種方式的單片機(jī)設(shè)計,KeilC51在兼容標(biāo)準(zhǔn)C語言的基礎(chǔ)上,又增加了很多與51系列單片機(jī)硬件相關(guān)的編譯特性,其生成的程序代碼運(yùn)行的速度快,所需的存儲器空間小。

Keil軟件已被完全集成到一個功能強(qiáng)大的全新環(huán)境中,該開發(fā)環(huán)境集成了文件編譯處理、編譯鏈接、項(xiàng)目管理、工具引用、和仿真軟件模擬器等多種功能。Keil軟件具有豐富的庫函數(shù),同時也帶有功能強(qiáng)大的集成開發(fā)調(diào)試工具,可以自動識別所編寫程序的語法錯誤,編譯效率也很高, 能將源文件編譯為二進(jìn)制機(jī)器語言代碼,其軟件調(diào)試仿真功能也很強(qiáng)大,能通過單步、設(shè)置斷點(diǎn)等功能讓編程者了解CPU正在進(jìn)行的程序,并能監(jiān)控各變量以及各寄存器是否符合編程者的要求。

  • 程序編寫

單片機(jī)的應(yīng)用系統(tǒng)由硬件和軟件組成,在硬件原理圖搭建完成上電之后,暫時還不能看到流水燈循環(huán)點(diǎn)亮的現(xiàn)象,還需要編寫程序控制單片機(jī)管腳電平的高低變化,來實(shí)現(xiàn)LED燈的各種亮滅功能。

先將P0、P1、P2、P3全部置1,即通入高電平,用16進(jìn)制表示為0XFFH,則32個LED燈全部處于熄滅狀態(tài)。然后給P0口賦值0X7FH,即只有P0.0處于低電平時,LED1燈點(diǎn)亮。使用延時函數(shù)delay,并設(shè)置延時時間為2秒,延時時間一到P0口的值就變?yōu)?X3FH,即P0.0和P0.1都為高電平,LED2也開始點(diǎn)亮,如此循環(huán)P0口控制的8個LED燈全部點(diǎn)亮,當(dāng)高電平變?yōu)榈碗娖綍r,LED燈熄滅。P1、P2、P3口控制的LED燈閃亮和熄滅原理同P0口一樣,所以就可以看到LED燈的流水效果了。程序流程圖如圖7所示。


圖7 程序設(shè)計流程圖

  • 程序調(diào)試

    在程序設(shè)計好了之后,需要建立工程、寫C源文件、連接工程、獲得目標(biāo)代碼Hex文件,所以程序的調(diào)試就顯得至關(guān)重要。剛開始程序總是編譯出錯,請教了老師之后才知道是程序的編寫存在語法錯誤,我們就仔細(xì)閱讀并檢查所編寫的程序,發(fā)現(xiàn)在給I/O 口的狀態(tài)賦初值時,多加了一個分號,導(dǎo)致語法錯誤,編譯不能正確通過。經(jīng)過反復(fù)的檢查、編譯、調(diào)試,程序最終沒有錯誤,可以將程序代碼文件調(diào)入Proteus軟件,進(jìn)行電路功能仿真。

3.3 電路功能仿真

在各部分電路設(shè)計的基礎(chǔ)上,按照總體電路圖在Proteus上一一進(jìn)行器件選擇,并連接。將電路連接好后,為各個器件選擇合適的參數(shù),然后調(diào)入已編譯好的目標(biāo)代碼Hex文件,啟動仿真。根據(jù)LED燈是否發(fā)亮,判斷所設(shè)計的電路是否可以實(shí)現(xiàn)32個LED燈依次點(diǎn)亮、依次熄滅、對角閃亮、對角熄滅、間隔閃亮、間隔熄滅等多種功能。剛開始時,LED燈不亮,仔細(xì)檢查原來是將LED燈接反了,改正之后LED燈便可以正常發(fā)光了。電路仿真的結(jié)果為32個LED燈依次發(fā)亮、依次熄滅,并可以實(shí)現(xiàn)多種亮滅功能。根據(jù)仿真結(jié)果可知電路原理及程序無誤,可以進(jìn)行PCB設(shè)計。

3.4 電路PCB設(shè)計

    在原理圖及仿真圖設(shè)計成功的情況下,設(shè)置正確的PCB外形和尺寸,按照課程設(shè)計所給的要求,設(shè)置環(huán)境參數(shù)。接著向PCB文件中導(dǎo)入網(wǎng)絡(luò)表及元件的封裝等數(shù)據(jù),然后設(shè)置工作參數(shù)。根據(jù)要求設(shè)置布線規(guī)則。在上述準(zhǔn)備工作都完成就緒的情況下,對原件進(jìn)行布局,使盡量少的線重疊,以減少布線時跳線的出現(xiàn)。

3.5 安裝與調(diào)試

在安裝時要考慮LED燈正負(fù)極有沒有接反,所以安裝前,請教了老師怎樣辨認(rèn)正負(fù)極。然后安裝好所有的元件后,按照電路圖逐一檢查電路有沒有漏焊的問題,接下來用萬用表逐一檢查有沒有虛焊、線路斷路或線路短路的問題。在線路沒有問題的情況下連接電源調(diào)試,加入電源以后, 32個LED燈可以循環(huán)點(diǎn)亮、依次熄滅,可以達(dá)到預(yù)期的效果。

4. 結(jié)果與結(jié)論

在設(shè)計電路圖的過程中,經(jīng)過了多次分析和仿真驗(yàn)證,并結(jié)合所給的器件清單最后確定了需要哪些器件來實(shí)現(xiàn)電路的功能,并且保證了所需要的元器件在給出的清單范圍內(nèi)。經(jīng)過Proteus軟件多次仿真和修改后,在仿真電路圖實(shí)現(xiàn)設(shè)計要求的前提下確定了最終的原理圖。然后在Altium Designer中畫出來所對應(yīng)的原理圖,再導(dǎo)入到PCB設(shè)計的環(huán)境中,進(jìn)行PCB設(shè)計。在經(jīng)過小組內(nèi)多次討論和聽取指導(dǎo)老師的意見后確定了PCB的最終布局,布線完成后打印輸出制成印刷電路板。將所有的元器件放到相應(yīng)的封裝位置,查無誤后進(jìn)行焊接。焊接完成,接入電源后,心形流水燈實(shí)現(xiàn)了32個LED燈依次點(diǎn)亮、依次熄滅,對角點(diǎn)亮、間隔點(diǎn)亮燈多種功能。電路能夠正常工作,得到了老師的肯定。

    總體說來,電路布局合理,采用了模塊化的布局方式即先布局各個功能模塊,再將各個功能模塊連接在一起組成最終的電路,但是電路還是存在一定的不合理之處,在布局合理美觀方面存在一些沖突,由于布線太過寬松,整體尺寸稍大。

5. 獲與致謝

經(jīng)過為期兩周的課程設(shè)計,我收獲很多。在本次課程設(shè)計中,我們遇到了很多困難,比如電路圖畫錯、編程出現(xiàn)錯誤、軟件不會使用、元器件虛焊斷焊以及焊錯等。在這期間,我還是努力認(rèn)真的去檢查和修改,雖然這個過程非常艱難,但還是值得我回味的。在整個課程設(shè)計過程中,我查閱了相關(guān)書籍和文獻(xiàn)資料,從中學(xué)習(xí)了一些單片機(jī)的工作原理以及怎樣去設(shè)計一個電子電路,還參照了一些以前做過的課程設(shè)計。這次課程設(shè)計,加深了我對以前學(xué)過的課本知識的理解和認(rèn)識,以前有些課本上的理論知識總是弄不懂,這次通過自己親自動手去實(shí)踐,很多問題就通俗易懂了。本次課程設(shè)計,真正提高了自己的各項(xiàng)能力,比如獨(dú)立思考解決問題的能力,與人協(xié)作的能力,親自動手實(shí)踐的能力,真正的提高了自己的實(shí)踐技能,培養(yǎng)了自己的創(chuàng)新能力,為今后完成更高質(zhì)量的項(xiàng)目打下了基礎(chǔ)。

這次我們能夠順利完成課程設(shè)計,是與老師們的辛勤勞動分不開的,所以在此,特別感謝課程設(shè)計輔導(dǎo)老師趙路華老師和單片機(jī)任課老師丁瑩亮老師,感謝他們在設(shè)計中的耐心指導(dǎo)和提出的寶貴建議,同時也感謝小組搭檔,和我共同度過這為期兩周的課程設(shè)計。

6. 參考文獻(xiàn)

[1] 林志琦.基于Proteus的單片機(jī)可視化軟硬件仿真[M] .北京:北京航空航天大學(xué)出版社,2006.

[2] 何立民.MCS-51單片機(jī)應(yīng)用系統(tǒng)設(shè)計[M] .北京:北京航空航天大學(xué)出版社,1990.

[3] 張毅剛.單片機(jī)原理及應(yīng)用[M] .北京:高等教育出版社,2004.

[4] 谷樹忠,劉文洲,姜航.Altium Designer教程-原理圖、PCB設(shè)計與仿真.北京:電子工業(yè)出版社,2010.

[5] 張陽天,韓異凡.Protel DXP電路設(shè)計[M].北京:高等教育出版社,2005.

7. 附件

7.1 元器件清單

    元器件清單如表2所示。

元器件名稱

型號規(guī)格

數(shù)量

備注

單片機(jī)

STC89C52

1

貼片

晶振

11.0592MHZ

1


電容

10uF

1

電解電容

30pF

2

瓷介電容

0.1uF

2


      電阻

100

36


10K

4


LED燈


32


USB接口


1



表2 元器件清單表

7.2 電路仿真圖

    電路仿真圖如圖8所示。

圖8  電路仿真圖

7.3 電路原理圖

    電路原理圖如圖9所示。

圖9 電路原理圖

7.4 PCB布線圖

    PCB布線圖如圖10所示。

圖10  PCB布線圖

7.5 實(shí)物圖

    實(shí)物圖如圖11所示。

圖11 實(shí)物圖

7.6 程序代碼


單片機(jī)源程序如下:
  1. #include<reg52.h>
  2. #include <intrins.h>
  3. #define              uint unsigned int
  4. #define              uchar unsigned char
  5. uchar code table[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00}; // 逐個點(diǎn)亮0~7
  6. uchar code table1[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00}; // 逐個點(diǎn)亮7~0
  7. uchar code table2[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff}; // 逐個滅0~7
  8. uchar code table3[]={0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff}; // 逐個滅7~0
  9. void delay(uint t);              //延時
  10. void zg(uint t,uchar a);//兩邊逐個亮
  11. void qs(uint t,uchar a);//全部閃爍
  12. void zgxh(uint t,uchar a);  // 逆時針逐個點(diǎn)亮
  13. //void zgxh1(uint t,uchar a);  // 順時針逐個點(diǎn)亮
  14. void djs(uint t,uchar a);  //對角閃
  15. void lbzgm(uint t,uchar a);//兩邊逐個滅
  16. //void sszgm(uint t,uchar a); // 順時針逐個滅
  17. void nszgm(uint t,uchar a); // 逆時針逐個滅
  18. void sztl(uint t,uchar a);//順時逐個同步亮
  19. void nztl(uint t,uchar a);//逆時逐個同步亮
  20. void sztm(uint t,uchar a);//順時逐個同步滅
  21. void nztm(uint t,uchar a);//逆時逐個同步滅
  22. void hwzjl(uint t,uchar a); //橫往中間亮
  23. void hwzjm(uint t,uchar a); //橫往中間滅
  24. //void swzjl(uint t,uchar a); //豎往中間亮
  25. //void swzjm(uint t,uchar a); //豎往中間滅
  26. void nzdl(uint t,uchar a); //逆時逐段亮
  27. void nzdgl(uint t,uchar a);   //逆時逐段一個點(diǎn)亮
  28. void jgs(uint t,uchar a);   //間隔閃
  29. void zg(uint t,uchar a)//兩邊逐個亮
  30. {
  31.               uchar i,j;
  32.       for(j=0;j<a;j++)
  33.               {
  34.                               P0=P1=P2=P3=0xff;
  35.                               P0=0x7f;delay(t);
  36.                               for(i=0;i<7;i++)
  37.                               {
  38.                               P0=table1[i+1];
  39.                               P2=table1[i];
  40.                               delay(t);            
  41.                               }
  42.                               P2=0x00;P1=0xfe;
  43.                               delay(t);
  44.           for(i=0;i<7;i++)
  45.                               {
  46.                                             P1=table[i+1];
  47.                                           P3=table1[i];
  48.                                           delay(t);
  49.                               }
  50.                               P3=0x00;delay(t);
  51.                 }
  52. }
  53. void qs(uint t,uchar a)              //全部閃爍
  54. {
  55.               uchar j;
  56.               for(j=0;j<a;j++)
  57.               {
  58.                  P0=P1=P2=P3=0xff;
  59.                  delay(t);
  60.                  P0=P1=P2=P3=0x00;
  61.                  delay(t);
  62.               }               
  63. }
  64. void zgxh(uint t,uchar a)  // 逆時針逐個點(diǎn)亮
  65. {
  66.               uchar i,j;
  67.               for (j=0;j<a;j++)
  68.               {
  69.                             P0=P1=P2=P3=0xff;
  70.                             for (i=0;i<8;i++)
  71.                             {
  72.                                           P0=table1[i];
  73.                                           delay(t);
  74.                             }
  75.                             for(i=0;i<8;i++)
  76.                             {
  77.                                           P1=table[i];
  78.                                           delay(t);
  79.                             }
  80.                             for(i=0;i<8;i++)
  81.                             {
  82.                                           P3=table[i];
  83.                                           delay(t);
  84.                             }
  85.                             for(i=0;i<8;i++)
  86.                             {
  87.                                           P2=table[i];
  88.                                           delay(t);
  89.                             }
  90.               }
  91. }

  92. void nszgm(uint t,uchar a) // 逆時針逐個滅
  93. {
  94.               uchar i,j;
  95.               for(j=0;j<a;j++)
  96.               {
  97.                             P0=P1=P2=P3=0x00;
  98.                             for (i=0;i<8;i++)
  99.                             {
  100.                                           P0=table3[i];delay(t);            
  101.                             }
  102.                             for (i=0;i<8;i++)
  103.                             {
  104.                                           P1=table2[i];delay(t);            
  105.                             }
  106.                             for (i=0;i<8;i++)
  107.                             {
  108.                                           P3=table2[i];delay(t);            
  109.                             }
  110.                             for (i=0;i<8;i++)
  111.                             {
  112.                                           P2=table2[i];delay(t);            
  113.                             }
  114.               }
  115. }
  116. void zgxh1(uint t,uchar a)  // 順時針逐個點(diǎn)亮
  117. {
  118.               uchar i,j;
  119.               for (j=0;j<a;j++)
  120.               {
  121.                             P0=P1=P2=P3=0xff;
  122.                             for (i=0;i<8;i++)
  123.                             {
  124.                                           P2=table1[i];
  125.                                           delay(t);
  126.                             }
  127.                             for(i=0;i<8;i++)
  128.                             {
  129.         P3=table1[i];
  130.                                           delay(t);
  131.                             }
  132.                             for(i=0;i<8;i++)
  133.                             {
  134.                                           P1=table1[i];
  135.                                           delay(t);
  136.                             }
  137.                             for(i=0;i<8;i++)
  138.                             {
  139.                                           P0=table[i];
  140.                                           delay(t);
  141.                             }
  142.               }
  143. }
  144. void sszgm(uint t,uchar a) // 順時針逐個滅
  145. {
  146.               uchar i,j;
  147.               for(j=0;j<a;j++)
  148.               {
  149.                             P0=P1=P2=P3=0x00;
  150.                             for (i=0;i<8;i++)
  151.                             {
  152.                                           P2=table3[i];delay(t);            
  153.                             }
  154.                             for (i=0;i<8;i++)
  155.                             {
  156.                                           P3=table3[i];delay(t);            
  157.                             }
  158.                             for (i=0;i<8;i++)
  159.                             {
  160.                                           P1=table3[i];delay(t);            
  161.                             }
  162.                             for (i=0;i<8;i++)
  163.                             {
  164.                                           P0=table2[i];delay(t);            
  165.                             }
  166.               }
  167. }
  168. void djs(uint t,uchar a)  //對角閃
  169. {
  170.               uchar j;
  171.               for(j=0;j<a;j++)
  172.               {
  173.         P0=P1=P2=P3=0xff;
  174.                             P0=P3=0x00;
  175.                             delay(t);
  176.                             P0=P1=P2=P3=0xff;
  177.                             P1=P2=0x00;
  178.                             delay(t);
  179.               }
  180.             
  181. }
  182. void lbzgm(uint t,uchar a)//兩邊逐個滅
  183. {
  184.                 uchar i,j;
  185.                 for (j=0;j<a;j++)
  186.                 {
  187.                               P0=P2=0x00;
  188.                             P3=0x01;delay(t);
  189.                             for(i=7;i>1;i--)
  190.                             {
  191.                                           P1=table[i-1];P3=table1[i-2];
  192.                                           delay(t);
  193.                             }
  194.                             P1=0xfe;P3=0xff;delay(t);
  195.                             P1=0xff;P2=0x01;delay(t);
  196.                             for(i=7;i>1;i--)
  197.                             {
  198.                                           P0=table1[i-1];
  199.                                           P2=table1[i-2];
  200.                                           delay(t);
  201.                             }
  202.                             P0=0x7f;P2=0xff;delay(t);
  203.                             P0=0xff;delay(t);
  204.                 }
  205. }
  206. void sztl(uint t,uchar a)//順時逐個同步亮
  207. {
  208.               uchar i,j;
  209.               for(j=0;j<a;j++)
  210.               {
  211.                             P0=P1=P2=P3=0xff;
  212.                             for(i=0;i<8;i++)
  213.                             {
  214.                                           P0=table[i];
  215. P1=P2=P3=table1[i];
  216.    delay(t);
  217.                             }
  218.               }
  219. }

  220. void nztl(uint t,uchar a)//逆時逐個同步亮
  221. {
  222.               uchar i,j;
  223.               for(j=0;j<a;j++)
  224.               {
  225.                             P0=P1=P2=P3=0xff;
  226.                             for(i=0;i<8;i++)
  227.                             {
  228.                                           P0=table1[i];
  229.                                           P1=P2=P3=table[i];
  230.                                           delay(t);
  231.                             }
  232.               }
  233. }
  234. void sztm(uint t,uchar a)//順時逐個同步滅
  235. {
  236.               uchar i,j;
  237.               for(j=0;j<a;j++)
  238.               {
  239.                             P0=P1=P2=P3=0x00;
  240.                             for(i=0;i<8;i++)
  241.                             {
  242.                                           P0=table2[i];
  243.                                           P1=P2=P3=table3[i];
  244.                                           delay(t);
  245.                             }
  246.               }
  247. }
  248. void nztm(uint t,uchar a)//逆時逐個同步滅
  249. {
  250.               uchar i,j;
  251.               for(j=0;j<a;j++)
  252.               {
  253.                             P0=P1=P2=P3=0xff;
  254.                             for(i=0;i<8;i++)
  255.                             {
  256.                                           P0=table3[i];
  257. P1=P2=P3=table2[i];
  258. delay(t);
  259.                             }
  260.               }
  261. }
  262. void hwzjl(uint t,uchar a) //橫往中間亮
  263. {
  264.               uchar i,j;
  265.               for (j=0;j<a;j++)
  266.               {
  267.                             P0=P1=P2=P3=0xff;
  268.                             for(i=0;i<8;i++)
  269.                             {
  270.                                           P0=P2=P1=table1[i];
  271.                                           P3=table[i];delay(t);            
  272.                             }
  273.               }
  274. }
  275. void hwzjm(uint t,uchar a) //橫往中間滅
  276. {
  277.               uchar i,j;
  278.               for (j=0;j<a;j++)
  279.               {
  280.                             P0=P1=P2=P3=0x00;
  281.                             for(i=0;i<8;i++)
  282.                             {
  283.                                           P0=P2=P1=table3[i];
  284.                                           P3=table2[i];delay(t);            
  285.                             }
  286.               }
  287. }
  288. void swzjl(uint t,uchar a) //豎往中間亮
  289. {
  290.               uchar i,j;
  291.               for (j=0;j<a;j++)
  292.               {
  293.                             P0=P1=P2=P3=0xff;
  294.                             for(i=0;i<8;i++)
  295.                             {
  296.                                           P0=P2=P1=table[i];
  297.                                           P3=table1[i];delay(t);            
  298.                             }
  299.               }
  300. }
  301. void swzjm(uint t,uchar a) //豎往中間滅
  302. {
  303.               uchar i,j;
  304.               for (j=0;j<a;j++)
  305.               {
  306.                             P0=P1=P2=P3=0x00;
  307.                             for(i=0;i<8;i++)
  308.                             {
  309.                                           P0=P2=P1=table2[i];
  310.                                           P3=table3[i];delay(t);            
  311.                             }
  312.               }
  313. }
  314. void nzdl(uint t,uchar a) //逆時逐段亮
  315. {
  316.               uchar i,j;
  317.               for (j=0;j<a;j++)
  318.               {
  319.                             P0=P1=P2=P3=0xff;
  320.                             for(i=0;i<8;i++)
  321.                             {
  322.                                           P0=table1[i];
  323.                                           delay(t);
  324.                             }
  325.                             P0=0xff;
  326.                             for(i=0;i<8;i++)
  327.                             {
  328.                                           P1=table[i];
  329.                                           delay(t);
  330.                             }
  331.                             P1=0xff;
  332.                             for(i=0;i<8;i++)
  333.                             {
  334.                                           P3=table[i];
  335.                                           delay(t);
  336.                             }
  337.                             P3=0xff;
  338.                             for(i=0;i<8;i++)
  339.                             {
  340.                                           P2=table[i];
  341.                                           delay(t);
  342.                             }
  343.                             P2=0xff;                           
  344.               }
  345. }
  346. void nzdgl(uint t,uchar a)   //逆時逐段一個點(diǎn)亮
  347. {
  348.               uchar i,j,k,l;
  349.               for (j=0;j<a;j++)
  350.               {
  351.                             k=table1[0];
  352.                             P0=k;l=table[0];
  353.                             P1=P2=P3=l;delay(t);
  354.                             for(i=0;i<8;i++)
  355.                             {
  356.                                           k=_crol_(k,-1);
  357.                                           P0=k;
  358.                                           l=_crol_(l,1);
  359.                                           P1=P2=P3=l;
  360.                                           delay(t);
  361.                             }
  362.               }
  363. }
  364. void jgs(uint t,uchar a)   //間隔閃
  365. {
  366.               uchar j;
  367.               for (j=0;j<a;j++)
  368.               {
  369.                             P0=0x55;P1=P2=P3=0xaa;
  370.                             delay(t);
  371.                             P0=0xaa;P1=P2=P3=0x55;
  372.                             delay(t);            
  373.               }
  374. }
  375. void main()
  376. {
  377.               uchar i;

  378.               while(1)
  379.               {
  380.               zg(100,1);                                          //兩邊逐個亮
  381.               lbzgm(100,1);                            //兩邊逐個滅
  382.               jgs(300,10);
  383.               djs(100,20);  //對角閃
  384.               P1=P2=P3=0xff;
  385.               for(i=0;i<3;i++)
  386.               {
  387.               P0=0x00;delay(800);
  388.               P0=0xff;delay(800);
  389.               }
  390.               P0=0x00;
  391.               for(i=0;i<3;i++)
  392.               {
  393.               P1=0x00;delay(800);
  394.               P1=0xff;delay(800);
  395.               }
  396.               P1=0x00;
  397.               for(i=0;i<3;i++)
  398.               {
  399.               P3=0x00;delay(800);
  400.               P3=0xff;delay(800);
  401.               }
  402.               P3=0x00;
  403.               for(i=0;i<3;i++)
  404.               {
  405.               P2=0x00;delay(800);
  406.               P2=0xff;delay(800);
  407.               }
  408.               qs(500,3);
  409.               for(i=0;i<6;i++)
  410.               {
  411.               zgxh(50,1);
  412.               nszgm(50,1);
  413.               }
  414.               djs(100,20);  //對角閃
  415.               for(i=0;i<3;i++)
  416.               {
  417.               zg(100,1);                                          //兩邊逐個亮
  418.               lbzgm(100,1);                            //兩邊逐個滅
  419.               }
  420.               qs(200,10);djs(100,50);
  421.               for(i=0;i<5;i++)
  422.               {
  423.                             sztl(200,1); //順時逐個同步亮
  424.                             nztm(200,1);
  425.                             nztl(200,1);
  426.                             sztm(200,1); //順時逐個同步滅
  427.               }
  428.               djs(300,10);  //對角閃
  429.               nzdgl(300,10);   //逆時逐段一個點(diǎn)亮
  430.               jgs(300,10);   //間隔閃
  431.               for(i=0;i<3;i++)
  432.               {
  433.               zgxh(100,1);
  434.               nszgm(100,1);
  435.               }
  436.               for(i=0;i<5;i++)
  437.               {
  438.               zgxh1(100,1);
  439.               sszgm(100,1);
  440.               }
  441.    nzdl(200,3); //逆時逐段亮
  442.    jgs(50,100);   //間隔閃
  443.               P0=P1=P2=P3=0xff;
  444.               for (i=0;i<8;i++)
  445.               {
  446.                             P0=table1[i];
  447.                             delay(200);
  448.               }
  449.               for (i=0;i<8;i++)
  450.               {
  451.                             P1=table[i];
  452.                             delay(200);
  453.               }
  454.               for(i=0;i<3;i++)
  455.               {
  456.                             P0=P1=0x00;delay(200);
  457.                             P0=P1=0xff;delay(200);
  458.               }

  459.               for (i=0;i<8;i++)
  460.               {
  461.                             P2=table1[i];
  462.                             delay(200);
  463.               }
  464.               for (i=0;i<8;i++)
  465.               {
  466.                             P3=table1[i];
  467.                             delay(200);
  468.               }
  469.               for(i=0;i<3;i++)
  470.               {
  471.                             P2=P3=0x00;delay(200);
  472.                             P2=P3=0xff;delay(200);
  473.               }            
  474.               nzdgl(50,40);   //逆時逐段一個點(diǎn)亮
  475.               for(i=0;i<4;i++)
  476.               {
  477.               zg(100,1);qs(100,10);
  478.               lbzgm(100,1);
  479. ……………………

  480. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
心形流水燈設(shè)計報告.doc (560.54 KB, 下載次數(shù): 104)


評分

參與人數(shù) 3黑幣 +13 收起 理由
stu + 3 共享資料的黑幣獎勵!
ASDFG3 + 5 贊一個!
南風(fēng)木木 + 5 贊一個!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏8 分享淘帖 頂7 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:314732 發(fā)表于 2018-4-23 20:34 | 只看該作者
很厲害 想頂一下
回復(fù)

使用道具 舉報

板凳
ID:353235 發(fā)表于 2018-7-1 01:53 來自觸屏版 | 只看該作者
不錯可以把原理圖和程序發(fā)給我嗎?郵箱:1298714905@qq.com
回復(fù)

使用道具 舉報

地板
ID:112406 發(fā)表于 2018-11-10 12:13 | 只看該作者
很實(shí)用的教程
回復(fù)

使用道具 舉報

5#
ID:772069 發(fā)表于 2020-6-7 18:15 | 只看該作者
贊一個
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日本免费一区二区三区四区 | 亚洲精品福利在线 | 麻豆亚洲 | 欧美日韩国产在线观看 | 在线观看特色大片免费网站 | 精品国产乱码久久久久久1区2区 | 欧美日韩大陆 | 欧美性猛片aaaaaaa做受 | 一区二区精品 | 超碰人人91 | 国产成人av在线播放 | 国产盗摄视频 | 日韩精品一区二区三区视频播放 | 在线播放中文字幕 | 欧美亚洲高清 | 在线国产一区 | 亚洲免费一区二区 | 亚洲精品一 | 丝袜天堂| 日本中文在线 | 人人人人干 | 国产免费视频 | 欧美国产91 | 天天干天天谢 | 欧美www在线观看 | 一区二区久久 | 国产精品一区在线观看 | 久久久久国产精品免费免费搜索 | 国产日韩一区二区三免费 | 日韩精品视频在线 | av中文字幕在线 | 精品三级 | 91爱啪啪| 一级黄色片网址 | 欧美日韩在线观看视频 | av网站观看 | 国产极品粉嫩美女呻吟在线看人 | 亚洲a在线视频 | 日韩中文字幕免费 | 二区欧美 | 精品视频一区二区三区 |