|
一、課程設計(論文)的內容 以89C51單片機為核心,制作一個LED顯示的雙精度電子稱設計。具體要求: 1、用4只LED數碼管輸出顯示重量。 2、可通過按鍵設置重量功能,且停鬧無須手工操作。 3、可通過按鍵設置重量的單位。 4、稱重時的誤差少于10g。 二、課程設計(論文)的要求與數據 1、系統框圖、方案論證; 2、各部分的硬件電路原理圖及功能說明; 3、程序流程圖及分析; 4、系統調試與分析; 5、源程序清單。 三、課程設計(論文)應完成的工作 1. 畫出系統框圖,論證系統設計方案; 2、器件選型,給出系統各個組成部分的硬件電路原理圖; 3、給出程序流程圖; 4、進行源程序的設計及調試; 5、撰寫課程設計報告的。 四、課程設計(論文)進程安排 序號 | 設計(論文)各階段內容 | 地點 | 起止日期 | 1 | 選擇課題,明確設計要求,查閱資料 | 校內 | 5.12 | 2 | 方案論證、系統總體設計 | 校內 | 5.13~5.14 | 3 | 硬件電路原理圖設計 | 校內 | 5.15~5.16 | 4 | 程序流程圖的設計、源程序的編制及系統調試 | 校內 | 5.17~5.18 | 5 | 撰寫課程設計報告 | 校內 | 5.19~5.20 | 6 | | | |
五、應收集的資料及主要參考文獻 [1] MCS-51系列單片微型計算機及其應用 [2] MCS-51系列單片機實用設計 發出任務書日期: 2017年 05月12 日 指導教師簽名: 計劃完成日期: 2017年 05月20 日 教學單位責任人簽章:
目錄 1系統分析 1.1功能要求 1.2方案論證 2 系統設計 2.1 系統硬件電路的設計 2.2 系統程序的設計 9 3 結束語 18 參考文獻 19 附錄1材料清單 20 附錄2電路原理圖 21 附錄3實物圖 22 附錄4主要程序清單 23
1系統分析 1.1功能要求 本課題的主要設計思路是:利用壓力傳感器采集因壓力變化產生的電壓信號,經過電壓放大電路放大,然后再經過模數轉換器轉換為數字信號,最后把數字信號送入單片機。單片機經過相應的處理后,得出當前所稱物品的重量及總額,然后再顯示出來。此外,還可通過鍵盤設定所稱物品的價格。 本文主要主要以下幾個方面的工作: (1)詳細講解了稱重器工作原理。 (2)對稱重器系統進行總體方案的設計。 (3)對于稱重器的硬件系統,重點介紹關于精度、轉換速率的壓力傳感器和A/D轉換模塊器件的選取。 (4)對于稱重器的軟件系統,通過解說LCD液晶顯示的使用及鍵盤的工作原理,對于主程序的編寫與調試提供重要的依據。 (5)依據稱重系統的總電路,通過Keil軟件C語言編程和Proteus仿真,實現模擬的稱重顯示。 (6)對稱重系統的測量值與顯示值的差值,進行系統的調試與誤差校正。 主要技術指標為:稱量范圍0~10Kg;分度值0.01kg;精度等級Ⅲ級;電源DC1.5V(一節5號電池供電)。 這種高精度智能電子秤體積小、計量準確、攜帶方便,集重量稱量功能與價格計算功能于一體,能夠滿足商業貿易和居民家庭的使用需求 圖1.1設計思路框圖
1.2方案論證 數碼管顯示。結構如圖1.2所示:
圖1.2數碼管顯示方案 此方案利用數碼管顯示物體重量,簡單可行,可以采用內部帶有模數轉換功能的單片機。此設計的硬件部分簡單,接口電路易于實現,并且在編程時大大減少程序量,在電路結構上只有簡單的輸出輸入關系。缺點是:硬件部分簡單,雖然可以實現電子稱基本的稱重功能,但是不能實現外部數據的輸入,無法實時地設定各種控制參數。由于數碼管只能實現簡單的數字和英文字符的顯示,不能顯示漢字以及其他的復雜字符,不能達到顯示購物清單的要求。又因為采用了具有模數轉換功能的單片機,系統電路過于簡單,系統硬件的擴展必受到限制,電子秤的功能過于單一,達不到設計的標準。 1
2 系統設計 2.1 系統硬件電路的設計 2.1.1 AT89S52的最小系統電路構成 AT89S52單片機的最小系統由時鐘電路、復位電路、電源電路及單片機構成。單片機的時鐘信號用來提供單片機片內各種操作的時間基準,復位操作則使單片機的片內電路初始化,使單片機從一種確定的初態開始運行。 單片機的時鐘信號通常用兩種電路形式得到:內部振蕩方式和外部振蕩方式。在引腳XTAL1和XTAL2外接晶體振蕩器(簡稱晶振)或陶瓷諧振器,就構成了內部振蕩方式。由于單片機內部有一個高增益反相放大器,當外接晶振后,就構成了自激振蕩器并產生振蕩時鐘脈沖。 當單片機的復位引腳RST出現2個機器周期以上的高電平時,單片機就執行復位操作。如果RST持續為高電平,單片機就處于循環復位狀態。根據應用的要求,復位操作通常有兩種基本形式:上電復位和上電或開關復位。上電復位要求接通電源后,自動實現復位操作。 上電或開關復位要求電源接通后,單片機自動復位,并且在單片機運行期間,用開關操作也能使單片機復位。單片機的復位操作使單片機進入初始化狀態,其中包括使程序計數器PC=0000H,這表明程序從0000H地址單元開始執行。 系統復位是任何微機系統執行的第一步,使整個控制芯片回到默認的硬件狀態下。51單片機的復位是由RESET引腳來控制的,此引腳與高電平相接超過24個振蕩周期后,51單片機即進入芯片內部復位狀態,而且一直在此狀態下等待,直到RESET引腳轉為低電平后,才檢查EA引腳是高電平或低電平,若為高電平則執行芯片內部的程序代碼,若為低電平便會執行外部程序。
圖2.1AT89S52最小系統電路 2.2.2 A/D轉換器與AT89S52單片機接口電路 AD574是美國Analog Device公司生產的12位單片A/D轉換器。它采用逐次逼近型的A/D轉換器,最大轉換時間為25us,轉換精度為0.05%,所以適合于高精度的快速轉換采樣系統。芯片內部包含微處理器借口邏輯(有三態輸出緩沖器),故可直接與各種類型的8位或者16位的微處理器連接,而無需附加邏輯接口電路,切能與CMOS及TTL電路兼容。AD574采用28腳雙列直插標準封裝。
圖2.2AD574芯片引腳圖 A/D574有5根控制線,邏輯控制輸入信號有: A0:字節選擇控制信號。 CE:片啟動信號。 /CS:片選信號。當/CS=0,CE=1同時滿足時,AD574才處于工作狀態,否則工作被禁止。 R/-C:讀數據/轉換控制信號。 12/-8:數據輸出格式選擇控制信號。當其為高電平時,對應12位并行輸出;為低電平時,對應8位輸出。 當R/-C=0,啟動A/D轉換:當A0=0,啟動12位A/D轉換方式;當A0=1,啟動8位轉換方式。 當R/-C=1,數據輸出,A0=0時,高8位數據有效;A0=1時,低4位數據有效,中間4位為0,高4位為三態。 輸出信號有: STS:工作狀態信號線。當啟動A/D進行轉換時,STS為高電平;當A/D轉換結束時為低電平。則可以利用此線驅動一信號二極管的亮滅,從而表示是否處于A/D轉換。 由于對AD574 的8、10、12引腳的外接電路有不同連接方式,所以AD574與單片機的接口方案有兩種,一種是單極性接法,可實現輸入信號0~10V或者0~20V的轉換;另一種為雙極性接法,可實現輸入信號-5~+5V或者-10~+10V之間轉換。本次設計采用單極性接法。
圖2.3 AD574與AT89S52的接線圖 根據芯片管腳的原理,無論啟動、轉換還是結果輸出,都要保證CE端為高電平,所以可以將單片機的/RD引腳和/WR端通過與非門與AD574的CE端連接起來。轉換結果分高8位、低4位與P0口相連,分兩次讀入,所以12/-8端接地。同時,為了使CS、A0、R/-C在讀取轉換結果時保持相應的電平,可以將來自單片機的控制信號經74LS373鎖存后再接入。CPU可采用中斷、查詢或者程序延時等方式讀取AD574的轉換結果,本設計采用查詢方式。 2.1.3 顯示電路與AT89S52單片機的接口電路
圖2.4 單片機與LCD接線圖 3.4 鍵盤電路與AT89S52的接口電路設計 鍵盤一般是由若干按鍵組成的開關矩陣,若按照其接線方式的不同,可分為兩種: 一種是獨立式接法,一種是矩陣式接法;若按照按鍵的結構原理,可分為兩類:一類是觸點式開關按鍵,如機械式開關、導電橡膠式開關等,一類是無觸點式開關按鍵,如電氣式按鍵、磁感應按鍵等。前者造價低,后者壽命長。 按鍵按下時,與此鍵相連的行線與列線導通,行線在無鍵按下時處于高電平。顯然如果讓所有的列線也處在高電平,那么按鍵按下與否不會引起行線電平的變化,因此,必須使所有的列線處在低電平。只有這樣,當按鍵按下時,該鍵所在的行電平才會由高電平變為低電平。CPU根據行電平的變化,便能判定相應的行有鍵按下。 對應鍵盤的相應取決于鍵盤的工作方式,鍵盤的工作方式應根據實際應用系統中CPU的工作情況而定,其選取的原則既要保證CPU能及時響應按鍵操作,又不要過多的占用CPU的工作時間。通常,鍵盤的工作方式有3種,即編程掃描、定時掃描和中斷掃描。 ① 編程掃描方式:利用CPU完成其他工作的空余時間,調用鍵盤掃描子程序來響應鍵盤輸入要求。在執行鍵功能程序時,CPU不再響應鍵輸入要求,直到CPU重新掃描鍵值為止。 ② 定時掃描方式,定時掃描方式就是每隔一段時間對鍵盤掃描一次,它利用單片機內部的定時器產生一定時間(列如10ms)的定時,當定時時間到,就會產生定時器溢出中斷。CPU響應中斷后對鍵盤進行掃描,并在有鍵按下時識別出該鍵,再執行該鍵的子程序。 ③ 中斷掃描方式:采用上述兩種掃描方式時,無論是否有鍵按下,CPU都要定時掃描鍵盤,而單片機應用系統工作時,并非經常需要鍵盤輸入,因此,CPU經常處于空掃描狀態。為提高CPU工作效率,可采用中斷掃描工作方式。其工作過程如下:當無鍵按下時,CPU處理自己程序,當有鍵按下時,產生中斷請求,CPU轉去執行鍵盤掃描子程序,并識別鍵號。 說明此(低電平)行沒有鍵被按下。接著進行下一行“0”行掃描與列讀入,知道4行關不檢查完為止,若無鍵按下,則返回。 矩陣式鍵盤的結構與工作原理: 在鍵盤中按鍵數量較多時,為了減少I/矩陣式鍵盤有兩種識別鍵是否被按下的方法:行掃描法和線反轉法。行掃描法又稱逐行零掃描查詢法,及逐行輸出行掃描信號“0”,使各行依次為低電平,然后分別讀取列數據,檢查此(低電平)行中是否有鍵被按下。如果讀得某列線為低電平,則表示此(低電平)行線與列線的交叉處有鍵按下,再對該鍵該鍵譯碼計算,得到鍵值,然后轉入該鍵的功能子程序入口地址;如果沒有任何一根列線為低電平,則O口的占用,通常將按鍵排列成矩陣形式。在矩陣式鍵盤中,每條水平線和垂直線在交叉處不直接連通,而是通過一個按鍵加以連接。這樣,一個端口(如P1口)就可以構成4*4=16個按鍵,比之直接將端口線用于鍵盤多出了一倍,而且線數越多,區別越明顯,比如再多加一條線就可以構成20鍵的鍵盤,而直接用端口線則只能多出一鍵(9鍵)。由此可見,在需要的鍵數比較多時,采用矩陣法來做鍵盤是合理的。 矩陣式鍵盤的按鍵識別方法 :確定矩陣式鍵盤上何鍵被按下介紹一種“行掃描法”。行掃描法 行掃描法又稱為逐行(或列)掃描查詢法,是一種最常用的按鍵識別方法,如下圖所示鍵盤,介紹過程如下。判斷鍵盤中有無鍵按下 將全部行線R0-R3置低電平,然后檢測列線的狀態。只要有一列的電平為低,則表示鍵盤中有鍵被按下,而且閉合的鍵位于低電平線與4根行線相交叉的4個按鍵之中。若所有列線均為高電平,則鍵盤中無鍵按下。 判斷閉合鍵所在的位置 在確認有鍵按下后,即可進入確定具體閉合鍵的過程。其方法是:依次將行線置為低電平,即在置某根行線為低電平時,其它線為高電平。在確定某根行線位置為低電平后,再逐行檢測各列線的電平狀態。若某列為低,則該列線與置為低電平的行線交叉處的按鍵就是閉合的按鍵。 在本系統中鍵盤采用矩陣式鍵盤并采用編程掃描的工作方式。鍵盤為4 X 4鍵盤,包括0、1、2、3、4、5、6、7、8、9、十個數字及確認和清除鍵。
圖2.5 單片機與鍵盤接口電路 各個按鍵的功能說明: 數字鍵:.、0、1、2、3、4、5、6、7、8、9被按下時直接顯示在LCD液晶顯示屏上。 啟動鍵:當按下此鍵時,LCD液晶顯示開啟。 單價鍵:當此按鍵被按下時,此刻要求輸入稱重物品單價,即要求按下數字鍵。 確定鍵:前提是單價已輸入完畢,當此按鍵被按下時,LCD屏幕顯示當前稱重物品的總價格。 總價鍵:當稱重物品單價不變、重量改變時,按下此按鍵時,LCD液晶屏上顯示當前重量物品的總價格。 清除鍵:當此鍵按下時,單價及總價處的顯示清零。 2.2 系統程序的設計 2.2.1 主程序設計 在單片機應用系統的開發中,軟件的設計是最復雜和困難的,大部分情況下工作量都較大,特別是對那些控制系統比較復雜的情況。如果是機電一體化的設計人員,往往需要同時考慮單片機的軟硬件資源分配。本系統的軟件設計主要分為系統初始化、按鍵、顯示處理及信號頻率輸入處理。 程序設計是一件復雜的工作,為了把復雜的工作條理化,就要有相應的步驟和方法。其步驟可概括為以下三點: (1) 分析系統控制要求,確定算法:對復雜的問題進行具體的分析,找出合理的計算方法及適當的數據結構,從而確定編寫程序的步驟。這是能否編制出高質量程序的關鍵。 (2) 根據算法畫流程圖:畫程序框圖可以把算法和解題步驟逐步具體化,以減少出錯的可能性。 (3)編寫程序:根據程序框圖所表示的算法和步驟,選用適當的指令排列起來,構成一個有機的整體,即程序。 程序數據的一種理想方法是結構化程序設計方法。結構化程序設計是對利用到的控制結構類程序做適當的限制,特別是限制轉向語句(或指令)的使用,從而控制了程序的復雜性,力求程序的上、下文順序與執行流程保持一致性,使程序易讀易理解,減少邏輯錯誤和易于修改、調試。根據系統的控制任務,本系統的軟件設計主要由主程序、初始化程序、A/D轉換子程序、鍵盤掃描子程序和顯示子程序等組成。 2.2.2 C語言在單片機中的應用 C語言是一種通用的計算機程序設計語言,在國際上非常流行。它既可以用來編寫計算機的系統程序,也可以用來編寫一般的應用程序。以前計算機的系統軟件主要用匯編語言編寫,單片機應用系統更是如此。C語言是當前最流行的程序設計語言,它像其它高級語言一樣,面向用戶,面向解題的過程,編程者不必熟悉具體的計算機內部結構和指令;C語言又像匯編語言一樣,可以對機器硬件進行操作。如進行端口0,1操作、位操作、地址操作,并可內嵌匯編指令,將匯編指令當作它的語句一樣。我們知道,匯編語言將涉及計算機硬件,所以C語言又像低級語言一樣,可以對計算機硬件進行控制,因此人們把它稱為介于高級語言與低級語言之間的一種中級語言。正是因為C語言具有這樣的特性,所以很適合編寫要對硬件進行操作的軟件程序。本文采用C語言進行編寫.因為經系統軟件比較,本系統存儲量較大,因此必須應用C語言編程了。 4.1.2 電子稱的軟件設計與實現 電子稱軟件設計均采用模塊化設計,整個程序包括主程序、A/D轉換模塊程序、鍵盤掃描程序、液晶顯示子程序等模塊。所有程序均采用C語言編寫。電子計價秤的軟件設計思路說明如下:主程序的作用為程序初始化,計算單價×物體重量(單價通過鍵盤給出,物體重量通過壓力傳感器獲得),并實時顯示十進制的物重,單價,總價。設定T0為計數工作方式,T1為定時工作方式。其中R0為標志位寄存器當為OOH時為正常顯示方式。當為01H時為累計顯示方式,在T1定時中斷程序中。一秒鐘采樣物料重量(已轉成脈沖頻率),并賦值重量計算RAM區和顯示RAM區。在INTO外部中斷程序中,采樣單價并賦值單價計算。 2.2.3 系統主程序流程圖 主程序流程圖給出了系統工作的基本過程,描述了信號的基本流向,起到一個向導的作用。 本系統的軟件系統主要可分為主程序和定時器中斷程序兩大模塊。在程序過程中,加入了抗干擾措施。下面對部分模塊作介紹。
圖2.6 稱重總設計的仿真圖
圖2.7 系統總程序圖 2.2.4 系統子程序設計 系統子程序主要包括A/D轉換啟動及數據讀取程序設計、鍵盤輸入控制程序設計以及顯示程序設計等。 2.2.5 A/D轉換啟動及數據讀取程序設計 A/D轉換子程序主要是指在系統開始運行時,把稱重傳感器傳遞過來的模擬信號轉換成數字信號并傳遞到單片機所涉及到的程序設計
圖2.8 A/D轉換啟動及數據讀取程序流程圖
圖2.9 A/D0832轉換后的顯示圖像
圖2.10 A/D574轉換后的顯示圖像 2.2.6 顯示程序設計 顯示子程序主要是來判斷是否需要顯示,以及如何去顯示,也是十分重要的程序之一。
圖2.11 顯示子程序流程圖
圖2.12 顯示啟動按鍵按下后
圖2.13 顯示歡迎界面 2.2.7 鍵盤輸入控制程序設計 鍵盤電路設計成4X4矩陣式,由鍵盤編碼方式可以得出0,1,2,3,4,5,6,7,8,9以及啟動等功能選擇鍵。在程序中可以先判斷按鍵編碼,然后根據編碼將鍵盤代表的數值送到相應的存儲單元,再進行功能選擇或數據處理。 矩陣式鍵盤又叫行列式鍵盤。就是用I/O口線組成行、列結構,按鍵設置在行列的交點上。在按鍵較多時多用矩陣鍵盤,可以節省I/O口線。列如:占用8個I/O口線的4×4矩陣式結構可以構成16個鍵的鍵盤。當有鍵按下時,要逐行或逐列掃描來判斷是哪個按鍵按下。通常的掃描方式有掃描法和反轉法。
圖2.14 鍵盤逐行掃描過程 3 結束語 隨著全球數字化技術的不斷發展,電子衡器已經在我們的生活各個領域得到了廣泛的應用,從工業貿易到能源交通都能看到電子衡器的技術應用。本文著眼于目前中小型市場商用電子稱智能化低、精度差、易損壞等特點,研發設計了基于AT89S52單片機的雙精度電子稱。 雙精度電子稱是針對目前中小型市場上現有的衡器無法同時運用于稱量微重物理和較重物體而研發的產品。該仿真設計系統主要包括五大模塊,即數據采集和雙精度轉換模塊、單片機處理模塊、鍵盤控制模塊、128*64液晶顯示模塊和軟件驅動模塊。啟動工作后,單片機可根據A/D采集的重量參數能夠自動選擇轉換精度值,完成相應的數據處理,同時在128*64的液晶屏上進行直觀的顯示重量、單價和總價,4*4鍵盤控制系統能夠實時進行單價調整,操作簡單方便,不僅能夠測量微重物理,而且能夠測量較重物體,完全達到了商品的自動化、數字化和智能化,具有很好的應用價值和意義。 本文唯一的不足是只對研發方案成果的進行了仿真設計,沒有運用實物進行驗證方案是否可行,有待進一步的研發。雖然沒有做出實物,但基于51單片機雙精度電子稱依然是一個具有前景的電子衡器產品,非常適合于中小型市場的物體稱重,如果雙精度電子稱進一步發展,與虛擬串口技術融合,將會實現與上位機的無線通訊,實現遠程監測,將更有價值。
參考文獻 [1] 黃堅,金惟偉.中小型電機產品近年出口情況簡述[J].中小型電機,2005,32(1) 9--12. [1]趙茂泰. 智能儀器原理及應用[M].北京:電子工業出版社.2004 [2]張毅剛. MCS-51單片機應用設計[M].哈爾濱:哈爾濱工業大學出版社.2003 [3]賈伯年, 俞樸.傳感器技術[M].東南大學出版社.2000 [4]單成祥.傳感器理論設計基礎及其應用[M].北京:國防工業出版社.1999 [5]李道華,李玲,朱艷 .傳感器電路分析與[M].武漢:武漢大學出版社.2000 [6]沙占友 ,王彥朋等. 智能傳感器系統設計與應用[M].北京:電子工業出版社2004.6 [7]何希才,薛永毅. 傳感器及其應用實例[J].北京:機械工業出版社.2004.1 [8]李群芳. 單片機微型計算機與接口技術[M].電子工業出版社. [9]周立功. 單片機實驗與實踐[M].北京航空航天大學出版社.2004.6 [10]全國大學生電子設計競賽組委會.全國大學生電子設計競賽獲獎作品匯編[J].北京理工大學出版社.2005.11 [11]何立民 .單片機高級教材[M].北京:航空航天大學出版社.2000 [12]童詩白,華成英 .模擬電子技術基礎[M]. 北京:北京高等教育出社.2001 [13]程林 ,超省電型電子秤的設計方案[J].福建:福建省計量科學技術研究所. 2008.3
附錄1材料清單 | | | | | | | | | | | | | | | |
3紅、透明 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
附錄2電路原理圖
附錄3實物圖
附錄4主要程序清單
- ALARMHBUFF2 EQU 77H ;鬧鈴時間的時十位計時綬沖
- ALARMHBUFF1 EQU 76H ;鬧鈴時間的時個位計時綬沖
- ALARMMBUFF2 EQU 75H ;鬧鈴時間的分十位計時綬沖
- ALARMMBUFF1 EQU 74H ;鬧鈴時間的分個位計時綬沖
- HBUFF2 EQU 73H ;時十位計時綬沖
- HBUFF1 EQU 72H ;時個位計時綬沖
- MBUFF2 EQU 71H ;分十位計時綬沖
- MBUFF1 EQU 70H ;分個位計時綬沖
- DP EQU 6FH ;控制數碼管點的亮暗
- NUM EQU 78H ;前四秒還是后四秒計數
- SBUFF EQU 79H ;秒十進制計時綬沖(低四位對應個位,高四位對應十位)
- MBUFF EQU 7AH ;分十進制計時綬沖
- HBUFF EQU 7BH ;時十進制計時綬沖
- ALARMMBUFF EQU 7CH ;鬧鈴時間的分十進制計時綬沖
- ALARMHBUFF EQU 7DH ;鬧鈴時間的時十進制計時綬沖
- NUMT1 EQU 67H;用于控制時間調整時按鍵p3.2一次按下時,計數器T1中斷的次數
- NUMT2 EQU 68H;用于控制時間調整時按鍵p3.3一次按下時,計數器T1中斷的次數
- KEYNUMT1 EQU 69H ;用于存儲NUMT1已經計數到第幾個半秒
- KEYNUMT2 EQU 6AH ;用于存儲NUMT1已經計數到第幾個半秒
- STOREKEYNUMT2 EQU 6BH ;用于存儲當前KEYNUMT1的值,以和下次做比較,看是否有變化
- STOREKEYNUMT1 EQU 6CH ;用于存儲當前KEYNUMT2的值,以和下次做比較,看是否有變化
- ORG 0000H
- AJMP START
- ORG 000BH
- MOV TH0 , #0BH ;設置計數初值 ,R4用來存儲低位的初值
- MOV TL0 , R4
- AJMP INTERT0
- ORG 001BH
- AJMP INTERT1
- ORG 0040H
- START: MOV NUMT1 , #00H
- MOV NUMT2 , #00H
- MOV KEYNUMT1 , #00H
- MOV KEYNUMT2 , #00H
- MOV STOREKEYNUMT2 , #00H
- MOV STOREKEYNUMT1 , #00H
- MOV NUM , #8
- MOV DPTR , #TAB
- MOV ALARMHBUFF , #18H ;置鬧鈴時間初始值為18:55
- MOV ALARMMBUFF , #55H
- MOV ALARMHBUFF2, #01H
- MOV ALARMHBUFF1, #08H
- MOV ALARMMBUFF2 , #05H
- MOV ALARMMBUFF1 , #05H
- MOV HBUFF2, #01H ;置鬧鐘時間為18:53
- MOV HBUFF1, #08H
- MOV MBUFF2 , #05H
- MOV MBUFF1 , #03H
- MOV HBUFF , #18H
- MOV MBUFF , #53H
- MOV SBUFF , #3CH ;置初始秒為60,計時時減
- MOV TCON , #05H ;下降沿觸發
- MOV TMOD , #11H ;初始化定時器,T0 ,T1 16位計時
- MOV TH0 , #0BH ;設置計數初值,125ms計時
- MOV TL0 , #0DBH
- MOV TH1 , #3CH ;T1置初值,進行100ms計時,用于調整時間
- MOV TL1 , #0B0H
- MOV IE , #82H ;開T0中斷
- SETB PT0 ;T0中斷優先級最高
- SETB TR0 ;允許T0計數
- SETB P3.2
- SETB P3.3
- START1: MOV A , HBUFF ; 顯示時,7點以前及21點以后亮度調暗
- SUBB A , #7H
- JC START2
- MOV A , HBUFF
- SUBB A , #21H
- JNC START2
- ACALL DISPLAY
- ACALL ZDBS
- AJMP START3
- START2: ACALL NIGHTDISPLAY
- START3: MOV A ,ALARMHBUFF ;檢測是否是定鬧時間
- CJNE A , HBUFF , START4
- MOV A , ALARMMBUFF
- CJNE A , MBUFF ,START4
- MOV C, DP ;若是定鬧時間,則利用dp的值來決定蜂鳴
- MOV P3.2, C
- MOV A , SBUFF
- JNZ START1 ;若還沒到1分鐘,則繼續蜂鳴
- SETB P3.2
- START4: JNB P3.2,ADJUSTTIME1 ;循環等待中斷,并檢測是否鍵按下,若是,則進入相應程序
- JNB P3.3,ADJUSTTIME2
- AJMP START1
- AJMP START1
-
- ;****************
- ;*int0中斷子程序*
- ;****************
-
- ADJUSTTIME1:NOP
- MOV KEYNUMT1 ,#00H
- MOV TH1 , #3CH ;T1置初值,進行100ms計時,用于調整時間
- MOV TL1 , #0B0H
- SETB ET1 ;開T1中斷
- SETB PT1 ;設T1中斷優先級最高
- SETB TR1 ;允許T1計時
- MOV STOREKEYNUMT1 , KEYNUMT1 ;存儲當前次KEYNUMT1的值
- TIME1_1:ACALL DISPLAY
- MOV A , KEYNUMT1
- CJNE A , STOREKEYNUMT1,TIME1_2 ;若當前KEYNUMT1的值與上一次的值不等,則時間加1分,否則繼續循環,等等至半分鐘
- AJMP TIME1_3
- TIME1_2:MOV STOREKEYNUMT1 , KEYNUMT1 ;加1后存儲當前的KEYNUMT1的值
- ACALL ADDBUFF0 ;分加1
- TIME1_3:JNB P3.2,TIME1_1 ;若p3.2已關,則退出增時,否則繼續循環
- CLR ET1
- CLR PT1
- CLR TR1
- AJMP START1
-
- ;********************
- ;*****時間增1分******
- ;********************
-
- ADDBUFF0:MOV A , MBUFF ; 若按鍵小于1s,則分增1
- ADD A , #1
- DA A
- MOV MBUFF , A
- ANL A , #0FH
- MOV MBUFF1 , A
- MOV A , MBUFF
- SWAP A
- ANL A , #0FH
- MOV MBUFF2 , A
- MOV A , MBUFF
- CJNE A , #60H , ADDBUFF1
- MOV MBUFF , #00H
- MOV MBUFF2 , #00H
- MOV MBUFF1 , #00H
- MOV A , HBUFF ;時增1
- ADD A , #1
- DA A
- MOV HBUFF , A
- ANL A , #0FH
- MOV HBUFF1 , A
- MOV A , HBUFF
- SWAP A
- ANL A , #0FH
- MOV HBUFF2 , A
- MOV A , HBUFF
- CJNE A , #24H , ADDBUFF1 ;若沒到24小時,則不必初值置0
- MOV HBUFF , #00H
- MOV HBUFF2 , #00H
- MOV HBUFF1 , #00H
- ADDBUFF1:RET
-
- ;*********************************
- ;*int1中斷子程序******************
- ;*********************************
-
- ADJUSTTIME2: NOP
- ACALL DL100MS
- MOV C , P3.3
- JC TIME2_6 ;如果(P3.3按鍵<100ms以上) 則不做處理
- MOV KEYNUMT2 , #00H ;否則進入定鬧設置
- MOV STOREKEYNUMT2 , KEYNUMT2 ;記錄當前NUMT2的數據,以看下次有沒改變
- TIME2_1:NOP
- MOV TH1 , #3CH ;T1置初值,進行100ms計時,用于調整時間
- MOV TL1 , #0B0H
- SETB ET1 ;開T1中斷
- SETB PT1 ;設T1中斷優先級最高
- SETB TR1 ;允許T1計時
- TIME2_2:ACALL ALARMDISPLAY
- MOV A , KEYNUMT2
- CJNE A , STOREKEYNUMT2 ,TIME2_3
- AJMP TIME2_4
- TIME2_3: MOV STOREKEYNUMT2 , KEYNUMT2
- MOV A , ALARMMBUFF ; 若按鍵小于1s,則分增1
- ADD A , #1
- DA A
- MOV ALARMMBUFF , A
- ANL A , #0FH
- MOV ALARMMBUFF1 , A
- MOV A , ALARMMBUFF
- SWAP A
- ANL A , #0FH
- MOV ALARMMBUFF2 , A
- MOV A , ALARMMBUFF
- CJNE A , #60H , TIME2_4
- MOV ALARMMBUFF , #00H
- MOV ALARMMBUFF2 , #00H
- MOV ALARMMBUFF1 , #00H
- MOV A , ALARMHBUFF ;時增1
- ADD A , #1
- DA A
- MOV ALARMHBUFF , A
- ANL A , #0FH
- MOV ALARMHBUFF1 , A
- MOV A , ALARMHBUFF
- SWAP A
- ANL A , #0FH
- MOV ALARMHBUFF2 , A
- MOV A , ALARMHBUFF
- CJNE A , #24H , TIME2_4 ;若沒到24小時,則初值不必置0
- MOV ALARMHBUFF , #00H
- MOV ALARMHBUFF2 , #00H
- MOV ALARMHBUFF1 , #00H
- TIME2_4:NOP
- JNB P3.3,TIME2_2 ;若按鍵已經未按,則退出循環
- CLR ET1
- CLR TR1
- MOV KEYNUMT2 , #00H
- MOV NUMT2 , #00H
- MOV R2 , #10 ; 直到p3.3 20s鐘內都是未按,此時復原數據,即退出設置
- TIME2_7:MOV R1 , #200
- TIME2_5:ACALL ALARMDISPLAY
- ACALL DL1MS
- JNB P3.3 , TIME2_1
- DJNZ R1 , TIME2_5
- DJNZ R2 , TIME2_7
- TIME2_6:CLR ET1
- CLR PT1
- CLR TR1
- LJMP START1
- ;***********************************
- ;**T1中斷子程序*********************
- ;***********************************
-
- INTERT1:NOP
- MOV TH1 , #3CH ;T1置初值,進行100ms計時,用于調整時間
- MOV TL1 , #0B0H
- PUSH ACC
- PUSH PSW
- CLR ET0
- CLR ET1 ;關T1中斷
- MOV A , NUMT1
- INC A
- MOV NUMT1 , A ;中斷一次則相應的增加NUMT1
- CJNE A , #5 , INTERT1NEXT ;每中斷五次,即半秒,都增加KEYNUMT1
- MOV A ,KEYNUMT1
- INC A
- MOV KEYNUMT1 , A
- MOV NUMT1 , #00H ;NUMT1已經是5了,則處理過KEYNUMT1后,重置NUMT1
- INTERT1NEXT:NOP
- MOV A , NUMT2 ;中斷一次則相應的增加NUMT1
- INC A
- MOV NUMT2 , A
- CJNE A, #5,ENDINTERT1 ;每中斷五次,即半秒,都增加KEYNUMT1
- MOV A , KEYNUMT2
- INC A
- MOV KEYNUMT2 , A
- MOV NUMT2 , #00H ;NUMT1已經是5了,則處理過KEYNUMT1后,重置NUMT1
- ENDINTERT1: SETB ET1
- SETB ET0
- POP ACC
- POP PSW
- RETI
-
-
-
-
- ;**************
- ;** 整點報時 **
- ;**************
- ZDBS: MOV A , MBUFF ;在整點時,響半秒
- JNZ ZDBSEND
- MOV A , SBUFF
- CJNE A , #3CH , ZDBSEND
- CLR P3.2
- ACALL DL0FIVE
- SETB P3.2
- ZDBSEND:RET
-
- ;**************
- ;**定鬧顯示子程序**
- ;**************
- ALARMDISPLAY: MOV P1 ,#0FFH ;使時的十位亮
- MOV A , ALARMHBUFF2
- MOVC A , @A+DPTR
- SETB ACC.7
- MOV P1 , A
- CLR P3.0
- ACALL DL1MS
- SETB P3.0
- MOV A , ALARMHBUFF1 ;使時的個位亮
- MOVC A , @A+DPTR
- MOV C , DP
- MOV ACC.7 , C
- MOV P1 , A
- CLR P3.1
- ACALL DL1MS
- SETB P3.1
- MOV A ,ALARMMBUFF2 ;使分的十位亮
- MOVC A , @A+DPTR
- MOV C , DP
- MOV ACC.7 , C
- MOV P1 , A
- CLR P3.4
- ACALL DL1MS
- SETB P3.4
- MOV A , ALARMMBUFF1 ;使時的個位亮
- MOVC A , @A+DPTR
- SETB ACC.7
- MOV P1,A
- CLR P3.5
- ACALL DL1MS
- SETB P3.5
- RET
-
- ;********************************
- ;**晚上顯示子程序****************
- ;******************************** ;降低顯示的占空比,數碼管進入節能
- NIGHTDISPLAY: NOP
- MOV P1 ,#0FFH
- MOV A , HBUFF2
- MOVC A , @A+DPTR
- SETB ACC.7
- MOV P1 , A
- CLR P3.0
- ACALL DL1MS ;亮1ms
- SETB P3.0
- ACALL DL1MS
- ACALL DL1MS ;暗2ms
- MOV A , HBUFF1
- MOVC A , @A+DPTR
- MOV C , DP
- MOV ACC.7 , C
- MOV P1 , A
- CLR P3.1
- ACALL DL1MS
- SETB P3.1
- ACALL DL1MS
- ACALL DL1MS
- MOV A ,MBUFF2
- MOVC A , @A+DPTR
- MOV C , DP
- MOV ACC.7 , C
- MOV P1 , A
- CLR P3.4
- ACALL DL1MS
- SETB P3.4
- ACALL DL1MS
- ACALL DL1MS
- MOV A , MBUFF1
- MOVC A , @A+DPTR
- SETB ACC.7
- MOV P1,A
- CLR P3.5
- ACALL DL1MS
- SETB P3.5
- ACALL DL1MS
- ACALL DL1MS
- RET
-
- ;**************
- ;**顯示子程序**
- ;**************
- DISPLAY: MOV P1 ,#0FFH
- MOV A , HBUFF2
- MOVC A , @A+DPTR
- SETB ACC.7
- MOV P1 , A
- CLR P3.0
- ACALL DL1MS
- SETB P3.0
-
- MOV A , HBUFF1
- MOVC A , @A+DPTR
- MOV C , DP
- MOV ACC.7 , C
- MOV P1 , A
- CLR P3.1
- ACALL DL1MS
- SETB P3.1
-
- MOV A ,MBUFF2
- MOVC A , @A+DPTR
- MOV C , DP
- MOV ACC.7 , C
- MOV P1 , A
- CLR P3.4
- ACALL DL1MS
- SETB P3.4
- MOV A , MBUFF1
- MOVC A , @A+DPTR
- SETB ACC.7
- MOV P1,A
- CLR P3.5
- ACALL DL1MS
- SETB P3.5
- RET
-
- TAB: DB 88H,0BBH,94H,91H,0A3H ; 0 1 2 3 4
- DB 0C1H,0C0H,9BH,80H,81H ; 5 6 7 8 9
-
- ;**************
- ;***延時程序***
- ;**************
-
- DL1MS: MOV R6 , #20 ;延時1ms
- DL11: MOV R7 , #25
- DL12: DJNZ R7 , DL12
- DJNZ R6 , DL11
- RET
-
- DL100MS:MOV R6 , #200 ;延時100ms
- DL100MS1:MOV R7 , #250
- DL100MS2:DJNZ R7 , DL100MS2
- DJNZ R6 , DL100MS1
- RET
-
- DL11S: MOV R5 , #10
- DL1S0: MOV R6 , #200 ;延時1s 10*250*200
- DL1S1: MOV R7 , #250
- DL1S2: DJNZ R7 , DL1S2
- DJNZ R6 , DL1S1
- DJNZ R5 , DL1S0
- RET
-
- DL0FIVE:MOV R5 , #5
- DL0: MOV R6 , #100 ;延時0.5s
- DL1: MOV R7 , #250
- DL2: DJNZ R7 , DL2
- DJNZ R6 , DL1
- DJNZ R5 , DL0
- RET
-
- ;**************
- ;*T0中斷子程序*
- ;**************
- INTERT0:PUSH ACC
- PUSH PSW
- CLR ET0 ;關T0中斷
- MOV A , SBUFF
- CJNE A ,#028H, SET1
- MOV R4 , #0DCH ;后四十秒的初值
- SET1: DJNZ NUM , ENDINTT0 ;若還沒到1s,則退出該次中斷
- MOV NUM , #8 ;設置NUM初值
- CPL DP
- DJNZ SBUFF , ENDINTT0 ; 若還沒到60s,則退出該次中斷
- MOV SBUFF , #03CH
- MOV R4 , #0DBH ;前20秒的初值
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
完整論文下載地址(word格式 可編輯):
http://www.zg4o1577.cn/bbs/dpj-86574-1.html
|
|