|
這是最近做的課程設(shè)計,用了3、4天的時間,我們是一個小組,6個人共同完成的,其中的內(nèi)容也有借鑒網(wǎng)上的,但沒有照搬,代碼完全是自己寫的,附件里有流水燈的代碼和原理圖及仿真圖,本次設(shè)計用到的是89c51單片機(jī),新手報到,還望海涵,原理圖和仿真是用的proteus8.3,程序的編寫用的是keil 5。
電路原理圖如下:
Proteus仿真圖_黑白版.png (388.45 KB, 下載次數(shù): 134)
下載附件
心形流水燈仿真圖
2019-4-3 10:55 上傳
proteus原理圖_黑白版.png (400.76 KB, 下載次數(shù): 66)
下載附件
心形流水燈原理圖
2019-4-3 10:54 上傳
設(shè)計要求:
設(shè)計一個用單片機(jī)控制的心形流水燈系統(tǒng);
LED燈數(shù)量為32個;
可以實現(xiàn)循環(huán)點亮、依次熄滅的基本功能;
可以實現(xiàn)對角閃亮、間隔閃亮、順時針閃亮、逆時針閃亮等多種功能(也可自行增加功能)。
學(xué)生需要完成的任務(wù):
完成心形流水燈電路設(shè)計,利用Keil軟件編寫程序,Proteus軟件進(jìn)行電路功能仿真,并將仿真結(jié)果采用錄屏形式生成視頻,視頻類型建議用.mp4格式,大小不超過200M。
目錄
目錄
一、總體方案設(shè)計
1、單片機(jī)的選擇
2、LED燈控制方式的比較與選擇
3、硬件設(shè)計
二、電路原理圖設(shè)計
1、時鐘電路
2、復(fù)位電路
3、顯示電路
4、電源電路
三、程序設(shè)計
1、Keil 軟件介紹
2、程序編寫設(shè)計
3、程序調(diào)試
4、電路功能仿真
附件:
1、程序代碼:
2、小組成員任務(wù)分配表
一、總體方案設(shè)計
1、單片機(jī)的選擇單片機(jī)作為該電路的主要控制器芯片,是整個系統(tǒng)核心部分,主要負(fù)責(zé)控制LED燈的亮滅變化的速度以及變化效果。89c51單片機(jī)共有32個I/O口,能夠滿足32個流水燈的設(shè)計需求;另外80c51具有4k字節(jié)的FLASH閃存和128字節(jié)的RAM,編寫的程序很小,非常能夠滿足設(shè)計的需求;除此之外,89c51單片機(jī)還具有靈活性高且廉價的特點,綜合考慮,選擇89c51芯片作為設(shè)計的方案。 2、LED燈控制方式的比較與選擇方案一:采用位操作的方式對32個i/o口進(jìn)行操作 方案二:采用總線的方式對32個i/o口進(jìn)行操作 由于采用位操作的方式,還需要聲明32個i/o口,另外在寫程序的時候語句較多,過程繁瑣;而采用總線操作的方式,則不需要聲明i/o口,與位操作相比,采用總線的方式在程序編寫時能用很少的語句實現(xiàn)相同的功能效果;所以,選擇方案二,即采用總線操作的方式對32個i/o口操作。 3、硬件設(shè)計 心形流水燈設(shè)計所需的系統(tǒng)應(yīng)該具有:由32個發(fā)光二極管組成的顯示電路、由晶振和電容組成的時鐘電路、電源、復(fù)位電路即軟件部分。心形流水燈的硬件設(shè)計框圖如圖1-3.1所示
二、電路原理圖設(shè)計
1、時鐘電路單片機(jī)內(nèi)有一個由反相放大器所構(gòu)成的振蕩電路, XTAL1 和 XTAL2 分別為振蕩電路的輸入端和輸出端。 在 XTAL1 和 XTAL2 引腳上外接石英晶體和微調(diào)電容構(gòu)成并聯(lián)振蕩回路。晶振頻率設(shè)置為 11.0592MHZ, 作用是產(chǎn)生時鐘信號。 單片機(jī)晶振提供的時鐘頻率越高,那么單片機(jī)運行速度就越快,單片接的一切指令的執(zhí)行都是建立在單片機(jī)晶振提供的時鐘頻率紙上。電容值為 30pF, 可以起到頻率微調(diào)作用。時鐘電路如圖2-1.1所示: 2、復(fù)位電路 當(dāng)輸入連續(xù)兩個機(jī)器周期以上高電平時為有效,用來完成單片機(jī)的復(fù)位初始值操作,復(fù)位后程序計數(shù)器PC=0000H,即復(fù)位后將從程序儲存器的0000H單元讀取第一條指令碼,通俗的講,就是單片機(jī)重新開始命令,防止程序走偏。復(fù)位電路如圖2-2.1所示: 3、顯示電路單片機(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 個電阻既為上拉電阻,也起到電路分壓作用,防止燒壞元器件。顯示電路如圖2-3.1所示 4、電源電路
本次課程設(shè)計,單片機(jī)正常工作要求輸出電壓為穩(wěn)定的 5V,輸出電壓能夠適應(yīng)所帶負(fù)載的啟動項能。并且電路還必須簡單可靠,能夠輸出足夠大的電流,但是不至于會燒壞元器件。我們采用 USB 取電,4.8V 鋰電池供電。電源電路如圖所示, 兩個電阻起到濾波作用, 兩個電阻的作用是平衡電路中的電流,以免在只有 1 個 LED 燈亮?xí)r燒壞元器件。電源電路如圖2-4.1所示。
 
