0-1.jpg

8051程式記憶體

8050是一個8位元的單晶片,它有獨立最大64K的程式記憶體,當然,市售的805X族系晶片,程式記憶體大半在4K,8K,16K為主,和個人電腦以G為單位的記憶體相比,8051的記憶體算是很小了。

64K記憶體中,最前面的00—0X3F的記憶體較為特別,0的位址是單晶片冷開機時啟動的位址,一般會放一個LJMP指令,跳躍至真正的開機程式,其他03—0X3F的位址,則是8051發生各種中斷時(如串列埠中斷,計時中斷),程式的執行位址,一般也是以一個LJMP指令,跳躍至中斷程式。

在常見的C51編譯器,為了方便工程師可以只用C程式,來開發整個專案,所以在編譯時候,會在程式碼的最前面,由C51加入一段由C51先寫好的STARTUPCODE,這段程式碼處理一些原本由組合語言的工作,比如設定堆壘(SP),RESET及中斷程式的LJMP程式碼,還可能包括一些清除資料記憶體的動作等等,程式碼約占用60H左右的程式記憶體長度。

#include "at89x52.h"

單晶片玩人 發表在 痞客邦 留言(0) 人氣()

9-1.jpg

在串列埠輸出資料

能夠在串列埠輸出文字,其實是很重要的一步,印象中當年微軟的DOS作業系統,就有一個DEBUG程式,讓使用者可以看到,目前記憶體的內容為何。現在8051單晶片系統,作者嘗試作類似的努力,讓使用者可以看到8051系統內的記憶體內容為何。得知記憶體內容,對8051的學習,將帶來很大的幫助。

 ;*************************************************/

; Used in C as PutWord(int i)
;*************************************************/

單晶片玩人 發表在 痞客邦 留言(0) 人氣()

串列埠簡介和設定

串列埠一般簡稱RS232UART介面,通常用於單晶片的資料傳輸之用。RS232規格至少是和8051一樣古老,因為技術上簡單,容易使用,即使時至今日,在單晶片的領域仍很重要。

簡單的UART總共只須3個訊號,RXD負責讀取資料,TXD傳送資料,再加上地線(GND),因為UART資料傳送適用不同的傳輸速度,所以須要設定傳輸速度,資料的傳送端和接收端必須用同樣的傳輸速度,資料才得以正確的傳送,因此單晶片的串列埠必須經過設定,才能夠使用。

目前的工作平台11F04單晶片使用12M的石英振盪晶片,作者習慣的傳輸速度為38400N81,參考技術資料後,以組合語言寫出來的串列埠設定函式如下:

;*************************************************/

單晶片玩人 發表在 痞客邦 留言(0) 人氣()

SDCC C51函式的回傳值

C語言的函式,在被呼叫時,可以將某種參數傳入函式使用,當函式執行結束,還可以回傳某種資料型態的數值。這是C語言最基本的用法。

#include "at89x52.h"

__sfr __at (0x91) P1M1;
__sfr __at (0x92) P1M0;

單晶片玩人 發表在 痞客邦 留言(0) 人氣()

SDCC C51函式的輸入參數

 目前已可以在一個專案中,同時包括C和組合語言兩個源碼,進一步,希望能將C語言的輸入參數,可以用組合語言的方式來表現或傳遞,或者倒過來,可以利用組合語言,來呼叫C函式,並且將輸入參數,傳送到C函式之中。

 #include "at89x52.h"

__sfr __at (0x91) P1M1;
__sfr __at (0x92) P1M0;

單晶片玩人 發表在 痞客邦 留言(0) 人氣()

SDCC 函式的輸入參數

目前已可以在一個專案中,同時包括C和組合語言兩個源碼,還想進一步,希望能將C語言的輸入參數,可以用組合語言的方式來表現或傳遞,或者倒過來,可以利用組合語言,來呼叫C函式,必且將必要的參數,傳到C函式之中。

 #include "at89x52.h"

__sfr __at (0x91) P1M1;
__sfr __at (0x92) P1M0;

單晶片玩人 發表在 痞客邦 留言(0) 人氣()

SDCC C51的聯結功能

作者在開始學習SDCC C51時,是由sdas8051 assembler入手,SDCC這類自由軟體最大的缺點之一,是能找得到的參考資料很少,作者自認英文不差,嘗試在網路搜尋,也沒找到多少可用的文章,碰到問題只能K它們家的使用手冊(也很簡單),自己寫程式嘗試錯誤(TRY AND ERROR) 總之,一切靠自己,是典型的LIY(LEARN IT YOURSELF)。

