Ⅰ 單片機的數據空間和程序空間
AT89C52的程序空間是8KB是確認無疑的,但指的是存放純二進制的機器碼,就是二進制數。而KeilC編譯的HEX代碼文件並不是純二進制數,是以ASCII碼格式存放的文件,而且其中還有一些編譯信息,如地址、校驗和等。所以,不能看HEX文件的大小來確定下載到單片機內的真正的程序空間大小,也就是說HEX文件的大小並不是真正下載的單片機的程序大小。而下載到單片機的代碼空間大小要看Keilc編譯時給出的代碼數的提示,才是真正要下載到單片機內的代碼空間。舉個例子,下圖是一個程序編譯後的提示,真正的二進制代碼是337個位元組,而HEX文件卻是1KB。這里還有一個誤區,你看到的HEX文件的大小是操作系統給出的大小吧,它是取整KB的,就是說HEX文件不足1KB時,也顯示是1KB。再明確一點說吧,假如編譯後的代碼是750418,用純二進制數(即BIN格式,有些匯編程序的編譯器輸出的就是BIN格式)的代碼保存就是3個位元組,而用HEX格式保存就是6個位元組,因為要用6個ASCII碼來表示。這來算來,HEX文件大小是BIN文件的二倍,加上一些地址信息,是大於二倍的。好,回到你的問題來,你的HEX文件是19KB,你看一下編譯後的代碼大小提示,肯定是不會超過8KB的,否則編譯時肯定會報錯的。
Ⅱ 在單片機里程序存儲器和數據存儲器的區別是什麼
程序存儲器顧名思義就是放程序的存儲器。就是把你寫的程序放到裡面去。就算斷電了但是裡面的數據還在,好比手機裡面存的電話薄,你換塊電池這中間有個斷電的過程但是數據還在。數據存儲器顧名思義就是專門放數據的,哪樣才是數據呢,比如說一個測溫度的設備,溫度時時都在變化我們不可能存某一固定的值進去,這個時候時時變化的溫度數據就是放在數據存儲器裡面的。只要一斷電它就不會保留數據
Ⅲ 51單片機通過串口實現數據的發送與接收程序
串口收發,要有通信協議。也就是什麼時候開始接收,接收到指令後,轉發什麼數據。這個要知道,才可以寫。而且使用不同的51單片機,其內部寄存器配置是不同的。
一般來說,過程如下:
1,配置串口參數、波特率等,開啟串口中斷;
void Init_UART()
{
}
2,中斷函數里寫中斷響應函數,根據接收的指令或者數據,執行相應的動作;
程序一般為:
void UART_ISR() interrupt x using y
{
;串口中斷處理函數
}
x - 單片機的C51中斷號
y - 指定使用的當前工作寄存器組號(0-3 PSW中的RS0,RS1組合)
3,主程序
int main(void)
{
Init_UART();
while(1)
{
;//數據發送函數
}
}