單片機(jī)實(shí)例之跑馬燈_第1頁
單片機(jī)實(shí)例之跑馬燈_第2頁
單片機(jī)實(shí)例之跑馬燈_第3頁
單片機(jī)實(shí)例之跑馬燈_第4頁
單片機(jī)實(shí)例之跑馬燈_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、課題三(實(shí)例)課題三(實(shí)例) 之跑馬燈之跑馬燈n任務(wù)一 一只LED的閃爍n任務(wù)二 跑馬燈n任務(wù)三 任意變化的彩燈控制學(xué)習(xí)目標(biāo)學(xué)習(xí)目標(biāo) 知識目標(biāo)知識目標(biāo):nKeil uVision2 軟件的使用和調(diào)試方法。n掌握匯編語言與C語言的編寫方法和技巧。n 技能目標(biāo)技能目標(biāo):n能根據(jù)實(shí)際電路要求編寫閃爍LED程序。任務(wù)一 一只LED的閃爍n一、課題目標(biāo)一、課題目標(biāo) 本課題就是以發(fā)光二極管為例,用單片機(jī)控制8只發(fā)光二極管,實(shí)現(xiàn)逐個(gè)點(diǎn)亮、全亮、閃爍等花樣顯示。 為了便于理解,采用從簡單的單只發(fā)光二極管的點(diǎn)亮和熄滅控制開始,到實(shí)現(xiàn)八只發(fā)光二極管組成的各種樣式閃亮彩燈控制。圖3-1 LED顯示電路原理圖二、電路

2、原理二、電路原理圖3-2 八路發(fā)光二極管控制電路演示圖AT89S51 P1.0+Vcc單 片 機(jī) 的I/O端口 圖3-3 單片機(jī)驅(qū)動一只發(fā)光二極管的原理電路P1.0端口的LED閃亮三、程序設(shè)計(jì)0.5秒延時(shí)的匯編程序:MOV R6,#5SS:MOV R7, #200LOOP:MOV R5, #249DJNZ R5, $DJNZ R7,LOOPDJNZ R6,SS整個(gè)子程序延時(shí)為:2s249+1+2200+25=501010s匯編語言程序:org 0000hLS:setb p1.0Lcall delayclr P1.0Lcall delaysjmp $delay:mov R6,#5SS:MOV R

3、7, #200loop:mov R1,#245SD:DJNZ R1, SDDJNZ R7,loopDJNZ R6,SSretendn1、端口的定義 C51使用sfr命令來對單片機(jī)這些端口進(jìn)行定義,如: sfr P1 = 0 x90; 這條命令的作用就是定義了P1這個(gè)名稱(也可叫變量)代表了地址為90H的特殊功能寄存器。 匯編程序直接使用P1就可以,并且不分大小寫。例:MOV P1,#0FFH;MOV P1,#00H。 在程序命令中使用命令“sfr P1 = 0 x90;”這樣定義后,P1就代表了P1口,程序中就可以對單片機(jī)的P1口進(jìn)行讀寫操作了,如使用“Y=P1;”的命令將單片機(jī)P1口的狀態(tài)讀

4、入并存入變量Y中,而“P1=0 x02”則是P1口的P1.1置1。 同樣的方式,也可以定義其他端口。為了方便,C51將各個(gè)廠商生產(chǎn)的單片機(jī)的各個(gè)特殊功能寄存器的定義放在一個(gè)特殊的文件中,如AT89S51、AT89C51對應(yīng)的文件是AT89X51.H。作為通用的MCS-51系列單片機(jī),在編寫C程序,首先調(diào)用這些通用的REG51.H頭文件。n2、位定義 針對特殊功能寄存器的某一位進(jìn)行操作,則需要使用sbit命令定義特殊功能寄存器中的可尋址位。如要對AT89S51端口P1的P1.0進(jìn)行操作,則可以使用下面的命令進(jìn)行定義: sbit P10=P10; 然后就能使用“P10=1;”控制P1.0輸出高電平

