2008年10月23日 星期四

[教學] 如何用程式對port作輸出入控制

這一篇的教學文件主要可以告訴你,如何用程式控制8051之外的硬體
IO怎麼控制?

首先我要說明的方法是-
找參考書!!

在坊間有很多介紹8051如何與KEIL C一起工作的參考書,不止一家書商有出
在其內容除了介紹基本的C語言運算,8051各個暫存器的用途及使用方式,更有許多實作的範例,其中有許多的範例跟我們實驗的內容不謀而合,完全一樣! 只要照著書上一步一步的接,程式一步一步的寫,就可以完程實驗,可以減少很多錯誤的路徑。

可是,我們在驗收的時候,不只會要求你把實驗的內容給一模一模的完成,可能會要求你現場作一些簡單的變化,如果你沒有完全了解其內部的運作過程,並且有能力進行修改的話,也是過不了驗收的!! 所以儘管買參考書可以讓你實驗快速完成,但你還是要一步一步的學習每一個實驗應該要學會的東西,不能只按照書上寫的完全照抄。

另外,如果不想買書的話,我記得在圖書館有很多相關的書藉,大家可以去借來看,如果已經被借走的話,有很大的可能是自已同學借的,所以查一下是誰借走的,去敲他房門借來看唄!!






-------------------------------
方案二--看懂DATASHEET 從底層自已來
-------------------------------
1、邏輯相關的語法
基本上在KEIL C裡面對於邏輯的運算即是一般的C語言,所有的運算符號就是那幾個,在網路上可以找到很多C語言的相關資料,動動手試幾個關鍵字,例如 「C語言 教學」、「C語言 語法」之類的,找英文網站會有更多的教學資訊,台灣的教學網站是很貧脊的!!

2、與port溝通的方式
在8051上面,具有很多個不同的port,每個port在8051內都各自代表了一個 "暫存器",而每一個 "暫存器" 具有一個自已的 "地址(ADDRESS)" ,這個地址跟我們的門牌號碼一樣,是由許多16進位的數值在命名。

當你要對一個port進行寫入,讓它執行你想要的值時,你需要做的事就是,去寫入那個腳位所在位置的值。舉個例子,當你要寫入Port0,你需要做的事是寫入8051中 address為0x80(hex) (這個位置具有1個byte的內容) 這個位置裡的值。
當然要執行上述的過程很麻煩,使用keil c時它會有比較方便又好記的作法,我們在寫一個程式時,會在最上方加入
#include
加入之後我們就可以使用所有在reg52.h中的定義。 在這個定義檔中有一行是這樣子寫的
sfr P0 = 0x80;
這一行的意思是,將"P0"定義成一個特殊的名字,它代表0x80這個位置,當你要對0x80這個位置的暫存器進行寫入時,就直接把值丟給P0作處理即可
例如 P0 = 254;
代表將數值254寫入P0也就是位置0x80裡面。

要讀出這個腳位的值時也一樣,直接讀出P0內的值即可
例如 tmp=P0;
這樣子就會把P0的值寫入到"tmp"這個暫存器裡面去了。

其他暫存器的名字與功能還有在keil c中對應的特殊名字,都可以在8051的datasheet以及REG52.H這個定義檔裡面找到。
8051的datasheet網址


-----
3、如何控制一個port中的某一個特定腳位
在這裡我提供兩個方法來控制單一的腳位
(1)第一個方法是運用邏輯的概念
先解釋名字 " | "這個符號是 or的意思," & "是AND的意思
a |= b; 這一行的意義是 先將a與b中每一個bit作 or 的運算後,將運算的結果填回a中
所以當我們要對P0中第5個腳位寫入1的話可以用這樣的式子
P0 |= 0x20;
這樣子就會把1寫入到Port
同樣的,如果要把0寫的P0中第0個腳位的話,可以用
P0 &= 0xfe;
來達成其效果。

(2) 用sbit 來定義每一個腳位,但在已預設的定義檔裡面沒有幫每個腳位作定義,所以你需要自行定義。方法很簡單,照下面作就ok了

sbit P0_0 = P0^0; //裡面P0_0是自定的名稱,可以更改,如改成ABC或XYZ也可以

當你要使用P0中第0個腳位時,只要使用P0_0這個名稱就可以了

例 P0_0 = 1; 這樣子就把P0第0個腳位寫入成HIGH
tmp = P0_0; 也同樣的可以把第0個腳位的值給讀回來。

--
有了這麼方便的方法應該大家都改用這個了吧……
重點還是要學會看懂DATASHEET才是永久之道呀!

-----

以上是臨時打的教學文章
如果有發現任何錯誤或疑問的話,儘管下面留言!!

沒有留言: