單片機的C語言程序設計
單片機應用系統的程序設計,除了可採用彙編語言完成外,還可以採用C語言實現。目前已有多種可以對51系列單片機硬件進行操作的C語言,它們通常統稱爲C51。
C51在標準C(ANSI C)的基礎上,針對單片機的硬件資源,擴展了相應的數據類型和變量,而C51在語法規定、程序結構與設計方法上都與標準C相同。本章重點介紹 C51對標準C所擴展的部分,並結合幾個簡單實例講解單片機C51的程序設計方法。
爲什麼使用C51
- C語言是一種通用的程序設計語言,其代碼率高,數據類型及運算符豐富,並具有良好的程 序結構,適用於各種應用的程序設計,是目前使用最廣的單片機編程語言,使用 C51編譯器。
- 由C51產生的目標代碼其運行速度高,所需存儲空間小,符合C語言的ANSI標準,生成的代碼遵循Intel目標文件格式,而且可與A51彙編語言或PL/M51語言目標代碼混和使用
程序結構
全局變量說明 /*可被各函數引用*/
main( ) /*主函數*/
{
局部變量說明 /* 只在本函數引用 */
執行語句 (包括函數調用語句);
}
Fun1(形式參數表) /*函數1*/
形式參數說明
{
局部變量說明
執行語句(包括調用其他函數語句);
}
…
Funn(形式參數表) /*函數n*/
形式參數說明
{
局部變量說明
執行語句 (包括調用其他函數語句)
}
數據類型
存儲器模式
data char var; //字符變量var定位在片內RAM區
char code MSG[]=″ENTER PARAMETER:″ //字符數組定位在程序存儲區
unsigned long xdata array[100]; /* 無符號長型數組定位在片外RAM區,每元素佔4bytes*/
float idata x,y,z; /*實型變量x,y,z,定位在片內用 間址訪問的內部RAM區*/
bit lock; /*位變量Lock定位在片內RAM可位尋址區*/
unsigned int pdata dimension; /* 無符號整型變量 dimension定位
在分頁的外部RAM區 */
unsigned char xdata vector [10][4][4]; /* 無符號字符型三維數組,定位在片外RAM區*/
sfr P0=0x80; /*定義P0口,地址爲80H*/
char bdata flags; /*字符變量flags定位在可位尋址內部RAM區*/
sbit flag0=flags^0; /*定義flag0爲flags.0
指針變量
指針就是存儲單元地址,存儲這個地址的變量稱爲指針變量。
習題
2. C51與彙編語言的特點各有哪些?怎樣實現兩者的優勢互補?
答:採用C51進行程序設計,對系統硬件資源的分配比用彙編語言簡單,且程序的閱讀和修改比較容易,適於編寫較大一點的程序。
彙編語言生成的目標程序佔存儲空間少、運行速度快,具有效率高、實時性強的優點,適於編寫短小高效的程序。
7.中斷函數是如何定義的?各種選項的意義如何?
答:interrupt n 用於定義中斷函數,n爲中斷號,可以爲0~31,通過中斷號可以決定中斷服務程序的入口地址。
常用的中斷源對應的中斷號
中斷源 | 外中斷0 | 定時器0 | 外中斷1 | 定時器1 | 串行口 |
---|---|---|---|---|---|
中斷號 | 0 | 1 | 2 | 3 | 4 |
9.一般指針與基於存儲器的指針有何區別?
答:定義時未指定它所指向的對象的存儲器類型時,該指針變量就被認爲是一般指針。
一般指針佔用3個字節:第一個字節存放該指針的存儲器類型編碼(由編譯模式的默認值確定),第二和第三個字節分別存放該指針的**高位和低位地址偏移量。**定義時就指定了它所指向的對象的存儲類型時,該指針變量就屬於基於存儲器的指針。
基於存儲器的指針可以高效訪問對象,類型由C51源代碼中存儲器類型決定,且在編譯時確定。
12.改正下列程序的錯誤。
#include<reg51.h>
main ()
{a = c;
int a = 7,c;
delay (10)
void delay( );
{
char i;
for (i = 0;i< = 255;i++);
}
答:本程序有如下錯誤:
變量必須先定義後引用。
第5句調用函數後面應該加分號。
Main()函數結束處漏寫了反大括號。
被調用函數delay()在main()後面,必須在前面先聲明。
第6句函數說明語句後的分號應該去掉。
13.試說明爲什麼xdata型的指針長度要用2個字節。
答:因爲xdata是外部數據存儲器,最大可有64KB 的存儲單元,xdata指針是表示外部數據存儲單元的地址,要表示64KB個單元地址,所以必須用2字節共16位表示。
64KB=65536B=2^16B