|
首先吹一句,就一句哈:我這套教法,與現有的所有的教材的思路都大不一樣。 數碼管是什么?就是可以用來顯示數字的一種電子設備或叫做零部件或叫做電子元器件。下面的圖,就是一種典型的數碼管的結構圖,這種叫七段數碼管,分別用abcdefg這七個字母標注這七個段條,每段的位置安裝有一個燈,如果是LED數碼管,那每段就安裝了一個LED燈,每一個燈都是可以單獨點亮的,如果要控制它顯示數字,比如說顯示1,那點亮bc這兩段就行了,如果全部點亮,那就是個8字,如果全部不亮,那個,也有可能壞了。
數碼管.jpg (42.85 KB, 下載次數: 0)
下載附件
2025-11-6 15:22 上傳
說明一下,這個結構圖上還有個dp,它是一個點,可以作為顯示小數點來用。至于兩個com,那是這八個LED的公共端,就是說這八個LED的接地端都在這個器件的內部連在了這兩個管腳上,這種類型的數碼管也就是教材說的共陰極數碼管。 知道了怎么讓這個數碼管顯示不同的數字,那接下來我們就思考如何手工控制它來顯示數字。電路原理圖很簡單,它上面有兩個腳標注的是com,把這兩個com腳接電源地就行了;abcdefgc以及dp這八個腳先各自接一個限流電阻,再各自接一個開關,再一起接到電源正極,電路圖就算畫完成了。接下來就是按電路圖搭建好電路,什么?你說你不會?這個沒關系,網上一大堆教程,照著做就是了,簡單點的方法,就是在面包板上搭建,材料都很普通,至于開關,建議用DIP撥碼開關,就是那種可以插在面包板上的成排的開關,你用8位的就行了。如果你對這些名詞所表達的東西不明白,直接在小寶上搜。 電路搭建完成,手工控制數碼管就大功告成,你可以隨心所欲地讓這個東西顯示你所想要顯示的數字了。 不過呢,我想大家感興趣的不是什么手工控制,而是如何用單片機來控制,而且是隨心所欲地。 簡單,下面就來實現我們的這個愿望。 思路其實很簡單,就是用單片機來代替上面電路中的八個開關就行了。 這里我們先簡單說一句最簡單的電路原理:LED燈之所以亮,開關的作用,就是在LED的正極上加上正電源,LED的正極有了正電位、負極有了零電位,它就亮了;如果LED的負極是零電位,正極也是零電位,它自然就不亮了。為什么我在這里要說這個誰都懂得的原理?因為是要引出0和1的概念。我們在這里指出個現有的規則:將電路中任意點的高電位狀態標記為1,零電位狀態標記為0,這個規則,是我們學習單片機的基礎規則之一。 在這里說一件很重要的事,從物理學上來說,數字電路包括計算機,根本不認識什么0和1,它只有電位的概念,目前我們所用到的數字電路,只用到了電位的兩種狀態,即高電位和低電位。這個思路很重要,特別是搞芯片設計尤其是想拋開現有而另開新路的人,它關系到你對數字電路的基本原理的正確理解,但是,對于做程序設計的人來說,你得接受計算機只認識0和1這個理念,這樣才利于編程,所以,在后面,我也會采用這種理念,將它們說成數值。關于這一點,有興趣時我再詳細解說。 好了,我們回歸正題,先拿一個我們要用到的單片機的管腳圖來,下面是STC89C52單片機某一型的管腳圖,我們可以看到它共有40個管腳,其中的32個管腳,它們的標注都是以P開頭的,這些P管腳的功能之一,就是單片機自己可以自由控制其為高電位或零電位,有了這個功能,我們就可以用它來給LED的正極授以高電位或零電位以達到控制其亮滅的目的,如果我們用上它的七個管腳,這樣不就可以控制數碼管的顯示了么?如果用上八個管腳,那就連小數點一并也控制了。
STC89.jpg (149.26 KB, 下載次數: 0)
下載附件
2025-11-6 15:28 上傳
接下來就做四件事,就可以達成我們隨心控制數碼管的大愿望:畫電路圖,搭建電路,在電腦上寫程序,將寫好的程序復制也就是下載到單片機中。 前圖所展示的單片機共有32個可以用于輸出的管腳,這32個管腳被設計成了4個組,每組由8個管腳組成,這4組端口分別標記為P0、P1、P2、P3組。在以下的實驗電路設計上,我們用到單片機的P2組,當然,你也可以用其它幾組中的任意一組。連接順序是單片機的P2.0~P2.6管腳一一對應數碼管的a~g腳;P2.7可以不接,也可以接dp以顯示小數點。電路圖如算了,這個電路圖太簡單,就不如下了,反正網上也找得到。 搭建好的電路實物圖:略。 下面就是寫程序了,咱們不用現有的教材上的什么keil不keil的方法去寫程序,因為這個對初學者來說用起還是有些麻煩,有這個時間,咱們早都完成這個實驗了,咱們簡單點,咱們就用STC的程序下載軟件,這個先在網上下載老妖的STC-ISP軟件,官網,得到一個開頭為stc-isp的壓縮包,解壓,得到一個開頭為stc-isp的或開頭為AiCube-isp的應用程序,這個程序根本不用安裝,也沒任何限制,不用你充話費不用你當會員去貢獻點什么,你直接點擊打開就是了,部分界面如下:
下載軟件界面.jpg (257.17 KB, 下載次數: 0)
下載附件
2025-11-6 15:41 上傳
說一下哈,如果你著急看到結果,下面有幾段你可以暫時不看,而是直接跳到后面的開始寫程序部分。 我們編寫程序的思路依據的就是單片機運行的機制,比如我們要顯示7,就要置abc腳為高電位,對應的單片機的P2.0、P2.1、P2.2要由單片機控制為高電位,用0和1來標記,就是這三個管腳均為1,而其它管腳均為0,從高到低連起來寫,就是00000111,這里再說一個規則,就是連寫這一組管腳的電位標注時,規定Px.0為最末位,其它的管腳則順序往高位排。 編程前,我們先要理清程序執行的流程,也就是,這個單片機在設計上,它自身有什么功能可以將P2端口的電位控制成我們想要的結果。 我們先不管這個芯片的設計是怎么樣的,我們先思考如果是你自己,你會怎么來設計這個芯片以實現這個功能。 有一種方法,我們可以把這個00000111當成貨物,而P2口呢,當成倉庫,我們要做的事,就是把這個貨物,送到名稱叫做P2的倉庫里去,而你,作為老板,就是跟員工下達一個指令,指令的內容必須很明晰以免員工不知所措:指令的第一個內容,是明確指出是送貨;第二個內容,明確告訴他這個要送的貨現在在哪,也就是源地址;第三個內容,明確告訴他貨物的目的地地址。如果你將這些寫在紙上,那在我們的工作中,叫做寫計劃書,而為單片機而寫在電腦上,叫做編程。 以上只是我們自己考慮到的一種方法,那單片機是不是也是這種工作機制呢?幸好,設計這個單片機的人還是個正常人,他跟我們想得差不多一樣。接下來的事就簡單了,就按照這個思路來編程,寫出這條指令的全部內容:01110101 10100000 00000111。 第一個數01110101是什么意思?不管你知道不知道,反正單片機是知道的,就是老板給他下了道命令,叫他去送貨。貨送到哪?那就是01110101包含的第二層指令內容:緊跟著的第二個數,就是貨物的目的地的地址;01110101還包含著第三層指令內容:緊跟著的第三個數,就是貨物本身,可以這樣理解,老板在下達命令時,他是當面把貨物交給員工的,也即貨物就在你眼皮子底下,這類數據傳送指令,教材中稱為立即尋址,這個數,叫做立即數。這三層意思,固定用01110101這一個數來表達,如果改變了這個數。比如給改成了10000101,那他的指令的第三層內容,就變成了源地址,也即這類送貨方式中,貨物并不在眼前,而是在一個倉庫中,這第三個數就是貨物所在的倉庫地址,10000101這個數還指明了這個倉庫是距離最近的那類倉庫。 我們在這里為什么要寫成01110101 10100000 00000111?前面我們說了,單片機只認識0和1,所以這個指令的表現形式也就是0和1的組合。 開始寫程序,編程軟件用的就是上面說的STC-ISP程序,編程窗口在箭頭1所指程序文件窗口里,這里該說明了,在這個窗口中,是沒辦法輸入只有0和1這類數據的,這個軟件就是這樣設計的,我們只能望著嘆氣。只有0和1的數據叫二進制數,而這個編程窗口中,輸入的只能是十六進制數,所以,我們必須將這三個二進制數轉換成十六進制數,你理解不理解二進制十六進制這個概念現在沒關系,反正這個有現成的轉換工具,不用你去計算,轉換的結果是75 A0 07,我們將這三個數順序填寫進去就行了。當然,為了防止程序跑飛,后面再附加兩個數:80 FE,當然,這個你可以加,也可以試著不加,你自己觀察結果。 這樣編程就完成了,是不是特簡單?更簡單的是,接下來連好電腦,你再點一下左下方的“下載編程”方框,OK,7出來了。 為什么要點按“下載編程”?你在電腦上寫完了程序,你得交給單片機啊,就象你的計劃書,得交給你的員工一樣,你交給他,他才能照著這個計劃書去一步一步地執行啊。這個下載編程的作用,就是將寫好的程序交給單片機,其實質就是復制到單片機中,專業稱呼叫下載,以前叫燒寫燒錄之類的。這個程序寫進去的時候,并不是十六進制數,還是前面說的那句話,它只認識0和1,所以,依然是二進制數。還有,這個程序寫進單片機之后,單片機自身是不能改變其中的任何內容的,這個存放的地方也是專門設計的,教材上稱為程序存儲器的就是它。 這里補充說明程序文件窗口中輸入程序的方法:如果窗口中是一片空白而看不到輸入的位置,沒關系,點一下這個空白窗口的任意位置,窗口的最上面一行會出現一個閃爍黑方塊,黑方塊左邊有0000h字樣,這個0000h表示的就是程序存儲器的第一個地址,也就是說,我們這里寫入的程序中,75這個十六進制數在復制進入單片機的程序存儲器之后,它將存儲在地址為0000h的程序存儲器單元中。然后你就可以直接開始輸入了;如果窗口中有內容,那請點按窗口下箭頭3所指“清空區域”按鈕,窗口里就什么都沒有了,然后如同上面所說的一樣用鼠標點擊空白處,就能看到有光標閃爍,然后開始輸入數據。 如果想改變數碼顯示的內容,你直接修改第三位也就是現在的07那個位置的數值就行,如果你搞不清楚該是什么值,你隨心改也沒人干涉你,至于數碼管顯示的是什么,管它呢,試一試也沒什么關系,說不定,你會發現它還能顯示AbCdEF之類的。 STC-ISP是有使用說明的,這里須重點注意幾點:一是左上角的芯片型號欄顯示的型號要與你所使用的芯片一致,先用“下載編程”按鈕下方的“檢測選項”按鈕檢查一下,軟件會自行檢測出芯片型號,如果檢測不出則可以手動選擇,實測這個89C52好象是不能自動檢測出來的,那就得手動選擇了,它在STC89C52RC系列下,選STC98C52RC/LE52RC,然后再按“檢測選項”按鈕檢查一下看對不對;二是緊隨其下的掃描串口中顯示的串口號要正確,也是可以手動選擇的。 STC89C52芯片的程序下載工作,是需要專門的硬件設備的,有現成的,給外星人的小店施舍幾塊錢,他會告訴你這個是什么東西,然后過幾天送一個給你。這個小東西可能是要驅動程序的,在下載軟件頂部菜單欄有一欄顯示的是“USB驅動安裝”,點擊它然后按照提示進行安裝就行了,安裝前先插上這個下載器,安裝可能有點慢,一個字,等,等到“掃描串口”按鈕右側出現內容即完成安裝。檢查是否安裝正確且連接的是你的那個下載器的方法有幾種,咱們粗暴點,直接拔掉這個小東西,如果“掃描串口”右邊里的內容變化了或成了空白,蠻好,這個就對了。如果你的電腦上只有這么一個串口設備,你再插上這個小東西,那“掃描串口”右邊的窗口內就會自動出現你的設備的串口號。 數碼管有現成的,個人建議喜歡自己動手的自己搭一個,這樣可以更清楚電路原理,掌控感滿滿。LED用方型的比較合適。 隨心控制數碼管的學習到此就算差不多了。學習這個內容,其主要目的,就是學習掌握單片機的輸出功能。 單片機的核心功能,其實就兩條,一條是控制其端口的電位的高低,以此向連接它的設備傳遞數據;二條是它也可以將端口電位高低的控制權交給外面的設備,以此獲得連接到它的設備傳遞給它的數據。單片機所設計的其它所有的功能,可以說,都是圍繞著這個核心功能來的,所以說,你只要掌握了這兩樣核心功能,你就是兩只腳踏進了單片機的大門。 下面我們來實踐一下用外部設備來控制端口的電位,然后單片機讀取這個電位值并傳送到另一個地方:P1的八個端口分別用一個電阻連接到電源正極,再用一只八位撥碼開關串上電阻后一端連接P1的八個端口,撥碼開關的另一端全部連接到地,P2改為串限流電阻后直接接八個LED,然后你自己設置這個八位開關為任意開關狀態,比如用數值表達的11001001狀態,然后讓單片機將P1的狀態送入P2,然后你再觀察P2口八個LED的狀態是不是也是11001001,然后你再改變撥碼開關的狀態,再試再觀察。這里需要提醒一下,改變撥碼開關的狀態之后,是不用重新下載程序的,只需重啟單片機就行了,重啟的方法,我文化程度不高,就簡單粗暴吧,斷電后重新上電。 這個將P1口狀態送入P2口,用到的機器命令的表達值是10000101,轉換成十六進制是85,這個在前面已經說過了;P1口的地址的表達值是10010000,轉換成十六進制是90。所以,程序就是85 90 A0 80 FE。這條機器碼指令的格式比較奇怪,它是數據源地址值緊跟在命令值之后,之后才是目的地址,而這條指令對應的匯編指令,卻依然是命令助記符之后順序跟著目的地址、源地址。 這個實驗,其實是我們學習單片機中最重要最基礎的實驗之一,實驗的主要目的,就是了解單片機的輸入接收功能,我們在單片機學習中,很大一部分學習的內容叫做通訊,也就是單片機的數據輸入輸出,其實際操作的,就是對端口的電位高低的控制(發送)與接收(讀取),可知這個實驗的重要性。 以上我們學習的是用機器碼來編程,這種編程方式是最原始的,雖然它才是單片機工作的本來面目,但是它在實踐應用中有一個很大的麻煩,入門容易掌控太難,所以入門學習時了解一下就夠了,但這個學習是非常有必要的,通過這個學習,我們就可以了解到單片機的工作機制和編程規則,為接下來我們學習匯編和C打下理論基礎。另外,如果你對單片機芯片級的設計感興趣,這個學習可以給你打一點基礎。我這個教法,不是讓你亦步亦趨地跟我學,而是要打通你的自學能力的任督二脈,讓你直接去了解單片機的工作機制和語言規則,了解了之后,你會對編制任何一個項目都有清晰的思路,剩下的,就是查資料,查器件資料,查編程語言有哪些功能語句以及它們的使用規則,查編程技巧和注意事項,等等。你比如控制數碼管的例子,我們的目的就是將一個讓數碼管顯示數字的值送到P2端口,這里面首先要查的是用什么樣的命令,你可以查51單片機的機器指令表,它分了類的,顯然,這是一個數據傳送類指令,我們就在這一類里面查,然后我們就查到了一條最適合用在這里的指令:立即數傳送指令;然后我們就查這條指令的使用規則:目的地址緊隨其后,再跟著這個要傳送的立即數;再查P2的地址,這個在芯片手冊中查,當然,51機是統一的,現有教材中也都給出了這張表,叫做特殊功能寄存器表,里面給出的P0的地址是80H,P1是90H,P2是A0H,P3是B0H,完工。 如果你對芯片設計感興趣,通過這些知識的學習,再學習一下邏輯電路,你甚至可以自行設計簡單的單片機電路,比如說,用現有的邏輯集成電路,來搭建一個十以內的加法計算器,很容易的。如果你的電子電路水平比較象樣,用分立元器件也不是不可以。 接下來我們可以進入匯編或C的學習了,個人建議先學一下匯編,熟悉了解后再正式進入C。 哦對了,總有一些人說什么匯編很難,真是奇怪的言論,對于理工科的人來說,真沒什么不好懂的,入門非常容易,它只是難在復雜應用上的掌控,但是,我們只是達到熟悉了解的目的就行了,你學它,花不了幾個時間,但對你打好學C用C的基礎,效費比太高了。關于這個看法和解釋,我已在前面的帖子中說過了。 在這個實驗中,我們選用的單片機的型號是89C52,為什么要用這個型號,因為這個型號的是老款的,它不用配置端口的功能,入門時學起來簡單多了。如果你用的是STC的15系列或8系列或32系列,那你還得先寫幾條端口配置語句,對于初學者來說這個學法就不太友好,至于什么STM的,那更是麻煩加茫然,三把兩把,興趣就給折騰得沒了。當然這個型號也可以選用STC12系列的,它也不用配置端口,而且還可以省了晶振。用89系列的話,還得要配一個晶振及兩片陶瓷電容,這個一定不能忘,否則單片機是不會工作的,至于晶振的頻率參數,對于初學者來說,用不著多的,一個11.0592就夠你用了,以后升級到高系列,也用不到晶振這個東西。還有90與89是一個系列的。從這個系列入門之后,肯定是要進到更高系列的,畢竟這個系列太古老,功能太少,速度也慢,特別是價格方面的意思,你可以自己去了解。 在實驗中,如果你是用面包板來搭建電路,那要注意單片機的外觀選型,要選用雙列直插式、管腳間距2.54mm的,至于管腳數,滿足你的試驗需求就行,我們這里用的是40個管腳的,它叫雙列直插式。你以后的實驗,都要注意器件的管腳的間距,因為面包板的孔距就是2.54mm。 如果你不想用撥碼開關,也可以簡單點,就用跳線來代替。
|