單片機I/O的應用最典型的是通過I/O口與7段LED數碼管構成顯示電路,我們從常用的LED顯示原理開始,詳盡講解利用單片機驅動LED數碼管的電路及編程原理,目的在於通過這一編程範例,讓初學者了解I/O口的編程原理,意在起舉一反三,拋磚引玉的作用。
LED數碼管根據LED的接法不同分為共陰和共陽兩類,了解LED的這些特性,對編程是很重要的,因為不同類型的數碼管,除了它們的硬體電路有差異外,編程方法也是不同的。右圖是共陰和共陽極數碼管的內部電路,它們的發光原理是一樣的,只是它們的電源極性不同而已。 將多隻LED的陰極連在一起即為共陰式,而將多隻LED的陽極連在一起即為共陽式。以共陰式為例,如把陰極接地,在相應段的陽極接上正電源,該段即會發光。當然,LED的電流通常較小,一般均需在迴路中接上限流電阻。假如我們將"b"和"c"段接上正電源,其它端接地或懸空,那麼"b"和"c"段發光,此時,數碼管顯示將顯示數字“1”。而將"a"、"b"、"d"、"e"和"g"段都接上正電源,其它引腳懸空,此時數碼管將顯示“2”。其它字元的顯示原理類同,讀者自行分析即可。 | | | 左圖為實驗電路圖,我們使用80C51單片機,電容C1、C2和CRY1組成時鐘振蕩電路,這部分基本無需調試,只要元件可靠即會正常起振。C3和R1為單片機的複位電路,80C51的并行口P1.0-P1.7直接與LED數碼管的"a-f"引腳相連,中間接上限流電阻R3-R10。值得一提的是,80C51并行口的輸出驅動電流並非很大,為使LED有足夠的亮度,LED數碼管應選用高亮度的器件。 此外,圖中的80C51還可選用C51系列的其它單片機,只要它們的指令系統兼容C51即可正常運行,程序可直接移植,例如選用低價Flash型的AT89C1051或2051等,它們的ROM可反覆擦寫,非常適合作實驗用途。 | · 程序清單: 01 START: ORG 0100H ;程序起始地址 02 MAIN: MOV R0,#00H ;從“0”開始顯示 03 MOV DPTR,#TABLE ;表格地址送數據指針 04 DISP: MOV A,R0 ;送顯示 05 MOVC A,@A+ADPTR ;指向表格地址 06 MOV P1,A ;數據送LED 07 ACALL DELAY ;延時 08 INC R0 ;指向下一個字元 09 CJNE R0,#0AH,DISP ;未顯示完,繼續 10 AJMP MAIN ;下一個循環 11 DELAY: MOV R1,#0FFH ;延時子程序,延時時間賦值 12 LOOP0: MOV R2,#0FFH 13 LOOP1: DJNZ R2,LOOP1 14 DJNZ R1,LOOP0 15 RET ;子程序返回 16 TABLE: DB 0C0H ;字型碼錶 17 DB 0F9H 18 DB 0A4H 19 DB 0B0H 20 DB 99H 21 DB 92H 22 DB 82H 23 DB 0F8H 24 DB 80H 25 DB 90H 26 END ;程序結束 | |