官术网_书友最值得收藏!

  • 單片機原理及應用
  • 趙旭輝 楊靈主編
  • 2619字
  • 2021-09-27 12:50:18

3.2 使用并行接口點亮數碼管

課件 使用并行接口點亮數碼管

視頻 使用并行接口點亮數碼管

并行接口傳輸的特點就是數據同時發送,同時到達。單片機可以通過并行接口驅動數碼管、LCD顯示模塊等設備,將其運行狀態顯示出來,更好地方便用戶使用。

1.七段數碼管

七段數碼管也有人稱其為八段數碼管,它是由8個發光二極管組成的,其中7個長條形的發光二極管排列成中文“日”字形狀,另一個小圓點在右下角作為小數點使用。其結構示意圖如圖3-5所示。這種組合可以顯示0~9十個數字以及部分英文字母。

圖3-5 七段數碼管

數碼管由多段發光二極管彼此相連構成,這些二極管的連接方式有兩種:一種是共陰極連接方式,即各發光二極管的所有陰極連接在一起共同接地,此時當某個發光二極管的陽極為高電平時,該發光二極管會點亮;另一種是共陽極連接方式,與共陰極數碼管的連接方式正好相反,是所有發光二極管的陽極連接在一起共同接電源,此時當某個發光二極管的陰極為低電平時,該發光二極管會點亮。共陰極、共陽極數碼管的內部電路原理圖如圖3-6所示。

圖3-6 數碼管的內部電路原理圖

使用數碼管時,只需要將單片機的任一并行接口的8個引腳與數碼管引腳一一對應(并行接口的0號引腳對應數碼管的a段,1號引腳對應b段,以此類推)相連即可。通過并行接口輸出數據即可達到控制數碼管顯示內容的目的,如圖3-7所示。

圖3-7 使用P1口點亮一個數碼管

通常將控制數碼管顯示內容的8位字節數據稱為段選碼。不同的段選碼對應不同的數碼顯示。共陽極數碼管與共陰極數碼管的段選碼正好互補,見表3-2。

表3-2 七段數碼管的段選碼

注:表中字符都不帶小數點,故未涉及dp段狀態,與其對應引腳也未連接。

【課堂練習】通過P1口控制一個數碼管顯示數字5。電路原理圖見圖3-7。

【分析】圖3-7中所用的數碼管公共端接地即為共陰極數碼管。查表3-2可知,欲顯示數字5,其段選碼(共陰碼)為1101101(即6DH)。通過P1口輸出1101101就可控制該數碼管點亮。由此編寫出以下顯示數字5的驅動程序。

圖3-7中為數碼管連接了一個排阻,這其中的道理與點亮一個發光二極管時,需要串聯一個限流電阻用以保護發光二極管一樣。排阻是一排電阻的簡稱,實質上就是多個電阻。Proteus中排阻有兩種:一種是帶有公共端的,名稱為RESPACK;另一種是不帶公共端的,名稱為RX8。Proteus中七段數碼管的英文名稱為7SEG,共陽極為AN,共陰極為CAT。

將上述程序編譯后,導入單片機,單擊“仿真運行”按鈕,即可觀察到數碼管點亮。

2.精確調整的延時函數

課件 使用單片機控制數碼管顯示輸出數字

視頻 使用單片機控制數碼管顯示輸出數字

上例只是實現了一個數字的顯示,如果要讓數碼管從0顯示到9,且每隔50ms就變換一個數字又該怎么編寫程序呢?

將上面課堂練習的代碼簡單修改,在顯示每個數字后添加一個延時函數,就能簡單實現每隔50ms變換一個數字的效果。

這里涉及延時函數實現50ms時間間隔問題。延時函數的實質就是利用單片機每條指令執行的時長固定,且嚴格按時序執行的特點,讓它執行一些毫無意義的語句來耗費一點CPU的時間,以達到延緩系統運行的目的。要實現精確定時,必須依據振蕩頻率計算出機器周期的時長。

下面就介紹如何來精確地設定延時函數。

首先打開Keil,新建一個工程,選擇單片機為AT89C51,晶振頻率為12MHz,如圖3-8所示。

圖3-8 設定單片機的主頻為12MHz

延時函數的代碼如下所示:

