易禮智
( 湖南工程職業(yè)技術(shù)學(xué)院 信息工程系,湖南 長沙 410151 )
本流水燈控制系統(tǒng)由電阻、發(fā)光二極管、單片機(jī)最小系統(tǒng)(proteus 仿真時(shí)省略電源、晶振、復(fù)位等電路)和必要的軟件。其具體硬件組成如圖1 所示。
從硬件中可發(fā)現(xiàn),從p1.0 輸出低電平時(shí)D1 亮,p1.0輸出高電平時(shí)D1 熄;同理,接在p1.1~p1.7 口的其他7 個(gè)LED 的點(diǎn)亮和熄滅的方法同D1。因此,將D1~D8 依次點(diǎn)亮、熄滅,8 個(gè)LED 將一亮一熄實(shí)現(xiàn)流水燈。
該代碼包含了main()和msec()兩個(gè)函數(shù)[1],main()為主程序,msec()為1s 延時(shí)子程序。feH 根據(jù)C51單片機(jī)硬件連接進(jìn)行確定,表示給P1 口的p1.0 賦了一個(gè)低電平,其他的為高電平。賦值后調(diào)用子程序msec(),調(diào)用中將實(shí)參1000 傳遞給被調(diào)用函數(shù)msec的形參x。
該代碼的主函數(shù)main()中,for 語句的表達(dá)式用來描述循環(huán)的次數(shù)即小燈的個(gè)數(shù)。在硬件電路中C51 單片機(jī)的引腳輸出低電平時(shí),燈亮;反之,燈熄。D1~D8 循環(huán)亮的過程通過a=0xfe 和p1=~(a<2.3.數(shù)組
這段代碼定義了一個(gè)一維數(shù)組{0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f},數(shù)組中的元素根據(jù)流水燈的工作過程來確定。語句 p1=a[i]表示將數(shù)組中元素的內(nèi)容依次送給P1 口。
用二維數(shù)組描述代碼:語句uint a[2][4]={{0xfe,0xfd,0xfb,0xf7},{0xef,0xdf,0xbf,0x7f}}描述數(shù)組元素;在循環(huán)嵌套中采用語句p1=a[i][s]將數(shù)組中元素的內(nèi)容依次送給P1 口。
在這個(gè)代碼中通過指針直接賦值來實(shí)現(xiàn)流水燈。在主函數(shù)main()中,語句p=&a 表示把a(bǔ) 的地址送給p,經(jīng)過賦值后指針變量p 就指向了變量a。語句p1=*p 表示把變量a 里面的內(nèi)容送給p1 口。
用一維數(shù)組指針描述代碼:用語句 uint a[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}描述依次送給P1 口的各個(gè)數(shù)據(jù),在函數(shù)main()中,采用語句uint *p=a 表示指針變量p 指向數(shù)組a 的起始地址,語句p1=*(p+i)表示將數(shù)組a 中的數(shù)據(jù)依次送給P1。
用二維數(shù)組指針描述代碼,uint a[2][4]={{0xfe,0xfd,0xfb,0xf7},{0xef,0xdf,0xbf,0x7f}}描述依次送給P1 口的各個(gè)數(shù)據(jù);在主函數(shù)main()中,語句uint (*p)[4]表示指針變量p 指向一個(gè)包含4 個(gè)元素的一維數(shù)組;語句p=a 表示指針變量p 指向二維數(shù)組的第0 行的首地址,也就是 a[0][0]的起始地址;語句p1=*(*(p+i)+s)描述將二維數(shù)組中 a[i][s]的內(nèi)容傳送給P1。
在這個(gè)代碼中:傳送數(shù)據(jù)的方式采用數(shù)組的形式(給 P1 賦值也可采用本文中的其他方式),通過使用C51 單片機(jī)的定時(shí)/計(jì)數(shù)器實(shí)現(xiàn)流水燈工作中的延時(shí)。在晶振為11.0592MHZ 時(shí),C51 單片機(jī)的機(jī)器周期[2]為 1us。本段代碼通過查詢 TF0 是否為“1”對重復(fù)20 次計(jì)數(shù)5000us 是否完成進(jìn)行判斷。
在這段代碼中,傳送數(shù)據(jù)的方式采用數(shù)組[3]的形式(給 P1 賦值也可采用本文中的其他方式)。通過同時(shí)使用C51 單片機(jī)的定時(shí)/計(jì)數(shù)器與中斷系統(tǒng)來實(shí)現(xiàn)流水燈工作中的延時(shí)。定時(shí)/計(jì)數(shù)器定時(shí)50000us后,提出中斷請求;在中斷服務(wù)函數(shù)timer0()中,語句if(++i==20)中的i 對中斷的次數(shù)進(jìn)行計(jì)數(shù)。
針對51 單片機(jī)實(shí)現(xiàn)流水燈的控制,上述編程方法從不同的角度提供了關(guān)鍵的代碼;在實(shí)際應(yīng)用中,需將代碼完善為完整程序。在實(shí)際應(yīng)用中,“定時(shí)+中斷”方式可與“直接賦值”、“數(shù)據(jù)移位”、“數(shù)組”、“指針”、“定時(shí)計(jì)數(shù)器”五種方式中的某一種進(jìn)行組合。通過對一個(gè)對象進(jìn)行多種編程描述,能有效提高電子、編程愛好者的學(xué)習(xí)興趣,提高動(dòng)手能力和解決實(shí)際問題的能力。
[1] 譚浩強(qiáng).C 程序設(shè)計(jì)[M].北京:清華大學(xué)出版社,1991.
[2] 胡漢才.單片機(jī)原理及接口[M].北京:清華大學(xué)出版社,2004.
[3] 馬忠梅,籍順心,張凱,馬巖.單片機(jī)的 C 語言應(yīng)用程序設(shè)計(jì)[M].北京:北京航空航天大學(xué)出版社,2007.