77范文网 - 专业文章范例文档资料分享平台

合泰单片机C语言教程(4)

来源:网络收集 时间:2018-12-19 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

盛群半導體股份有限公司

HOLTEK SEMICONDUCTOR INC C50 微電腦工具事業處部 文 件 編 號 撰 寫 人 : 版 別 1.20 日 期 2008/5/26 第 16 頁 共 189 頁 double

32 real -3.48e-38 ~ 3.48e+38 * * float, double 皆使用 IEEE754 32 位元的格式 4.3.3 變數的有效範圍 (scope)

根據變數定義的所在? 決定此變數的有效範圍. 可分為 → 區域變數 (local variable)

定義在程式區塊內 (program block, 例如函式)的變數皆是區域變數. 只有當此程式 區塊被執行時, 區域變數才會有效, 而在執行完畢並離開此程式區塊後, 這些區域 變數將無效. 程式區塊是指包含在左右大括號 ?{? 及 ?}? 之間的敘述行 定義在函式中的 static 變數則是全域變數, 參考 4.3.2 說明 → 全域變數 (global variable)

定義在所有函式之外的變數為全域變數. 當程式在執行時, 此變數皆有效, 任何函 式都可以存取或修改這個變數

範例

#include “ht48r50a-1.h” unsigned char flag ; void main(void) {

char type ; static status = 0 ; …… }

4.3.4 變數的資料型態 (data type)

當宣告變數時,必須指定它的資料型態, 以告知編譯器此變數所需記憶體的大小. 資料型態分為整數型(integer type)及浮點數型 (floating point type). 整數型又可區分為 有正負號 (signed) 及無正負號 (unsigned).

整數型 (integer) → char

佔用一個位元組 (byte) 的記憶體空間. 如加上 signed 則表示有正負號, 其大小

// 區域變數, 只有在此函式被執行時才有效 // static 變數, 只在第一次執行時設為 0 // 全域變數

盛群半導體股份有限公司

HOLTEK SEMICONDUCTOR INC C50 微電腦工具事業處部 文 件 編 號 撰 寫 人 : 版 別 1.20 日 期 2008/5/26 第 17 頁 共 189 頁

範圍是 –128 到 127. 若加上 unsigned, 則表示沒有正負號, 其大小範圍是 0 到 255. 如果沒有 signed 或 unsigned, 則被視為 signed. 可用此型態定義字元, 如 ?A?, ?d?, ?$?, ?3? 等 → short

佔用兩個位元組 (2 bytes) 的記憶體空間, 如加上 signed 則表示有正負號, 其大小 範圍是 –32768 到 32767. 若加上 unsigned, 則表示沒有正負號, 其大小範圍是 0 到 65535. 如果沒有 signed 或 unsigned, 則被視為 signed.

Holtek C 採用 little-endian 格式, 就是變數的低位元組 (least significant byte) 存 放在記憶體的低位址. 例如變數 count = 0x1234 是存放於記憶體 40H 的位址, 則低位元組的數值 0x34 存放於位址 40H, 高位元數值 0x12 存放於位址 41H. → int

與 short 型態相同 → long

佔用四個位元組 (4 bytes) 的記憶體空間, 如加上 signed 則表示有正負號, 其大小 範圍是 –2147483648 到 2147483647. 若加上 unsigned, 則表示沒有正負號, 其大 小範圍是 0 到 4294967295. 如果沒有 signed 或 unsigned, 則被視為 signed 在 little-endian 格式中, 32位元的變數, 則是先存低字元 (least significant word) 的 低位元組 (least significant byte)到記憶體的低位址, 再存放低字元的高位元組 (high byte), 再存放高字元 (high word)的低位元組, 最後才是高字元的高位元組

浮點型 (floating point)

Holtek C 支援 IEEE 754 32 位元的格式. 包括 float 及 double 兩個資料型態, 浮點數 值是以下表的格式儲存在記憶體

sign x biased exponent xxxx xxxx mantissa xxx xxxx xxxx xxxx xxxx xxxx IEEE 754 32 bit

與浮點數值的關係式為

number = (-1)sign x 2(exponent – 127) x 1.mantissa

例如, 浮點數為 2.77000e+37 在儲存到記憶體時換成 7DA6B69B 共佔 32 位元

盛群半導體股份有限公司

HOLTEK SEMICONDUCTOR INC C50 微電腦工具事業處部 文 件 編 號 撰 寫 人 : 版 別 1.20 日 期 2008/5/26 第 18 頁 共 189 頁

記憶體儲存值 sign Biased exponent 1.mantissa 0 1111 1011b (=251) 1.0100110101101101001101b (=1.302447676659) 十進位數值 2.77000e+37 32bit 7DA6B69Bh

4.3.5 bit 資料型態

類似整數型, 但是只有 0 或 1 兩個值, 所以只會取整數的最低位值 (LSB: least significant bit) 需要注意下列用法

→ bit 型態不可與 auto 一起使用, bit 型態的變數不可當函式的參數, 不可用於指標 (pointer) 的數據型態, 不可設定靜態初始值 (static)