5、,“P10=0;”控制P1.0輸出低電平。 圖3-4 1Hz的閃爍程序設(shè)計(jì)框圖輸出低電平輸出高電平程序開始延時(shí)0.5秒延時(shí)0.5秒n3、程序設(shè)計(jì)分析 在本任務(wù)的程序設(shè)計(jì)框圖就是圖3-4。從框圖中可看出兩點(diǎn),一是程序是一個(gè)循環(huán)結(jié)構(gòu),即程序開始后就反復(fù)地循環(huán)執(zhí)行,二是程序包含了端口輸出控制和0.5秒的延時(shí)程序。 在本任務(wù)中的引腳定義使用如下命令: sbit light=P10; 命令定義了light表示P1口的P1.0端。 讓LED點(diǎn)亮,需要在引腳上輸出低電平,就是在P1.0引腳上輸出0,應(yīng)使用的命令是: light=0;(匯編:CLR P1.0) 同理,讓LED熄滅,應(yīng)使用的命令是: light

6、=1; (匯編:SETB P1.0) n4、延時(shí)程序的編寫 單片機(jī)執(zhí)行一條指令的執(zhí)行時(shí)間,稱為指令周期。指令周期是以機(jī)器周期為單位的,為14個(gè)機(jī)器周期,多數(shù)指令都是單周期指令,也就是執(zhí)行一條指令的時(shí)間為一個(gè)機(jī)器周期。在MCS-51單片機(jī)規(guī)定一個(gè)機(jī)器周期為單片機(jī)振蕩器的12個(gè)振蕩周期。如果晶振頻率為12MHz,則一個(gè)機(jī)器周期為1s。 單片機(jī)的指令運(yùn)行是很快的,要在端口獲得一定時(shí)間長度的脈沖信號,就要通過編寫程序,使單片運(yùn)行設(shè)計(jì)程序產(chǎn)生時(shí)間延遲,實(shí)現(xiàn)從單片機(jī)輸出端口上獲得需要頻率的電脈沖信號。 任務(wù)中要求獲得0.5s的時(shí)間長度,當(dāng)單片機(jī)的指令周期是1s時(shí),可計(jì)算出0.5s是1s的5000000倍,

7、在程序編寫中常用循環(huán)語句來完成計(jì)數(shù)和時(shí)間延遲,從而獲得需要的延時(shí)時(shí)間。 為了便于計(jì)算和控制,常采用無符號變量的循環(huán)來實(shí)現(xiàn)。因?yàn)槌绦驁?zhí)行時(shí),對應(yīng)的每次循環(huán)所需要的時(shí)間是兩個(gè)機(jī)器周期,當(dāng)單片機(jī)所使用的晶振為12MHz,每次循環(huán)就延時(shí)2s。 無符號數(shù)最大值為255,也就是說,使用無符號類型的變量的單個(gè)的循環(huán)最多為255次,即用一個(gè)循環(huán)不能完成所需要的0.5s延時(shí)。為了達(dá)到0.5s延時(shí),可采用多重循環(huán)的方式完成。為了方便,將其中的每重循環(huán)的循環(huán)次數(shù)取為0.5s/2s=25000的因數(shù)200、250和5。下面就是一個(gè)完成0.5秒延時(shí)的程序。void delay05s(void) unsigned cha

8、r i,j,k; for(i=5;i0;i-) for(j=200;j0;j-) for(k=250;k0;k-) ; 整個(gè)子程序延時(shí)為:2s2502005=500000s=0.5s。近似值,不準(zhǔn)確按圖3-5所對應(yīng)的主程序:sbit light=P10;void main(void) while(1) light=0; delay05s(); light=1; delay05s(); 圖3-5 1Hz的閃爍程序設(shè)計(jì)框圖輸出低電平輸出高電平程序開始延時(shí)0.5秒延時(shí)0.5秒C語言程序:語言程序:#include sbit light=P10;void delay05s(void) unsigned