三、程序設(shè)計
1、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)的編譯特性,其生成的程序代碼運行的速度快,所需的存儲器空間小。 Keil 軟件已被完全集成到一個功能強(qiáng)大的全新環(huán)境中,該開發(fā)環(huán)境集成了文件編譯處理、編譯鏈接、項目管理、工具引用、和仿真軟件模擬器等多種功能。 Keil 軟件具有豐富的庫函數(shù),同時也帶有功能強(qiáng)大的集成開發(fā)調(diào)試工具,可以自動識別所編寫程序的語法錯誤,編譯效率也很高, 能將源文件編譯為二進(jìn)制機(jī)器語言代碼,其軟件調(diào)試仿真功能也很強(qiáng)大,能通過單步、設(shè)置斷點等功能讓編程者了解 CPU 正在進(jìn)行的程序,并能監(jiān)控各變量以及各寄存器是否符合編程者的要求。 2、程序編寫設(shè)計單片機(jī)的應(yīng)用系統(tǒng)由硬件和軟件組成,在硬件原理圖搭建完成上電之后,暫時還不能看到流水燈循環(huán)點亮的現(xiàn)象,還需要編寫程序控制單片機(jī)管腳電平的高低變化,來實現(xiàn) LED 燈的各種亮滅功能。其程序流程圖3-2.1如圖所示:
例如,先將 P0、P1、P2、P3 全部置 1,即通入高電平,用 16 進(jìn)制表示為 0XFF,則 32個 LED 燈全部處于熄滅狀態(tài)。然后給 P0 口賦值0X7F,即只有 P0.0 處于低電平時,LED1 燈點亮。使用延時函數(shù) delay,并設(shè)置延時時間為0.2秒,延時時間一到 P0 口的值就變?yōu)?0X3F, 即 P0.0和 P0.1都為高電平, LED2 也開始點亮,如此循環(huán) P0口控制的8 個 LED 燈全部點亮,
當(dāng)高電平變?yōu)榈碗娖綍r, LED 燈熄滅。P1、P2、P3 口控制的 LED燈閃亮和熄滅原理同 P0 口一樣,所以就可以看到 LED 燈的流水效果了。 圖3-2.1程序設(shè)計流程圖 3、程序調(diào)試在程序編寫好了之后,需要連接工程并編譯,經(jīng)過反復(fù)的檢查、編譯、調(diào)試,程序沒有錯誤后,最后獲得目標(biāo)代碼 Hex文件。將程序代碼文件調(diào)入 Proteus軟件,進(jìn)行電路功能仿真,并根據(jù)仿真結(jié)果進(jìn)行程序的修改和完善。所以程序的調(diào)試就顯得至關(guān)重要。其中,將每個閃爍的部分都寫成一個子函數(shù),直接在主函數(shù)中調(diào)用即可實現(xiàn)閃爍的花樣和效果,各子函數(shù)與主函數(shù)的結(jié)構(gòu)框圖如圖3-3.1所示: 
4、電路功能仿真在各部分電路設(shè)計的基礎(chǔ)上,按照總體電路圖在 Proteus上一一進(jìn)行器件選擇,并連接。將電路連接好后,為各個器件選擇合適的參數(shù),然后調(diào)入已編譯好的目標(biāo)代碼Hex 文件,啟動仿真。根據(jù) LED 燈是否發(fā)亮,判斷所設(shè)計的電路是否可以實現(xiàn) 32 個 LED燈依次點亮、依次熄滅、對角閃亮、對角熄滅、間隔閃亮、間隔熄滅等多種功能。電路仿真的結(jié)果為 32 個 LED 燈依次發(fā)亮、依次熄滅,并可以實現(xiàn)多種亮滅功能。 1
 