→ bit 型態可以設為函式的返回型態, 它是存於累加器 (accumulator) 的相對位置 → 程式開始執行時, 不會設定 bit 型變數的初始值, 因此程式必須自行設定初始值 → 以下是合法的使用方式

static bit init_flag ; bit toggle_flag ; → 範例

int data = 0x54 ; bit flag ; flag = data ;

則 flag = 0 (取 data 的 LSB)

// 定義於函式內則被視為 區域變數

如果微控制器具有一個以上的 RAM bank, 例如 HT46R63, 在定義 bit 型態的變數時 需要使用前置處理指令 #pragma rambank0 指定在 RAM bank 0, 如下

#pragma rambank0 bit flag ;

#pragma norambank

盛群半導體股份有限公司

HOLTEK SEMICONDUCTOR INC C50 微電腦工具事業處部 文 件 編 號 撰 寫 人 : 版 別 1.20 日 期 2008/5/26 第 19 頁 共 189 頁

儲存類別 (storage class) 與修飾詞 (qualifier) 儲存類別 (storage class) 修飾詞 (qualifier) 指定詞 (specifier) auto, register, static, extern const, volatile, persistent typedef 變數於宣告或定義時必須指定其資料型態, 但是儲存類別及修飾詞是可選擇的, 可根據應用時的需要去設定或不使用.

儲存類別 (storage class)

儲存類別與區域變數 (local variable)及全域變數(global variable)有關. → 儲存類別 auto

auto 是給區域變數使用的, 沒有指定儲存類別的區域變數皆是 auto 寫與不寫 auto 都是相同效力. 區域變數是存放在 RAM bank 0 的空間 → 儲存類別 register

register 與 auto 類似, 是給區域變數用的, 當變數的存取很頻繁時, 可將之 設為 register, C 編譯器會使用暫存器而非資料記憶體空間來存放此變數, 如此 可增加存取的速度及減少編碼. 目前並未實做此功能. → 儲存類別 static

static 的變數會一直有效到整個程式結束後才失效. 它的初始值只會在程式開始 執行時被設定一次. 雖然 static 的變數在程式結束前皆有效, 但是定義在函式內的 static 變數仍然是區域變數, 必須要在它所定義的函式中才可以讀寫 → 儲存類別 extern

extern 通知 C 編譯器此變數是定義在其他的程式檔內, 需要經由連結器 (Linker) 連結定義此變數的檔案後, 才知道變數的所在.

以目前在微控制器的應用程式上, 比較需要使用 extern, 其他三種不具特別的優勢 可用定義全域變數(global variabl)的方式即可達到相同效果. 建議不要使用.

修飾詞 (qualifier) → 修飾詞 const

C 編譯器會將 const 的變數放置於程式記憶體 (PROM). 在定義 const 變數時, 必須要設定其值, 而程式在執行中不能修改此變數的值

盛群半導體股份有限公司

HOLTEK SEMICONDUCTOR INC C50 微電腦工具事業處部 文 件 編 號 撰 寫 人 : 版 別 1.20 日 期 2008/5/26 第 20 頁 共 189 頁

→ 修飾詞 constant

這個修飾詞是 Holtek C 編譯器特別提供的. 它會將 constant 的變數放置於程式記 憶體 (PROM) 的最後一頁 (last page). 定義 constant 變數時,必須要設定其值, 而 程式在執行中不能修改此變數的值. 使用此修飾詞要注意下列三點 ● 只能使用在 int 或 unsigned int 的資料型態

● 設定值必須配合微控制器程式記憶體的寬度, 例如, 若使用在 HT48R50A-1 時, 因為此微控制器的寬度為 15 個位元, 最高位元是無效的, 所以 0x9A 會被 C 編譯器改成 0x1A. 最高位元, 位元 15 被清除為 0

● 所有設定此修飾詞的變數或陣列, 總共佔用的字位元組 (word) 不可超過 256 個

指定詞 (specifier) → 指定詞 typedef

typedef 是針對資料型態做新名稱的宣告, 不是宣告資料型態的新變數, 而是宣告一 個新的名字. 例如將 UCHAR (新名字) 宣告為 unsigned char 的資料型態, 可使用

typedef unsigned char UCHAR ; UCHAR count ;

// UCHAR 為 unsigned char 的新名字

// 變數 count 的資料型態為 unsigned char // 等同於 unsigned char count ;

使用 typedef 宣告資料型態的新名字可以讓程式的可讀性更高, 更易了解. 例如,

typedef unsigned int WORD ; // 使用 WORD 代表 unsigned int, 16 bits typedef unsigned long DWORD ; // DWORD 代表 32 bit 的 double word

絕對變數 (absolute variable)

可以將全域變數或 static 變數指定一個固定的記憶體的位址, 例如

unsigned char PortA @ 0x12 ;

在變數名的後面再加上 ?@? 及位址

C 編譯器在編譯時會將程式中出現絕對變數的程式改為此位址, 但並未在記憶體中 保留位置給此變數, 所以從連結器 (Linker) 產出的對映檔 (map file)中找不到 此變數 C 編譯器會將之翻成組合語言的 EQU 指令,如下

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库合泰单片机C语言教程(4)在线全文阅读。

合泰单片机C语言教程(4).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/374484.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: