崑 崑
崑 崑 山 山 山 山 科 科 科 科 技 技 技 技 大 大 大 大 學 學 學 學
電子工程系四技部 電子工程系四技部 電子工程系四技部 電子工程系四技部
專 專 專
專 題 題 題 題 研 研 研 究 研 究 究 究 報 報 報 告 報 告 告 告
8051 實作煙霧 實作煙霧 實作煙霧 實作煙霧 感測器之研究 感測器之研究 感測器之研究 感測器之研究
學生 學生 學生
學生: : : : 4940K084 陳元昭 陳元昭 陳元昭 陳元昭 4940K062 林奐丞 林奐丞 林奐丞 林奐丞 指導教授
指導教授 指導教授
指導教授: : : 陳耀煌老師 : 陳耀煌老師 陳耀煌老師 陳耀煌老師
中 華 民 國 九 十 九 中 華 民 國 九 十 九 中 華 民 國 九 十 九
中 華 民 國 九 十 九 年 年 年 年 六 六 六 六 月 月 月 月
摘要 摘要 摘要 摘要
氣體偵測是用 MQ-2 感測器來作感測,可偵測的氣體有:H2 氫氣、LPG 液化石油氣、
CH4甲烷、CO 一氧化碳、酒精、煙霧、丙烷。
經過這學期的微處理機課程後,我們學習了如何使用微處理晶片來控制和數學 運算的機制,在這次的計畫裡,我們準備運用 89C51 這個功能強大的晶片來執 行感測、控制等功能。整個計畫中用到感測原理和微處理器原理,讓我們獲 得一次將課堂理論用來實做的機會。
利用單晶片AT89C51、氣體感測器、繼電器等元件,並自行製作並組裝;了解機電如 何整合,進一步研究其改進方向。
工作準備 工作準備 工作準備 工作準備
1. 閱讀 89C51 的書,了解 89C51 的基礎知識及使用方法 2. 大略了解如何用組合語言模擬程式執行
3. 實作燒錄程式碼到 AT89C51 的過程 4. 詳讀 MQ-2 的英文規格書
5. ADC0804 類比轉數位實作
研究方法 研究方法 研究方法 研究方法
1. 先利用麵包板、電源供應器、電表,測試電路是否能運作 2. 熟悉 89C51 的使用方法、組合語言使用方法,熟悉燒錄方法,
3. 寫程式
4. 將程式燒入 89C51,測試是否能依據我們的設計正常運作 5. 將電路移植到一般的電路板上,並測試是否正確
6. 連接秤重器與電路板,並修改原本電路 7. 做最後的校正及外部包裝結果
3.1 MQ-2 氣體感測器 氣體感測器 氣體感測器 氣體感測器
技術參數 技術參數 技術參數 技術參數
MQ-2具有良好靈敏度和偵測氣體寬廣範圍的特性,其工作點設計在5V加熱電
源,而電路電壓不得超過5V。電壓額定值的規格,範圍很廣,這樣可使成本降低,而可靠性提升。因為他對甲 烷、丙烷和天然氣具有高敏感度,所以MQ-2對瓦斯和LPG監視極為實用同時有短而 穩定的出始期和高可靠度的特性。
特點:
1. 廣泛的探測範圍 2. 高靈敏度/快速響應恢復 3. 優良穩定性/壽命長 4. 簡單驅動電路
應用:
可用於家和工廠的氣體泄漏監測裝置,適宜於液化氣、丁烷、丙烷、甲烷、酒精、
氫氣、煙霧等的探測,因此它是室內感應最佳的感測器。
規格
A. 標準工作條件
符號 參數名稱 技術條件 備註
V
C 回路電壓 5V±0.1 AC OR DCV
H 加熱電壓 5V±0.1 AC OR DCR
L 負載電阻 可調R
H 加熱電阻 32Ω±10% 室溫P
H 加熱耗能 小於800毫瓦MQ-2偵測器阻抗的改變,間接的改變將出現在負載電阻 R
L上,但是當瓦斯氣體如 甲烷、丙烷等接觸到偵測器表面時,若有瓦斯濃度的出現,偵測器阻抗立即降低,而由AC(交流)或DC(直流)電源電壓
V
C和V
H在R
L上所產生的電壓則是相同的。B. 環境條件
符號 參數名稱 技術條件 備註
Tao
使用溫度 -20℃~50℃Tas
儲存溫度 -20℃~70℃R
h 相對溫度 小於95%RhO
2 氧氣濃度 21%(標準條件)氧氣濃度會影響靈敏度特性 最小值大於2%
C. 靈敏度特性
符號 參數名稱 技術條件 備註
R
S 敏感體表面電阻 3KΩ-30KΩ(1000ppm isobutene) 探測濃度範圍 200ppm-5000ppm
液化氣和丙烷 300ppm-5000ppm丁烷 5000ppm-2000ppm 甲烷
300ppm-5000ppm 氫氣 100ppm-2000ppm 酒精
G(3000/10000) isobutane
濃度斜率
標準工作條件
溫度:20℃±2℃ Vc:5V±0.1 相對溫度:65%±5% Vb:5V±0.1預熱時間
不小於24小時D. 結構 外形 測試電路
部件 材料
1 氣體敏感層 二氧化錫
2 電極 金(Au)
3 測量電線引路 鉑(Pt) 4 加熱器 鎳鉻合金(Ni-Cr)
5 陶瓷管 三氧化二鋁
6 防爆管 100 目雙層不銹鋼 (SUB316) 7 卡環 鍍鎳銅材(Ni-Cu)
8 基座 電木
9 針狀管腳 鍍鎳銅材(Ni-Cu)
MQ-2其體積如煙頭般大小,主要組成元件是二氧化錫半導體,這半導體物質和
電極組合成圓形管狀殼內。MQ 系列氣體感測器結構原理圖 系列氣體感測器結構原理圖 系列氣體感測器結構原理圖 系列氣體感測器結構原理圖
MQ-2 氣敏元件的結構和外形如圖一所示(結構A or B),由微型AL
2O3 陶瓷管、SnO2 敏感層,測量電極和加熱器構成敏感元件固定在塑膠或不銹鋼製成的腔體內,
加熱器? 氣敏元件提供了必要的工作條件。封裝好的氣敏元件有6 只針狀管腳,其中 4 個用於信號取出,2 個用於提供加熱電流。
E.靈敏度特性曲線
圖三給出了MQ-2型氣敏元件的靈敏度性。
其中:
溫度:20℃
相對溫度:65%
氧氣濃度:21%
RL=5KΩ
Rs:元件在不同氣體,不同濃度下的電阻值。
R0:元件在潔淨空氣中的電阻值。
圖4 給出了MQMQMQMQ-2型氣敏元件的溫濕度特性
Ro:20℃,33%RH 條件下,1000ppm 氫氣中元件電阻。
Rs:不同溫度,濕度下,1000ppm 氫氣中元件電阻。
靈敏度調整
MQ-2 型氣敏元件對不同種類,不同濃度的氣體有不同的電阻值。因此,在使用
此類型氣靈敏元件時,靈敏度的調整是很重要的。我們建議您用1000ppm液化氣或 1000ppm 丁烷校準感測器.。當精確測量時,報警點的設定應考慮溫濕度的影響。
圖三 :
3.2 ADC0804 相關知識 相關知識 相關知識 相關知識
3.2.1 類比 類比 類比 類比/數位轉換器 數位轉換器 數位轉換器 數位轉換器 ADC0801~ADC0805 的認識 的認識 的認識 的認識
雖然微電腦可以將各種數位資料做快速而精確的處理,但是人類在日常生活中所 遇到的各種物理量(例如溫度、亮度、重量)都是類比的,因此欲令微電腦處理類比信 號,必須先將類比信號轉換成數位信號才送進微電腦。
類比/數位轉換器(analog to digital converter)簡稱為 A/D 轉換器(A/D converter)。
A/D
轉換器的功能是將輸入之類比信號轉換成數位信號輸出。目前最常用的 A/D 轉換器是 ADC0801 糸
列,編號從 ADC0801 到 ADC0805,它們的接腳及特性皆相容,可以互相代換使用,
圖 2-2 ADC0804 基本用法
各說明如下:
(1) 功能:8 位元 A/D 轉換器
(2) 接腳圖:見圖 2-1 (3) 特點:
※8 位元 CMOS 連續漸進型 ADC。
※三態閂鎖輸出。
※最大誤差±1LSB◦
※轉換時間 100uS@640KHZ。
※內部含有時脈產生電路,頻率由外加 R、C 決定。
3.2.2 基本用法 基本用法 基本用法 基本用法
(1) 基本用法見圖 2-2 (2) 動作情形:
a.若令 CS 及 WR 腳皆為”0”,則會令 INTR 接腳變 為”1”,且使類比至數位電路完成 準備工作。
b.經過 100ns 後,若 CS 與 WR 之中有任一腳以上變為”1”,則類比至數位轉換電路進 入工作狀態,開始將類比輸入電壓 Vx 轉換成 8 位元的數位資料。
c.當轉換好後,會將數位資料保存在栓鎖器,並令 INTR 腳輸出”0”表示已轉換完成,
見圖 2-3。
圖 2-1 ADC080X 接腳圖
圖 2-3 時序圖
d.若令 CS 及 RD 腳皆為”0”,則三態緩衝器導通,將數位資料由 DB7~DB0 輸出,
見圖 2-4。
e. 第 9 腳 (1/2 VREF )這是一支很重要的輸入腳,標示 VREF/2,表示只要輸入 VREF 的一
半到 Pin9,就能得到步階的大小=VREF / 2N =VREF / 28 =VREF / 256。
f. 第 10 和 8 腳(D GND),(A GND)分別是數位的接地及類比的接地。
g. 數位輸出信號 DB 與類比輸入電壓 Vx 的關係為:DB=51 Vx。
h. ADC0804 其內部已內建一組時脈產生電路,只要在第 19 和 4 腳之間接一個電 阻 R,且於
第 4 腳上再接一個電容 C 對地,就能產生時脈供 ADC0804 使用。而其頻率的大小約 為
fCLK≒1/1.1RC (3) 防雜訊的干擾:
a.在第 20 和 10 腳之間接一個 1uF 以上的電容。
b.在第 8 和 9 腳之間接一個 0.1uF 的電容。
圖 2-4 時序圖
3.3 使用 使用 使用 使用 ADC0804 量測濃度 量測濃度 量測濃度 量測濃度
我們實際做了以下實驗:
1.乾淨的空氣中感測器的阻值為 RO,無法直接用電表測量,因為我們想出來分壓公 式來反推求 RO。
在乾淨的空氣中量出感測器 RO 和 RL=5.1K 串連之後的分壓為 1V 由分壓公式:5V* 5.1K/(RO+5.1K)=1V ,=> RO=20K
2.在固定氣體下,可由下圖:RS/RO 來比對出濃度,現在 RO 已經求得為 20K,RS 為在不同濃度下,感測器的阻值。
3.整理數據如下表: RS/RO 已知(上圖)、RO 已知 =>RS
可求出 RS 和 RL(5.1K)串連後的分壓,RS 代入分壓公式:5V* 5.1K/(5.1K+RS) A/D 值為電壓值*51,再將數值四捨五入
RS/RO RS RS 和 RL 分壓後的電
壓 A/D 值 四捨五入
0.1 2 3.591549296 183.169 183 0.2 4 2.802197802 142.9121 143 0.3 6 2.297297297 117.1622 117 0.4 8 1.946564885 99.27481 99 0.5 10 1.688741722 86.12583 86 0.6 12 1.49122807 76.05263 76 0.7 14 1.335078534 68.08901 68 0.8 16 1.208530806 61.63507 62 0.9 18 1.103896104 56.2987 56
1 20 1.015936255 51.81275 52 2 40 0.5654102 28.83592 29 3 60 0.391705069 19.97696 20 4 80 0.299647474 15.28202 15 5 100 0.24262607 12.37393 12 6 120 0.20383693 10.39568 10 7 140 0.175740868 8.962784 9 8 160 0.154451847 7.877044 8 9 180 0.137763371 7.025932 7 10 200 0.124329595 6.340809 6 4.建好以上數據表後
將以上表格的A/D值在8051的程式裡建一個表,再將每次ADC0804讀到的值和表比 對,比如ADC0804讀到的值為7,和表格作比對後,再將RS/RO的值顯示在LCD上,此 例為9,再用下圖查出濃度
3.4 MQ-2 暖機過程 暖機過程 暖機過程 暖機過程
當電源啟動的那一段時間,因加熱器尚未加熱完全,此時感測器的RS有一段阻值變小 的時間,大約數十秒到數分鐘後,才會得到穩定的數據。而每一次測完氣體後,要把 感測器置於乾淨的空氣中,且等到一段時間後,RS才會又恢復到待機狀況的數據。
因為我們使用ADC0804將電壓值讀出後,存到暫存器40H裡,等待10秒後再將目前的 A/D跟40H作比對,若不相同,表示還在下凹的曲線上,若10秒後的A/D跟10秒前的A/D 相同,我們則判定暖機完成。
3.5 LCD 顯示器 顯示器 顯示器 顯示器
LCD 控制電路
雖然 LCD 的接腳因製造廠商的不同而排列方式有所不同,不過都是編號由 1 至 14, 的 14 根接腳.
P0.7 P0.0
P0.6
LCM 16x2
12
7891011121314 3456 VCCVO
D0D1D2D3D4D5D6D7 GND
RSR/-WE
P0.5 P0.3P0.4 P0.1P0.2
+5V
P2.7
LCD模組
P2.6 P2.5
NO Symbol Function 1 GND 主電源 0V 2 VDD 接地端 5V
3 V0 顯示明暗對比控制腳 CONTRAST ADJ 4 RS 暫存器選擇信號(Register)
RS=0 為資料,RS=1 為指令暫存器 5 R/W R/W=1 表示從 LCD 模組讀取資料
R/W=0 表示將資料寫入 LCD 模組 6 E LCD 模組的致能端
7 DB 0 Data Bit 0 8 DB 1 Data Bit 1 9 DB 2 Data Bit 2 10 DB 3 Data Bit 3 11 DB 4 Data Bit 4 12 DB 5 Data Bit 5 13 DB 6 Data Bit 6
14 DB 7 Data Bit 7 但是也拿來傳送 BF LCD 內部的旗號與暫存器
1. 忙碌旗號 Busy Flag(BF)
BF 旗號是 LCD 用來告訴 CPU 他內部是否再忙碌的一個旗號,若 BF=1,表示 LCD 正在處理內部的工作,因此此時不可以寫資料給 LCD.當 BF=0,表示 CPU 可以寫資料 給 LCD.當接腳 RS=0 且 R/W=1 時,忙碌旗雕的接腳會由 DB7 輸出.
2. 暫存器
LCD 模組內只有 2 個 8 位元暫存器,稱為指令暫存器(Instruction Register IR),和資 料暫存器(Data Register,DR),他們都是 8 位元暫存器,由 RS 腳來選用.
指令暫存器 IR 用來接收單晶片送來的命令,例如清除顯示,或功能設定等等…資料暫 存器 DR 則用來接收單晶片要寫到 DDRAM(共 80Byte)或 CGRAM(共 64Byte)的
資料緩衝區.當單晶片寫到 DR 暫存器之後.LCD 內部的控制電路會將資料自動寫 到 DD RAM 或 CG RAM 中,而位址是由 LCD 內部的位址計數器(Address Counter AC)所指定.而單晶片要讀取資料時,需先將欲讀取的位址放入 IR 暫存器中, LCD 就 會將其內容放入 DR 中,然後單晶片就可以去讀取 DR 的資料.
3. 位址計數器 AC
位址計數器是用來指定欲存取的 DD RAM 和 CG RAM 的位址.位址設定指令將位 址寫入 IR 暫存器之後,LCD 內部控制電路會將 IR 暫存器的內容送至 AC.當資料 存取之後,AC 便會自動加一(I/D=1)或減一(I/D=0).
字元產生器 Character Generat ROM (CG ROM)
LCD 內部有一個存放字型的 ROM,它裡面存著 192 個 5x7 點矩陣的字型.這些字 型,由存放在 DD RAM 中的 ASCII 碼叫出來顯示.例如:’A’的字型碼為 01000001(即 41H)
5.自創字型產生器
LCD 模組除了提供標準的字型 CG ROM 供人使用之外,另外還提供一塊 64 位元組 的 CG RAM 空間供人從放 user 自己設計的字,一個字要 8 個位元組(5x7 點矩陣), 因此 64/8=8,做多可放 8 個新字元.要顯示自己的字元時,需先將 5X 點矩陣圖形放 入 CG RAM 中.而要叫出自元時,其字型碼為 00H~07H.
↑圖 2.4.4 LCD 模組寫入時序
↑圖 2.4.5 LCD 模組讀出時序圖 LCD 模組控制命令
LCD 模組可以接受 CPU 送至 IR 暫存器的命令,並加以執行.其指令共有 11 道,除 了 Clear Display 和 Cursor Home 為 1.64ms 之外,其餘都為 40ns.
1. 清除顯示 Clear Display 指令
動作:將 DDR 資料全部填入空白碼 20H,並將游標移到左上角原點位置,清除 DD RAM 的位址計數器 AC 為 00H,I/D 設為 1.
2. 游標歸位 Curse Home 指令
動作: DD RAM 的資料保持不變,僅將游標移至左上角原點處,及第一行的第一個 字,DD RAM 的位址計數器設為 00H.
3. 輸入模式設定 Entry Mode 指令
2.4. 顯示 ON/OFF 控制(Display ON/OFF) 指令
動作: D:顯示器控制位元,D=0 關 D=1,開
C:游標顯示控制位元, C=0 不顯示 C=1 顯示
B:游標閃爍 Blink 控制位元,B=0 不閃爍,B=1 閃爍
5. 游標移位控制
指令
6. 功能設定 Function Set 指令
動作: DL:設定介面的位元寬度,DL=1 時為 8 位元,若 DL=0 時為 4 位元.
N:設定顯示器的行數,N=0 時,1 行顯示 N=1 時,2 行顯示.
F:字型 Font 設定.
7. CG RAM 位址設定指令
動作:設定 CG RAM 的位址,由 A5~A0 之六個位元位址 00H~3FH 位址 共 64 個位元組,當寫入本命令之後,接個輸入的資料將寫到 CG
RAM 中.
8. 8.DD RAM 位址設定指令
動作:設定 DD RAM 的位址,由 A6~A0 之七個位元定址,接著寫入的資料將寫入 DD
RAM 中.
9. 讀取忙碌旗標 BF 即位址計數器 AC 的內容.指令
動作:若讀出的 BF=1,表示 LCD 模組正忙著內部的工作,因此,無法接受 CPU 的命令, 直到 BF=0 才可以.在讀 BF 的同時,也會讀到位址計數器的值(DB0~DB6),這個讀出 的位址,可能是 CG RAM 的位址或是 DD RAM 的位址,端看前面設定.
10. 寫資料到 CG RAM 或 DD RAM 中指令
動作:寫入 8 位元的資料(D0~D7)到 DD RAM 或 CG RAM,至於是寫到那一個,則是 看前一次式設定 DD RAM 或是 CG RAM 的位址.
11. 自 CG RAM 或 DD RAM 中讀取資料指令
動作:寫入 8 位元的資料(D0~D7)到 DD RAM 或 CG RAM,至於是寫
到那一個,則是看前一次式設定 DD RAM 或是 CG RAM 的位址
圖 2.4.6 LCD 控制指令表
LCD 初始化副程式
LCD 模組在送電後,使用之前,單晶片必須要先去規劃 LCD 的各項功能,或工作模 式,LCD 才能正常工作.這個動作稱為 LCD 的初始化.
例:功能設定命令
第四章 第四章 第四章 第四章 89C51 89C51 89C51
89C51 程式規劃 程式規劃 程式規劃 程式規劃 系統方塊方塊圖 系統方塊方塊圖 系統方塊方塊圖 系統方塊方塊圖
主程式流程圖
主程式流程圖 主程式流程圖 主程式流程圖
8051 氣體感
測器
LCD 顯 示器
ADC0804 類比轉數 位
開始
開始熱機 並讀出數位值,顯
示在 LCD 上
10 秒到?
否
是
比較目前 A/D 值和 10 秒前
A/D 值
是 相同?
暖機完成,顯 示主畫面
A/D 將電壓值轉數 位,再查表,將 RS/RO
顯示在 LCD 上 否
R3>12?
啟動警報 20 秒
附錄一 附錄一 附錄一
附錄一參考文獻 參考文獻 參考文獻 參考文獻
[1] 盧明智、許陳鑑編著,電子實習與專題製作感測器應用篇,全華圖書有限公司,
2008。
[2]蔡朝洋,單晶片微電腦8051/8951原理與應用,全華科技圖書股份有限公司,2003。
[3] 鄧錦城編著,8051單晶片實作寶典,益眾資訊有限公司,2000。
零件表 零件表 零件表 零件表
項目 數量 編號 規格
1 1 1 煙霧感測器 2 2 C2,C1 30PF
3 2 C3,C6 104 4 1 C4 10uF 5 1 C5 150P 6 1 C7 220uF/16V 7 1 J1 POWER 8 2 R3,R1 10K 9 1 R2 5.1K 10 1 U1 8051 11 1 U2 ADC0804 12 2 U4,U3 78M05 13 1 Y1 12MHZ
附錄二 附錄二 附錄二
附錄二 8051 8051 8051 程式碼 8051 程式碼 程式碼 程式碼
EN REG P3.5 ;LCD 控制腳 RW REG P3.6 ;LCD 控制腳 RS REG P3.7 ;LCD 控制腳
ADDR EQU 37H CNT EQU 38H
ORG 00H ;設定程式開頭位置 AJMP START
;--- -
; MAIN
;--- - START:
MOV 32H,#10 MOV 31H,#0
ACALL INIT ;呼叫 LCD 初始化副程式 MOV A,#80H ;顯示在 LCD 第 1 行第 1 字 ACALL W_INS ;傳指令至 LCD MOV CNT,#16
MOV DPTR,#MSG3 ;
ACALL W_STR ;傳字串至 LCD SHOW 出資料 MOV A,#C0H ;顯示在 LCD 第 1 行第 1 字
ACALL W_INS ;傳指令至 LCD MOV CNT,#16
MOV DPTR,#MSG4 ;
ACALL W_STR ;傳字串至 LCD SHOW 出資料
CALL ATOD
MOV A,B MOV B,#10 DIV AB
MOV 40H,A ;AD 值/10 存到 40H HEAT:
MOV A,#8CH ;顯示在 LCD 第 1 行第 13 字 ACALL W_INS ;傳指令至 LCD
CALL ATOD
MOV 30H,B ;AD 值->30H MOV A,B
MOV B,#100
DIV AB ;AD 值/100,商數轉成 ASCII 碼再顯示在第 1 行第 13 字 ADD A,#30H
CALL W_DATA MOV A,B
MOV B,#10
DIV AB ;AD 值/100 的餘數/10,商數轉成 ASCII 碼再顯示在第 1 行第 14 字 ADD A,#30H
CALL W_DATA
MOV A,B ;AD 值/100 的餘數/10 的餘數轉成 ASCII 碼再顯示在第 1 行第 15 字 ADD A,#30H
CALL W_DATA
MOV A,#C6H ;顯示在 LCD 第 2 行第 7 字 ACALL W_INS ;傳指令至 LCD
MOV A,31H ;時間計數值
MOV B,#100
DIV AB ;時間計數值/100,商數轉成 ASCII 碼再顯示在第 2 行第 7 字 ADD A,#30H
CALL W_DATA MOV A,B
MOV B,#10
DIV AB ;時間計數值/100 的餘數/10,商數轉成 ASCII 碼再顯示在第 2 行第 8 字 ADD A,#30H
CALL W_DATA
MOV A,B ;時間計數值/100 的餘數/10 的餘數轉成 ASCII 碼再顯示在第 2 行第 9 字 ADD A,#30H
CALL W_DATA
INC 31H ;時間計數值加 1 CALL DELAY1S ;延時 1 秒 DJNZ 32H,HEAT ;10 秒到了?
MOV 32H,#10
MOV A,30H ;目前 AD 值/10
MOV B,#10 DIV AB
CJNE A,40H,HEAT2 ;再比對 10 秒前 AD 值/10,相等則往下,否則跳 HEAT2 JMP HEATOK
HEAT2:
MOV A,30H ;把目前 AD 值存到 40H
MOV B,#10 DIV AB MOV 40H,A JMP HEAT
HEATOK:
CALL ON
LOOP:
ACALL ATOD ;呼叫副程式,致能 ADC0804 這顆 IC,並把數值讀進來 P2 腳
WAIT1: MOV R3,#00H ;令字形及電壓值的指標為 0
LOOP1: CLR C ;設 C 為 0
ACALL READTEMP ;讀電壓資料表,查表法
INC R3 ;把字形及電壓值的指標加 1
MOV A,B ;把量測到的電壓數值放進去 A
SUBB A,R1 ;A 減去 R1
JNC LOOP1 ;A 減去 R1,一直減到 R1(查表)比 A(量測)大 <=====C 被借位變成 1
MOV R5,#10 ;C 被借位變成 1,往下做
;此時電壓已找到
DEC R3 ;多加了兩次要減回來
DEC R3
ACALL DISPLAY ;呼叫顯示副程式
CALL ALARM ;呼叫偵測警報副程式
CALL DELAY1S ;延時 1 秒 MOV A,3AH
CJNE A,#1,LO2 ;3AH=1 時,表示要啟動警報 CLR P1.0 ;風扇腳
CPL P1.1 ;蜂鳴器腳 CPL P1.4 ;LED 腳 JMP LOOP
LO2:
SETB P1.0 ;風扇腳 SETB P1.1 ;蜂鳴器腳 SETB P1.4 ;LED 腳 JMP LOOP
;--- --- --
; POWER ON
;--- --- --
ON: PUSH A
MOV A,#80H ;顯示在 LCD 第 1 行第 1 字 ACALL W_INS ;傳指令至 LCD
MOV CNT,#16
MOV DPTR,#MSG1 ;
ACALL W_STR ;傳字串至 LCD SHOW 出資料 MOV A,#C0H ;顯示在 LCD 第 2 行第 1 字 ACALL W_INS ;傳指令至 LCD
MOV CNT,#16
MOV DPTR,#MSG2 ;
ACALL W_STR ;傳字串至 LCD SHOW 出資料 POP A
RET
;--- --- ---
; INIT LCD
;--- --- --- INIT:
;
MOV A,#38H
ACALL W_INS ;傳指令至 LCD MOV A,#38H
ACALL W_INS ;傳指令至 LCD MOV A,#38H
ACALL W_INS ;傳指令至 LCD MOV A,#38H
ACALL W_INS ;傳指令至 LCD MOV A,#08H ;FUNCTION SET ACALL W_INS ;傳指令至 LCD MOV A,#01H ;CLEAR DISPLAY ACALL W_INS ;傳指令至 LCD MOV A,#06H ;INPUT MODE SET ACALL W_INS ;傳指令至 LCD MOV A,#0CH ;DISPLAY ON/OFF
ACALL W_INS ;傳指令至 LCD RET
;--- --- ---
; CLEAR LCD
;--- --- ---
CLRLCD: MOV A,#01H
ACALL W_INS ;傳指令至 LCD RET
;--- --- ---
; WRITE STRING TO LCD
;--- --- --- W_STR: PUSH A MOV R5,#0 STR: MOV A,R5
MOVC A,@A+DPTR
ACALL W_DATA ;傳單字至 LCD SHOW 出資料 INC R5
DJNZ CNT,STR POP A RET
;--- --- ---
; WRITE INS TO LCD
;--- --- --- W_INS: PUSH A ACALL CHECK CLR RS CLR RW SETB EN MOV P0,A CLR EN POP A RET
;--- --- ---
; WRITE DATA TO LCD
;--- --- --- W_DATA: PUSH A
ACALL CHECK SETB RS CLR RW SETB EN MOV P0,A CLR EN POP A RET
;--- --- ---
; CHECK LC D BUSY
;--- --- ---
CHECK: PUSH A BUSY: CLR RS SETB RW SETB EN MOV A,P0 CLR EN
JB ACC.7,BUSY ACALL DELAY POP A RET
;--- --
; DELAY
;--- --
DELAY: MOV R6,#20 D1: MOV R7,#150 DJNZ R7,$
DJNZ R6,D1 RET
ALARM:
MOV A,R3 ;R3 大於 12 時,設 3A=1 否則 3AH=0 CLR C
SUBB A,#12
JNC A_ON A_OFF: MOV 3AH,#0
JMP A_BACK A_ON:
MOV 3AH,#1 A_BACK:
RET
; ====================
; =讀電壓資料副程式 ==
; ====================
READTEMP:MOV DPTR,#TABLE MOV A,R3
MOVC A,@A+DPTR MOV R1,A
RET
; ====================
; == 顯示副程式 ==
; ====================
DISPLAY:
MOV A,#C7H ;設定顯示位置為第一行第 13 個字
CALL W_INS MOV A,R3 MOV B,#3 MUL BA
MOV DPTR,#TABLE1 ;查字形表 MOVC A,@A+DPTR ;顯示 RS/RO 值 CALL W_DATA
MOV A,R3 MOV B,#3 MUL BA INC A
MOVC A,@A+DPTR ;顯示 RS/RO 值 CALL W_DATA
MOV A,R3
MOV B,#3 MUL BA INC A INC A
MOVC A,@A+DPTR ;顯示 RS/RO 值 CALL W_DATA
RET
; ====================
; == 電壓資料表 ==
; ====================
TABLE:
DB 6 DB 7 DB 8 DB 9 DB 10 DB 12 DB 15 DB 20 DB 29 DB 52 DB 56 DB 62 DB 68 DB 76 DB 86 DB 99 DB 117 DB 143 DB 183
; ====================
; == 字形表 ==
; ====================
TABLE1: DB '010'
DB '009' DB '008' DB '007' DB '006' DB '005' DB '004' DB '003' DB '002' DB '001' DB '0.9' DB '0.8' DB '0.7' DB '0.6' DB '0.5' DB '0.4' DB '0.3' DB '0.2' DB '0.1'
; ====================
; == AD 轉換副程式 ==
; ====================
; 起動 ADC0804 ATOD:
CLR P1.7 ;令 ADC0804 的 WR=0 SETB P1.7 ;令 ADC0804 的 WR=1
; 等待 ADC0804 把類比電壓轉換成數位資料
WAIT: JB P1.6,WAIT ;等待 ADC0804 的 INTR=0
; 讀進轉換完成的 Vx 對應值
MOV A,P2 ;把轉換完成的數位資料讀進累積器 A 內
MOV B,A ;返品主程式
RET
DELAY1S: MOV R5,#10
DLL0: MOV R6,#250 DLL1: MOV R7,#200 DLL2: DJNZ R7,DLL2
DJNZ R6,DLL1 DJNZ R5,DLL0 RET
;--- --- -
; MESSAGE
;--- --- -
MSG1: DB 'MQ-2 GAS SENSOR ' MSG2: DB 'RS/RO: ' MSG3: DB 'Preheat... '
MSG4: DB 'Timer: s ' END;
附錄三 附錄三 附錄三
附錄三 電路圖 電路圖 電路圖 電路圖
主板電路
P2.1
P1.5
U1
8051 31 19
18
9
12 13 14 15 1 2 3 4 5 6 7 8
39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 17 16 29 30 11 10 20
40 EA/VPP XTAL1
XTAL2
RESET
P3.2_INT0 P3.3_INT1 P3.4_T0 P3.5_T1 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 P2.0 P2.1 P2.2 P2.3 P2.4 P2.5 P2.6 P2.7 P3.7_RD P3.6_WR PSEN ALE/PROG P3.1_TXD P3.0_RXD GND
VCC
P0.6
P1.0
P0.1
P3.6 P3.2
P3.4
P2.2
P3.5
P1.2
P2.7 P0.5
+5V
P3.0 P0.5 P0.5
R3 10K C1
30PF
P2.6 C4 +
10uF
P0.5 P0.2
P3.1 C2
30PF
P0.7 P0.3 +5V
P3.3
P0.0
P0.4
P1.1
P1.6
P2.4 P2.0
P1.4
P3.7 P2.3 P2.5
P1.3
P1.7 Y 1 12MHZ
電源電路
+ C7 220uF/16V
9V變壓器插座
+5V
+9V U4
78M05 1
2
3 VOUT
GND
VIN J1
POWER 1 2 +9V 3 GND 3
氣體偵測 A/D 電路
P2.5
C6 104 P2.3 P2.1
R1 10K
P2.4 P2.6
R2 5.1K
U2
ADC0804 6
7 9
11 12 13 14 15 16 17 18
19
20 4
5 1
2 3
8 10 +IN
-IN VREF/2
DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
CLKR
VCC/VREF CLKIN
INTR CS
RD WR
A GND D GND
+5V
1
煙煙煙煙煙
P2.7 C5
150P
P1.7
P2.2
P1.6 +5V
C3 104
P2.0
LCD LCD LCD LCD 電路電路電路電路
P3.5
P0.6 P0.4P0.5 P3.7
P0.0
P0.2
LCM 16x2
12
7891011121314 3456 GNDVCC
D0D1D2D3D4D5D6D7 VC
RSR/-WE
P0.1
P0.3 P3.4
P0.7
+5V
直流風扇電路
直流風扇電路 直流風扇電路 直流風扇電路
J6
風風
1 2
P1 P2 RLY 1
RELAY
COM
NC NO L1
L2 Q1 A1015 +5V
+12V D3
1n4148 P1.0
R16 100Ω
蜂鳴器
蜂鳴器 蜂鳴器
蜂鳴器 LEDLEDLED 電路LED電路電路 電路
BZ1
蜂蜂煙
D1
警警警警LED
R3 300 P1.1
P1.4
+5V
附錄四 附錄四 附錄四
附錄四MC MC MCS MC S S S----51 51 51簡介 51 簡介 簡介 簡介
2222----1 MCS1 MCS1 MCS1 MCS----515151簡介51簡介簡介 簡介
MCS-51是Intel公司所設計的8051系列單晶片的總稱,較具知名度的編號有8051、
8751和8031,這些不同的單晶片都使用相同的核心CPU與指令集,只是能在靠製造IC 時給予不同的周邊設計,分別賦予這些IC一個特別編號。
圖2-1 MCS-51的成員
以下將MCS-51系列單晶片的主要功能列舉如下:
1. 專為控制應用所設計的8位元CPU 2. 有完整的單位元邏輯運算指令
3. 有32條(4個Port)雙向且每條都可以被單獨定址的I/O 4. 內部有128byte可供讀/寫的RAM
5. 內部有兩個16位元Timer/Counter
6. 有一個通信用的全雙工UART(串列I/O)
7. 可接受5個中斷源,且有2層優先權的中斷結構 8. 內部有時脈振盪器(最高頻率可到12MHz) 9. 內部有4K的程式記憶體
10. 可在外部擴充到64K程式記憶體(EPROM) 11. 可在外部擴充64K資料記憶體(RAM) 2-2 MCS-51的接腳
圖2-2 MCS-51的40Pin DIP包裝的接腳圖
1~81~8
1~81~8腳腳腳腳 (P1.0~P1.7)(P1.0~P1.7)(P1.0~P1.7)(P1.0~P1.7)::: :
這8支角是8051的I/O port,稱為PI。第一腳(P1.0)是LSB,第8支腳(P1.7)是MSB。如
果是8052(8032或8752)時,P1.0又可當作Timer2的外部脈波輸入腳,P1.1又當作T2EX,
可當作另外一個外部中斷觸發輸入腳。P1上的每支腳都可推動4個LS TTL。
9999腳腳腳腳(RESET)(RESET)(RESET): (RESET)
8051的重置(RESET)輸入腳,當這支腳由外部輸入High(+5V)的信號時,8051就被 重置,8051被重置後就從位址0000H開始執行程式。且特殊功能暫存器(SFR)裡的所有 暫存器都會被設成已知狀態。
10~17 10~17 10~17
10~17腳腳腳腳 (P3.0~P3.7)(P3.0~P3.7)(P3.0~P3.7)(P3.0~P3.7)::: :
這8支腳是8051的I/O port,稱為P3。第10支腳(P3.0)為LSB,第17支腳(P3.7)為MSB。
P3裡的每支I/O腳除了可以當作單純的輸入/輸出使用外,也當作8051內部的某些週邊 與外界溝通個I/O腳。例如P3.0和P3.1接腳的另外一個名稱為RxD和TxD,當8051內部的 UART被軟體啟動後,UART會將串列資料從TxD腳輸出,而UART也接收由外部送進 來的串列信號。INT0和INT1是8051的兩個外部中斷輸入部。T0是Timer0的外部脈波輸 入腳。T1是Timer1的外部脈波輸入腳。WR,RD,當您再8051的外部擴充資料記憶體 (RAM)時,這兩條線是控制寫與讀的信號。P3上的每一隻I/O腳都可以做兩種用途。那 8051怎麼知道P3上的某支腳是當I/O或當另一種用途,例如您要使用UART時您將第10 腳看成RxD,第11腳看成TxD加以使用就可以了。但是有一點必須特別注意,那就是 當作其他功能(不當I/O使用)使用的那支腳的內部栓鎖器的內容必須設為1,其他的功 能(如TxD,RxD,RD,ER,⋯等)才會有作用。P3上的每支I/O腳都可推動4個LS TTL。
18~
18~
18~
18~19191919腳腳腳腳(XTAL2(XTAL2(XTAL2(XTAL2,,,,XTAL1)XTAL1)XTAL1)XTAL1)::: :
這兩支腳是8051內部時脈振盪器的輸入端,您可以在這兩支腳上跨街一個12MHz 的工作頻率,供內部使用。8051會根據這個速度工作。若未特別註明,這個振盪器的 工作頻率是在1MHz~12MHz之間的任何一個。如果線路板上已有振盪器,那這個振盪 器所產生的脈波(Clock)也可以直接輸入給8051使用。這個外部送給8051使用的脈波是 從第18腳(XTAL2)輸入,而19腳(XTAL1)必須接地,以上的接法是CMOS的8051(如 8051AH)。
如果您是使用CMOS的8051(80C51,80C31等),外部的脈波必須從19腳(XTAL1)輸入而 18腳空接,這個差別必須特別注意。
40 40 40
40,,,20,2020腳20腳腳腳(Vcc(Vcc(Vcc(Vcc,,,,Vss)Vss)Vss)Vss)::::
這是8051的電源輸入端,40腳接電源的正端的20腳接地。
電源規格是5V +/- 10﹪。
21~28 21~28 21~28
21~28腳腳腳腳(P2.0~P2.7)(P2.0~P2.7)(P2.0~P2.7)(P2.0~P2.7)::: :
這8支腳是8052的I/O port,稱為P2,P2.0為LSB,P2.7為
MSB。P2除了當作I/O使用之外。如果您在8051的外面擴充程式記憶體或資料記憶體 時,P2就變成8051的位址匯流排的高位元組(即A8~A15),此時P2就不能當作I/O使用。
P2上的每支I/O腳可推動4個LS TTL。
39~32 39~32 39~32
39~32腳腳腳腳(P0.0~P0.7)(P0.0~P0.7)(P0.0~P0.7)(P0.0~P0.7)::: :
這8支腳也是8051的I/O port,稱為P0其中P0.0為LSB,P0.7為MSB。如果將P0當作 I/O使用時必須特別注意P0的輸出型態是Open Drain,其他三個I/O port(P1,P2,P3)內
部有pull high電路。P0除了當作I/O使用外,如果您在8051的外面擴充程式記憶體或資 料記憶體時,P0就當作位址匯流排(A0~A7)和資料匯流排(D0~D7)多工使用。您必須再 外部加一個8位元栓鎖器將位
址匯流排從PC上分離出來,這個A0~A7與P2所提供的A8~A15合成一個16位元的位址匯 流排,因此8051可以在外部定址到64K的記憶體。
29 29 29
29腳腳腳(PSEN)腳(PSEN)(PSEN)(PSEN)::: :
這支腳是8051用來讀取放在外部程式記憶體的指令時所用的讀去信號,通常這支 腳是接到EPROM的OE腳。8051分別致能放在外部的EPROM(程式記憶體)與RAM資料 記憶體是兩塊獨立的記憶體,且這兩塊記憶體都可以接到64K,因此我們說8051的定 址能力可達128K。
30 30 30
30腳腳腳(ALE)腳(ALE)(ALE)(ALE)::::
這支腳的名稱為 ”位址拴住致能” (Address Latch Enable,簡稱ALE),8051可以 使用這支腳觸發外部的8位元栓鎖器,將P0上的位址匯流排信號(A0~A7)鎖入栓鎖器 中。
31 31 31
31腳腳腳(EA)腳(EA)(EA)(EA)::: :
這是一支輸入腳,當EA=0時,8051一律執行外部程式記憶體裡的程式,因此8051 內部的4K程式記憶體就沒有用了。因此如果您要使用內部的程式記憶體時,一定要將 EA接+5V。因為8031(或8032)內部沒有程式記憶體,它的EA必須接地。
2222----3 80513 80513 80513 8051的記憶體結構的記憶體結構的記憶體結構的記憶體結構
8051的記憶體可以分成3塊獨立的記憶體,如圖所示:
1. 內部加上外部的程式記憶體(ROM)共64K byte 2. 可在外部擴充64K byte資料記憶體(RAM) 3. 內部資料記憶體空間256 byte
圖2-3 8051記憶體映像圖
2222----3333----1 1 1 1 程式記憶體程式記憶體程式記憶體 程式記憶體
程式記憶體是存放8051所執行的程式碼的地方,CPU會主動到這塊記憶體讀取要 執行的指令碼,因此這塊記憶體的資料只能被CPU讀取,而無法寫入資料。
程式記憶體的空間最多可達64K byte,在8051,8751裡已有最低的4K byte(0000H ~ 0FFFH),因此在外部可再擴充60K byte EPROM;而8031H,8032H內部沒有ROM,因 此外部可擴充64K byte EPROM;8052AH,8752AH內部已有8K byte的程式記憶體,因 此可以在外部擴充56K byte EPROM。8051讀取程式記憶體的激發信號是PSEN。
8051是如何決定程式記憶體的前面4K byte(8052是8K)要到內部或到外接程式記憶 體去讀取指令呢?這就是8051的EA腳(第31腳)的功能,如果我們將EA腳接地(邏輯0),
則8051會將前面4K移到外部,也就是說原來在8051內部的4K byte的程式記憶體無效,
就算將程式燒到內部的4K byte程式記憶體裡,8051也看不到。
如果將EA接到+5V(邏輯1),則8051就會到內部去讀去前面4K的程式記憶體,超過 4K的部分(1000H~FFFFH),8051會自動切換到外部來讀取。因此EA接腳是決定內部程 式記憶體是否有效的控制腳,當EA=0,內部程式記憶體無效;當EA=1內部程式記憶 體有效。例如8031AH,8032AH內部沒有ROM,因此使用8031AH或8032AH時,必須將 它的EA腳接地。
在寫 8051 的程式時,必須知道幾個程式記憶體的特殊位址,這些位址是各種中 斷服務程式的進入點,表 2 列出了各種中斷的進入點位址,其中位址 0000H 是重置 (RESET)的進入點,這意思是說,8051 被重置時,從位址 0000H 開始執行程式。
圖2-4 中斷服務程式的進入點
2222----3333----2 2 2 2 外部資料記憶體外部資料記憶體外部資料記憶體 外部資料記憶體
8051允許您在外部擴充64K byte資料記憶體(RAM)。這64K位址空間裡,除了可以 放RAM以外,也可以採用Memory Map I/O的方式將一些標準I/O(例如8255,8253等)的 位址解在這一塊記憶體裡。
定址64K資料記憶體空間需要16條位址線和8條資料線,這16條位址匯流排和8條 資料匯流排與程式記憶體使用相同的匯流排,然後8051是以控制匯流排來區分這兩塊 不同的記憶體。8051讀取外部程式記憶體時使用PSEN,而讀/寫外部資料記憶體使用 RD和WR信號。如此一來程式記憶體和資料記憶體就是兩個完全獨立的64K空間。
8051是執行到MOVX A,@DPTR和MOVX A,@Ri 指令時,就會到外部資料記憶體 讀入一個byte資料,當執行MOVX @DPTR,A 或 MOVX @Ri,A 就會將資料寫到外部資 料記憶體。
有時候在外部擴充程式記憶體和資料記憶體,其總和不超過64K時,我們可以採 用兩塊記憶體合併成一個64K的設計方式,合併的好處是可以讓程式設計更具彈性。
合併的方法很容易,因為8051將程式記憶體和資料記憶體分開的方法是將這兩塊 記憶體的讀取激發信號分別使用不同的信號,即PSEN讀取程式記憶體,RD讀取資料 記憶體,因此要將這兩塊記憶體合併,只要將PSEN及RD信號合併成一個信號即可,
方法是將PSEN與RD使用AND閘做邏輯AND即可,如圖所示,可將AND閘的輸出看成 一個記憶體讀取激發信號(MRD)激發(MRD=0),然後我們就將MRD接到程式記憶體 (EPROM)的輸出致能,或資料記憶體(RAM)的輸出致能就可以讀到這兩塊記憶體的內 容。
圖2-5 將PSEN與RD合併成MRD
程式記憶體與資料記憶體合併之後,8051的整個記憶體空間就縮減成64K,也可以使 用合併外接32K EPROM (27256)和32K SRAM (62256)的方法。在這種合併的記憶體結構 裡就沒有所謂程式記憶體或資料記憶體之分別,不管是MOVC或MOVX指令都可以定 址到這64K的內容。換句話說,也可以將程式放入RAM(62256)裡執行。
2222----3333----3 3 3 3 內部資料記憶體內部資料記憶體內部資料記憶體 內部資料記憶體
8051內部有一塊256個byte的位址空間,這塊空間是存放資料記憶體(RAM)和特殊 功能暫存器(SFR)的地方。
這塊記憶體空間雖然只有256byte,但是8051將其中位指教高的128byte(80H~FFH) 採用不同的定址方式而容納了兩組128byte的記憶空間,因此總共的空間為
128+128+128=384 byte。以下三個部分開加以解說:
1. 位址 00H~7FH 的RAM 2. 位址 80H~FFH 的RAM 3. 位址 80H~FFH 的 SFR
不論8051或8052都有這塊記憶體,並且可以使用直接定址或間接定址法讀/寫其內部資 料。8051將這塊記憶體分成數種不同的用途。下圖是8051對這128byte定義的用途說明。
圖2-6 內部RAM的較低128位元組
(A) 暫存器庫
由上圖我們看到,位址00~1FH這32個byte被分成4組工作暫存器(Register Bank),分 別稱為RB0,RB1,RB2和RB3,每一組暫存器庫有8個byte。程式指令將每組裡的8個 byte稱為R0~R7。但是8051共有四組R0~R7,到底目前所指的R0~R7是屬於哪一組的 R0~R7呢?它是由PSW暫存器裡的RS1和RS0 這兩個bit加以選擇,如上圖所示,當 RS1=0和RS0=0時,就指到RB0,當RS1=0和RS0=1,就指到RB1。
(B) 可位元定址區
位址20H~2FH這16個byte是8051內部256個位元位址中的128個位元的所在位址。每 個位元組佔了8個位元位址,下圖是這16個位元組裡每一個bit的位元位址,例如20H這 個byte的第0位元,其位元位址為00H,然後依序編到2FH這個位元組的第7位元為7FH,
8051有一組單位元運算指令可以直接對這些位元作運算。
位元位址區的另外128個bit(80H~FFH),是在SFR暫存器裡,如下圖所示。
(C) 一般用途
內部RAM的30H~7FH這些位元組,8051並未定義這些位元作任何用途,8051稱這 塊區域為使用者的RAM(User RAM)。因此可以規劃這塊區域當作其他用途,例如計時 器的緩衝區或印表機資料的緩衝區等。但是有一點必須注意的是,8051的堆疊區也是 使用內部RAM,因此必須保留一塊足夠大的RAM給堆疊區使用,堆疊區的大小是依 所寫的程式所需而定。
圖2-7 8051的前面128個位元位址
(a) 圖2-8 RAM裡的位元位址
(b) SFR RAM裡的位元位址 1.位址80H~FFH的RAM
只有8052,8752和8032的內部RAM有這128byte,8031,8051和8751則沒有。這塊 RAM的內容必須使用間接定址法。
2.位址80H~FFH的SFR
特殊功能暫存器是一塊128byte的記憶空間,它是存放8051內部的週邊所使用的暫 存器的地方,例如I/O port的輸出栓鎖器(P0,P1,P2,P3),計時器的counter,致能中 斷系統的IE暫存器等。因為8051的週邊設備並不多,因此SFR裡128個位址空間並未用 完,這些目前沒有用到的位址,裡面是空的。
SFR所使用個位址是80H~FFH,這塊區域與8051的較高128位元組的RAM使用了同 一塊記憶空間,8051採用了不同的指令的定址法來區分這兩塊記憶體,如前面所述,
RAM是使用間接定址法,SFR是使用直接定址法。
在SFR裡的各種位元組都有其個別的名稱,在寫程式時,要用到這些位元組,可 直接呼叫其名稱,而不需要使用位址。
在8051被重置後(RESET=1),在SFR裡面的各個暫存器都會被設定一個固定值,這 些僅在每次RESET後都是一樣,表3,列出了SFR
重置後的初始值。
SFR裡面的各個暫存器:
1. PSW(程式狀態字語)暫存器 2. SP暫存器(堆疊指標)
3. DPTR(資料指標)
4. P0,P1,P2,P3暫存器 5. SBUF(串列阜緩衝區) 6. 計時器暫存器
7. 捕捉式暫存器(Capture Register) 8. 控制暫存器(Control Register)
圖2-9 SFR各個暫存器重置後的初始值
1.累加器 (ACC)
ACC就是累加器暫存器,累加器指令所使用的助憶符號是A。
2.B暫存器 (B)
B暫存器是使用在乘法(MUL AB)和除法(DIV AB)指令時。在其它的指令,它可以 被當成一般暫存器處理。
3.PSW(程式狀態字語)暫存器
PSW實際上就是一般CPU理所稱的旗號(Flags)暫存器,內部包含有CPU的系統狀態 資料。
4.SP暫存器(堆疊指標)
SP暫存器只有8位元寬,因此MCS-51的堆疊區最多只有256byte,並且一定在內部 RAM裡。當執行PUSH或CALL指令存入資料到堆疊區之前,SP的內容會先被加1。
因為SP的內容可由指令任意改變,因此堆疊區可以由使用者設定在內部RAM裡的 任一個位址。但是,在RESET之後,SP的內容會被設成07H,因此RESET後堆疊 區是從位址08H開始。
5.DPTR(資料指標)
DPTR是一個16位元暫存器,它是由兩個8位元暫存器所組成,高位元組為DPH,
低位元組為DPL。因DPTR可看成一個16
位元暫存器或看成兩個8位元暫存器加以處理。DPRT的用途是用來定址外部資料 記憶體
(MOVX A,@DPTR),或程式記憶體使用(MOVC A,@A+DPTR),因此MCS-51可以 定址程式記憶體或資料記憶體各64K。
6.P0,P1,P2,P3暫存器
P0,P1,P2,P3,是MCD-51四個I/O port的輸出栓鎖器(Latch)。
7.SBUF(串列阜緩衝區)
SBUF暫存器,實際上是由兩個暫存器構成,一個是當作UAR傳送資料的緩衝區,
另一個是當作UART接收資料的緩衝區。若將資料寫到SBUF時,就會將資料放入 傳送緩衝區,UART就會將這個資料轉成串列資料透過TXD這條線傳出去。若去 讀SBUF,就會讀到接收緩衝區的資料。
8.計時器暫存器
(TH0,TL0),(TH1,TL1)和(TH2,TL2)這三對暫存器,是三個16位元計時器的名 稱分別為Timer0,Timer1和Timer2。
9.捕捉式暫存器(Capture Register)
(RCAP2H,RCAP2L)這一對暫存器稱為捕捉式暫存器,當8052的Timer2工作在 ” 捕捉模式” (“Capture mode”)時,當
T2EX(P1.1)這支接腳上的輸入信號1←0轉態時,TH2,TL2的內容會被移入 RCAP2H,RCAP2L就是保存TH2,TL2的重新載入值的地方。
10.控制暫存器(Control Registers)
IP,IE暫存器控制MCS-51的中斷系統;TMOD,TCON暫存器是控制Timer0和Timer1 的工作模式;T2CON控制Timer2的工作模式;SCON控制UART的工作模式等。
以下就將這些暫存器裡的各個位元的名稱及功能以圖形表示:
圖2-10 PWS暫存器
圖2-11 PCON電源控制暫存器
圖2-12 IE中斷致能暫存器
圖2-13 IP中斷優先權暫存器
圖2-14 TCON計時器/計數器控制暫存器
圖2-15 TMOD計時器/計數器模式控制暫存器
圖2-16 T2CON:TIMER2控制暫存器
圖2-17 SCON串列埠控制暫存器 2222----4 MCS4 MCS4 MCS4 MCS----515151的中斷結構51的中斷結構的中斷結構 的中斷結構
8051提供了5個中斷源,8052則提供了6個中斷源,外部中斷INT0和INT1可以規劃 成半位元觸發或邊緣觸發的方式動作,它是由TCON暫存器裡的IT0和IT1位元所選 擇;而TE0和TE1是真正產生中斷的旗號(當IT0和IT1等於1時);如果中斷是設成邊緣觸
發的話,當中斷產生時,在執行中斷服務程式的同時,硬體會將這個旗號(IE0或IE1) 清除;而準位觸發方式則不會清除。
Timer0和Timer1的中斷是由TF0和TF1旗號所產生,這些旗號是在它們各自的計時/
計數暫存器溢位時所設定(Timer0在模式3時例外)。當計時器產生中斷時,硬體會在執 行到其服務程式時自動將這些旗號(TF0或TF1)清除成0。
串列埠的中斷是由RI和TI的邏輯OR之後所產生,在執行RI和TI的中斷服務程式 時,硬體不會自動將RI或TI清除,因為串列埠的中斷服務程式必須判斷中斷是由RI或 TI產生,因此產生中斷的旗號必須由軟體加以清除。
在8052時Timer2的中斷是由TF2和EXF2的邏輯OR的結果所產生,當執行到其中斷 服務程式時,這些旗號不會被硬體清除,因為,中斷服務程式必須判斷中斷是由TF2 或EXF2所產生,然後以軟體將其清除。
以上所討論的每個產生中斷的旗號(IE0,IE1,TF0,TF1,TI,RI,TF2,EXF2),
都可以透過軟體加以設定或清除,其結果與硬體所產生設定或清除的效果完全一樣。
如此一來就可以透過軟體產生中斷,或將正在等待的中斷清除。
2222----4444----1 1 1 1 中斷致能與優先權結購中斷致能與優先權結購中斷致能與優先權結購 中斷致能與優先權結購
透過設定或清除SFR裡的TE暫存器的位元,這些中斷裡的每個中斷源可以個別的 加以致能(Enable)或禁能(Disable)產生中斷。IE暫存器裡也包含了一個禁止所有中斷產 生的位元EA,它可以立即禁止所有中斷產生。
MCS-51的優先權層次共有兩層,即高優先權和低優先權,每一個中斷源都可以透 過軟體規劃SFR裡的IP暫存器裡的位元,以設定各中斷優先權順序,當設為 ”1” 時 列在高優先權層次, ”0” 時列在較低優先權層次。較高優先層的中斷源可以中斷 較低優先層的中斷服務程式,同優先權層次的中斷副程式不能相互中斷。
如果兩個不相同優先權層次的中斷同時發生,則優先權層較高的中斷會先被接 受;如果相同優先權層次的中斷同時到達,就由內部硬體的輪詢(polling)順序決定要 先接受哪一個。因此在每個優先權層次裡又有一個由輪詢順序所決定的第二個優先權 結構,這個輪詢順序如下表4所示:
圖2-18 優先權輪詢順序