9、 char i,j,k; for(i=5;i0;i-) for(j=200;j0;j-)for(k=250;k0;k-) ; void main(void) while(1) light=0; delay05s(); light=1; delay05s(); (一)(一)keil C51 windowskeil C51 windows集成開發(fā)平臺的使用集成開發(fā)平臺的使用 1keil C51 windows集成開發(fā)平臺介紹集成開發(fā)平臺介紹工具欄工具欄菜單欄菜單欄源文件編輯窗口源文件編輯窗口工程窗口工程窗口輸出窗口輸出窗口圖3-6 軟件窗口介紹2 2導(dǎo)入需要仿真的程序?qū)胄枰抡娴某绦?建立一個(gè)工

10、程項(xiàng)目芯片選擇 屬性設(shè)置 建立源程序文件 添加文件到當(dāng)前項(xiàng)目組中 編譯文件 KEIL 軟件開發(fā)平臺軟件開發(fā)平臺KEIL 軟件開發(fā)平臺軟件開發(fā)平臺圖3-7 新建工程窗口KEIL 軟件開發(fā)平臺軟件開發(fā)平臺圖3-8 新建工程窗口KEIL 軟件開發(fā)平臺軟件開發(fā)平臺圖3-9 單片機(jī)選擇窗口KEIL 軟件開發(fā)平臺軟件開發(fā)平臺圖3-10 目標(biāo)1屬性設(shè)置窗口KEIL 軟件開發(fā)平臺軟件開發(fā)平臺圖3-11 目標(biāo)1輸出窗口設(shè)置KEIL 軟件開發(fā)平臺軟件開發(fā)平臺圖3-12 調(diào)試窗口設(shè)置KEIL 軟件開發(fā)平臺軟件開發(fā)平臺圖3-13 軟件輸入窗口KEIL 軟件開發(fā)平臺軟件開發(fā)平臺圖3-14 目標(biāo)1添加窗口KEIL 軟件開

11、發(fā)平臺軟件開發(fā)平臺圖3-15 目標(biāo)1添加文件窗口(二)(二) Keil Keil 程序調(diào)試程序調(diào)試 1 1程序調(diào)試時(shí)的常用窗口程序調(diào)試時(shí)的常用窗口 u 編譯文件界面 KEIL 軟件開發(fā)平臺軟件開發(fā)平臺圖3-16 編輯文件界面調(diào)試程序窗口 字母字母C C:代碼存儲空間:代碼存儲空間D D:直接尋址的片內(nèi)存儲空間:直接尋址的片內(nèi)存儲空間I I:間接尋址的片內(nèi)存儲空間:間接尋址的片內(nèi)存儲空間X X:擴(kuò)展的外部:擴(kuò)展的外部RAMRAM空間空間“數(shù)字?jǐn)?shù)字”:想要查看的地址。:想要查看的地址。KEIL 軟件開發(fā)平臺軟件開發(fā)平臺圖3-17 代碼查詢窗口工程窗口寄存器頁工程窗口寄存器頁 KEIL 軟件開發(fā)平臺

12、軟件開發(fā)平臺圖3-18 工程寄存器窗口2 2各種窗口在程序調(diào)試中的用途各種窗口在程序調(diào)試中的用途 程序調(diào)試界面程序調(diào)試界面 KEIL 軟件開發(fā)平臺軟件開發(fā)平臺圖3-19 程序調(diào)試窗口I/O端口界面端口界面 KEIL 軟件開發(fā)平臺軟件開發(fā)平臺圖3-20 硬件查詢窗口I/O口全部打開界面口全部打開界面 KEIL 軟件開發(fā)平臺軟件開發(fā)平臺圖3-21 硬件I/0口查詢窗口打開后的打開后的InterruptInterrupt窗口窗口 KEIL 軟件開發(fā)平臺軟件開發(fā)平臺圖3-22 P3口查詢窗口串口設(shè)置串口設(shè)置 KEIL 軟件開發(fā)平臺軟件開發(fā)平臺圖3-23 串口查詢窗口打開后的串口窗口打開后的串口窗口 K

