版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、,單片機C語言應用技術與實踐 講課稿,項目4 LED廣告燈設計, 知識目標: 1. 單片機I/O端口及端口的基本應用; 2. 單片機C語言的基本結構及設計方法; 3. 程序對單片機端口的控制方法。 能力目標: 1. 能根據(jù)設計任務要求編制程序流程圖,理解程序對發(fā)光二極管的控制原理; 2. 會利用繪制流水廣告燈電路原理圖; 3. 會用keil C51軟件對源程序進行編譯調試及與protues軟件聯(lián)調,實現(xiàn)電路仿真。,任務1 流水廣告燈的設計,廣告燈是一種常見的裝飾,常用于街上的廣告及舞臺裝飾等場合。最簡單的流水廣告燈就是各個燈依次發(fā)光。本任務利用AT89S51單片機來實現(xiàn)這一功能。 用AT89S
2、51的P1口做輸出口,接八只發(fā)光二極管D1、D2、D3、D4、D5、D6、D7、D8,編寫程序,使發(fā)光二級管循環(huán)點亮,時間間隔為0.2s。即剛開始時D1點亮,延時0.2s后,接著是D2點亮,接著依次點亮D3、D4、D5、D6、D7、D8,然后再點亮D7、D6、D5、D4、D3、D2、D1,重復循環(huán)。,項目一、流水廣告燈的設計,介紹發(fā)光二極管: 通常紅色(貼片)二極管LED:電壓1.6V2.4V,電流220mA,在25mA亮度有所變化,5mA以上亮度基本無變化,可以求出電阻阻值大概在150-1.5K之間變化,硬件電路設計 電路組成。這里選擇具有內(nèi)部程序存儲器的AT89S51單片機作為控制電路,其
3、P1口接8個發(fā)光二極管(LED)和8個限流電阻,電路如圖所示。,任務1 流水廣告燈的設計,硬件電路分析 要使LED點亮,則P1口的對應端子輸出低電平,即P1.00時,D1亮。一般情況下,驅動LED的電流約10mA左右,而LED本身的壓降為2V。當P1.0輸出為低電平時,輸出為0V,則流經(jīng)D1的電流為,為了在仿真實驗中讓LED更亮一些,在這里取限流電阻為100。相反,當P1.0輸出為高電平時,輸出電壓為5V,則流經(jīng)D1的電流為0mA,D1不亮(熄滅),即P1.01時,D1不亮(熄滅)。,任務1 流水廣告燈的設計,點亮第一個D1發(fā)光二極管 #include /52系列單片機頭文件 sbit led
4、1=P10; /聲明單片機P1口的第一位 void main() /主函數(shù) led1=0; /*點亮第一個發(fā)光二極管*/ ,任務1 流水廣告燈的設計,點亮第1、3、5、7發(fā)光二極管 #include /52系列單片機頭文件 void main() /主函數(shù) P1=0 xaa; ,任務1 流水廣告燈的設計,點亮第1、3、5、7發(fā)光二極管 #include /52系列單片機頭文件 void main() /主函數(shù) P1=0 xaa; 一個完整點亮第一個發(fā)光二極管的程序 #include /52系列單片機頭文件 void main() /主函數(shù) P1=0 xfe; While(1); /注意比較前面
5、的寫法 ,任務1 流水廣告燈的設計,編寫一個讓D1以間隔1S亮滅閃爍的程序 #include /52系列單片機頭文件 #define uint unsigned int /宏定義 sbit led1=P10; /聲明單片機P1口的第一位 uint i,j; void main() /主函數(shù) while(1) /大循環(huán) led1=0; /*點亮第一個發(fā)光二極管*/ for(i=1;i0;i-)/延時 for(j=110;j0;j-); led1=1; /*關閉第一個發(fā)光二極管*/ for(i=1000;i0;i-)/延時 for(j=110;j0;j-); ,任務1 流水廣告燈的設計,說明:延時
6、程序,設f0=11.0592MHZ,每執(zhí)行 一次for語句所需時間1.09us,根據(jù)實驗得出在 保持內(nèi)for語句數(shù)值不變,只要改變外for語句的 數(shù)值,就可以得出所需的延時時間為ms級,一 般定義延時程序變量的數(shù)據(jù)類型為無符號整型數(shù) 據(jù),最大為65536,若為無符號字符型只能最大 255,這個關系只有在數(shù)據(jù)類型為無符號整型數(shù) 據(jù)才成立,原因是這兩種變量在運行的時間不一 樣。,任務1 流水廣告燈的設計,延時程序說明,#define 宏定義指令 格式:#define 新名稱 原內(nèi)容 后面無分號 #define uint unsigned int 前面的程序中出現(xiàn)延時程序相同重復,可以把該重復部分用
7、一個 函數(shù)形式來描述,到時直接調用,即子函數(shù)的應用。 說明:子函數(shù)可以寫在主函數(shù)的前面或者后面,但是不可以寫在 主函數(shù)體內(nèi),當子函數(shù)寫在主函數(shù)后面,必須在主函數(shù)之前聲明 子函數(shù)。 聲明方法:將返回值特性、函數(shù)名、及后面的小括號完全復制。 若無參數(shù),則小括號內(nèi)為空,若有參數(shù)函數(shù),則括號依次寫上 參數(shù)類型,參數(shù)類型之間用逗號隔開,最后在小括號加分號, 在主函數(shù)之前無需聲明。,任務1 流水廣告燈的設計,編寫一個讓D1以間隔500mS亮滅閃爍的程序 #include /52系列單片機頭文件 #define uint unsigned int /宏定義 sbit led1=P10; /聲明單片機P1口的
8、第一位 void delays();/聲明子函數(shù) void main() /主函數(shù) while(1) /大循環(huán) led1=0; /*點亮第一個發(fā)光二極管*/ delays(); /調用延時子函數(shù) led1=1; /*關閉第一個發(fā)光二極管*/ delays();/調用延時子函數(shù) void delays()/子函數(shù)體 uint i,j; for(i=500;i0;i-) for(j=110;j0;j-); 不帶參數(shù)函數(shù)的編寫程序。,任務1 流水廣告燈的設計,編寫一個讓D1點亮500ms、熄滅300ms的程序 void delayms(unsigned int xms) unsigned int i
9、,j; for(i=xms;i0;i-) /i=xms即延時約xms毫秒 for(j=110;j0;j-); 帶參數(shù)函數(shù)的寫法,任務1 流水廣告燈的設計,編寫一個讓D1以亮200ms、滅800ms的方式閃動 #include /52系列單片機頭文件 #define uint unsigned int /宏定義 sbit led1=P10; /聲明單片機P1口的第一位 void delayms(uint);/聲明子函數(shù) void main() /主函數(shù) while(1) /大循環(huán) led1=0;/*點亮第一個發(fā)光二極管*/ delayms(200);/延時200毫秒 led1=1;/*關閉第一個
10、發(fā)光二極管*/ delayms(800);/延時800毫秒 void delayms(uint xms) uint i,j; for(i=xms;i0;i-) /i=xms即延時約xms毫秒 for(j=110;j0;j-); ,任務1 流水廣告燈的設計,軟件設計思路(循環(huán)點亮) P1口輸出電平分析。P1口的每一位都接有一個LED,要實現(xiàn)流水燈功能,就是要讓各個LED依次點亮一段時間,再熄滅一段時間,然后再點亮下一個LED一段時間,然后再熄滅一段時間,如此循環(huán)。換句話來說,就是讓P1口周而復始地輸出高電平和低電平,要實現(xiàn)這一功能,最簡單和最直接的方法是依次將數(shù)據(jù)送往P1口,每送一個數(shù)據(jù)延時一段
11、時間。根據(jù)上述分析,列出一個功能表,如表所示。,任務1 流水廣告燈的設計,任務1 流水廣告燈的設計,從表可以看出,要實現(xiàn)設計任務功能,P1口輸出的8個數(shù)據(jù)分別是11111110B、11111101B、11111011B、11110111B、11101111B、11011111B、10111111B、011111111B,轉化成十六進制分別是0 xfe、0 xfd、0 xfb、0 xf7、0 xef、0 xdf、0 xbf和0 x7f。送完這8個數(shù)據(jù)后再反過來送011111111B 、10111111B、11011111B、11101111B、11110111B、11111011B、111111
12、01B、11111110B,轉化成十六進制分別是0 x7f 、0 xbf 、0 xdf、0 xef、0 xf7、0 xfb、0 xfd和0 xfe。送完后從頭開始循環(huán)。,任務1 流水廣告燈的設計,如何采用單片機C語言編程實現(xiàn)數(shù)據(jù)從輸出P1口呢?從這些數(shù)據(jù)來看,有這么一個規(guī)律,D1至D8依次點亮時,就是數(shù)據(jù)中的二進制0的位置依次往左移動了1位,D8至D1依次點亮時,就是往右依次移動1位。在單片機C51中,要直接實現(xiàn)數(shù)據(jù)的這種計算是不容易的,如果將數(shù)據(jù)的所有二進制取反后,D1至D8依次點亮時的數(shù)據(jù)就變成了:0 x01、0 x01、0 x04、0 x08、0 x10、0 x20、0 x40、0 x8
13、0,也就是后一個數(shù)是在前一個數(shù)的基礎上乘以2(或者直接左移1位)。,任務1 流水廣告燈的設計,根據(jù)前面分析,實現(xiàn)任務的思路是:程序開始時,給某一個變量賦初始值0 x01,并從端口輸出反碼,延時一段時間后,讓顯示變量左移1位,再次輸出反碼并延時,直到輸出所有左移數(shù)據(jù)為止,接下來就實現(xiàn)右移數(shù)據(jù)輸出完畢,再次重復整個過程。,任務1 流水廣告燈的設計,延時程序編寫。單片機程序的延時有兩種,一種是軟件延時,一種是硬件延時,在這里我們重點討論軟件延時。當系統(tǒng)加電后,單片機就開始工作,按照設計的程序開始運行(也稱執(zhí)行指令)。單片機執(zhí)行一條指令要花一定的時間,那么單片機執(zhí)行一條指令的執(zhí)行時間成為指令周期。指令
14、周期是以機器周期為單位的。MCS-51單片機規(guī)定,一個機器周期為單片機振蕩器的12個振蕩周期。如果單片機時鐘電路中的晶振頻率為12MHz,則一個機器周期為1us。,任務1 流水廣告燈的設計,單片機的指令運行速度是很快的,要想在端口獲得一定的延時時間,就要編寫程序,使單片機運行設計程序產(chǎn)生時間延遲。 任務中要求獲得0.2s的時間長度,當單片機的指令周期是1us時,0.2s就是1us的200 000倍。在程序編寫中常用循環(huán)語句來完成計數(shù)和時間延遲,從而獲得需要的延時時間。,任務1 流水廣告燈的設計,采用單片機C語言編寫的一個0.2s延時程序如下: void delay02s(void) / 定義延
15、時0.2s函數(shù) unsigned char i,j,k; / 聲明3個無符號字符型變量i、j、k for(i=2;i0;i-) / 外循環(huán)2次,每次約0.1s,延時0.2s for(j=200;j0;j-) / 外循環(huán)200次,每次約0.5ms,延時0.1s for(k=250;k0;k-) / 內(nèi)循環(huán)250次,每次約2us,延時05ms ; / 里面的循環(huán)的循環(huán)體什么也不做,但每次循環(huán)延時2us ,任務1 流水廣告燈的設計,上述程序可以簡化為: void delay02s(void) unsigned char i,j,k; for(i=2;i0;i-) for(j=200;j0;j-) f
16、or(k=250;k0;k-); 整個子程序延時為:2us2502002=200 000us=0.5s,任務1 流水廣告燈的設計, 思考: 如將延時改為1s,該怎樣修改程序呢?,任務1 流水廣告燈的設計,根據(jù)程序流程圖編寫的源程序如下: # include reg51.h / 包含頭文件 #define uchar unsigned char / 定義uchar為無符號數(shù)據(jù)類型 void delay02s(void) / 延時0.2s函數(shù) unsigned char i,j,k; for ( i=2;i0;i- ) for (j=200;j0;j- ) for (k=250;k0;k- );
17、void main (void) / 主函數(shù),任務1 流水廣告燈的設計, uchar i,j; / 定義變量 while (1) / 死循環(huán) j=0 x01; / j初始化為0 x01,左移初始值 for(i=0;i8;i+) / for循環(huán)語句,完成8個循環(huán) P1= j; / 對變量j 中的值按位取反后,從P1口輸出 delay02s( ); / 延時0.2s j= j1; / 左移1位 ,任務1 流水廣告燈的設計,j=0 x80; / 設置右移初始值j為0 x80 for (i=0;i1; / 右移1位 ,任務1 流水廣告燈的設計,程序調試與電路仿真 運行C語言編輯軟件,在編輯區(qū)中輸入上面
18、的源程序,并以“l(fā)sd4-1.c”為文件名存盤。 運行Keil C51,然后建立一個“l(fā)sd4-1.uv2”的工程項目。把源程序文件“l(fā)sd4-1.c”添加到工程項目中,進行編譯,得到目標代碼文件“l(fā)sd4-1.hex”。 運行Proteus,在編輯窗口中繪制如圖所示的電路圖并存盤。然后選中單片機AT89s51,左鍵點擊AT89s51,出現(xiàn)如圖4.2所示的對話框,在Program File后面的 “ ”按鈕,找到剛才編譯好的“l(fā)sd4-1.hex”文件,然后點擊“OK”就可以進行仿真了。點擊模擬調試按鈕的運行按鈕“”,進入 調試狀態(tài)。此時可看到D1點亮,延時0.2s后,接著是D2點亮,接著依次
19、點亮D3、D4、D5、D6、D7、D8,然后再點亮D7、D6、D5、D4、D3、D2、D1,重復循環(huán)。,任務1 流水廣告燈的設計,圖4.2 加載hex文件對話框,任務1 流水廣告燈的設計,利用C51庫函數(shù)實現(xiàn)流水燈,實現(xiàn)流水燈的方法很多 Keil軟件安裝文件夾,找到keilc51hlp文件夾,打開c51lib文件 找到_crol_函數(shù),雙擊打開,內(nèi)容顯示: c51中的intrins.h庫函數(shù) _crol_ 字符循環(huán)左移 _cror_ 字符循環(huán)右移 _irol_ 整數(shù)循環(huán)左移 _iror_ 整數(shù)循環(huán)右移 _lrol_ 長整數(shù)循環(huán)左移 _lror_ 長整數(shù)循環(huán)右移 _nop_ 空操作8051 NO
20、P 指令 _testbit_ 測試并清零位8051 JBC 指令,任務1 流水廣告燈的設計,函數(shù)名: 原 型: unsigned char _crol_(unsigned char C,unsigned char n); 功 能:_crol_,以位形式將C 循環(huán)左移n 位, 該函數(shù)有返回值、帶參數(shù),程序執(zhí)行完這個函數(shù)后,通過函數(shù) 內(nèi)部的某些運算得出一個新數(shù)值,最終將這個新數(shù)值返回給調 用的語句。,任務1 流水廣告燈的設計,利用C51自帶的庫函數(shù)_crol_,以間隔500ms,實現(xiàn)所有LED以流水燈的方式顯示。 #include /52系列單片機頭文件 #include #define uint
21、 unsigned int /宏定義 #define uchar unsigned char void delayms(uint);/聲明子函數(shù) uchar aa; void main() /主函數(shù) aa=0 xfe;/賦初值11111110 while(1) /大循環(huán) P1=aa; delayms(500); /延時500毫秒 aa=_crol_(aa,1);,任務1 流水廣告燈的設計,/將aa循環(huán)左移1位后再賦給aa void delayms(uint xms) uint i,j; for(i=xms;i0;i-) /i=xms 即 延 時約xms毫秒 for(j=110;j0;j-);
22、, 知識鏈接 1.文件包含處理 程序“l(fā)sd3-1.c”中的第一行# include reg51.h是一個文件包含處理。所謂文件包含是指一個文件將另外一個文件的內(nèi)容全部包含進來。這里程序中包含reg51.h文件的目的是為了要使用P1這個符號,即通知C編譯器,程序中所寫的P1是指AT89S51單片機的P1端口而不是其它變量。,任務1 流水廣告燈的設計,2. 單片機某個引腳的符號表示 以P1.0引腳為例。在C語言里,如果直接寫P1.0,C編譯器并不能識別,而且P1.0也不是一個合法的C語言變量名,所以得給它另起一個名字,這里起的名為P1_0,可是P1_0是不是就是P1.0呢?你這么認為,C編譯器可
23、不這么認為,所以必須給它們建立聯(lián)系,這里使用了C51的關鍵字sbit來定義,如: sbit P1_0=P10; / 定義用符號P1_0來表示P1.0引腳,也可以用其他的符號來表示。,任務1 流水廣告燈的設計,3C51程序的結構特點 (1)C51程序是由函數(shù)構成的。函數(shù)是C51程序的基本單位。 (2)一個函數(shù)由兩部分組成: 函數(shù)說明部分。包括函數(shù)名、函數(shù)類型、函數(shù)屬性、函數(shù)參數(shù)(形參)名、形式參數(shù)類型。一個函數(shù)名后面必須跟一個圓括號,函數(shù)參數(shù)可以沒有,如main( )。 函數(shù)體。即函數(shù)說明下面的大括號之內(nèi)的部分。 (3)一個C51程序總是從main函數(shù)開始執(zhí)行,而不論main函數(shù)在整個程序中所處
24、的位置如何。,任務1 流水廣告燈的設計,(4)C51程序書寫格式自由,一行內(nèi)可以寫幾個語句,一個語句可以分寫在幾行上。 (5)每個語句和數(shù)據(jù)定義的最后必須有一個分號“;”。分號是C51語句的必要組成部分。分號不可少,即使是程序中的最后一個語句也應包含分號。 (6)C51本身沒有輸入輸出語句。標準的輸入和輸出(通過串行口)是由scanf和printf等庫函數(shù)來完成的。對于用戶定義的輸出,比如直接以輸出端口讀取鍵盤輸入和驅動LED,則需要自行編制輸出函數(shù)。,任務1 流水廣告燈的設計,(7)可以用/*/對C51程序中的任何部分作注釋。在Keil uVision 2中,還可以使用/進行單行注釋。 4.
25、 位運算符 程序中“j= j1;”語句中的表示左移、右移運算符。表明將j中的值左移、右移1位,得到新的數(shù)值后,再將該值賦給j。,任務1 流水廣告燈的設計,作業(yè) 修改程序lsd3-1.c,使8只發(fā)光二極管按2Hz的頻率閃爍。 修改程序lsd3-1.c,使D1、D3、D5、D7按10Hz的頻率依次點亮。,任務1 流水廣告燈的設計,1.任務要求 如圖所示,編寫程序使發(fā)光二極管按時間依次顯示出規(guī)定的花樣,但其對于控制的顯示數(shù)據(jù)之間沒有規(guī)律,不能通過計算的方式得到。,任務2 任意變化廣告燈的設計,2.分析任務 由于本任務中是按時間變化依次控制LED亮、滅,可以采用與流水廣告燈的思路來完成程序的編寫,但顯
26、示花樣所對應的數(shù)據(jù)的變化不一定有規(guī)律,不能采用變量直接計算的方式實現(xiàn)前后數(shù)據(jù)的變化。因此,在這里采用查表法來實現(xiàn)。,任務2 任意變化廣告燈的設計,將廣告燈顯示的圖案所對應的端口輸出數(shù)據(jù)依次編寫為一張數(shù)據(jù)表,表中每個數(shù)值中為的位表示對應的廣告燈亮,數(shù)據(jù)為的位表示為應的廣告燈滅。將這張數(shù)據(jù)表放在程序中,以數(shù)組的形式存儲,在使用時依次讀出組中的元素就得到需要的數(shù)據(jù),實現(xiàn)了數(shù)據(jù)的無規(guī)律變化,并且數(shù)組存儲的數(shù)據(jù)可以較多,能實現(xiàn)的花樣變化也可以復雜。,任務2 任意變化廣告燈的設計,在C51中要進行復雜計算,也可以采用數(shù)組的方式來實現(xiàn),比如:一個周期正弦值的計算,可以先將這些列在表中,需要時查表讀出,這就是
27、查表法。 將用于點亮廣告燈的數(shù)據(jù)入在數(shù)組中,讓程序依次讀這數(shù)組中的數(shù)據(jù),并將數(shù)據(jù)送到端口,控制廣告燈的點亮就實現(xiàn)了任意規(guī)律變化廣告的控制。假設有個數(shù)據(jù),當程序讀完個數(shù)據(jù)后,又從頭開始讀數(shù),具體的程序流程圖如圖4.3所示。,任務2 任意變化廣告燈的設計,任務2 任意變化廣告燈的設計,3. 源程序編寫 /* 文件名 lsd4-2.c*/ #include reg51.h /包含頭文件 #define uchar unsigned char / 設置變量類型 uchar discode8=0 x7e,0 xbd,0 xdb,0 xe7,0 xdb,0 xbd,0 x7e,0 xff; /*定義顯示花樣數(shù)據(jù)的數(shù)組*/ void delay02s(void) / 延時時間 unsigned char i,j,k; for(i=2;i0;i-),任務2 任意變化廣告燈的設計,for(j=200;j0;j-) for(k=250;k0;k-); void main(void) / 主函數(shù) uchar i; / 定義變量 w
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年黃陂區(qū)教育局聘用制教師公開招聘27人備考題庫有答案詳解
- 金融風險評估與防范工具集
- 技能競賽與挑戰(zhàn)活動體驗方案
- 營銷郵件撰寫與發(fā)送標準化工具
- 企業(yè)財務成本核算標準流程模板
- 農(nóng)村合作社特色農(nóng)產(chǎn)品銷售代理協(xié)議
- 換拱施工方案(3篇)
- 新款式施工方案(3篇)
- 施工方案組織程序(3篇)
- 暑假教育活動策劃方案(3篇)
- 2026年鄭州鐵路職業(yè)技術學院單招職業(yè)傾向性考試題庫及參考答案詳解
- DB35-T 2278-2025 醫(yī)療保障監(jiān)測統(tǒng)計指標規(guī)范
- 長沙股權激勵協(xié)議書
- 心源性腦卒中的防治課件
- 2025年浙江輔警協(xié)警招聘考試真題含答案詳解(新)
- 果園合伙經(jīng)營協(xié)議書
- 節(jié)能技術咨詢合同范本
- 物業(yè)管理經(jīng)理培訓課件
- 員工解除競業(yè)協(xié)議通知書
- 【語文】太原市小學一年級上冊期末試題(含答案)
- 儲能電站員工轉正述職報告
評論
0/150
提交評論