附件:1、程序代碼:
- #include<reg52.h>
- #include<intrins.h> //庫函數(shù)
- #define uint unsigned int
- #define uchar unsigned char//宏定義
- void delay(uint xms)//延時函數(shù)
- {
- uint i,j;
- for(i=xms;i>0;i--)
- for(j=110;j>0;j--);
- }
- void zys(uint t)//左右閃爍
- {
- while(t--)
- {
- P3=P2=0x00;
- delay(500);
- P3=P2=0xff;
- P1=P0=0x00;
- delay(500);
- P1=P0=0xff;
- }
- }
- void qs(uint t)//全部閃亮
- {
- while(t--)
- {
- P0=P1=P2=P3=0xff;
- delay(300);
- P0=P1=P2=P3=0x00;
- delay(300);
- }
- P1=P2=P3=P0=0xff;
- }
- void ycdl(uint t)//依次點亮
- {
- uchar code table[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};
- uint i;
- while(t--)
- {
- for(i=0;i<8;i++)
- {
- P0=table[i];
- delay(200);
- }
- for(i=0;i<8;i++)
- {
- P1=table[i];
- delay(200);
- }
- for(i=0;i<8;i++)
- {
- P2=table[i];
- delay(200);
- }
- for(i=0;i<8;i++)
- {
- P3=table[i];
- delay(200);
- }
- }
- }
- void ycxm (uint t)//依次熄滅
- {
- uchar code table[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};
- uint i;
- while(t--)
- {
- P0=P1=P2=P3=0x00;
- for(i=0;i<8;i++)
- {
- P0=~table[i];
- delay(200);
- }
- for(i=0;i<8;i++)
- {
- P1=~table[i];
- delay(200);
- }
- for(i=0;i<8;i++)
- {
- P2=~table[i];
- delay(200);
- }
- for(i=0;i<8;i++)
- {
- P3=~table[i];
- delay(200);
- }
- }
- }
- void jgs(uint t)//間隔閃爍
- {
- while(t--)
- {
- P0=P1=P2=P3=0xaa;
- delay(500);
- P0=P1=P2=P3=~0xaa;
- delay(500);
- }
- P0=P1=P2=P3=0xff;
- delay(200);
- }
-
- void sszs(uint t)//順時針閃爍
- {
- uchar a,i;
- while(t--)
- {
- a=0xfe;
- for(i=0;i<8;i++)
- {
- P0=a;
- delay(200);
- a=_crol_(a,1);
- }
- P0=0xff;
- a=0xfe;
- for(i=0;i<8;i++)
- {
- P1=a;
- delay(200);
- a=_crol_(a,1);
- }
- P1=0xff;
- a=0xfe;
- for(i=0;i<8;i++)
- {
- P2=a;
- delay(200);
- a=_crol_(a,1);
- }
- P2=0xff;
- a=0xfe;
- for(i=0;i<8;i++)
- {
- P3=a;
- delay(200);
- a=_crol_(a,1);
- }
- P3=0xff;
- }
- }
- void nszs(uint t)//逆時針閃爍
- {
- uchar a,i;
- while(t--)
- {
- a=0x7f;
- for(i=0;i<8;i++)
- {
- P3=a;
- delay(200);
- a=_cror_(a,1);
- }
- P3=0xff;
- a=0x7f;
- for(i=0;i<8;i++)
- {
- P2=a;
- delay(200);
- a=_cror_(a,1);
- }
- P2=0xff;
- a=0x7f;
- for(i=0;i<8;i++)
- {
- P1=a;
- delay(200);
- a=_cror_(a,1);
- }
- P1=0xff;
- a=0x7f;
- for(i=0;i<8;i++)
- {
- P0=a;
- delay(200);
- a=_cror_(a,1);
- }
- P0=0xff;
- }
- }
- void djs1(uint t)//對角閃爍2個順時針
- {
- uchar i;
- uchar code table[]={0xf0,0xe1,0xc3,0x87,0x0f,0x1f,0x3f,0x7f,
- 0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf8,0xf0,
- 0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf8,
- 0xf0,0xe1,0xc3,0x87,0x0f,0x1f,0x3f,0x7f,0xff};
- while(t--)
- {
- for(i=0;i<17;i++)
- {
- P0=P2=table[i];
- P1=P3=table[i+17];
- delay(200);
- }
- for(i=0;i<17;i++)
- {
- P1=P3=table[i+17];
- P0=P2=table[i];
- delay(200);
- }
- }
- delay(300);
- P0=P1=P2=P3=0xff;
- }
- void djs2(uint t)//對角閃4個逆時針
- {
- uchar i;
- uchar code table[]={0x0f,0x87,0xc3,0xe1,0xf0,0x78,0x3c,0x1e,0x0f};
- while(t--)
- {
- for(i=0;i<9;i++)
- {
- P1=P2=P3=P0=table[i];
- delay(200);
- }
- }
- }
- void sxhx(uint t)//從上往下畫心
- {
- uchar code table[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,
- 0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};
- uint i;
- while(t--)
- {
- for(i=0;i<8;i++)
- {
- P0=table[i];
- P3=table[i+8];
- delay(200);
- }
- for(i=0;i<8;i++)
- {
- P1=table[i];
- P2=table[i+8];
- delay(200);
- }
- P1=P2=P3=P0=0xff;
- delay(300);
- }
- }
-
- void main()
- {
- while(1)
- {
- ycdl(1);
- ycxm(1);
- jgs(3);
- sszs(1);
- nszs(1);
- djs1(1);
- djs2(3);
- zys(3);
- sxhx(1);
- qs(3);
- }
- }
復(fù)制代碼 全部資料51hei下載地址:
心形流水燈設(shè)計報告.doc
(1.14 MB, 下載次數(shù): 86)
2019-4-3 10:57 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
心形流水燈設(shè)計報告.pdf
(1.2 MB, 下載次數(shù): 43)
2019-4-3 10:57 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|