13、EIL 軟件開發(fā)平臺軟件開發(fā)平臺圖3-24 串口窗口定時(shí)器設(shè)置定時(shí)器設(shè)置 KEIL 軟件開發(fā)平臺軟件開發(fā)平臺圖3-25 定時(shí)器窗口打開后的定時(shí)器打開后的定時(shí)器1 1窗口窗口 KEIL 軟件開發(fā)平臺軟件開發(fā)平臺圖3-26 硬件I/0口查詢窗口常用的調(diào)試按鈕常用的調(diào)試按鈕 復(fù)位按鈕,按復(fù)位按鈕,按下后,所有的下后,所有的系統(tǒng)狀態(tài)將變系統(tǒng)狀態(tài)將變成初始狀態(tài)。成初始狀態(tài)。 全速運(yùn)全速運(yùn)行行 進(jìn)入循環(huán)并進(jìn)入循環(huán)并單步執(zhí)行單步執(zhí)行 停止全速運(yùn)行停止全速運(yùn)行 跳過循環(huán)并單跳過循環(huán)并單步執(zhí)行步執(zhí)行 跳出單步執(zhí)行跳出單步執(zhí)行過程過程 執(zhí)行到斷點(diǎn)處執(zhí)行到斷點(diǎn)處 KEIL 軟件開發(fā)平臺軟件開發(fā)平臺圖3-27 調(diào)試按

14、鈕二、ISP軟件的使用 n打開下載軟件,雙擊目錄下的文件打開下載軟件,雙擊目錄下的文件ISPgm.exeISPgm.exe,打開軟件進(jìn)入軟件使用界面打開軟件進(jìn)入軟件使用界面n1 1芯片選擇:左擊界面右面芯片選擇窗口的芯片選擇:左擊界面右面芯片選擇窗口的下拉箭標(biāo),選擇編程芯片的型號。下拉箭標(biāo),選擇編程芯片的型號。n2 2導(dǎo)入導(dǎo)入hexhex文件到緩沖區(qū):左擊界面上的文件到緩沖區(qū):左擊界面上的“Open FileOpen File”按鈕,選擇本目錄下的按鈕,選擇本目錄下的hexhex文件。文件。n3 3向芯片寫入文件:左擊界面上的向芯片寫入文件:左擊界面上的“WriteWrite”按鈕,開始編程向

15、芯片寫入程序。按鈕,開始編程向芯片寫入程序。n4 4完成寫入編程。完成寫入編程。n5 5退出程序:左擊界面右上角的退出程序:左擊界面右上角的“x x”按鈕,按鈕,退出此程序。退出此程序。KEIL 軟件開發(fā)平臺軟件開發(fā)平臺任務(wù)二跑馬燈本任務(wù)讓圖3-28中的LED依次點(diǎn)亮圖3-28 LED硬件圖n程序設(shè)計(jì)分析 為了讓圖3-28所示的LED依次點(diǎn)亮,就是要求從P1口從P1.0至P1.7依次輸出低電平,其余引腳都輸出高電平,就能讓被接在端口的彩燈依次點(diǎn)亮。 從輸出的具體的數(shù)據(jù)來看,第一個(gè)LED點(diǎn)亮需要的輸出數(shù)據(jù),是對應(yīng)于P1.0的位為0,其余位為1,組合為一個(gè)字節(jié)時(shí)對應(yīng)的二進(jìn)制位從高到低為:1111

16、1110,即十六進(jìn)制數(shù)0 xFE;同理,第二個(gè)LED點(diǎn)亮對應(yīng)的數(shù)為:1111 1101,化為十六進(jìn)制數(shù)為0 xFD。 依次類推,逐次點(diǎn)亮LED所對應(yīng)的數(shù)據(jù)為: 1111 1110、1111 1101、1111 1011、1111 0111、 1110 1111、1101 1111、1011 1111、0111 1111。 從這些數(shù)據(jù)上,可以看出一個(gè)規(guī)律,就是這些數(shù)據(jù)中的二進(jìn)制數(shù)0的位置依次往左移動了一位。在C51中,要直接實(shí)現(xiàn)數(shù)據(jù)的這種計(jì)算是不容易的。 根據(jù)前面的分析,實(shí)現(xiàn)任務(wù)的思路是:程序開始時(shí),給某一變量賦初始值0 xFE,然后每次將數(shù)據(jù)左移后送入P1口直到所有循環(huán)次數(shù)輸出完畢,再次重復(fù)整

