原文檔"自制單片機開發板全過程(傻瓜式教程).pdf"下載方法地址請看文章底部第一條留言!
學習了一段時間的51 單片機,也買了學習板,但總覺得在學習板上操作對元件引腳認識不那么深刻。學習板上的許多功能塊元件密集,相互又牽扯,造成電路認識上的不清。在接擴展板時引線也不能集中成一組排線引出。商家也對他的原理圖遮遮掩掩說一半留一半的。因此我打算拿起電烙鐵,在通用板上先搭建起最小系統,再做出ISP 下載線,一步步的與愿和我一同上路的菜鳥們踏入C51 的世界。
昨天下午才匯了錢買洞洞板,沒想到今天中午快遞公司的人就把貨送到我手上了。快的有點讓我吃驚。等元件也到貨后我便可以動手并上圖與大家一同學習討論了。
今天剛申請的空間,也試試發貼和上圖。
2.自制單片機之二……AT89S51 最小系統制做廢話這里就不多說了,干活吧!
C51 最小系統電路在網上一搜一大把,大同小異。我略做改動后如圖:
加一個11.0592MHZ 的晶振是為了以后做串口通信時和PC 有相同的波特率。可用短路帽切換。
說說板子的布局:網上賣的最小系統都是把板子做的非常小,如果僅僅只學習最小系統,那是可以的。我以后是要做擴展的,所以不能做的太小。因此該有的應留著,不該有的都去掉。很重要的是以后在做其它擴展功能塊時的連接線就用一組排線而不能再有其它飛線。因此做一個好的布局是非常有必要的。
在板上除了最小系統外還有鍵盤輸入、數碼管、LCD、I2C 存儲器。它們的數據接口和電源接口也是完全獨立的。其它的功能都準備在以后通過上方的接口另外用板子擴展。
圖上方的彎腳插針就是向外擴展的接口。我在彎腳下方又安排了一組直插針。它是和彎腳插針并行連接的。這樣在擴展功能塊時我先在AT89S51 板上將要輸出的引線(包括數據線、控制線、電源線等)跳至直插針上。這樣通過彎腳插針引到擴展板上的線就只有一組排線。不用再零亂地接上幾組連接線了。這也是我用買的學習板常常垢病而最終棄而自制的主要原因之一。因為當時我擴展LCD12864,我既要連上數據線,又要連電源線,LCD 模塊上還拖著背光電源限流電阻線。還有液晶驅動電壓調節電位器。所以感覺拖的到處是線,很不方便。
實施:通過檢查各元件的好壞后便進行焊接工作。焊接進行的還是比較順利。見下圖:
完成了。在檢查了線路的正確性后,用萬用表測了是否有短路。一切正常!
之前我的AT89S51 里已寫好了個最小系統測試程序,就是讓P1.0 上的紅色發光管閃爍。
我把它先插在我買的學習板上運行,一切正常。但插在我做的的最小系統上卻沒反應。就那么點線路查來查去還是沒問題呀!是晶振不起振?在學習板上用手拿著改錐分別碰18 腳(XTAL2)和19 腳(XTAL1)。發現當人體碰到19 腳時程序會亂掉,就是說可能會停振。于是又把我的系統板上晶振位置的電路重焊一遍,盡量縮短了19 腳處線的長度。C4、C5 又分別換了15PF、20PF、30PF 的電容試試。故障依然,沒辦法,得靜一靜,看書! 在看到介紹第31 腳(EA/VPP)時猛然想到31 腳沒有接到電源正啊!起來立即把31 腳接到電源正,紅色發光管立即閃爍起來。此時的高興真不可名狀啊!
總結:除了在焊接時要仔細外,先畫好電路圖也是很重要的。像上面的電路圖在89S51 的31 腳上就只寫了Vcc 的字樣,因此焊接時就被忽視了。應該先畫出一張完整的圖才行。
檢查分幾個部分:1.晶振部分、2.復位部分、3.電源部分(最不可以忘掉EA 接V+5v),4.還有就是P1_0 發光管最基本的一個應用部分。
其實這個板子上的晶振電路是非常容易起振的。19 腳上的引線也沒那么敏感。但處理19 腳時可能的話還是要盡量短些的,畢竟它比18 腳要對外界干擾敏感的多。手摸上去就停振了。
還有就是學習單片機怎么著也得先買塊最最簡單的板子。否則你焊好你的板子后有故障到底是程序問題還是線路問題就無從查起,查錯查得還不瘋掉呀! 程序也沒法寫進片子里去。你可能會說再做一個ISP 下載線呀。做下載線更加不穩定,下一篇我會專門講做ISP 下載線的問題。再來個特寫鼓勵一下自己。
3.自制單片機之三……AT89S51ISP 下載線的制做
最小系統板做好了,接下來就是做根ISP 下載線了。否則程序怎么寫到AT89S51芯片里呢?
先來認識一下AT89S51 上ISP(在線編程)功能腳的定義
看上圖的左邊AT89S51 引腳圖的P1.5、P1.6、P1.7 的第二功能分別為MOSI(主機發送從機接收)、MISO(主機接收從機發送)、SCK(時鐘脈沖信號由主機發送)。那什么時候才能啟用第二功能呢?就是當復位腳RST 接高電平一直處于復位狀態時就可用第二功能了,所以在ISP 下載板上有一條線接至AT89S51 的第9腳(RST)上,就是在寫程序前先發一個高電平將S51 的RST 腳設為復位態,然后就可通過MOSI、MISO 向S51 內寫程序了。
有網友問我的板子上ISP 線是如何定義的,我上圖的右邊就是我這個板子上的接法。ISP 十針接口的定義如下圖
看見上圖的實物接口邊緣上的三角標記了嗎?這就是第1 腳的標記,它的定義如上圖的右邊示意圖。
在網上查了一下,ISP 下載線的種類主要取決于PC 端下載程序的種類。有并口的,有串口的,也有USB 的。串口和USB 的介紹較少而并口的介紹的很多,也比較簡單。易于自己制做。并口的在網上也分為幾類,原理都一樣。主要是根據下載程序的不同。
1.這是Easy Isp-2 的配合軟件為Easy 51Pro v2.0 宇宙版
這是他的簡化版:
在網上的制做思路幾乎都是把74HC373 放在并口頭的小盒子內見下圖:
但由于我的臺式機放在桌子的下面,把74HC373 放在接頭盒內插在電腦機箱后面怎么調試呢。因此我沒將它放在接頭盒內而是另用個洞洞板做的,前面是一米的并行線,后面是約50cm 的連接線。線路的焊接沒什么問題,比較順利。見下圖:(因舊的已拆了,現在只是示意一下)Easy 51Pro
Easy 51Pro 2.0 的工作界面:
連上我的最小系統后,發現不能穩定工作。但可以讀出89S51 的特征字,說明線路是好的
反復試驗,不斷在電源間加去偶電容,沒什么效果,后來發現把連接排線握成一團握在手心里,就能有80%的機率正確寫入程序,跟并口線那邊關系卻不大。莫非我要在排線上掛塊肉,就像以前黑白電視的天線?
結論:讀寫不可靠。放棄!
因為這個下載程序不支持win98,我的筆記本是98 的不能用。因此這次我用了官方的下載線方案。配合軟件為ISP-30a.
線路的原理還是差不多,焊接也沒什么問題,這次可以支持筆記本,我省掉了并口線,將并口頭直接焊在板子上。完工后的樣子見下圖。
現在它的并口端沒有線了,直接插在了我的筆記本的并口上,啟動程序,ISP-30A 界面見下圖
狀況同上一個下載線如出一轍,能讀出特征字。讀寫也是幾乎不成功,還是將排線揉成團握在手心里時,便能有八九十的讀寫正確率了。看來用哪個方案都是一樣的,關鍵在布線上不同罷了。
我一不做二不休,狠狠剪短了排線,就剩下這么一點點引線,見下圖:
再接上筆記本一試,你猜怎么著,正確讀寫率100%,成功了!
結論:各種方案都差不多,但在布線上,原來總是把元件裝在并口盒內,而留一段連線到AT89S51 板上的想法是錯誤的。應盡量把從HC373 到AT89S51 板上的連線做短,最好HC373 就做在板子上,因為HC373 是三態輸出,停用時OE 端是高電平,輸出是高阻抗的,對系統板的獨立性是沒有影響的。而留的線應該是從PC 機到HC373 的并口線,這樣的下載線作為自制來說才能有點實用價值。
第二天我把那段并口線又再連上后,接上筆記本再試,讀寫正確率仍為100%。下載線見圖
樣子雖不好看,但它是個皮實且易于自制的方案,在論壇里有人跟我說,把下載板上元件做好布線和抗干擾也能把下載板至AT89S51 板的引線做到1.5 米。我非常相信。但我沒有示波器及其它測量設備,只有一塊萬用表。有簡單易行的方案為什么不用呢!
4.自制單片機之四----數碼管電路的制做與驅動數碼管的使用方法與發光二極管沒什么區別,只是把七或八只發光二極管組合在一個模件上組成了個8 字和小數點,用以顯示數字。為了減少管腳,把各個發光管的其中同一個極接在一起作為共用點,因此就產生了共陽極和共陰極數碼之說。共陽管就是把各個發光管的正極接在一起,而共陰管就剛好相反。見下圖:一般來說大部分的邏輯IC 的吸收電流要強于輸出電流。因此,大家都愛
使用共陰極的數碼管,因為可選的IC 多些。很可惜,我的這組數碼管是共陽的,因此公共端我打算用三級管來驅動。
我的最小系統板:
我用最常用的S9012,首先我得計劃好電路方式,就采用最常用的動態掃描顯示。
先搭建最簡電路,調試出需采用元件的參數。
先不接上圖的R2 和74HC244,將數碼管一個段直接接地。調節R1,測得S9012基極電流為0.21mA 時集電極也就是數碼管上已有40mA,說明放大倍數足夠了。這時接上R2 和74HC244,調節R2 使數碼管電流控制在15mA,這樣當8 個段一起點亮時三極管上得通過120mA 的電流。而基極上需要0.63mA,為了減小三極管的負荷應使三極管過飽和,,調節R1 使基極電流為2mA,此時測得集電極和漏極之間的電壓約0.1V。好!此時R1 為2K。R2 為240 歐姆。確定。
接下來就是確定電路。電路的接口與AT89S51 間有三組接口:段碼、位碼和電源。為了讓AT89S51 獨立出來這三級接口都采用插針做接口,用排線自由連接到AT89S51 的P1-P3 口,電源用短路帽連接,完成后的板子見下圖:
然后就是寫程序。先寫個查詢方式的吧!
//六位管碼管在以0.3 秒的間隔在閃爍,這是采用查詢方式的,比較占CUP 資源
當我插把程序寫入片子,插上電運行時,是亂碼。你猜怎么回事?
原來那個P2 口方向是反的,您注意過沒有,在AT89S51 管腳排列上,P0--P1 和P3 都是上方為PX_0。而唯獨P2 口管腳排列是下方為P2_0。方向則好是反的。既然反了,我就把段碼表重寫一下。再試,一切正常。
在這里我說一下段碼的排列,好多人問數碼管段碼是如何排列的,我也在網上查了,好像沒有什么標準的排法,隨自己的接法而定,這也是導致為什么在網上下載的一些數碼管程序在自己的板子上不能正常顯示的原因。就普遍而言我最上面的那張圖示的標法最多,在上面程序里原打算也是P2_0 對應段碼a(也就是上面的橫)。一直到P2_7 對應段為h(就是小數點)。結果哪知道P2 口剛好是反的。這樣一來也就是倒過來了,P2_0 對應段h(小數點了)。例如我原先定義的數碼管顯示“2”段碼為10100100B 的,一接反了就不再是“2”了。而要想再顯示“2”那就把段碼的高低位倒過來。改為00100101B 就OK 了。
下面再寫個用中斷來顯示的:
5.自制單片機之五……LCD1602的驅動
(1)……LCD1602的驅動
LCD1602 已很普遍了,具體介紹我就不多說了,市面上字符液晶絕大多數是基于HD44780 液晶芯片的,控制原理是完全相同的,因此HD44780 寫的控制程序可以很方便地應用于市面上大部分的字符型液晶。字符型LCD 通常有14 條引腳線或16 條引腳線的LCD,多出來的2 條線是背光電源線VCC(15 腳)和地線GND(16腳),其控制原理與14 腳的LCD 完全一樣,定義如下表所示:
HD44780 內置了DDRAM、CGROM 和CGRAM。
DDRAM 就是顯示數據RAM,用來寄存待顯示的字符代碼。共80 個字節,其地址和屏幕的對應關系如下表:
也就是說想要在LCD1602 屏幕的第一行第一列顯示一個"A"字,就要向DDRAM的00H 地址寫入“A”字的代碼就行了。但具體的寫入是要按LCD 模塊的指令格式來進行的,后面我會說到的。那么一行可有40 個地址呀?是的,在1602 中我們就用前16 個就行了。第二行也一樣用前16 個地址。對應如下:
我們知道文本文件中每一個字符都是用一個字節的代碼記錄的。一個漢字是用兩個字節的代碼記錄。在PC 上我們只要打開文本文件就能在屏幕上看到對應的字符是因為在操作系統里和BIOS 里都固化有字符字模。什么是字模?就代表了是在點陣屏幕上點亮和熄滅的信息數據。例如“A”字的字模:
上圖左邊的數據就是字模數據,右邊就是將左邊數據用“○”代表0,用“■”代表1。看出是個“A”字了嗎?在文本文件中“A”字的代碼是41H,PC收到41H 的代碼后就去字模文件中將代表A 字的這一組數據送到顯卡去點亮屏幕上相應的點,你就看到“A”這個字了。
剛才我說了想要在LCD1602 屏幕的第一行第一列顯示一個"A"字,就要向DDRAM 的00H 地址寫入“A”字的代碼41H 就行了,可41H 這一個字節的代碼如何才能讓LCD 模塊在屏幕的陣點上顯示“A”字呢?同樣,在LCD 模塊上也固化了字模存儲器,這就是CGROM 和CGRAM。HD44780 內置了192 個常用字符的字模,存于字符產生器CGROM(Character Generator ROM)中,另外還有8 個允許用戶自定義的字符產生RAM,稱為CGRAM(Character Generator RAM)。下圖說明了CGROM 和CGRAM 與字符的對應關系。
從上圖可以看出,“A”字的對應上面高位代碼為0100,對應左邊低位代碼為0001,合起來就是01000001,也就是41H。可見它的代碼與我們PC 中的字符代碼是基本一致的。因此我們在向DDRAM 寫C51 字符代碼程序時甚至可以直接用P1='A'這樣的方法。PC 在編譯時就把“A”先轉為41H 代碼了。
字符代碼0x00~0x0F 為用戶自定義的字符圖形RAM(對于5X8 點陣的字符,可以存放8 組,5X10 點陣的字符,存放4 組),就是CGRAM 了。后面我會詳細說的。
0x20~0x7F 為標準的ASCII 碼,0xA0~0xFF 為日文字符和希臘文字符,其余字符碼(0x10~0x1F 及0x80~0x9F)沒有定義。
那么如何對DDRAM 的內容和地址進行具體操作呢,下面先說說HD44780 的指令集及其設置說明,請瀏覽該指令集,并找出對DDRAM 的內容和地址進行操作的指令。
共11 條指令:
1.清屏指令
功能:
<1> 清除液晶顯示器,即將DDRAM 的內容全部填入"空白"的ASCII 碼20H;
<2> 光標歸位,即將光標撤回液晶顯示屏的左上方;
<3> 將地址計數器(AC)的值設為0。
2.光標歸位指令
功能:
<1> 把光標撤回到顯示器的左上方;
<2> 把地址計數器(AC)的值設置為0;
<3> 保持DDRAM 的內容不變。
3.進入模式設置指令
功能:設定每次定入1 位數據后光標的移位方向,并且設定每次寫入的一個字符是否移動。參數設定的情況如下所示:
位名設置
I/D 0=寫入新數據后光標左移 1=寫入新數據后光標右移
S 0=寫入新數據后顯示屏不移動 1=寫入新數據后顯示屏整體右移一個字符
4.顯示開關控制指令
5.設定顯示屏或光標移動方向指令
6.功能設定指令
7.設定CGRAM 地址指令
功能:設定下一個要存入數據的CGRAM 的地址。
8.設定DDRAM 地址指令
功能:設定下一個要存入數據的CGRAM 的地址。
9.讀取忙信號或AC 地址指令
功能:
<1> 讀取忙碌信號BF 的內容,BF=1 表示液晶顯示器忙,暫時無法接收單片機送來的數據或指令;當BF=0 時,液晶顯示器可以接收單片機送來的數據或指令;
<2> 讀取地址計數器(AC)的內容。
10.數據寫入DDRAM 或CGRAM 指令一覽
功能:
<1> 將字符碼寫入DDRAM,以使液晶顯示屏顯示出相對應的字符;
<2> 將使用者自己設計的圖形存入CGRAM。
11.從CGRAM 或DDRAM 讀出數據的指令一覽
(2)……LCD1602的驅動
具體電路的制作是很簡單的,就接了兩個電阻,一個是10 歐姆的背光限流電阻,另一個是2K 的LCD 極板電壓調節電阻。這兩個電阻的阻值怎么定呢?背光比較簡單,它就相當于在后面接了幾個發光二極管,任何時候你只要在15、16 腳串上個100 歐的電位器接上電源,調節電位器,覺得亮度合適。此時的阻值便可。LCD 液晶極板驅動電壓調節電阻的確定就稍微麻煩一點。在各數據線,控制線接好關通上電源的前提下在第3 腳(VEE)和地之間接一個10K 的電位器。調節電位器。當3 腳電壓高時為全亮,電壓為0 時為全暗(液晶全顯示為黑塊)。你用電位器把屏幕從全暗剛好調到變亮。這時便可調試程序。待屏幕能正確顯示后再細調電位器,使對比度合適。這時的阻值便可確定,然后換成等值的固定電阻焊上便可。
我們接著上次的系統板制做:
新買的1602LCD,20 元,貴不?
反面:
組裝后:
具體電路圖:
接口說明:
運行:
用戶自定義字符的應用:
我們從CGROM 表上可以看到,在表的最左邊是一列可以允許用戶自定義的CGRAM,從上往下看著是16 個,實際只有8 個字節可用。它的字符碼是00000000-00000111 這8 個地址,表的下面還有8 個字節,但因為這個CGRAM 的字符碼規定0-2 位為地址,3 位無效,4-7 全為零。因此CGRAM 的字符碼只有最后三位能用也就是8 個字節了。等效為0000X111,X 為無效位,最后三位為000-111共8 個。
如果我們要想顯示這8 個用戶自定義的字符,操作方法和顯示CGROM 的一樣,先設置DDRAM 位置,再向DDRAM 寫入字符碼,例如“A”就是41H。現在我們要顯示CGRAM 的第一個自定義字符,就向DDRAM 寫入00000000B(00H),如果要顯示第8 個就寫入00000111(08H),簡單吧!
好!現在我們來看怎么向這八個自定義字符寫入字模。有個設置CGRAM 地址的指
令大家還記得嗎?趕快再找出來看看。
從這個指令可以看出指令數據的高2 位已固定是01,只有后面的6 位是地址數據,而這6 位中的高3 位就表示這八個自定義字符,最后的3 位就是字模數據的八個地址了。例如第一個自定義字符的字模地址為01000000-01000111 八個地址。我們向這8 個字節寫入字模數據,讓它能顯示出“℃”
下面我們寫一段程序讓這8 個自定義字符顯示出一個心的圖案:
實際效果如圖:
6.自制單片機之六……LCD12864的驅動
LCD12864 的驅動
LCD12864 在市面上主要分為兩種,一種是采用st7920 控制器的,它一般帶有中文字庫字模,價格略高一點。另一種是采用KS0108 控制器,它只是點陣模式,不帶字庫。很可惜,我的這塊就是KS0108 控制器不帶漢字庫的,不過不打算用它專門顯示文本,也就無所謂了。
具體電路圖如下:
制做如下:
接口說明:
裝上12864
具體的電路還是兩個電阻。一個背光限流電阻。一個液晶驅動電壓調節電阻。背光電阻還是任何時候在19、20 腳與電源之間串上個100 歐電位器接上電源。調節電位器到合適亮度。具體值最好是到調試完程序能夠正常顯示后再將阻值確定換成固定電阻。液晶驅動電壓的調整在數據線、電源線接好的前提下是在Vee(-15v)和地之間接一個電位器。中間接V0,通過調節電位器來調節V0 上的電壓。當V0 上為-15V 時為全暗(液晶顯示為全黑)。當V0 為0V 時為全亮。調節電位器使屏幕從全暗剛好變到亮時,便可進行程序的調試。待屏幕顯示正常后,進行對比度的細調,然后測量這兩邊的阻值在地和V0 之間、V0 和Vee 之間換成兩個固定電阻焊上就好了。注意在V0 的電壓是在一個很小的范圍有效。我的就是在-2.2——-2.5 這個范圍。仔細調節V0 和地之間的電阻使V0 上的電壓在2.3V。
更換為固定電阻后的裝配圖:
下面說說具體的驅動:
先來了解一下LCD12864 的內部控制結構:見圖
可以看出12864 屏是分為左、右兩塊控制的。所有對屏幕的操作要受片選CS1、CS2 來控制。
我們再來看一看對屏幕操作數據與屏幕點陣的排布關系:見下圖。
從上圖可以看出數據按字節在屏幕上是豎向排列的。上方為低位,下方為高位。因此在橫向上(也就是Y)就一共是128 列數據。分為CS1 和CS2 兩個64 列來寫入。在豎方向上(也就是X)一字節數據顯示8 個點,豎向64 個點分為8 個字節,稱做8 頁(X=0-7)。了解這些后我們就知道要滿屏顯示一張圖就要從y=0…127、X=0…7 一共寫128×8=1024 個字節的數據。同樣在AT89S51 中存一張圖就要1024個字節的空間。
好!下面我們來了解對LCD12864 進行操作的一些指令。
下面對上圖的指作解釋:
1.顯示開關控制(DISPLAY ON/OFF)
D=1:開顯示(DISPLAY ON) 意即顯示器可以進行各種顯示操作
D=0:關顯示(DISPLAY OFF) 意即不能對顯示器進行各種顯示操作
2.設置顯示起始行(DISPLAY START LINE)
1.寫操作時序
2.讀操作時序
時序參數表:
又帖了這么多指令呀時序圖什么的,看了就頭暈。我也和你一樣不愛看這些枯燥的東西。
下面實際寫些程序讓屏幕亮起來。
運行:
7.自制單片機之七……LCD12864的驅動之源代碼
今天將LCD12864 的源代碼發上來。
本程序的實際效果圖如下。
8.串行 I2C總線 E2PROM AT24CXXX的應用1
這一篇介紹I2C 存儲器的使用。主要是介紹AT24CXX 系列器件,它分為兩類,主要是通過被存儲容量地址來分的,一類是AT24C02-AT24C16,它的存儲容量從256 字節到2048 字節。另一類是AT24C32-AT24C1024,容量從4K-128K。(理論上好像可以達到最高512K 字節容量,但現在網上最高也就能看到AT24C1024也就是128K 字節容量)
原理:
I2C 總線是一種用于IC 器件之間連接的二線制總線。它通過SDA(串行數據線)及SCL(串行時鐘線)兩根線在連到總線上的器件之間傳送信息,并根據地址識別每個器件:不管是單片機、存儲器、LCD 驅動器還是鍵盤接口。
I2C 總線接口電路結構如圖所示。
SDA 和SCL 均為雙向I/O 線,通過上拉電阻接正電源。當總線空閑時,兩根線都是高電平。連接總線的器件的輸出級必須是集電極或漏極開路,以具有線“與”功能。I2C 總線的數據傳送速率在標準工作方式下為100kbit/s,在快速方式下,最高傳送速率可達400kbit/s。
在I2C 總線技術規范中,開始和結束信號(也稱啟動和停止信號)的定義如圖所示。當時鐘線SCL 為高電平時,數據線SDA 由高電平跳變為低電平定義為“開始”信號;當SCL 線為高電平時,SDA 線發生低電平到高電平的跳變為“結束”信號。開始和結束信號都是由主器件產生。在開始信號以后,總線即被認為處于忙狀態;在結束信號以后的一段時間內,總線被認為是空閑的。
I2C 總線的數據傳送格式是:在I2C 總線開始信號后,送出的第一個字節數據是用來選擇從器件地址的,其中4-7 位為器件碼,如1010 就是代表串行E2PROM器件。1-3 位為存儲器的片選地址或存儲器內的塊地址碼,如何區分?后面再做詳細說明,第8 位為方向位(R/W)。方向位為“0”表示發送,即主器件把信息寫到所選擇的從器件;方向位為“1”表示主器件將從從器件讀信息。開始信號后,系統中的各個器件將自己的地址和主器件送到總線上的地址進行比較,如果與主器件發送到總線上的地址一致,則該器件即為被主器件尋址的器件,其接收信息還是發送信息則由第8 位(R/W)確定。
一個字節的寫操作的過程:首先器件發出起始信號后,發送器件識別控制字節,即1010A2A1A00(最低位置0,即R/W 讀寫控制位為低電平0),然后等待應答信號指示從器件被尋址。再發送一個AT24CXX 存儲器將要寫入的位置地址。再次等待AT24CXX 應答信號以后,將發送數據字節,AT24CXX 接收到后寫入到剛剛指定的存儲器地址。然后主器件再次等待AT24CXX 的應答信號。主器件最后發出停止信號。
在I2C 總線上每次傳送的數據字節數不限,但每一個字節必須為8 位,而且每個傳送的字節后面必須跟一個認可位(第9 位),也叫應答位(ACK)。數據的傳送過程如圖所示。每次都是先傳最高位,通常從器件在接收到每個字節后都會作出響應,即釋放SCL 線返回高電平,準備接收下一個數據字節,主器件可繼續傳送。如果從器件正在處理一個實時事件而不能接收數據時,(例如正在處理一個內部中斷,在這個中斷處理完之前就不能接收I2C 總線上的數據字節)可以使時鐘SCL 線保持低電平,從器件必須使SDA 保持高電平,此時主器件產生1個結束信號,使傳送異常結束,迫使主器件處于等待狀態。當從器件處理完畢時將釋放SCL 線,主器件繼續傳送。
當主器件發送完一個字節的數據后,接著發出對應于SCL 線上的一個時鐘(ACK)認可位,在此時鐘內主器件釋放SDA 線,一個字節傳送結束,而從器件的響應信號將SDA 線拉成低電平,使SDA 在該時鐘的高電平期間為穩定的低電平。從器件的響應信號結束后,SDA 線返回高電平,進入下一個傳送周期。I2C 總線還具有廣播呼叫地址用于尋址總線上所有器件的功能。若一個器件不需要廣播呼叫尋址中所提供的任何數據,則可以忽略該地址不作響應。如果該器件需要廣播呼叫尋址中提供的數據,則應對地址作出響應,其表現為一個接收器。
5.總線競爭的仲裁總線上可能掛接有多個器件,有時會發生兩個或多個主器件同時想占用總線的情況。例如,多單片機系統中,可能在某一時刻有兩個單片機要同時向總線發送數據,這種情況叫做總線競爭。I2C 總線具有多主控能力,可以對發生在SDA 線上的總線競爭進行仲裁,其仲裁原則是這樣的:當多個主器件同時想占用總線時,如果某個主器件發送高電平,而另一個主器件發送低電平,則發送電平與此時SDA 總線電平不符的那個器件將自動關閉其輸出級。總線競爭的仲裁是在兩個層次上進行的。首先是地址位的比較,如果主器件尋址同一個從器件,則進入數據位的比較,從而確保了競爭仲裁的可靠性。由于是利用I2C 總線上的信息進行仲裁,因此不會造成信息的丟失。
器件說明:
AT24CXXX 系列引腳圖如下
現在我先來說說AT24CXX 的具體使用
假設用AT89S51 的P0.0 做SDA 總線,P0.1 做SCL 總線。有若干個I2C 器件掛接在SDA 和SCL 總線上。
現在要對E2PROM_01 存儲器進行寫字節操作看看它是如何找到的。
上面說過在發送完一個開始信號后接著發送一個字節的器件識別信號。這一個字節的4-7 位就是器件識別碼。1010 就是對應E2PROM 器件,其它器件就不再理會了。1-3 位是器件的物理地址,也就是說如果是E2PROM,它可以在I2C 總線上掛接(000-111)8 個E2PROM。在這里就得詳細說說AT24CXX 上的A0,A1,A2 和這個器件識別字節之間的關系了。上面說過存儲器的尋址范圍是一個字節,也就256 個,AT24C02 的存儲容量為256 字字,剛剛好將一個字節的地址用完。器件電路上A0,A1,A2 三個管腳通過接高電平或低電平來和AT89S51 發送過來的器件識別控制字節相匹配,從而得以識別出AT89S51 將要操作的那個存儲器。現在AT24C04 的容量是512 個字節,那不是一個字節的地址不夠用了嗎?其實它是將512 個字節為成兩個頁,每頁256 字節,而頁地址就是器件識別控制字節的1 位。前面說了這個1-3 位不是和器件上的A0,A1,A2 匹配來識別器件的嗎?是的,但存儲器容量超過256 字節情況就有變了。AT24C04 上的A0 這時就廢棄不用了,只用A1 和A2,這樣就只能接(00-11)四個AT24C04 了,同樣AT24C08容量為1K 字節分為4 頁了,于是頁地址就是器件識別控制字節的1-2 位,器件上的A0,A1 廢棄不用,只用A2,就只能接兩個AT24C08 了。AT24C16 容量為2K字節,分為8 頁。頁地址是器件識別控制字節的1-3 位,全用了。器件上的A0,A1,A2,就無效了,只能接一只AT24C16。
我這么說能明白嗎?
對于大容量AT24C32-1024 的存儲器。器件的存儲尋址地址為兩個字節,所以它的一頁為65536(64K)。AT24C32-64 的容量為4K 字節-8K 字節,在一頁范圍,可以接8 只器件。從AT24C128-1024 的器件代號也由1010 改為10100,多了一位,識別控制字節的器件物理地址就少了一位,變為1-2 位,相應的在器件管腳上A2 也廢棄空著了,因此最多只能接四只器件。AT24C128-512 只有兩位器件地址所以最多只能接四只器件。而AT24C1024 的容量為128K,分為兩頁,識別控制字節的的1 位為頁地址,器件的A0 腳廢棄不用,只用了A1。因此只能接2 只器件。
下面我們進行具體的制做先準備好器件如下圖,我用的是AT24C16
原先的板子如下圖
焊好后。
好!下面我們進行調試:插上主電源。但AT24C16 的電源短路帽不接,在短路帽兩個針之間接上萬用表的電流檔檢查是否有短路和靜態電流的大小。實測靜態電流幾乎為零,改變兩個數據線的電平時,電流會有所上升,說明電路基本正常。
現在我們接上電源短路帽把AT24C16 電源接好。將兩個數據線用跳線接到P1.6和P1.7 口上(接到哪個口上可以自己選的)。注意分清哪個是SDA 哪個是SCL。別弄錯了。
把LCD12864 裝上,后面我們就要進行軟件的調試了。
接下來,我們進行軟件件部分的調試。
對代碼進行編譯成HEX 文件寫入S51 后運行:
重新編譯后寫入S51 芯片運行:
第一幅:
第二幅:
OK,成功!這次"iic test"這行字符是從AT24C16 內讀取的。你可以試著拔掉那兩根SDA,SCL 的數據線,再按下復位鍵重新運行,你會發現那行“iic test”沒有顯示了。說明沒有讀取到數據。再裝上數據線,重按復位鍵運行,又正常了。后面就可以將存儲在S51 代碼段的字模,圖形數據等,都寫到AT24C16 里了。
在網上找到一個寫的不錯的讀寫AT24CXXX 的通用程序函數,也很好用,程序見下面:
但實際使用中發現它有個嚴重的錯誤。就是沒有考慮到不同的I2C 器件在寫頁操作時,是有一頁數據限制的,AT24C01 是8 個字節,AT24C02-16 是16 個字節,AT24C33-64 是32 個字節。AT24C128-256 是64 個字節。AT24C512 是128 個字節。AT24C1024 是256 個字節。
這是器件說明書上的資料,我手上只有AT24C02、AT24C16 和AT24C256,實際使用了一下,AT24C02 的頁限制是8 個字節。另兩個是和說明書上一致的。當我寫的數據量超出頁限制時,地址指針就會回到起始點覆蓋原來的數據。例如我以頁方式寫10 個字節的數據到AT24C02 時。前8 個字節的數據正常寫入,第9、第10 個數據就回頭覆蓋掉了第一、第二個數據。
你如果把265 個字節的數據往AT24C02 進行寫頁操作,它也不報錯,就一個勁地反復覆蓋你8 個字節的空間,再比如你往AT24C256 里輸入一個字節的地址,或往AT24C02 里輸入兩個字節的地址,它也不報錯,就這么胡亂地把地址當數據或把數據當成地址往里一陣亂寫。當你讀取數據時才發現里面混亂不堪。這使得上面那個讀寫AT24CXXX 器件的程序怎么運行都不會出錯。我覺得這是AT24CXX器件設計上比較弱智的地方。
所以上面的程序得修改
12.板子上的最后一個部件--RS232串口
在我的板子上其它的部分都已完成了,現在就剩下RS232 串口了。串口對于單片機很重要,有了它就可以和PC 通信了,可以用PC 來控制你的單片機,也可以將你單片機上采集的數據傳到PC 上。
留的位置好像有點擠。得把上面的復位鈕挪一挪
先得搭建個臨時電路試一試,MAX232 結構圖和電路圖如下:
電路圖:
搭建的實際元件圖如下:
檢查無短路現象后接上電源。
注意,我已將板子上的晶振用短路帽跳接至11.0592MHz,這樣才能將波特率設置為19200。這是在12MHz 的狀態:
下圖是跳至11.0592MHz 的狀態。
在電腦上將程序寫好,編譯后用ISP 寫入S51。程序很簡單,就是不停地向PC傳送“hello World!”。程序如下:
在PC 上啟動串口調試器,將波特率調為19200,打開串口。然后按一下單片機上的復位鈕。如下圖:
電路運行正常。后面就是要把電路焊到板子上了。
焊好后的板子。
-
單片機
+關注
關注
6032文章
44523瀏覽量
633224 -
DIY
+關注
關注
176文章
886瀏覽量
348281 -
開發板
+關注
關注
25文章
4957瀏覽量
97213
原文標題:【太牛了】自制單片機開發板全過程(傻瓜式教程)-附下載!
文章出處:【微信號:fcsde-sh,微信公眾號:fcsde-sh】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論