微機原理-06-單片機c語言設計

單片機的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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章