17、個(gè)過程。根據(jù)思路得出的程序框圖如圖3-29所示。圖3-29 程序流程圖#include reg51.h#include intrins.h#define uchar unsigned char#define uint unsigned intvoid mDelay(unsigned int Delay) unsigned int i;for(;Delay0;Delay-) for(i=0;i0;Delay-) for(i=0;i124;i+);void main() unsigned char OutData=0 xfe; while(1) for(j=0;j7;j+) P1=OutData;

18、OutData=_crol_(OutData,1); /循環(huán)左移循環(huán)左移 mDelay(1000); /*延時(shí)延時(shí)1000 毫秒毫秒*/for(k=0;k7;k+)P1=OutData; OutData=_cror_(OutData,1); /循環(huán)右移循環(huán)右移 mDelay(1000); /*延時(shí)延時(shí)1000 毫秒毫秒*/ 任務(wù)三任意變化的彩燈控制任務(wù)三任意變化的彩燈控制本任務(wù)實(shí)現(xiàn)讓彩燈顯示出規(guī)定的任意的花樣。n程序設(shè)計(jì)分析 由于本任務(wù)中是按時(shí)間變化依次控制彩燈亮、滅,可以采用跑馬燈類似的思路來完成程序框圖,但顯示花樣所對應(yīng)的數(shù)據(jù)的變化不一定有規(guī)律,不能采用變量直接計(jì)算的方式實(shí)現(xiàn)前后數(shù)據(jù)的變化

19、,這里介紹一種很重要的程序設(shè)計(jì)方法查表法。 將彩燈顯示的圖案所對應(yīng)的端口輸出數(shù)據(jù)依次編寫為一張數(shù)據(jù)表,表中每個(gè)數(shù)據(jù)中為0的位表示對應(yīng)的彩燈亮,數(shù)據(jù)為1的位表示對應(yīng)的彩燈熄。將這張數(shù)據(jù)表放在程序中,以數(shù)組的形式存儲,在使用時(shí)依次讀出數(shù)組中的元素就得到了需要的數(shù)據(jù),實(shí)現(xiàn)了數(shù)據(jù)的無規(guī)律變化,并且數(shù)組存儲的數(shù)據(jù)可以較多,能實(shí)現(xiàn)的花樣變化也可以做到比較繁復(fù)。在C51中要進(jìn)行復(fù)雜的計(jì)算,也可以采用數(shù)組的方式來實(shí)現(xiàn),比如:一個(gè)周期正弦值的計(jì)算,可以先將這些列在表中,需要時(shí)查表讀出,這就是查表法。圖2-6 采用數(shù)組的彩燈控制程序框圖 將用于點(diǎn)亮彩燈的數(shù)據(jù)放在數(shù)組中,讓程序依次讀這數(shù)組中的數(shù)據(jù),并將數(shù)據(jù)送到端口

20、,控制彩燈的點(diǎn)亮,就實(shí)現(xiàn)了任意規(guī)律變化彩燈控制。假設(shè)有N個(gè)數(shù)據(jù),當(dāng)程序讀完N個(gè)數(shù)據(jù)后,又從頭開始讀數(shù)。具體的程序框圖如圖2-6所示。 具體完整例程詳見Keil軟件操作。nC語言程序:#include unsigned char code table=0 xfe,0 xfd,0 xfb,0 xf7,0 xef,0 xdf,0 xbf,0 x7f,0 xfe,0 xfd,0 xfb,0 xf7,0 xef,0 xdf,0 xbf,0 x7f,0 x7f,0 xbf,0 xdf,0 xef,0 xf7,0 xfb,0 xfd,0 xfe,0 x7f,0 xbf,0 xdf,0 xef,0 xf7,0 xfb,0 xfd,0 xfe,0 x00,0 xff,0 x00,0 xff,0 x01;unsigned char i;void delay(void)unsigned char m,n,s;for(m=

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論