
embedded c programming: techniques and applications of c and pic mcus
微控制器是将微型計算機的主要部分內建到一個晶片上的單晶片微型計算機。上電後,它會運作内部程式存儲器上的程式。内部程式存儲器可以使用隻讀存儲器(rom)或者flash。我們在各種地方都會發現微型計算機的蹤影,如家用電器、玩具、汽車和計算機外設(如鍵盤或滑鼠)。從電池充電器到雷達系統,幾乎所有的電子裝置中都有微型計算機的身影。
pic微控制器的速度很快,在寫作本書時已經達到每秒7000萬次指令,且價格低廉,某些型号的單價在1美元以内。由于這些優點,它逐漸成為新的設計方案中最流行的選型,并大量地應用于接口中,如usb、以太網和模拟信号接口。
c語言最初是由at&t實驗室的brian kernighan和dennis ritchie開發的,稱為k&r c,随後在1989年被ansi标準化,也就是c89。從c語言中衍生出的新特性催生了c++語言。1998年,c++的iso标準被準許通過。c++有些複雜的語言元素,使其無法應用于微控制器而隻能用于pc這樣相對宏觀的裝置。c是微控制器程式設計中最常用的語言。
c語言在計算機語言中屬于進階語言。進階語言使用一種名為編譯器的工具将c文本檔案轉換成機器語言檔案。
本書的前半部分着重講述c語言。如果讀者在這之前已經有些程式設計經驗,這會對閱讀本書有些幫助,但這些經驗并不是必需的。我們會使用c語言元素的正式定義,詳細列出微控制器所需要的全部語言特性。本書從第15章開始介紹pic微控制器及其外圍元件,以及如何在c語言中使用這些元件。硬體接口部分相關的基礎電子知識有助于讀者了解本書,但這些知識對于閱讀本書也不是必需的。
在不同的編譯器廠商之間或不同的微控制器系列之間會有些不同的c語言擴充。本書中出現的不同的處理器或編譯器之間可能會産生相容性問題,這些部分都做了标記。每一章也會分享一些好的程式設計實踐經驗以及相應的文檔。為了鞏固所學的概念,每章都會提供練習和測驗。本書中的例子全部可以在ccs c編譯器中編譯通過,這也是microchip pic系列處理器最常用的編譯器。
商标說明:pic? mcu、dspic? dsc和mplab?屬于microchip technology公司在美國及其他國家的注冊商标。
mark siegesmund
出版者的話
譯者序
前言
<a href="https://yq.aliyun.com/articles/89988">第1章 c語言概述和程式結構</a>
<a href="https://yq.aliyun.com/articles/89988">1.1 c源代碼</a>
<a href="https://yq.aliyun.com/articles/89990">1.2 注釋</a>
<a href="https://yq.aliyun.com/articles/89991">1.3 程式結構</a>
<a href="https://yq.aliyun.com/articles/89993">1.4 c預編譯指令</a>
<a href="https://yq.aliyun.com/articles/89998">1.5 函數</a>
<a href="https://yq.aliyun.com/articles/89999">1.6 聲明</a>
<a href="https://yq.aliyun.com/articles/90001">1.7 語句和表達式</a>
<a href="https://yq.aliyun.com/articles/90002">1.8 時間</a>
<a href="https://yq.aliyun.com/articles/90004">1.9 輸入準确度</a>
<a href="https://yq.aliyun.com/articles/90005">1.10 文本格式</a>
<a href="https://yq.aliyun.com/articles/90007">1.11 相容性</a>
<a href="https://yq.aliyun.com/articles/90008">1.12 小結</a>
<a href="https://yq.aliyun.com/articles/90009">1.13 練習</a>
<a href="https://yq.aliyun.com/articles/90014">1.14 測驗</a>
<a href="https://yq.aliyun.com/articles/90021">第2章 常量</a>
<a href="https://yq.aliyun.com/articles/90021">2.1 位、位元組等</a>
2.1.1 位
2.1.2 半位元組
2.1.3 位元組
2.1.4 記憶體大小
<a href="https://yq.aliyun.com/articles/90033">2.2 c常量文法</a>
2.2.1 二進制
2.2.2 十進制
2.2.3 有符号整數
2.2.4 十六進制
2.2.5 八進制
2.2.6 浮點數
2.2.7 定點數
2.2.8 字元
2.2.9 字元串
2.2.10 真和假
2.2.11 常量
<a href="https://yq.aliyun.com/articles/90035">2.3 三字母詞</a>
<a href="https://yq.aliyun.com/articles/90037">2.4 相容性</a>
<a href="https://yq.aliyun.com/articles/90039">2.5 設計文檔</a>
<a href="https://yq.aliyun.com/articles/90040">2.6 小結</a>
<a href="https://yq.aliyun.com/articles/90043">2.7 練習</a>
<a href="https://yq.aliyun.com/articles/90044">2.8 測驗</a>
<a href="https://yq.aliyun.com/articles/90051">第3章 預編譯指令</a>
<a href="https://yq.aliyun.com/articles/90051">3.1 标準預編譯指令</a>
3.1.1 #def?ine id text
3.1.2 #include 或#include “f?ilename”
3.1.3 #ifdef、#ifndef、#else、#endif和#undef
3.1.4 #if、#else、#elif和#endif
3.1.5 #error
3.1.6 #nolist和#list
<a href="https://yq.aliyun.com/articles/90053">3.2 相容性</a>
<a href="https://yq.aliyun.com/articles/90062">3.3 非标準編譯訓示</a>
3.3.1 #warning
3.3.2 #use delay
3.3.3 關于頻率
3.3.4 #use rs232(options)
3.3.5 #fuses options
3.3.6 #locate id = address
3.3.7 #byte id=x和#word id=x
3.3.8 #bit id=x.y
3.3.9 #reserve address
3.3.10 引導加載程式
3.3.11 #rom address={data}
3.3.12 #id data
3.3.13 其他編譯訓示
<a href="https://yq.aliyun.com/articles/90065">3.4 小結</a>
<a href="https://yq.aliyun.com/articles/90068">3.5 練習</a>
<a href="https://yq.aliyun.com/articles/90070">3.6 測驗</a>
第4章 變量和資料類型
4.1 資料類型
4.1.1 字元
4.1.2 整數
4.1.3 相容性
4.1.4 整數格式
4.1.5 枚舉類型
4.1.6 定點數
4.1.7 浮點數
4.1.8 幫助
4.1.9 浮點格式
4.1.10 空類型
4.1.11 類型定義
4.2 變量聲明
4.2.1 辨別符
4.2.2 變量作用域
4.2.3 變量生命周期
4.2.4 附加限定詞
4.3 設計資料
4.4 ram
4.5 小結
4.6 練習
4.7 測驗
第5章 表達式和運算符
5.1 數學運算符
5.2 相容性
5.3 運算符優先級
5.4 表達式類型和類型轉換
5.5 關系運算符
5.6 位運算符
5.7 相容性
5.8 指派運算符
5.9 自增/自減運算符
5.10 其他運算符
5.11 序列點
5.12 表達式示例
5.13 小結
5.14 練習
5.15 測驗
第6章 語句
6.1 語句定義
6.1.1 if語句
6.1.2 while循環
6.1.3 for循環
6.1.4 跳轉語句
6.1.5 switch/case語句
6.2 副作用
6.3 嵌套、縮進和括号的使用
6.4 設計文檔
6.5 程式複雜度
6.6 小結
6.7 練習
6.8 測驗
第7章 函數
7.1 main()函數
7.2 函數定義
7.3 函數參數
7.4 進階特性
7.4.1 相容性
7.4.2 引用參數
7.4.3 預設參數
7.4.4 重載函數
7.5 傳回值
7.6 内聯函數
7.7 嵌套函數
7.8 遞歸函數
7.9 序列點進階
7.10 結構良好的程式
7.11 設計文檔
7.12 實作細節
7.13 小結
7.14 練習
7.15 測驗
第8章 數組
8.1 數組初始化
8.2 常量數組
8.3 字元串變量
8.4 無下标數組
8.5 多元數組
8.6 索引範圍
8.7 數組使用示例
8.8 查找表
8.9 數組搜尋
8.10 數組排序
8.11 小結
8.12 練習
8.13 測驗
第9章 結構體
9.1 結構體嵌套和結構體數組
9.2 結構體在記憶體中的存儲
9.3 位字段
9.4 聯合體
9.5 程式中的結構體示例
9.6 小結
9.7 練習
9.8 測驗
第10章 記憶體和指針
10.1 記憶體
10.2 取位址運算符
10.3 間接運算符
10.4 強制指定變量位址
10.5 指針類型
10.6 指針運算
10.7 下标
10.8 函數參數
10.9 結構體
10.10 函數指針
10.11 指針的其他用途
10.12 錯誤行為
10.13 常見錯誤
10.14 rom指針
10.15 使用者定義記憶體
10.16 相容性
10.17 通關之後
10.18 小結
10.19 練習
10.20 測驗
第11章 内置函數
11.1 數學
11.2 記憶體
11.3 動态記憶體
11.4 一些更有趣的函數
11.5 可變參數清單
11.6 文本輸入/輸出
11.7 實作常量
11.8 相容性
11.9 位和位元組操作
11.10 非易失性記憶體
11.11 看門狗
11.12 延時
11.13 多個時鐘頻率
11.14 更多标準函數
11.15 小結
11.16 練習
11.17 測驗
第12章 字元串
12.1 字元串複制和字元串長度
12.2 字元串查找
12.3 字元串比較
12.4 字元串操作
12.5 字元串輸入/輸出
12.6 字元串和數字互相轉換
12.7 字元操作
12.8 統一字元編碼
12.9 常量字元串管理
12.10 小結
12.11 練習
12.12 測驗
第13章 函數式宏定義
13.1 參數
13.2 宏名字
13.3 串聯運算符
13.4 字元串化運算符
13.5 可變參數宏
13.6 函數式宏定義與内聯函數
13.7 可讀性
13.8 進階示例
13.9 宏調試
13.10 小結
13.11 練習
13.12 測驗
第14章 條件編譯
14.1 基本指令
14.2 關系表達式
14.3 特殊宏
14.4 特殊定義
14.5 全局定義
14.6 奇怪的錯誤
14.7 條件編譯示例
14.8 小結
14.9 練習
14.10 測驗
第15章 pic微控制器
15.1 pic架構
15.1.1 cpu
15.1.2 棧
15.1.3 工作寄存器
15.1.4 特殊功能寄存器
15.1.5 程式存儲器
15.1.6 指令
15.1.7 時鐘
15.1.8 複位
15.1.9 睡眠
15.1.10 中斷
15.1.11 配置位
15.1.12 外圍元件
15.2 最小系統
15.3 裝置程式設計
15.4 hex檔案
15.5 上電過程
15.6 時鐘配置
15.7 調試
15.8 引導加載
15.9 小結
15.10 練習
15.11 測驗
第16章 離散輸入和輸出
16.1 輸入電壓
16.2 驅動電流
16.3 驅動更大的電流
16.4 集電極開路輸出
16.5 方向
16.6 按鈕輸入
16.7 上拉電阻
16.8 消抖
16.9 濾波
16.10 記憶體映射端口
16.11 小結
16.12 練習
16.13 測驗
第17章 中斷
17.1 簡單中斷示例
17.2 時間都去哪兒了
17.3 再議消抖
17.4 中斷發生的時刻
17.5 為什麼需要中斷
17.6 中斷詳解
17.6.1 中斷标志位(if)
17.6.2 中斷使能标志位(ie)
17.6.3 全局中斷使能标志位(gie)
17.6.4 中斷處理
17.7 正确進行中斷
17.8 多個中斷同時發生
17.8.1 12位字長
17.8.2 14位字長
17.8.3 16位字長
17.8.4 24位字長
17.9 延遲
17.10 重入
17.11 相容性
17.12 小結
17.13 練習
17.14 測驗
第18章 定時器/計數器
18.1 定時器元件
18.1.1 計數器核心
18.1.2 計數器周期
18.1.3 後分頻器
18.1.4 預分頻器
18.1.5 門
18.1.6 多路轉換器
18.2 pic特性
18.3 c代碼
18.4 用定時器實作延遲
18.5 精度循環
18.6 中斷
18.6.1 以特定頻率産生中斷
18.6.2 在特定時間産生中斷
18.7 虛拟定時器
18.8 小結
18.9 練習
18.10 測驗
第19章 進階定時器
19.1 pwm
19.2 使用pwm庫
19.3 捕捉
19.4 對比
19.5 相容性
19.6 小結
19.7 練習
19.8 測驗
第20章 模拟技術
20.1 數/模轉換
20.2 模/數轉換
20.2.1 電壓高于5v
20.2.2 過濾
20.2.3 波形分析
20.2.4 混疊現象
20.2.5 在睡眠時工作
20.2.6 參考電壓
20.3 比較器
20.4 電壓檢測
20.5 相容性
20.6 小結
20.7 練習
20.8 測驗
第21章 内部串行總線
21.1 串行外圍接口
21.1.1 spi模式
21.1.2 硬體spi
21.1.3 多點spi
21.1.4 減少連線
21.1.5 噪聲
21.1.6 幀信号
21.1.7 pic從裝置
21.2 i2c
21.2.1 多個主裝置
21.2.2 特殊位址
21.2.3 10位位址
21.2.4 i2c從裝置
21.2.5 smbus
21.3 小結
21.4 練習
21.5 測驗
第22章 外部串行總線
22.1 rs-232
22.2 源代碼
22.3 uart
22.4 輸入資料中斷
22.5 輸出資料中斷
22.6 數據機控制信号
22.7 硬體流控制
22.8 軟體流控制
22.9 協定
22.10 rs-232的未來
22.11 rs-422
22.12 rs-485
22.13 文檔
22.14 小結
20.15 練習
22.16 測驗
第23章 多任務
23.1 搶占式排程
23.2 排程器排程
23.3 确定性排程
23.4 信号量
23.5 消息傳遞
23.6 await( )
23.7 任務管理
23.8 小結
23.9 練習
23.10 測驗
第24章 内聯彙編
24.1 c代碼中的彙編代碼
24.2 内聯彙編代碼
24.3 pic16/pic18資料傳送指令
24.4 在彙編代碼中通路c變量
24.5 pic16/pic18數學指令
24.6 pic16/pic18位操作類指令
24.7 pic16/pic18控制操作類指令
24.8 pic16/pic18立即數操作指令
24.9 編譯器對彙編代碼的修改
24.10 通路sfr
24.11 關于fsr
24.12 哪些不能做
24.13 優化彙編代碼
24.14 pic24指令
24.15 dspic指令
24.16 小結
24.17 練習
24.18 測驗
第25章 調試
25.1 概述
25.2 icsp
25.3 icsp插座
25.4 斷點
25.5 檢視記憶體
25.6 單步
25.7 增強調試
25.8 監控
25.9 資料流
25.10 實時性問題
25.11 使用示波器
25.12 診斷接口
25.13 記錄/回放
25.14 性能分析工具
25.15 代碼性能分析
25.16 設計驗證
25.17 小結
25.18 練習
25.19 測驗
附錄a
附錄b
附錄c
參考資料