Upload
others
View
7
Download
0
Embed Size (px)
Citation preview
逢 甲 大 學
自動控制工程學系專題製作
專 題 論 文
電子密碼保險箱
Electronic Password Coffer
指導教授:吳穎強
學 生:邱楷元
中華民國九十九年六月
i
摘 要 本次專題內容主要是以 8051 單晶片和微動開關、直流馬達、LCM、EEPROM
93C66、……等元件組成一座電子密碼保險箱,具有顯示時間、設定時間、輸入
密碼以及修改密碼的功能。當使用者打開保險箱之電源時,使用者必須確認保險
箱的門必須處於關閉狀態,此時才可正常使用保險箱之功能,若門已經處於關閉
狀態,則使用者必須輸入正確的兩組密碼,密碼兩組皆正確則保險箱的門會自動
彈開,而此時 LCD 螢幕顯示 Door Unlock,若密碼輸入錯誤則在 LCD螢幕顯示
ERROR,整個保險箱以 8051單晶片為主要部分,螢幕顯示方面使用文字型 LCD,
93C66用來儲存密碼,而在輸出端有一顆馬達用來驅動門閂使保險箱的門能夠自
動彈開。
關鍵字:電子密碼,保險箱
ii
Abstract This aim of this project is to establish a coffer that composed of a Intel 8051,Liquid
Crystal Module,EEPROM 93C66,Slide Switch,DC Motor.It include reveal time,set
time,input code and set code.The user have to make sure the door is closed,or user can
not use the coffer.The user need to ipunt the correct code and then the door can
open.When the door open,the screen will show “Door Unclock”,if you give the wrong
code,it will shoe “ERROR”.The major of this project is Intel 8051, Liquid Crystal
Module is used to show the word.There is a bolt moved by a motor to let the dppr open.
Key word:Electronic password,Coffer
iii
目錄
摘 要 ................................................................................................................................ i
Abstract ............................................................................................................................. ii
目錄 ................................................................................................................................. iii
圖目錄 ............................................................................................................................. iv
表目錄 .............................................................................................................................. v
第一章 前言 ..................................................................................................................... 1
1.1 前言 .................................................................................................................... 1
1.2 研究動機與目的 ................................................................................................ 1
第二章 研究背景 ............................................................................................................. 2
2.1 MCS-51 的認識: ................................................................................................ 2
2.2 8051 架構介紹: .................................................................................................. 4
2.3 MCS-51 家族 8051 記憶體簡介 ....................................................................... 5
2.4 EEPROM93C66 的認識: ................................................................................... 6
第三章 LCD 控制電路 .................................................................................................... 9
3.1 LCD 詳細功能與動作說明: ............................................................................ 11
第四章 程式硬體敘述及電路圖 ................................................................................... 17
4.1 硬體架構說明 .................................................................................................. 17
第五章 程式流程圖及程式碼介紹 .............................................................................. 21
5.1 程式流程圖 ...................................................................................................... 21
5.2 程式概述 .......................................................................................................... 28
5.3 詳細程式碼: ..................................................................................................... 35
第六章 製作心得與參考文獻 ...................................................................................... 71
6.1 製作心得 : ...................................................................................................... 71
6.2 參考文獻: ......................................................................................................... 71
iv
圖目錄
圖 2.1 8051 單晶片的接腳圖 .......................................................................................... 3
圖 2.2 93C66 接腳圖 ....................................................................................................... 6
圖 3.1 LCD 接腳圖 ......................................................................................................... 9
圖 3.2 LCD 初始化步驟圖 ............................................................................................ 16
圖 4.2 8051 主電路 ....................................................................................................... 18
圖 4.3 LCD 電路 ........................................................................................................... 18
圖 4.4 93C66 電路 ......................................................................................................... 18
圖 4.5 掃描鍵盤 ............................................................................................................ 19
圖 4.6 穩壓電路 ............................................................................................................ 19
圖 4.7 馬達驅動電路 .................................................................................................... 19
圖 4.8 按鍵偵測電路 .................................................................................................... 20
圖 4.9 LED 電路 ............................................................................................................. 20
圖 5.1 程式流程圖(開機)............................................................................................... 21
圖 5.2 程式流程圖(A) ................................................................................................... 22
圖 5.3 程式流程圖(B) ................................................................................................... 23
圖 5.4 程式流程圖(C) ................................................................................................... 24
圖 5.5 程式流程圖(D) ................................................................................................... 25
圖 5.6 程式流程圖(判斷密碼)...................................................................................... 26
圖 5.7 程式流程圖(判斷救密碼).................................................................................. 27
v
表目錄 表 2.1 8051 各接腳功能表 .............................................................................................. 3
表 2.2 93C66 指令集 ....................................................................................................... 6
表 3.1 LCD 接腳功能表 ............................................................................................... 10
表 3.2 接腳控制指令表 ................................................................................................ 11
表 3.3 LCD 控制指令整理表 ....................................................................................... 15
1
第一章 前言
1.1前言 由於近代科學的突飛猛進,而使微處理機的發明和發展有了長足的進
步,使計算機走出科學家的專屬的領域,而自從單晶片微電腦的發明之後,單晶
片更是逐漸變成新電子系統的標準元件。對於電子工程師而言,高科技電子產品
的競爭,往往就集中在對微處理機和單晶片微處理機的應用上;單晶片微電腦應
用在工業上已是相當普及,而產品性能在很大的程度上,取決於設計微處理機和
單晶片微處理機的應用水準,因此便用專題來進一步熟悉單晶片微處理機的功
能。
1.2研究動機與目的 有鑒於電子工業的發展及單晶片微電腦技術的進步,使我覺得對單晶片微電
腦方面的認知日益重要,而大部份所學都是有關於計算機理論與技巧方面的知
識,反而對硬體方面的認識與知識稍嫌不足、涉掠不深,因此便希望藉由這次的
專題來對硬體有更深入的了解,並且對單晶片微電腦系統的功能與特性透過電路
實作能有更深一層的認識,及明瞭實作電路時所面臨的困難和技術性的問題。而
MCS-51 家族的 8051 不僅功能強大且使用方便,也十分適合拿來應用於專題的
製作.
目的:
利用 8051設計製作一保險箱藉此對 8051 單晶片微電腦硬體以及所提供的指令
集有所了解,和了解如何利用 8051來控制文字型 LCD 的架構與指令的研究以及
對 8051 與外部擴充記憶體實際運作的了解。
2
第二章 研究背景
2.1 MCS-51的認識: MCS-51 是 Intel 所生產的 8051 系列單晶片的總稱,在這家族中還有
8051,8751,8031,8032,8052,80C51 等.以上這些單晶片雖然在編號上有所
不同,卻都是使用相同的 CPU,指令集,只是附加的周邊上有所不同,例如8751
是內含有 4k ERROM 的 MCS-51 版本,而 80C31 式一顆內部無記憶體的省電
MCS-51 版本.MSC-51 是在 1980,由 Intel 根據 MCS-48 的架構,所發展出功
能更強,速度更快的單晶片.Intel 發展初期,是以 HMOS 的製程發展而成,經
過數年,又改以 CMOS 生產,例如 8051 就是此款.
8051 的主要功能列舉如下
1. 為一般控制應用的 8 位元單晶片
2. 晶片內部具時脈震盪器(最高工作可至 12MHZ)
3. 內部程式記憶體(ROM)為 4K 位元組.
4. 內部資料記憶體(RAM)為 128K 位元組.
5. 外部程式記憶體可擴充至 64K 位元組
6. 外部資料記憶體可擴充至 64K 位元組
7. 32條雙向輸入輸出線,且每條均可以單獨做 I/O 控制
8. 5個中斷向量元
9. 2組獨立的 16 位元定時器
10. 1個全多工串列通訊埠 UART(通用非同步接收和傳送器)
11. 單晶片提供位元邏輯運算指令
3
圖 2.1 8051單晶片的接腳圖
表 2.1 8051各接腳功能表
4
2.2 8051架構介紹: 1.MCS-51 家族的單晶片,如 8051 的硬體架構可以簡單區分成七個部分震盪與
時序方塊(Oscillator) MSC-51 內部有時脈震盪電路,只要外部加上晶體,即可
產生頻率非常穩定的脈波信號,所有 MCS-51 單晶片的時序都是以此為基準
2.CPU
這是整個單晶片的控制處理中心,CPU 讀取位於程式記憶體(ROM或 EPROM)
的程式碼,經過計算與處理之後,將結果送到各個暫存器的輸出入埠上,並且接
受內部和外部的中斷信號,然後執行中斷服務程式,只要電源加入且震盪器開始
動作之後,CPU 就會開始一直不停的動作.
3.程式記憶體
MCS-51 系列單晶片中,8051 提供內部 4096Byte(4KB)的程式計區,專供儲
存程式指令碼的地方,CPU 所執行的程式指令,即到這裡來提取的.若有內部程
式記憶區時,CPU 可以選擇執型的程式指令,是由內部的程式區提取,或由外部
的程式區提取.程式區的內容只能讀出但不能寫入.
4.資料記憶體
MCS-51 系列中的 8051 單晶片提供 128 Bytes 可讀/寫的資料記憶區,而
8052 系列則有 256 Bytes 資料記憶區.這資料區中有 16 個 Bytes共 128Bit
的區域是可直接做單一位元定址的 (Bit Addressable),同時MCS-51 也提供相
當好用的位元指令.
5.四組可規劃輸入/輸出埠(P0,P1,P2,P3 ) ,這四個埠共提供 4X8=32 條
I/O 線,所有的部都可以做位元輸出入埠(Byte I/O),或者做單一位元輸出/入
埠(Bit I/O),當 MCS-51 做外部記憶體擴充時,必須用 Port-0,Port-2 當作
資料/位址線,配合ALE,PSEN,WR,WD 等控制線產生必要的控制信號,做讀出
(Read)及寫入(Write)信號.
6.計時/計數(Time0,Time0)
MCS-51 系列的單晶片都有 2 個 16 位元的計時/計數器,而 8052 則有3 個.每
個計時/計數器有多種模式可供選擇.
7.可規劃串列 I/O 方塊(UART)
MCS-51 單晶片可透過此串列輸出入埠介面,與外界的電腦或儀器設備做資訊的
5
交換,也可過此介面做 I/O 的擴充.
2.3 MCS-51 家族 8051 記憶體簡介 程式記憶體
程式記憶體式存放指令的地方(由燒錄器寫在 EPROM 或 Flash ROM中),只能被
CPU 讀取,不能被寫入.因為 MCS-51 單晶片的計數器有 16 位元,因此它可定
址的範圍是 216
=64K,又因為 MCS-51 的記憶體寬度皆為1個 Byte,所以 MCS-51
的最大程式記憶體空間為 64KByte.而 8051 裡面已有 4K 的內部程式記憶體,
所以可在外部再擴充 60KByte.MCS-51 由 EA 腳位來決定存取內部或外部程式記
憶體。
MCS-51 的資料記憶體,可分為內部資料記憶體,與外部資料記憶體,MCS-51 對
內部和外部的資料記憶體的存取,用不同的指令.一個是用 MOV(內部),另一個
是用 MOVX(外部).當 CPU 再執行 MOVX 時,會令 RD 或 WR 腳發出對外部資料
記憶體存取的信號.執行 MOV 時則不會.MSC-51 內部有 256KByte 的資料記憶空
間,前 128(00H~7FH)是做存放資料的地方,後面 128KByte 則是(SFR).
單晶片內部的 RAM,和一般 PC 的 RAM 是不同的,無法被用來存放程式,因為
程式計數器 PC 不對內部 RAM 定址。前面 的128KByte 的資料暫存區位址從
00H~1FH,設有四工作暫存器,每組有 8Byte,因此共是 32Byte.從 20H~2FH,
共有 16 個 Byte,提供每一位元可單獨被定址或控制的位元定址區.因此這 16
個位元組便提供了,16X8=128 個位元控制點.另外從位址 30H~7FH 的這個區域
是提供使用者任意使用的通用目的記憶區.
6
2.4 EEPROM93C66的認識: 專題做的是電子密碼保險箱,所以必須儲存密碼,並且在電源消失後仍要能
紀錄.若紀錄在 8051 中,因為 8051 的資料記憶體都是用 RAM,電源一關掉資
料就會 lose 掉.所以必須再外部加上一顆 ROM.且為了方便性,使用電子消除式
的 EEPROM,也是採用 ATMEL 的 93C66.
93C66 規格
記憶體容量 接腳 指令格式
93C66 4KBit(256X16) 8 11
93C66 接腳圖
CS:晶片選擇接腳此接腳為
高電位(cs=1)時,才可正確讀寫
SK:串列資料時脈接腳
DI:串列資料輸入接腳
DO:串列資料輸出接腳
Vcc:電源接腳
GND:接地腳
圖 2.2 93C66 接腳圖 NC:空接腳
表 2.2 93C66 指令集
Instruction Start Bit OP code Address Input Data
Read 1 10 A7~A0
WEN 1 00 11xxxxxx
WRITE 1 01 A7~A0 D15~D0
WR-ALL 1 00 01xxxxxx D15~D0
WDS 1 00 00xxxxxx
ERASE 1 11 A7~A0
REAL 1 00 10xxxxxx
7
指令說明
1. 讀取指令
當下達讀取指令後,位址經由解碼器選擇到相對的記憶體暫存器,其內容將被放
入 16 位元串列一位暫存器㆗,在每個 SK 的正緣信號,資料依序每次 1 個 Bit
由 D0 接腳輸出,且由最高位元 D15 先開始
2. 寫入致能指令
當資料要寫入 EEPROM 之前,必須先㆘達寫入致能,否則寫入無效,而一但下達
寫入致能指令之後,及變成寫入狀態,此時可用寫入指令將資料寫入 EEPROM
中,此狀態㆒直維持至㆘達寫入除能指令或電源消失為止.
3. 寫入指令
寫入指令會將 16Bit 的資料寫入指定位址中,當資料輸入完成之後,必須使 CS
為低電位(CS=0)置少 250ns,在使 CS 拉回高電位(CS=1),然後檢查 D0 腳, 當
D0=0 時,表示寫入動作未完成(Busy 狀態),當 D0=1 時,表示寫入動作完成
(Ready),寫入動作完成之後,必須下達寫入除能指令,以確保資料的安全性.
3. 寫入指令
寫入指令會將 16Bit 的資料寫入指定位址中,當資料輸入完成之後,必須使 CS
為低電位(CS=0)置少 250ns,在使 CS 拉回高電位(CS=1),然後檢查 D0 腳,當
D0=0 時,表示寫入動作未完成(Busy 狀態),當D0=1 時,表示寫入動作完成
(Ready),寫入動作完成之後,必須下達寫入除能指令,以確保資料的安全性.
4. 全部寫入指令
當下達全部寫入指令後,位於其後的 16 位元資料,會填入所有的記憶暫存器
中,即其內容皆相同,當資料輸入完成之後,必須使 CS 為低電位,置少
250ns,在使 CS 拉回高電位(CS=1),然後檢查 D0 腳,當 D0=0時,表示寫入動
作未完成(Busy 狀態),當 D0=1 時,表示寫入動作完成(Ready)
5. 寫入除能指令
當下達寫入除能指令之後,將禁止一切嘗試將資料寫入 EEPROM 的動作,以保持
其內部資料的完整性,不會被壞.
8
6. 清除指令
如果要清除 EEPROM 記憶體暫存器中某一位址的資料時,可以使用清除指令,當
下達清除指令完成之後,必須使 CS 為低電位(CS=0)置少 250ns,在使 CS 拉回
高電位(CS=1),然後檢查 D0 腳,當 D0=0 時,表示寫入動作未完成(Busy 狀
態),當 D0=1 時,表示寫入動作完成(Ready).
7. 全部清除指令
當下達全部清除指令之後,所有的記憶體暫存內容皆變為高電位,此時同樣必須
使 CS 為低電位(CS=0)置少 250ns,在使 CS 拉回高電位(CS=1),然後檢查 D0
腳,當 D0=0 時,表示寫入動作未完成(Busy 狀態),當 D0=1 時,表示寫入動
作完成(Ready)
9
第三章 LCD控制電路 LCD常見的型式有16x2、20x2、40x2等幾種規格,顯示器除了LCD板之外、還需
要控制電路和驅動電路、通常將其做成一塊模組(Module)簡稱LCM
圖 3.1 LCD接腳圖
P0
.7
P0
.0
P0
.6
LCM 16x2
1278910
11
12
13
14
3456
VC
CV
O
D0
D1
D2
D3
D4
D5
D6
D7
GN
D
RS
R/-
WE
P0
.5
P0
.3P
0.4
P0
.1P
0.2
+5V
P2
.7
LCD模組P2
.6P
2.5
10
表 3.1 LCD接腳功能表
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
11
3.1 LCD詳細功能與動作說明: 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)
表 3.2 接腳控制指令表
的資料緩衝區.當單晶片寫到 DR 暫存器之後.LCD 內部的控制電路會將資料自
動寫到 DD RAM 或 CG RAM 中,而位址是由 LCD 內部的位址計數器(Address
Counter AC)所指定.而單晶片要讀取資料時,需先將欲讀取的位址放入 IR 暫存
器中, LCD 就會將其內容放入 DR 中,然後單晶片就可以去讀取 DR 的資料.
3. 位址計數器 AC
12
位址計數器是用來指定欲存取的 DD RAM和 CG RAM 的位址.位址設定指令將位址
寫入 IR 暫存器之後,LCD 內部控制電路會將 IR 暫存器的內容送至 AC.當資料
存取之後,AC 便會自動加一(I/D=1)或減一(I/D=0).
4. 字元產生器 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.
6. LCD 模組控制命令
LCD 模組可以接受 CPU 送至 IR 暫存器的命令,並加以執行.其指令共有11 道,
除了 Clear Display 和 Cursor Home 為 1.64ms 之外,其餘都為 40ns.
6a 清除顯示 Clear Display
指令
動作:將 DDR 資料全部填入空白碼 20H,並將游標移到左上角原點位置,清除 DD
RAM 的位址計數器 AC 為 00H,I/D 設為 1.
6b 游標歸位 Curse Home
指令
動作: DD RAM的資料保持不變,僅將游標移至左上角原點處,及第一行的第一個
字,DD RAM 的位址計數器設為 00H.
6c 顯示 ON/OFF 控制(Display ON/OFF)
指令
13
動作: D:顯示器控制位元,D=0 關 D=1,開
C:游標顯示控制位元, C=0 不顯示 C=1 顯示
B:游標閃爍 Blink 控制位元,B=0 不閃爍,B=1 閃爍
6d 游標移位控制指令
6e 功能設定 Function Set 指令
動作: DL:設定介面的位元寬度,DL=1 時為 8 位元,若 DL=0 時為 4 位元.
N:設定顯示器的行數,N=0 時,1 行顯示 N=1 時,2 行顯示.
F:字型 Font 設定.
6f CG RAM 位址設定指令
動作:設定 CG RAM 的位址,由 A5~A0 之六個位元位址 00H~3FH 位址
共 64 個位元組,當寫入本命令之後,接個輸入的資料將寫到 CG
RAM 中.
6g DD RAM 位址設定指令
動作:設定 DD RAM 的位址,由 A6~A0 之七個位元定址,接著寫入的資料將寫入
DD RAM 中.
6.8 讀取忙碌旗標 BF 即位址計數器 AC 的內容.指令
14
動作:若讀出的 BF=1,表示 LCD 模組正忙著內部的工作,因此,無法接受CPU 的命
令,直到 BF=0 才可以.在讀 BF 的同時,也會讀到位址計數器的值(DB0~DB6),這
個讀出的位址,可能是 CG RAM 的位址或是 DD RAM 的位址,端看前面設定.
6h 寫資料到 CG RAM 或 DD RAM 中指令
動作:寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM,至於是寫到那一個,則是
看前一次式設定 DD RAM或是 CG RAM 的位址.
6i 自 CG RAM 或 DD RAM 中讀取資料指令
動作:寫入 8 位元的資料(D0~D7)到 DD RAM或 CG RAM,至於是寫
到那一個,則是看前一次式設定 DD RAM 或是 CG RAM 的位址
15
表 3.3 LCD 控制指令整理表
16
7 LCD 初始化副程式
LCM 作為顯示裝置之前,仍必須做適當的規劃程序,以方便顯示工作的進行,
規劃步驟如下
圖 3.2 LCD初始化步驟圖
17
第四章 程式硬體敘述及電路圖
4.1 硬體架構說明
圖4.1 電子密碼保險箱整體硬體架構
整個系統的主體為 8051 單晶片,顯示是用文字型 LCD,輸入用 4X4 的鍵
盤.93C66 儲存密碼,也就是作為 8051 的外部資料記憶體,輸出結果部分,在
輸出端接一個直流馬達驅動門鎖,門打開時表示密碼正確。
8051
LCD 顯示
4X4 鍵盤 93C66儲存密碼
門保險箱
18
C3
30PF
P0.4
P3.6
P1.6
P1.0
P3.1
P0.3
P0.6
P1.4P1.5
R810K
+5V
C2104
P3.3
P0.5
P1.2
P3.2
P2.6
P0.0
+5V
Y1
12MHZ
P0.7
P0.2
P2.4P2.3
P2.0
P2.7
P3.5
P3.7P1.1
P2.1
P1.7
P2.2
P2.5P3.4
P0.1
P1.3
C4
30PF
P3.0
+C510uF
U5
8051
31
19
18
9
12131415
12345678
3938373635343332
2122232425262728
171629301110
20
40
EA/VPP
XTAL1
XTAL2
RESET
P3.2_INT0P3.3_INT1P3.4_T0P3.5_T1
P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7
P0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7
P2.0P2.1P2.2P2.3P2.4P2.5P2.6P2.7
P3.7_RDP3.6_WR
PSENALE/PROG
P3.1_TXDP3.0_RXD
GND
VCC
圖 4.2 8051 主電路
+5V
P1.0
LCM 16x2
1278910
11
12
13
14
3456
GN
DV
CC
D0
D1
D2
D3
D4
D5
D6
D7
VC
RS
R/-
WE
LCD模組
P1.4
P1.5
P2.5
P1.6
P2.6
P1.2
P1.3
P2.7
P1.7
P1.1
圖 4.3 LCD電路
P2.0
+5V
P2.1
P2.2
P2.3
U6
93C66
1
2
3 4
58
CS
CLK
DI DO
GN
DV
CC
圖 4.4 93C66電路
19
P3
.5
P3
.5
P3
.1
P3
.7
P3
.5
+5V
R7
10K
掃描鍵盤
P3
.7
P3
.6P
3.6
P3
.0
R5
10K
P3
.4
P3
.2
P3
.4
R6
10K
P3
.3
P3
.4
P3
.7
P3
.4
R4
10K
P3
.7
P3
.6
1 2 3 A
4 5 6 B
7 8 9 C
E 0 F D
1 82 3 4 5 6 7P
3.5
P3
.6
圖 4.5 掃描鍵盤
+12VJ1
POWER
1
23+12V
GND3
12V變壓器插座+5V
+C1
220uF/16V
U1
78M051
2
3VOUT
GN
D
VIN
圖 4.6 穩壓電路
R1
10K
+5V
MG1
3V
1 2
+12V
R2
10K
P0.1P0.2
U3
L293
27
1015
19
361114
168
451213
1A2A3A4A
1/2EN3/4EN
1Y2Y3Y4Y
VCC1VCC2
GNDGNDGNDGND
圖 4.7 馬達驅動電路
L293D 為馬達控制 IC:
1A接到 8051之 P0.1 腳
2A接到 8051之 P0.2 腳
控制馬達右轉、左轉的方法如下表所示
20
執行< 開保險箱 >對策,即馬達右轉
控制訊號 CLR P0.1
SETB P0.2
執行< 上保險箱 >對策,即馬達左轉
控制訊號 SETB P0.1
CLR P0.2
SW2
data reset
1 2
P0.4
R9
10K
P0.3
SW1
微動開關
1 2
+5V
+5V
R1310K
圖 4.8 按鍵偵測電路
P2.4
R14
300
+5V
D1
LED
圖 4.9 LED電路
21
第五章 程式流程圖及程式碼介紹
5.1 程式流程圖
圖 5.1 程式流程圖(開機)
22
圖 5.2 程式流程圖(A)
23
圖 5.3 程式流程圖(B)
24
圖 5.4 程式流程圖(C)
25
圖 5.5 程式流程圖(D)
26
圖 5.6 程式流程圖(判斷密碼)
27
圖 5.7 程式流程圖(判斷救密碼)
28
5.2程式概述 因為程式十分的冗長,無法一一敘述,故只挑幾個初始化及重要的副程
式加以說明.
§初始化
第一行:為指定程式的起始位址,因為 8051 的程式是燒錄在 ROM 中,不像是一
般的 PC 乃是動態配置在 RAM,所以必須指定要放在 ROM 中的位址.
第二行:設定程式從何處開始執行
第三行:設定 Timer0 中斷程式的起始位置
第四行:Timer0 中斷發生後,到 Timer0 副程式執行.
§START
29
首先,要先指定堆疊的區域,堆疊區的範圍是 00H~7FH,依程式使用量,
programer 可以自己設定,如上面是設定成 61H~7FH.再來,SK 清成電位,因為
這時 93C66 並沒有要動作.LED 燈,當作結果的輸出,這時先關閉(暗).ACALL
INIT,這道指令有點像是呼叫副程式,INIT 是初始化 LCD,SET0 是設定
TIMER0.ON 是顯示功能表,就像是按 HELP 鍵一樣.最後 SCAN,就是掃描鍵
盤,底下的程式碼就是等使用者按下按鍵,然後跳到對應的副程式.
F1:顯示時間
F2:調整時間
F3:輸入密碼
F4:設定密碼
§CONV
“START”還有一道指令呼叫”CONV”,是做時間的轉換,因為當時間資料放在
RAM 時,是將”分”當作一個數,存成一個 Byte,十位數的”分”放在高位元,個
位數的”分”放在低位元,(由另一個副程式”JUDGE”負責轉換),但是當要顯示在
LCD 時,則必須將十位數和各位數分開存放,而且在高位元處都必須設為
0011B(LCD 控制器的規定).所以這個副程式的功用就是將原本放在 30H 的資料,
30
拆開分別放在 40H 和 41H
§SCAN
掃描鍵盤的副程式,掃描的原理是,從每行的接腳發出掃描信號,再從每列的接
腳接收.將結果放在 R5 暫存器.首先,先將暫存器 5 清空.暫存器 7 放 4(因為鍵盤
為 4X4),R6 放 11111110B,再將 R6 的值指給埠 3,以位元定址法,所以此時
P3.0 為低電位(發出信號給第一行),其餘 Bits 為高電位.再來,從第 6 行開始,接
收掃描結果.以埠 P3.4 接收訊號(第一列的信號).若為 1,表示鍵盤的第一行第一列
沒被按下.跳到 S1,接收下一列信號.若為 0,表示按鍵被按下,執行 JNB P3.4 $此
行為去彈跳,但是後來覺得不夠,所以又增加 delay 18ms.
SET0
SET0 為對 TIMER0 初始化.首先,因為用的 12MHz 的石英震盪器,所以每個
clock 的長度是:1/(12MHx/12)=1/1MHz= „1us‟,所以讓它每經過 10000 個 clock 中
斷一次,每中斷 100 次(剛好一秒),秒數加 1. 第二行為設定 Timer0 的工作模式
為 mode 1,也就是使用 TH0,TH1 共 16Bits 作為計時器.04,05 行,設定計時器
31
的初始值,因為使用 16Bits 計時器 65536=216,減掉 10000.表示從計時器從
65536-10000=55536 開始數,當計時器超過 65536(加了 10000 次),發生溢位,
TR0 設為 1.即發生中斷.06 行,設定溢位旗標.TIMER0 開始動作.
§將資料 show 在 LCD
以 F1(顯示時間)當作範例
06 的指令就是 show 出資料,這裡要顯示的是”TIME”,共 4 個 char,所以 04 行
CNT 設為 4,但是在寫入資料給 LCD 之前,要先給指令給 LCD,(在 03
行).W_INS 的程式碼如下
32
在呼叫 W_INS 之前,先將指令存入暫存 A 中.再來 02 行為檢查 LCD 忙碌旗標,
若 LCD 仍在忙碌,要先 delay 6ms.然後 RS=0,RW=0,EN=1,準備輸入指令(參
見第四章).最後指令寫入完成,EN(模組致能腳)恢復為 0.
§JUDGE
JUDGE 調整‟時‟,‟分‟,‟秒‟.在每次 TIMER0 中斷發生時,都會被執行一次,因
為每次中斷發生,時間就會加 1 秒.此副程式的功用即在於調整時間,免的出現時
>24,分 or 秒>60 的情況程式碼如下
首先,先將秒的資料從位址 32H,的地方拿出來,加一秒,然後轉成十位數再高
四位元,個位數在低四位元.06 為比較秒數是否達 60,若否,則時及分也不會改
變,所以就可以跳到 FIX 離開此副程式,否則要接下去做,將分的資料從位址
31H 除取出,加一……如同秒的處理方式,接下來的時也是如此.
33
§自 93C66 讀取資料,比對密碼
只有當 SETF3,也就是輸入密碼完之後,才要將 93C66 中的密碼拿出來比對,下
面是 SETF3 的 code. F0,是判斷密碼是否正確的旗標,F0=0 表示 error.呼叫
R_CODE,將93C66 的密碼讀入 8051 的位址 54H.然在和使用者輸入的密碼(存在
位址 50H)比較,一個字元一個字元比較,共四次(R2=4).R_CODE 的程式碼如下:
02 這行,將 ADDR 設為 0,表示要從外部資料記憶體的位址 00H 處開始讀資
34
料.03 行表示將資料存在 8051 的內部記憶體位址 54H 處.R1 設為 2,因為要讀 16
位元的資料 2 次(16X2=32 共四個 char).然後 call 副程式 READ 讀取.程式碼如下.
R6 設為 00000110B,後面 110 是 93C66 指令的前 3 個 Bits,因為後面 8 個 Bits
要接位址,所以要先左移,將位址從 R6 的尾端補進來(從 R7,而 R7 是從 ADDR
得到位址),SHIFT5,表示將 110 移到最前面.但是 93C66 的指令為 11Bits,目前
R6 只能放 8Bits,剩下 3 個還在 R7,等一下每寫一個 Bit 的指令進去,R7 再從後
面補進來.CNT=11,即指令有 11Bits.
延續上面,因為 93C66 為串列輸出/輸入,所以一次只能輸入 1Bit.設定 SK=1,給
它一個 clock,才會讀資料.此時 8051 則是執行 NOP,也就是什麼都不做,等待
93C66 完成.當 11Bits 都讀完後.93C66 隨即開始將 Memory中的密碼送到它的
DO,資料輸出腳.所以呼叫 R_DATA. R_DATA 和上述副程式類似,只不過反過
來將資料從 DO 讀到暫存器 C,故不再詳述.
35
5.3 詳細程式碼: EN REG P2.7 ;LCD 控制腳
RW REG P2.6 ;LCD 控制腳
RS REG P2.5 ;LCD 控制腳
SW REG P2.4 ;LED 燈
CS REG P2.3 ;93c66 控制腳
SK REG P2.2 ;93c66 控制腳
DI REG P2.1 ;93c66 控制腳
DO REG P2.0 ;93c66 控制腳
ADDR EQU 37H
CNT EQU 38H
SEC EQU 39H
ORG 00H ;設定程式開頭位置
AJMP START
ORG 0BH ;設定 Timer 0 中斷程式起始位置
AJMP TIMER0 ;中斷發生後,到 Timer 0 副程式執行
;----- -
; MAIN
;----- -
START: MOV SP,#60H
MOV 4FH,#1 ;為 0 時,表示已上鎖,為 1 未上鎖
CLR SK ;93c66 除能,不動作
SETB SW ;LED 燈暗
ACALL INIT ;呼叫 LCD 初始化副程式
ACALL SET0 ;設定 TIMER 0
L0: ACALL ON ;顯示功能表副程式
36
L1: ACALL CONV ;呼叫時間轉換副程式
MOV A,4FH
CJNE A,#1,L11
L1W:
JB P0.4,L111
CLR P0.1
SETB P0.2
CALL DELAY1S
CLR P0.1
CLR P0.2
CALL DELAY1S
ACALL LOCKED
CALL DELAY5S
ACALL ON ;顯示功能表副程式
MOV 4FH,#0
SETB SW ;LED 燈暗
JMP L11
L111:
CLR SW ;LED 燈亮
CALL UNLOCK
JMP L1W
L11:
JB P0.3,F11_0 ;是否按下 RESET 鍵,是則往下程式,否則跳 F11_0
L1_2: ACALL DELAY
JNB P0.3,L1_2 ;等待放開按鍵
AJMP F00 ;跳至設定切值
F11_0:
ACALL SCAN ;呼叫掃描鍵盤副程式
MOV A,R5 ;R5 為掃描值,用來判斷使用者按何鍵
CJNE A,#BH,L2 ;按下 E 鍵,是則往下,否則跳 L2
37
AJMP HELP
L2: CJNE A,#CH,L3 ;按下 A 鍵,是則往下,否則跳 L3
AJMP F1
L3: CJNE A,#DH,L4 ;按下 B 鍵,是則往下,否則跳 L4
AJMP F2
L4: CJNE A,#EH,L5 ;按下 C 鍵,是則往下,否則跳 L5
AJMP F3
L5: CJNE A,#FH,L1 ;按下 D 鍵,是則往下,否則跳 L1
AJMP F4
;----- -
; HELP
;----- -
HELP:
SJMP L0
;----
; F1 ;顯示時間
;----
F1:
ACALL CLRLCD ;清除 LCD
MOV A,#86H ;顯示在 LCD 第 1 行第 7 字
ACALL W_INS ;傳指令至 LCD
MOV CNT,#4 ;CNT 設為 4
MOV DPTR,#MSG3 ;'TIME'
ACALL W_STR ;傳字串至 LCD SHOW 出資料
F11: ACALL CONV ;BCD TO ASCII
MOV A,#C4H ;顯示在 LCD 第 2 行第 5 字
ACALL W_INS ;傳指令至 LCD
ACALL DISP ;LCD DISPLAY DATA
ACALL SCAN ;呼叫掃描鍵盤副程式
MOV A,R5 ;R5 為掃描值,用來判斷使用者按何鍵
38
CJNE A,#BH,F12 ;按下 E 鍵,是則往下,否則跳 F12
AJMP HELP
F12: CJNE A,#DH,F13 ;按下 B 鍵,是則往下,否則跳 F13
AJMP F2
F13: CJNE A,#EH,F14 ;按下 C 鍵,是則往下,否則跳 F14
AJMP F3
F14: CJNE A,#FH,F11 ;按下 D 鍵,是則往下,否則跳 F11
AJMP F4
;----
; F2 ;調整時間
;----
F2:
ACALL CLRLCD
MOV R0,#48H ;INPUT BUFFER
MOV A,#82H ;顯示在 LCD 第 1 行第 3 字
ACALL W_INS ;傳指令至 LCD
MOV CNT,#11
MOV DPTR,#MSG4 ;ADJUST TIME
ACALL W_STR ;傳字串至 LCD SHOW 出資料
MOV A,#C6H ;顯示在 LCD 第 2 行第 7 字
ACALL W_INS ;傳指令至 LCD
MOV A,#':'
ACALL W_DATA ;傳單字至 LCD SHOW 出資料
MOV A,#C9H ;顯示在 LCD 第 2 行第 10 字
ACALL W_INS ;傳指令至 LCD
MOV A,#':'
ACALL W_DATA ;傳單字至 LCD SHOW 出資料
MOV A,#C4H ;顯示在 LCD 第 2 行第 5 字
ACALL W_INS ;傳指令至 LCD
39
F21: ACALL SCAN ;呼叫掃描鍵盤副程式
MOV A,R5 ;R5 為掃描值,用來判斷使用者按何鍵
XRL A,#16 ;若掃描值等於 16 不動作
JZ F21
MOV A,R5
CJNE A,#AH,F22 ;按下 F 鍵,是則往下,否則跳 F22
AJMP SETF2 ;跳至 SETF2
F22: CJNE A,#BH,F23 ;按下 E 鍵,是則往下,否則跳 F23
AJMP HELP
F23: CJNE A,#CH,F24 ;按下 A 鍵,是則往下,否則跳 F24
AJMP F1
F24: CJNE A,#DH,F25 ;按下 B 鍵,是則往下,否則跳 F25
AJMP F21
F25: CJNE A,#EH,F26 ;按下 C 鍵,是則往下,否則跳 F26
AJMP F3
F26: CJNE A,#FH,F27 ;按下 D 鍵,是則往下,否則跳 F27
AJMP F4
F27: MOV A,R5
MOV @R0,A ;將掃描值存入 R0 所指向的暫存器位置
ORL A,#30H ;將掃描值轉成 ASCII 碼
ACALL W_DATA ;傳單字至 LCD SHOW 出資料
INC R0 ;R0 指向加 1
CJNE R0,#4AH,F27_0 ;6 組字元 時時、分分、秒秒
MOV A,#C7H ;顯示在 LCD 第 2 行第 8 字
ACALL W_INS ;傳指令至 LCD
F27_0:
CJNE R0,#4CH,F27_1 ;6 組字元 時時、分分、秒秒
MOV A,#CAH ;顯示在 LCD 第 2 行第 11 字
ACALL W_INS ;傳指令至 LCD
40
F27_1:
CJNE R0,#4EH,F28 ;6 組字元 時時、分分、秒秒
MOV R0,#48H ;R0 指向=48H
MOV A,#C4H ;顯示在 LCD 第 2 行第 5 字
ACALL W_INS ;傳指令至 LCD
F28: SJMP F21
;----- ---
; F2-SET
;----- ---
SETF2: MOV R2,#3 ;R2 計數,時、分、秒 3 次
MOV R0,#48H ;R0 指向=48H
MOV R1,#33H ;R1 指向=33H
T1: MOV A,@R0 ;取出 R0 所指向位置的資料
ANL A,#0FH ;取低四位元
SWAP A ;高低四位元交換
INC R0 ;R0 指向+1
ADD A,@R0 ;再加到 A
MOV @R1,A ;再將 A 存到 R1 指向之位置
INC R0 ;R0 指向+1
INC R1 ;R1 指向+1
DJNZ R2,T1 ;3 次到?到了往下行,否則跳 T1
MOV R0,#30H ;R0,目前時間值
MOV R1,#33H ;R1,設定時間位
MOV A,@R1
CLR C
SUBB A,#24H ;判斷設定時值>24?是則不存入 30H
JNC T2 ;否則存入 30H
MOV A,@R1
41
MOV @R0,A
INC R0
INC R1
MOV A,@R1
CLR C
SUBB A,#60H ;判斷設定分值>60?是則不存入 31H
JNC T2 ;否則存入 31H
MOV A,@R1
MOV @R0,A
INC R0
INC R1
MOV A,@R1
CLR C
SUBB A,#60H ;判斷設定秒值>60?是則不存入 32H
JNC T2 ;否則存入 32H
MOV A,@R1
MOV @R0,A
T2: AJMP F1
;----
; F3 ;輸入密碼
;----
F3:
ACALL CLRLCD ;清除 LCD
MOV A,#83H ;顯示在 LCD 第 1 行第 4 字
ACALL W_INS ;傳指令至 LCD
MOV CNT,#11 ;字數 11 個字
MOV DPTR,#MSG5 ;INPUT CODE1
ACALL W_STR ;傳字串至 LCD SHOW 出資料
MOV A,#C6H ;顯示在 LCD 第 2 行第 7 字
ACALL W_INS ;傳指令至 LCD
MOV R0,#50H ;R0 指向=50H
42
F31: ACALL SCAN ;呼叫掃描鍵盤副程式
MOV A,R5 ;R5 為掃描值,用來判斷使用者按何鍵
XRL A,#16 ;若掃描值等於 16 不動作
JZ F31
MOV A,R5
CJNE A,#AH,F32 ;按下 F 鍵,是則往下,否則跳 F32
AJMP SETF3
F32: CJNE A,#BH,F33 ;按下 E 鍵,是則往下,否則跳 F33
AJMP HELP
F33: CJNE A,#CH,F34 ;按下 A 鍵,是則往下,否則跳 F34
AJMP F1
F34: CJNE A,#DH,F35 ;按下 B 鍵,是則往下,否則跳 F35
AJMP F2
F35: CJNE A,#EH,F36 ;按下 C 鍵,是則往下,否則跳 F36
AJMP F31
F36: CJNE A,#FH,F37 ;按下 D 鍵,是則往下,否則跳 F37
AJMP F4
F37: MOV A,R5
MOV @R0,A ;將掃描值存入 R0 所指向的暫存器位置
ORL A,#30H ;將掃描值轉成 ASCII 碼
ACALL W_DATA ;傳單字至 LCD SHOW 出資料
INC R0 ;R0 指向+1
CJNE R0,#54H,F38 ;R0 指向=54H?不是則跳 F38,是則往下
MOV R0,#50H ;R0 指向=50H
MOV A,#C6H ;顯示在 LCD 第 2 行第 7 字
ACALL W_INS ;傳指令至 LCD
F38: SJMP F31
;----- ---
; F3-SET
;----- ---
SETF3: CLR F0 ;F0 為判斷密碼是否正確旗標,F0=0 表 ERROR
43
ACALL R_CODE ;將 93c66 密碼讀入 8051 的位置 54H
MOV R2,#4 ;4 位密碼
MOV R0,#50H ;R0 指向,使用者輸入的密碼 50H
MOV R1,#54H ;R1 指向,93c66 密碼 54H
C1: MOV A,@R0
XRL A,@R1 ;
JNZ C2 ;不規則跳 C2
INC R0
INC R1
DJNZ R2,C1
SETB F0 ;CODE EXACT
C2: MOV A,#C6H ;顯示在 LCD 第 2 行第 7 字
ACALL W_INS ;傳指令至 LCD
MOV DPTR,#MSG6 ;MSG6='EXACT'
JB F0,C3
MOV DPTR,#MSG7 ;MSG7='ERROR'
MOV CNT,#5
ACALL W_STR ;傳字串至 LCD SHOW 出資料
CALL DELAY5S
JMP L0
C3: MOV CNT,#5
ACALL W_STR ;傳字串至 LCD SHOW 出資料
;----
; FS ;輸入密碼 2
;----
FS:
ACALL CLRLCD ;清除 LCD
MOV A,#83H ;顯示在 LCD 第 1 行第 4 字
ACALL W_INS ;傳指令至 LCD
44
MOV CNT,#11 ;字數 11 個字
MOV DPTR,#MSG52 ;INPUT CODE2
ACALL W_STR ;傳字串至 LCD SHOW 出資料
MOV A,#C6H ;顯示在 LCD 第 2 行第 7 字
ACALL W_INS ;傳指令至 LCD
MOV R0,#58H ;R0 指向=50H
FS1: ACALL SCAN ;呼叫掃描鍵盤副程式
MOV A,R5 ;R5 為掃描值,用來判斷使用者按何鍵
XRL A,#16 ;若掃描值等於 16 不動作
JZ FS1
MOV A,R5
CJNE A,#AH,FS2 ;按下 F 鍵,是則往下,否則跳 F32
AJMP SETFS
FS2: CJNE A,#BH,FS3 ;按下 E 鍵,是則往下,否則跳 F33
AJMP HELP
FS3: CJNE A,#CH,FS4 ;按下 A 鍵,是則往下,否則跳 F34
AJMP F1
FS4: CJNE A,#DH,FS5 ;按下 B 鍵,是則往下,否則跳 F35
AJMP F2
FS5: CJNE A,#EH,FS6 ;按下 C 鍵,是則往下,否則跳 F36
AJMP F31
FS6: CJNE A,#FH,FS7 ;按下 D 鍵,是則往下,否則跳 F37
AJMP F4
FS7: MOV A,R5
MOV @R0,A ;將掃描值存入 R0 所指向的暫存器位置
ORL A,#30H ;將掃描值轉成 ASCII 碼
ACALL W_DATA ;傳單字至 LCD SHOW 出資料
INC R0 ;R0 指向+1
CJNE R0,#5CH,FS8 ;R0 指向=5CH?不是則跳 FS8,是則往下
MOV R0,#58H ;R0 指向=58H
MOV A,#C6H ;顯示在 LCD 第 2 行第 7 字
45
ACALL W_INS ;傳指令至 LCD
FS8: SJMP FS1
SETFS: CLR F0 ;F0 為判斷密碼是否正確旗標,F0=0 表 ERROR
ACALL R_CODE2 ;將 93c66 密碼讀入 8051 的位置 5CH
MOV R2,#4 ;4 位密碼
MOV R0,#58H ;R0 指向,使用者輸入的密碼 58H
MOV R1,#5CH ;R1 指向,93c66 密碼 5CH
CS1:
MOV A,@R0
XRL A,@R1 ;比對密碼,58H 比 5CH,59H 比 5DH,5AH 比
5EH,
5BH 比 5FH
JNZ CS2 ;不規則跳 CS2
INC R0
INC R1
DJNZ R2,CS1
SETB F0 ;CODE EXACT
CS2: MOV A,#C6H ;顯示在 LCD 第 2 行第 7 字
ACALL W_INS ;傳指令至 LCD
MOV DPTR,#MSG6 ;MSG6='EXACT'
JB F0,CS3
MOV DPTR,#MSG7 ;MSG7='ERROR'
MOV CNT,#5
ACALL W_STR ;傳字串至 LCD SHOW 出資料
CALL DELAY5S
JMP L0
CS3: MOV CNT,#5
ACALL W_STR ;傳字串至 LCD SHOW 出資料
46
CLR SW ;LED 燈亮
CLR P0.2
SETB P0.1
CALL DELAY1S
CLR P0.1
CLR P0.2
CALL DELAY1S
MOV 4FH,#1
CALL DELAY5S
JMP L0
;----
; F4 ;設定密碼
;----
F4:
ACALL CLRLCD ;清除 LCD
MOV A,#80H ;顯示在 LCD 第 1 行第 4 字
ACALL W_INS ;傳指令至 LCD
MOV CNT,#16
MOV DPTR,#MSGF ;CODE1 or CODE2?
ACALL W_STR ;傳字串至 LCD SHOW 出資料
COD:
ACALL SCAN ;呼叫掃描鍵盤副程式
MOV A,R5 ;R5 為掃描值,用來判斷使用者按何鍵
CJNE A,#01H,COD1
MOV 3AH,#50H ;50H 存到 3AH 裡
MOV 3BH,#54H ;54H 存到 3BH 裡
MOV 3CH,#58H
JMP SETCOD
COD1: CJNE A,#02H,COD2
MOV 3AH,#58H ;58H 存到 3AH 裡
MOV 3BH,#5CH ;5CH 存到 3BH 裡
MOV 3CH,#60H
47
JMP SETCOD
COD2:
JMP COD
SETCOD:
ACALL CLRLCD ;清除 LCD
MOV A,#83H ;顯示在 LCD 第 1 行第 4 字
ACALL W_INS ;傳指令至 LCD
MOV CNT,#10
MOV DPTR,#MSGA ;PASS WORD?
ACALL W_STR ;傳字串至 LCD SHOW 出資料
MOV A,#C6H ;顯示在 LCD 第 2 行第 7 字
ACALL W_INS ;傳指令至 LCD
MOV R0,3AH ;R0 指向 3AH 裡面的值
F51: ACALL SCAN ;呼叫掃描鍵盤副程式
MOV A,R5 ;R5 為掃描值,用來判斷使用者按何鍵
XRL A,#16 ;若掃描值等於 16 不動作
JZ F51
MOV A,R5
CJNE A,#AH,F52 ;按下 F 鍵,是則往下,否則跳 F52
AJMP SETF5
F52: CJNE A,#BH,F53 ;按下 E 鍵,是則往下,否則跳 F53
AJMP HELP
F53: CJNE A,#CH,F54 ;按下 A 鍵,是則往下,否則跳 F54
AJMP F1
F54: CJNE A,#DH,F55 ;按下 B 鍵,是則往下,否則跳 F55
AJMP F2
F55: CJNE A,#EH,F56 ;按下 C 鍵,是則往下,否則跳 F56
AJMP F3
F56: CJNE A,#FH,F57 ;按下 D 鍵,是則往下,否則跳 F57
AJMP F4
F57: MOV A,R5
48
MOV @R0,A ;將掃描值存入 R0 所指向的暫存器位置
ORL A,#30H ;將掃描值轉成 ASCII 碼
ACALL W_DATA ;傳單字至 LCD SHOW 出資料
INC R0
MOV A,R0
CJNE A,3BH,F58
MOV R0,3AH
MOV A,#C6H ;顯示在 LCD 第 2 行第 7 字
ACALL W_INS ;傳指令至 LCD
F58: SJMP F51
;----- ---
; F5-SET
;----- ---
SETF5: CLR F0 ;F0 為判斷密碼是否正確旗標,F0=0 表 ERROR
MOV A,3AH
CJNE A,#50H,CC0
ACALL R_CODE ;將密碼資料寫入 93C66
JMP CCC0
CC0:
ACALL R_CODE2 ;將 93c66 密碼讀入 8051 的位置 54H
CCC0:
MOV R2,#4 ;4 位密碼
MOV R0,3AH ;使用者輸入的密碼 50H
MOV R1,3BH ;93c66 密碼 54H
CC1: MOV A,@R0
XRL A,@R1 ;比對密碼,50H 比 54H,51H 比 55H,52H 比 56H,
53H 比 57H
JNZ CC2 ;不規則跳 C2
INC R0 ;R0 指向+1
INC R1 ;R1 指向+1
DJNZ R2,CC1
JMP F40
49
CC2:
ACALL CLRLCD ;清 LCD
MOV A,#C6H ;顯示在 LCD 第 2 行第 7 字
ACALL W_INS ;傳指令至 LCD
MOV DPTR,#MSG7 ;MSG7='ERROR'
MOV CNT,#5
ACALL W_STR ;傳字串至 LCD SHOW 出資料
ACALL DELAY1S
JMP F4
F40:
ACALL CLRLCD ;清 LCD
MOV A,#84H ;顯示在 LCD 第 1 行第 5 字
ACALL W_INS ;傳指令至 LCD
MOV CNT,#9 ;顯示 8 個字
MOV A,3AH
CJNE A,#50H,F4B
MOV DPTR,#MSG8 ;SET CODE1
JMP F4C
F4B:
MOV DPTR,#MSG82 ;SET CODE2
F4C:
ACALL W_STR ;傳字串至 LCD SHOW 出資料
MOV A,#C6H ;顯示在 LCD 第 2 行第 7 字
MOV R0,3BH ;R0=54H
ACALL W_INS ;傳指令至 LCD
F41: ACALL SCAN ;呼叫掃描鍵盤副程式
MOV A,R5 ;R5 為掃描值,用來判斷使用者按何鍵
XRL A,#16 ;若掃描值等於 16 不動作
JZ F41
MOV A,R5
CJNE A,#AH,F42 ;按下 F 鍵,是則往下,否則跳 F42
AJMP SETF4
50
F42: CJNE A,#BH,F43 ;按下 E 鍵,是則往下,否則跳 F43
AJMP HELP
F43: CJNE A,#CH,F44 ;按下 A 鍵,是則往下,否則跳 F44
AJMP F1
F44: CJNE A,#DH,F45 ;按下 B 鍵,是則往下,否則跳 F45
AJMP F2
F45: CJNE A,#EH,F46 ;按下 C 鍵,是則往下,否則跳 F46
AJMP F3
F46: CJNE A,#FH,F47 ;按下 D 鍵,是則往下,否則跳 F47
AJMP F4
F47: MOV A,R5
MOV @R0,A ;將掃描值存入 R0 所指向的暫存器位置
ADD A,#30H ;將掃描值轉成 ASCII 碼
ACALL W_DATA ;傳單字至 LCD SHOW 出資料
INC R0 ;R0 指向+1
MOV A,R0
CJNE A,3CH,F48
MOV R0,3BH
MOV A,#C6H ;顯示在 LCD 第 2 行第 7 字
ACALL W_INS ;傳指令至 LCD
F48: SJMP F41
;----- ---
; F4-SET
;----- ---
SETF4:
MOV A,3AH
CJNE A,#50H,ST4B
ACALL W_CODE ;將密碼資料寫入 93C66
JMP ST4C
ST4B:
ACALL W_CODE2 ;將密碼資料寫入 93C66
ST4C:
51
ACALL CLRLCD ;清 LCD
MOV A,#84H ;顯示在 LCD 第 1 行第 5 字
ACALL W_INS ;傳指令至 LCD
MOV CNT,#8
MOV DPTR,#MSG9 ;SUCCESS!
ACALL W_STR ;傳字串至 LCD SHOW 出資料
CALL DELAY5S
JMP L0
;----- --- --
; SCAN KEY
;----- --- --
SCAN: MOV R4,#00H ;清除 R4,R4 存放掃描按鍵值
MOV R7,#4 ;R7 設定為 4,掃描 4 次 P3.0~P3.3
MOV R6,#11111110B ;從 P3.0 開始掃瞄
COL: MOV A,R6
MOV P3,A
JB P3.4,S1 ;無按鍵(1)~S1,有按鍵(0)往下執行
JNB P3.4,$ ;消除彈跳誤動作,即按鍵(0)等待放開按鍵(1)往下執行
ACALL DELAY
ACALL DELAY
ACALL DELAY
SJMP S5 ;First Line
S1: INC R4
JB P3.5,S2
JNB P3.5,$ ;DEBOUNCE
ACALL DELAY
ACALL DELAY
ACALL DELAY
SJMP S5 ;Second Line
S2: INC R4
JB P3.6,S3
JNB P3.6,$
ACALL DELAY
52
ACALL DELAY
ACALL DELAY
SJMP S5 ;Third Line
S3: INC R4
JB P3.7,S4
JNB P3.7,$
ACALL DELAY
ACALL DELAY
ACALL DELAY
SJMP S5 ;Fouth Line
S4: INC R4
MOV A,R6
RL A ;換 P3.1 列開始掃描
MOV R6,A
DJNZ R7,COL
S5: CJNE R4,#00H,S6
MOV R5,#01H
RET
S6: CJNE R4,#01H,S7
MOV R5,#04H
RET
S7: CJNE R4,#02H,S8
MOV R5,#07H
RET
S8: CJNE R4,#03H,S9
MOV R5,#0AH
RET
S9: CJNE R4,#04H,SA
MOV R5,#02H
RET
SA: CJNE R4,#05H,SB
MOV R5,#05H
RET
53
SB: CJNE R4,#06H,SC
MOV R5,#08H
RET
SC: CJNE R4,#07H,SD
MOV R5,#00H
RET
SD: CJNE R4,#08H,SE
MOV R5,#03H
RET
SE: CJNE R4,#09H,SF
MOV R5,#06H
RET
SF: CJNE R4,#0AH,SG
MOV R5,#09H
RET
SG: CJNE R4,#0BH,SOK
MOV R5,#0BH
RET
SOK: MOV A,R4
MOV R5,A
RET
;----- --- --
; POWER ON
;----- --- --
ON: PUSH A
MOV A,#80H ;顯示在 LCD 第 1 行第 1 字
ACALL W_INS ;傳指令至 LCD
MOV CNT,#16
MOV DPTR,#MSG1 ;F1:TIME F2:ADJ
ACALL W_STR ;傳字串至 LCD SHOW 出資料
MOV A,#C0H ;顯示在 LCD 第 2 行第 1 字
ACALL W_INS ;傳指令至 LCD
54
MOV CNT,#16
MOV DPTR,#MSG2 ;F3:INPUT F4:SET
ACALL W_STR ;傳字串至 LCD SHOW 出資料
POP A
SETB SW
RET
LOCKED:
MOV A,#80H ;顯示在 LCD 第 1 行第 1 字
ACALL W_INS ;傳指令至 LCD
MOV CNT,#16
MOV DPTR,#MSGD ;F1:TIME F2:ADJ
ACALL W_STR ;傳字串至 LCD SHOW 出資料
MOV A,#C0H ;顯示在 LCD 第 2 行第 1 字
ACALL W_INS ;傳指令至 LCD
MOV CNT,#16
MOV DPTR,#MSGE ;F3:INPUT F4:SET
ACALL W_STR ;傳字串至 LCD SHOW 出資料
RET
UNLOCK:
MOV A,#80H ;顯示在 LCD 第 1 行第 1 字
ACALL W_INS ;傳指令至 LCD
MOV CNT,#16
MOV DPTR,#MSGC ;F1:TIME F2:ADJ
ACALL W_STR ;傳字串至 LCD SHOW 出資料
MOV A,#C0H ;顯示在 LCD 第 2 行第 1 字
ACALL W_INS ;傳指令至 LCD
MOV CNT,#16
MOV DPTR,#MSGE ;F3:INPUT F4:SET
ACALL W_STR ;傳字串至 LCD SHOW 出資料
SET0:
MOV SEC,#100 ;100*10000=1000000us=1s
55
MOV TMOD,#01H ;設定 TIMER O 工作模式 1
MOV IE,#10000010B
MOV TH0,#>(65536-10000)
MOV TL0,#<(65536-10000)
SETB TR0 ;開始中斷從 55536 開始數到 65536(10000 次)發生溢位
RET
;----- --- --------
; INIT RAM & LCD
;----- --- --------
INIT: MOV R0,#6
MOV R1,#30H
CLR A
NEXT0: MOV @R1,A
INC R1
DJNZ R0,NEXT0
MOV R0,#14
MOV R1,#40H
CLR A
NEXT1: MOV @R1,A
INC R1
DJNZ R0,NEXT1
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
56
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
;----- --- ------
; BCD TO ASCII
;----- --- ------
CONV: MOV A,#30H ;以下為轉換時值成 ASCII 值,ASCII為 LCD 所
顯示的值
MOV R0,A
MOV A,@R0
SWAP A
ANL A,#0FH
ADD A,#30H
MOV 40H,A
MOV A,@R0
ANL A,#0FH
ADD A,#30H
MOV 41H,A ;轉換時值完成
MOV 42H,#":"
INC R0
MOV A,@R0
SWAP A
ANL A,#0FH
ADD A,#30H
57
MOV 43H,A
MOV A,@R0
ANL A,#0FH
ADD A,#30H
MOV 44H,A ;轉換分值完成
MOV 45H,#":"
INC R0
MOV A,@R0 ;以下當轉換秒值或 ASCII 值,ASCII為 LCD 可顯示
的值
SWAP A
ANL A,#0FH
ADD A,#30H
MOV 46H,A
MOV A,@R0
ANL A,#0FH
ADD A,#30H
MOV 47H,A ;轉換秒值完成
RET
;----- --- ------
; DISPLAY TIME
;----- --- ------
DISP: MOV R1,#8
MOV R0,#40H
DSP: MOV A,@R0
ACALL W_DATA ;傳單字至 LCD SHOW 出資料
INC R0
DJNZ R1,DSP
RET
;----- --- -------------
; WRITE STRING TO LCD
;----- --- -------------
W_STR: PUSH A
MOV R5,#0
58
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 P1,A
CLR EN
POP A
RET
;----- --- -----------
; WRITE DATA TO LCD
;----- --- -----------
W_DATA: PUSH A
ACALL CHECK
SETB RS
CLR RW
SETB EN
MOV P1,A
CLR EN
POP A
RET
;----- --- --------
; CHECK LC D BUSY
;----- --- --------
59
CHECK: PUSH A
BUSY: CLR RS
SETB RW
SETB EN
MOV A,P1
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
; ======================
; ==廷時副程式===========
; ======================
DELAY1S: MOV R5,#5
DL0: MOV R6,#150
DL1: MOV R7,#100
DL2: DJNZ R7,DL2
DJNZ R6,DL1
DJNZ R5,DL0
RET
; ======================
; ==廷時副程式===========
; ======================
DELAY5S: MOV R5,#20
60
DLL0: MOV R6,#200
DLL1: MOV R7,#200
DLL2: DJNZ R7,DLL2
DJNZ R6,DLL1
DJNZ R5,DLL0
RET
;----- --- -----
; JUDGE H/M/S
;----- --- -----
JUDGE: PUSH A ;取出存放在 32H 的秒值
MOV A,32H
ADD A,#1
DA A ;秒值加 1 並轉成十進位
MOV 32H,A ;存放秒值於 32H
CJNE A,#60H,FIX ;判斷秒值,60 秒往下,否則跳至 FIX
MOV 32H,#00 ;秒歸零
MOV A,31H ;取出存放在 31H 的分值
ADD A,#1
DA A ;分值加 1,並轉成十進位
MOV 31H,A
CJNE A,#60H,FIX ;判斷分值,60 分往下,否則跳至 FIX
MOV 31H,#00 ;分值歸零
MOV A,30H ;取出存放在 30H 的時值
ADD A,#1
DA A ;時值加 1 並轉成十進位
MOV 30H,A ;存放時值於 30H
CJNE A,#24H,FIX ;判斷時值,24 時往下,否則跳至 FIX
MOV 30H,#00 ;時值歸零
FIX: POP A
RET
;----- ---
; TIMER0
61
;----- ---
TIMER0: PUSH A ;TIMER 1 SEC
MOV TH0,#>(65536-10000)
MOV TL0,#<(65536-10000)
DJNZ SEC,EXIT3 ;判斷是否 1 秒到了
MOV SEC,#100
ACALL JUDGE ;呼叫秒轉換成分、時副程式
EXIT3: POP A
RETI
;----- --- --------------
; READ CODE FORM 93CX6
;----- --- --------------
R_CODE: PUSH A
MOV ADDR,#0 ;從外部資料記憶體位地 00H 處開始讀資料
MOV R0,#54H
MOV R1,#2
LOOP1: ACALL READ ;讀資料,16 字元
INC ADDR ;位址加 1
DJNZ R1,LOOP1 ;讀第二次 16 位元資料
POP A
RET
;----- --- -------------
; WRITE CODE TO 93CX6
;----- --- -------------
W_CODE: PUSH A
MOV ADDR,#0
MOV R0,#54H
MOV R1,#2
LOOP2: ACALL ERASE
ACALL WEN
ACALL WRITE
62
ACALL WDS
INC ADDR
DJNZ R1,LOOP2
POP A
RET
;----- --- --------------
; READ CODE FORM 93CX6
;----- --- --------------
R_CODE2:
PUSH A
MOV ADDR,#2 ;從外部資料記憶體位地 00H 處開始讀資料
MOV R0,#5CH
MOV R1,#2
LOOP21: ACALL READ ;讀資料,16 字元
INC ADDR ;位址加 1
DJNZ R1,LOOP21 ;讀第二次 16 位元資料
POP A
RET
;----- --- -------------
; WRITE CODE TO 93CX6
;----- --- -------------
W_CODE2:
PUSH A
MOV ADDR,#2
MOV R0,#5CH
MOV R1,#2
LOOP22: ACALL ERASE
ACALL WEN
ACALL WRITE
ACALL WDS
INC ADDR
DJNZ R1,LOOP22
63
POP A
RET
;----- --- -----
; ERASE 93CX6
;----- --- -----
ERASE: PUSH A
MOV R6,#00000111B
MOV A,ADDR
MOV R7,A
ACALL SHIFT5
SETB CS
MOV CNT,#11
ER: MOV A,R7
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV DI,C
SETB SK
NOP
CLR SK
NOP
DJNZ CNT,ER
ACALL CHKBSY
CLR CS
POP A
RET
;----- --- ------------
; 93CX6 WRITE ENABLE
;----- --- ------------
WEN: PUSH A
MOV R6,#00000100B
MOV R7,#11000000B
64
ACALL SHIFT5
SETB CS
MOV CNT,#11
W1: MOV A,R7
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV DI,C
SETB SK
NOP
CLR SK
NOP
DJNZ CNT,W1
CLR CS
POP A
RET
;----- --- -------------
; 93CX6 WRITE DISABLE
;----- --- -------------
WDS: PUSH A
MOV R6,#00000100B
MOV R7,#00000000B
ACALL SHIFT5
SETB CS
MOV CNT,#11
DS: MOV A,R7
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV DI,C
65
SETB SK
NOP
CLR SK
NOP
DJNZ CNT,DS
CLR CS
POP A
RET
;----- --
; WRITE
;----- --
WRITE: PUSH A
MOV R6,#00000101B
MOV A,ADDR
MOV R7,A
ACALL SHIFT5
SETB CS
MOV CNT,#11
WR: MOV A,R7
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV DI,C
SETB SK
NOP
CLR SK
NOP
DJNZ CNT,WR
ACALL W_DAT
ACALL CHKBSY
CLR CS
POP A
66
RET
;----- --- -------------
; WRITE DATA TO 93CX6
;----- --- -------------
W_DAT: PUSH A
MOV R3,#2
WD1: MOV A,@R0
MOV R4,#8
WD2: RLC A
MOV DI,C
SETB SK
NOP
CLR SK
NOP
DJNZ R4,WD2
INC R0
DJNZ R3,WD1
POP A
RET
;----- -
; READ
;----- -
READ: PUSH A
MOV R6,#00000110B
MOV A,ADDR
MOV R7,A
ACALL SHIFT5 ;將 R6,R7 結合成 11Bits
SETB CS
MOV CNT,#11
RD: MOV A,R7
RLC A
MOV R7,A
MOV A,R6
RLC A
67
MOV R6,A
MOV DI,C
SETB SK
NOP
CLR SK
NOP
DJNZ CNT,RD
ACALL R_DAT
CLR CS
POP A
RET
;----- --- --------------
; READ DATA FROM 93CX6
;----- --- --------------
R_DAT: PUSH A
MOV R3,#2
RD1: MOV R4,#8
RD2: SETB SK
NOP
CLR SK
NOP
MOV C,DO
RLC A
DJNZ R4,RD2
MOV @R0,A ;把資料存入 54H、55H、56H、57H
INC R0
DJNZ R3,RD1
POP A
RET
;----- --- ----------
; SHIFT LEFT 5 BIT
;----- --- ----------
SHIFT5: PUSH A
MOV CNT,#5
68
SHT: MOV A,R7 ;R7 為 0000000B 表從 0H 開始取
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
DJNZ CNT,SHT ;將 R6 轉成 11000000B
POP A
RET
;----- --- ----------
; CHECK 93CX6 BUSY
;----- --- ----------
CHKBSY: PUSH A
BSY: CLR CS
SETB CS
MOV C,DO
JNC BSY
POP A
RET
;===================
;=====初值設定=======
;===================
F00:
ACALL CLRLCD
MOV A,#84H ;顯示在 LCD 第 1 行第 5 字
ACALL W_INS ;傳指令至 LCD
MOV CNT,#10
MOV DPTR,#MSGB ;DATA RESET.
ACALL W_STR ;傳字串至 LCD SHOW 出資料
MOV A,#C6H ;顯示在 LCD 第 2 行第 7 字
MOV R0,#54H
ACALL W_INS ;傳指令至 LCD
F08:
69
MOV A,#00H
MOV @R0,A
INC R0
CJNE R0,#58H,F08
MOV R0,#54H
ACALL W_CODE
MOV R0,#5CH
F082:
MOV A,#00H
MOV @R0,A
INC R0
CJNE R0,#60H,F082
MOV R0,#5CH
ACALL W_CODE2
ACALL DELAY1S
AJMP START
;----- --- -
; MESSAGE
;----- --- -
MSG1: DB 'F1:TIME F2:ADJ'
MSG2: DB 'F3:INPUT F4:SET'
MSG3: DB 'TIME'
MSG4: DB 'ADJUST TIME'
MSG5: DB 'INPUT CODE1'
MSG52: DB 'INPUT CODE2'
MSG6: DB 'EXACT'
MSG7: DB 'ERROR'
MSG8: DB 'SET CODE1'
MSG82: DB 'SET CODE2'
MSG9: DB 'SUCCESS!'
MSGA: DB 'PASS WORD?'
MSGB: DB 'DATA RESET.'
MSGC: DB 'Door Unlock.....'
70
MSGD: DB 'Door locked.....'
MSGE: DB ' '
MSGF: DB 'CODE1 or CODE2 ?'
END
71
第六章 製作心得與參考文獻
6.1製作心得: 在製作這個專題之前遇到許多難題,首先是解決這 8051 晶片電源問
題,在參考了許多書與詢問同學後,發現可藉由 7805 穩壓 IC,來完成
自製 5V 穩定的電源,對於單晶片的選擇方面,為了降低成本、燒錄程式
修改容易及且品質穩定各種條件下,決定採用價格合理而且可以重覆燒
錄的 89S51,因此也對 89S51 這顆 IC 有了更多的了解,也深深感到這個
IC 其強大的功能,雖然這只是一個小小的專題實習,不過我相信若是在
這個小小的基礎上,繼續研究的話,以後或許會有更深的學問及技術被
發現與應用。
6.2參考文獻:
[1]吳鴻璋,微處理應用(8051/8052基本原理與應用) ,滄海書局,2007
[2]楊明豐,單晶片實作入門與應用,第三波出版社,1997
[3] 林伸茂,8051 單晶片徹底研究基礎篇 ,旗標出版社,2002
[4]蔡朝洋 單晶片微電腦 8051/8951原理與應用第七版,全華科技,2009
72
73
74
75