在這個延時函數中,會接收一個參數x,它就是要延時的時長,這個函數執行一次大約為0.988ms,十分接近1ms可以近似當作1ms,那么當x為50時,就相當于停頓了50ms。delay()函數的一次執行時間與晶振的頻率是密切相關的。晶振的頻率越高,delay()的一次執行時間就越短。

那么又是如何知道這個函數執行一次用了0.988ms呢?原來可以通過Keil的調試運行來觀察程序的執行時間。當程序編寫完成后,單擊工具欄上的按鈕,會出現程序調試窗口,如圖3-9所示。

圖3-9 程序調試窗口

工具欄上的分別表示單步執行和跳過函數繼續執行。配合這兩個工具按鈕以及屏幕左側的寄存器欄中的系統運行時間,就可以計算得出執行一次延時函數所需要的時間了。

進入設計程序后,先單擊按鈕,進行單步運行,當程序運行到delay(1)時,記下此時系統運行已經耗用的時間為0.0039100s,接著再單擊按鈕,即已經執行一次delay(1),再記錄一下此時系統的時間為0.00137900s,二者之差為0.988ms。這就是延時函數執行一次所用的時間。

在上述延時函數中,主要通過兩個循環來實現延時,內層循環[for(z=120;z>0;z--);]是整個延時函數的關鍵,它運行的時間就是執行一次延時的耗時量,通過調整z的初始值,使其無限接近1ms。外層循環就是延時的倍數,與內層循環的時間量相乘,就是延時的時間。所以,上面延時函數執行一次約為0.988ms,欲延時50ms,就需要循環50÷0.988≈50,即這個循環執行50次就接近延時50ms。通過這個計算就可以編寫精確的延時函數了。

下面,請讀者思考一下,當系統晶振分別為6MHz、12MHz時,延時1ms需要設定的循環次數該是多少?

3.C51的數組及應用

【課堂練習】將設定好的延時函數添加到程序,并實現由9到0的數碼倒計時顯示,每個數字間隔50ms。

【分析】仍以圖3-8所示電路原理圖為例,通過前面的介紹,可以很快地寫出如下代碼:

……

觀察上述代碼,可以看出代碼的規律很明顯,都是通過P1口顯示一個數字(只是方框內數字不同)然后再延時,但這樣寫的代碼冗長易錯,工作量也大;應用C51提供的數組結合循環語句則可以有效地減少代碼,使程序可讀性更強,代碼更為精練。

C51中數組是同一數據類型數據的集合。利用數組可以一次性定義多個變量,對這些變量可以采用“數組名[下標]”的方式讀取。將數組與循環相結合,利用循環變量當作數組的下標,就可以在循環當中,遍歷到每一個數組值了。利用這個思路,將段選碼定義為數組,程序執行時,只需要讓P1口按順序讀取數組元素就能達到預期目標了。

定義數組的語法格式:

注意:定義數組時使用code關鍵字表示將該數組存放在程序存儲器空間,因此帶有code的數組元素值不可改變。如數組值在運行中會改變,則不要加code關鍵字。

數組的調用方法:

尤其需要特別提醒的是,C51中數組的下標都是從0開始計數的。如定義一個數組table,含有10個數字,則命令寫為:

ucharcode table[10]={0x6f,0x7f,0x07,0x7d,0x6d,0x66,0x4f,0x5b,0x06,0x3f};

上面數組中起始的數組元素是table[0],其內容為0x6f;結束的元素是table[9],其內容是0x3f,千萬注意上面定義的數組中并不存在table[10]這個元素。

結合for循環,上面的倒計時程序就可簡化為如下片段:

通過上述代碼可以看見,數組配合循環語句后,極大地簡化了代碼,程序的結構也更加清晰,同時還避免了重復書寫過多相同結構代碼帶來的錯誤,提高了編程效率。這種應用方法值得讀者反復練習,并加以熟練運用。

主站蜘蛛池模板: 凤凰县| 花垣县| 绥阳县| 九寨沟县| 探索| 阿克陶县| 昭通市| 自治县| 来安县| 邵阳市| 武穴市| 枞阳县| 清苑县| 碌曲县| 黄山市| 龙州县| 营口市| 正安县| 朝阳区| 会同县| 高雄市| 连城县| 古蔺县| 克拉玛依市| 磴口县| 白水县| 宁夏| 水富县| 平罗县| 盖州市| 太原市| 崇文区| 渭源县| 湟中县| 丰都县| 历史| 渝中区| 酉阳| 瓮安县| 屏南县| 绥化市|