雖然嘗試只單純的使用SDCC,編譯C原始程式,好像也沒碰到困難,只是心中還是留下一些問號。在傳統的標準發展系統,能夠直接編譯,產生應用程式的,叫作interpreter,compiler或assembler都只能產生目的碼(object code),由linker 聯結後才能產生應用程式。

看起來SDCC扮演的,不只是單純的編譯,碰到main.c這個C語言的主程式時,還會加入一些程式碼(如設定堆壘),讓編譯出來的機器碼可以順利的下載執行。

寫一個同時有C和組合語言的專案

單晶片玩人 發表在 痞客邦 留言(0) 人氣()

一個專案一個原始檔?

剛開始寫程式,常會參考網路的範例,或是學校教授上課,電腦書的例題,大半全部程式就是一個檔案。久了以後,大家也普遍認為一個專案,由一個程式全部完成,是一件很正常的事。

但如果把目光放遠,到網路下載一些開放源碼專案的原始檔(SDCC這個C51編譯器),當會發現多數較具分量的專案,幾乎都是由多個原始檔案構成的。

單一檔案的編譯動作單純,可在DOS視窗的命令行上輸入:SDCC main.c 即可,顯然超過一個檔案的專案無法用這種方式處理,業界對於複數檔案的專案,通常會寫一個類似以下的makefile檔案,用來管理專案的編譯動作。

SDCCCFLAGS = --model-small

單晶片玩人 發表在 痞客邦 留言(0) 人氣()

C51的首次出現

對於熟悉組合語言的工程師,第一次寫C51的程式,心中其實是有些不安的。比如組合語言有虛擬指令,像是 .ORG,可以用來告訴編譯器,程式碼要放在位址0,C語言沒有類似的虛擬指令,程式碼要放在何處,就是由C51編譯器決定。


#include "at89x52.h"

__sfr __at (0x91) P1M1;

單晶片玩人 發表在 痞客邦 留言(0) 人氣()

不只是開關而已

初學者可能以為,只要不停的開和關LED,眼睛看到的自然是閃動的效果,所以只要寫成如上的程式即可。

_ledon:
     SETB     LED
     CLR       LED

單晶片玩人 發表在 痞客邦 留言(0) 人氣()

可控制的輸出/

 記得以前作者參予筆電的研發團隊,BIOS工程師總會在列表機埠上接上幾顆LED,然後寫輸出程式控制LED的開或關,當作BIOS程式除錯之用。

 玩單晶片最重要的思維是必須看到程式的運作狀況,晶片的動作,簡單如LED開關,複雜如控制繼電器,甚至在電腦終端機顯示一段文字等等,單晶片透過輸出或輸入埠,和外界溝通,工程師也才能確定,程式在正常運作。

LED的動作控制

 LED是一個電流驅動元件,只要在LED的正極和負極之間通過小於10MA的電流,即可點亮LED

單晶片玩人 發表在 痞客邦 留言(0) 人氣()

由簡入繁

本篇先由一個簡單的組合語言程式起始,程式只有短短不到10行,不過這是一個完整的原始程式檔,編譯下載後可以點亮硬體平台的LED,下一篇另一個程式是第一個程式的改良版,程式開始讓LED閃動,像是單晶片的心臟開始跳動;兩個程式作者刻意維持最簡單的風格.作者也曾是電腦初學者,深知初學者的痛苦,記憶中作者的第一份程式長度約略100行上下,花了大約2個小時輸入和檢查,終於到了見真章的一刻,程式進入編譯階段,說時遲那時快,編譯後整個螢幕出現數拾行的錯誤訊息,當下的失望即使經過多年,仍然歷歷在目.

所以作者認為,初學者的第一個程式越簡單越好。簡單的程式較不會出錯,即使出錯也容易改正。文章中的每一個例題,都出自完整的專案程式,可以正確無誤的編譯和下載到硬體平台執行,即使如此作者還是建議讀者動手將原始碼重新輸入一遍,然後再編譯和下載.很多時候看別人寫程式好像不費什麼力氣,但真正自己寫作時卻總是錯誤百出.寫程式如同NIKE公司那句著名的廣告詞  JUST DO IT

極簡的組合語言程式

     P1M0 = 0x92

單晶片玩人 發表在 痞客邦 留言(0) 人氣()

1 2
Blog Stats
⚠️

成人內容提醒

本部落格內容僅限年滿十八歲者瀏覽。
若您未滿十八歲,請立即離開。

已滿十八歲者,亦請勿將內容提供給未成年人士。