久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 42619|回復: 0
收起左側

基于單片機的數字鐘設計

[復制鏈接]
ID:111475 發表于 2016-3-30 21:47 | 顯示全部樓層 |閱讀模式
The design of digital clock based on signal-chip computer


摘    要

基于單片機的定時和控制裝置在許多行業有著廣泛的應用,而數字鐘是其中最基本的,也是最具有代表性的一個例子。

在基于單片機系統的數字鐘電路中,除了基本的單片機系統和外圍電路外,還需要外部的控制和顯示裝置。本電路主要以單片機AT89S52為核心而設計的,通過單片機對信息的分析與處理,控制外圍設備。系統由復位模塊、時鐘模塊、溫度模塊、音樂模塊、光識模塊及顯示模塊共六個模塊組成,后來在時鐘模塊的基礎上又加載了日歷、星期的模塊。

本設計以單片機AT89S52為切入點,通過使用AT89S52的內部的可編程定時器/計數器,結合對外接晶振的調節來確定一個合適的振蕩周期,從而確定出內部的機器周期。再通過對內部中斷程序的設置來設計出時鐘程序,即設計出了電子時鐘的核心。然后在核心電路的基礎上設計出了相應的擴展電路,使本設計更加實用。

 

關鍵詞:單片機;數碼顯示;溫度傳感器


 

ABSTRACT

The timer equipment using micro controller unit is applied in many trades, the digital clock is the most fundamental example among them, and it is also a most typical example.

In digital clock circuit based micro controller unit system, there are the external controlling and display device besides the fundamental monolithic machine system and the outer-ring circuit. The key of the circuit in this design is AT89S52, using the micro control system to process information to control the outer-ring circuit. The system is made up of circuit, clock circuit, music circuit, temperature circuit, and shine circuit. Date and week modul is the external part.

This design focuses on monolithic integrated circuit AT89S52. Using AT89S52, which has the interior programmable timer/counter, the union foreign meets the crystal oscillator the adjustment to determine an appropriate duration of oscillation, thus determines theinterior the cycle of the system. And designing the internal interrupt procedure establishment to design the clock procedure, namely designed the core of electronic clock. Then design the expanded electric circuit to let this design more practical.

 

Key Words:Micro control unit; LED shows; Sensor of temperature


目    錄

1. 引言      1

2. 關于單片機      2

2.1單片機的發展      2

2.2 單片機的開發背景      4

2.2 單片機的開發背景      5

2.3 AT89S52單片機      6

2.3.1 AT89S52單片機引腳功能      7

2.3.2 AT89S52單片機硬件結構的特點      8

2.3.3 AT89S52單片機的硬件原理      10

3. 方案設計與論證      12

4. 系統總體結構框圖      13

5. 系統的硬件設計      14

5.1 顯示部分電路的設計      14

5.1.1 LED數碼顯示管的基本原理      14

5.1.2 數碼管顯示模塊分析      14

5.1.3 LED顯示電路      15

5.2 控制部分電路的設計      15

5.2.1 時鐘模塊      15

5.2.2 溫度模塊      16

5.2.3 音樂模塊      16

5.2.4 復位模塊      16

5.2.5 光識模塊      17

6. 系統的軟件設計      18

6.1 各模塊的程序設計      18

6.1.1 計時程序      18

6.1.2 定時鬧鐘程序      18

6.1.3 溫度程序      18

6.2 系統程序設計的總體框圖      19

7. 系統電路的制作與調試      20

7.1 電路硬件焊接制作      20

7.2 調試的主要方法      20

7.3 系統調試      20

7.3.1 硬件調試      20

7.3.2 軟件調試      20

7.3.3 聯機調試      21

7.3.4調試中遇到的問題及解決方法      21

結論      23

參考文獻      24

附錄1  數字鐘電路圖      26

附錄2  程序清單      27

附錄3  英文資料      59

附錄4  英文資料翻譯      69

致謝      77

1. 引言

20世紀末,電子技術獲得了飛速的發展,在其推動下,現代電子產品幾乎滲透了社會的各個領域,有力地推動了社會生產力的發展和社會信息化程度的提高,同時也使現代電子產品性能進一步提高,產品更新換代的節奏也越來越快。
  時間對人們來說總是那么寶貴,工作的忙碌性和繁雜性容易使人忘記當前的時間。忘記了要做的事情,當事情不是很重要的時候,這種遺忘無傷大雅。但是,一旦重要事情,一時的耽誤可能釀成大禍。例如,許多火災都是由于人們一時忘記了關閉煤氣或是忘記充電時間。尤其在醫院,每次護士都會給病人作皮試,測試病人是否對藥物過敏。注射后,一般等待5分鐘,一旦超時,所作的皮試試驗就會無效。手表當然是一個好的選擇,但是,隨著接受皮試的人數增加,到底是哪個人的皮試到時間卻難以判斷。所以,要制作一個定時系統。隨時提醒這些容易忘記時間的人。
  鐘表的數字化給人們生產生活帶來了極大的方便,而且大大地擴展了鐘表原先的報時功能。諸如定時自動報警、按時自動打鈴、時間程序自動控制、定時廣播、定時啟閉電路、定時開關烘箱、通斷動力設備,甚至各種定時電氣的自動啟用等,所有這些,都是以鐘表數字化為基礎的。因此,研究數字鐘及擴大其應用,有著非常現實的意義。

基于單片機的定時和控制裝置在許多行業有著廣泛的應用,數字鐘作為其中最基本的一個應用實例,具有結構簡單應用廣泛的特點。數字鐘中使用了單片機中最為常用的輸入輸出設備按鍵開關和數碼管;數字鐘程序主要應用單片機的定時器和中斷實現計時和顯示功能。當今數字種作為一個單元電路被廣泛應用于電子表、電子萬年歷等產品中,帶來廣泛的經濟效益。

   目前的單片機產品普遍要求體積小、重量輕,這就要求單片機除了功能強和功耗低外,還要求其體積要小。現在雖然單片機的品種繁多,各具特色,但仍以80C51為核心的單片機占主流,兼容其結構和指令系統的有PHILIPS公司的產品,ATMEL公司的產品和Winbond系列單片機。所以C8051為核心的單片機占據了半壁江山。而Microchip公司的PIC精簡指令集(RISC)也有著強勁的發展勢頭,HOLTEK公司近年的單片機產量與日俱增,與其低價質優的優勢,占據一定的市場分額。此外還有MOTOROLA公司的產品,日本幾大公司的專用單片機。在一定的時期內,這種情形將得以延續,將不存在某個單片機一統天下的壟斷局面,走的是依存互補,相輔相成、共同發展的道路。單片機的可靠性及應用水平越來越高和互聯網連接已是一種明顯的走向。單片機從功能上講可以說是萬用機。目前,單片機正朝著高性能和多品種方向發展,趨勢將是進一步向著CMOS化、低功耗、小體積、大容量、高性能、低價格和外圍電路內裝化等幾個方面發展。當今,單片機廣泛地用于各種儀器儀表,使儀器儀表智能化,并可以提高測量的自動化程度和精度,簡化儀器儀表的硬件結構,提高其性能價格比。單片機也廣泛地用于各種實時控制系統中。例如,在工業測控、航空航天、尖端武器、機器人等各種實時控制系統中,都可以用單片機作為控制器。單片機的實時數據處理能力和控制功能,可使系統保持在最佳工作狀態,提高系統的工作效率和產品質量。自從單片機誕生以后,它就步入了人類生活,如洗衣機、電冰箱、電子玩具、收錄機等家用電器配上單片機后,提高了智能化程度,增加了功能,倍受人們喜愛。單片機將使人類生活更加方便、舒適、豐富多彩。單片機已成為計算機發展和應用的一個重要方面。單片機應用的重要意義還在于,它從根本上改變了傳統的控制系統設計思想和設計方法。從前必須由模擬電路或數字電路實現的大部分功能,現在已能用單片機通過軟件方法來實現了。這種軟件代替硬件的控制技術也稱為微控制技術,是傳統控制技術的一次革命。隨著半導體工藝技術的發展及系統設計水平的提高,單片機還會不斷產生新的變化和進步。在不久的將來,最終單片機與微機系統之間的距離越來越小,甚至難以辨認。

 
 


 

2.關于單片機

2.1單片機的發展

單片機自問世以來,性能不斷提高和完善,其資源又能滿足很多應用場合的需要,加之單片機具有集成度高、功能強、速度快、體積小、功耗低、使用方便、價格低廉等特點,因此,在工業控制、智能儀器儀表、數據采集和處理、通信系統、高級計算器、家用電器等領域的應用日益廣泛,并且正在逐步取代現有的多片微機應用系統。單片機的潛力越來越被人們所重視。特別是當前用CMOS工藝制成的各種單片機,由于功耗低,使用的溫度范圍大,抗干擾能力強、能滿足一些特殊要求的應用場合,更加擴大了單片機的應用范圍,也進一步促使單片機性能的發展。而現在單片機在液晶顯示上也有了很多的應用。

隨著科技不斷進步,各種顯示技術如雨后春筍般誕生,由于液晶顯示器(LCD)具有輕薄短小、低耗電量、無輻射危險,平面直角顯示以及影像穩定不閃爍等優勢,在近年來價格不斷下跌的吸引下,逐漸取代CRT之主流地位,顯示器明日之星架勢十足。液晶顯示器件從初期的實驗室到現在的生產廠家,已形成較大規模的生產能力,使液晶顯示形成了獨立的產業部門。而今,液晶顯示已經應用于人們生產、生活中的各個領域,人們時時處處都要與這一神奇而又普通的產品打交道。液晶顯示技術以它跨越多學科的工作原理,高技術、專業化的制造工藝使它披上了一層神秘的面紗,而它輕巧薄形的體態,獨特而理想的性能以及廣泛的應用價值,又使它充滿魅力,深深地吸引著人們。

在單片機技術日趨成熟的今天,其靈活的硬件電路的設計和軟件的設計,讓單片機得到了廣泛的應用,幾乎是從小的電子產品,到大的工業控制,單片機都起到了舉足輕重的作用。單片機小的系統結構幾乎是所有具有可編程硬件的一個縮影,可謂是“麻雀雖小,肝膽俱全”,單片機的學習和研究是對微機系統學習和研究的簡捷途徑。

在目前,用戶對單片機的需要越來越多,但是,要求也越來越高,因此,單片機也在不斷的發展和進步。單片機的技術進步主要反映在內部結構、功率消耗、外部電壓等級以及制造工藝上。在這幾方面,較為典型地說明了數字單片機的水平。下面分別就這三個方面說明單片機的技術進步狀況。

(1)內部結構的進步

單片機在內部已集成了越來越多的部件,這些部件包括一般常用的電路,例如:定時器,比較器,A/轉換器,D /A轉換器,串行通信接口,Watchdog電路,LCD控制器等。
  有的單片機為了構成控制網絡或形成局部網,內部含有局部網絡控制模塊CAN。例如,Infineon公司的C 505C,C515C,C167CR,C167CS-32FM,81C90;Motorola公司的68HC08AZ 系列等。特別是在單片機C167CS-32FM中,內部還含有2個CAN。因此,這類單片機十分容易構成網絡。特別是在控制,系統較為復雜時,構成一個控制網絡十分有用。
  為了能在變頻控制中方便使用單片機,形成最具經濟效益的嵌入式控制系統。有的單片機內部設置了專門用于變頻控制的脈寬調制控制電路,這些單片機有Fujitsu公司的MB89850系列、MB89860系列;Motorola 公司的MC68HC08MR16、MR24等。在這些單片機中,脈寬調制電路有6個通道輸出,可產生三相脈寬調制交流電壓,并內部含死區控制等功能。

(2)功耗、封裝及電源電壓的進步
  現在新的單片機的功耗越來越小,特別是很多單片機都設置了多種工作方式,這些工作方式包括等待,暫停,睡眠,空閑,節電等工作方式。Philips公司的單片機P87LPC762是一個很典型的例子,在空閑時,其功耗為1.5 mA,而在節電方式中,其功耗只有0.5mA。而在功耗上最令人驚嘆的是TI公司的單片機MSP430系列,它是一個 16位的系列,有超低功耗工作方式。它的低功耗方式有LPM1、LPM3、LPM4三種。當電源為3V時,如果工作于 LMP1方式,即使外圍電路處于活動,由于CPU不活動,振蕩器處于1~4MHz,這時功耗只有50?A。在LPM3 時,振蕩器處于32kHz,這時功耗只有1.3?A。在LPM4時,CPU、外圍及振蕩器32kHz都不活動,則功耗只有0.1?A。
  現在單片機的封裝水平已大大提高,隨著貼片工藝的出現,單片機也大量采用了各種合符貼片工藝的封裝方式出現,以大量減少體積。在這種形勢中,Microchip公司推出的8引腳的單片機特別引人注目。這是PIC12CXXX系列。它含有0.5~2K程序存儲器,25~128字節數據存儲器,6個I/O端口以及一個定時器,有的還含4道A/D ,完全可以滿足一些低檔系統的應用。擴大電源電壓范圍以及在較低電壓下仍然能工作是今天單片機發展的目標之一。目前,一般單片機都可以在3.3~5.5V的條件下工作。而一些廠家,則生產出可以在2.2~6V的條件下工作的單片機。這些單片機有Fujitsu公司的MB89191~89195,MB89121~125A,MB89130系列等,應該說該公司的F2MC-8L系列單片機絕大多數都滿足2.2~6V的工作電壓條件。而TI公司的MSP430X11X系列的工作電壓也是低達2.2V的。

(3)工藝上的進步
  現在的單片機基本上采用CMOS技術,但已經大多數采用了0.6?m以上的光刻工藝,有個別的公司,如Motorola公司則已采用0.35?m甚至是0.25?m技術。這些技術的進步大大地提高了單片機的內部密度和可靠性。
單片機在目前的發展形勢下,可靠性及應用越來越高的水平和互聯網連接已是一種明顯的走向。所集成的部件越來越多;NS(美國國家半導體)公司的單片機已把語音、圖象部件也集成到單片機中,也就是說,單片機的意義只是在于單片集成電路,而不在于其功能了;如果從功能上講它可以講是萬用機。原因是其內部已集成上各種應用電路。 功耗越來越低和模擬電路結合越來越多也將會成為單片機的一個發展的方向。隨著半導體工藝技術的發展及系統設計水平的提高,單片機還會不斷產生新的變化和進步,最終人們可能發現:單片機與微機系統之間的距離越來越小,甚至難以辨認。

2.2 單片機的開發背景

現代工業控制和一些智能化儀器儀表中,越來越多的場所需要用點陣圖形顯示器顯示漢字。液晶顯示器是人與機器溝通的重要界面,而且液晶顯示器也有如下特點,開發出來會有很大的應用空間。液晶顯示器目前發展最快,也已經成為電子信息產業的支柱性產業之一,受到普遍關注與重視。那么液晶顯示器與傳統的顯示器相比,到底有什么新的特點呢?

⑴ 質量高 由于液晶顯示器每一個點在收到信號后就一直保持那種色彩和亮度,恒定發光,而不像陰極射線管顯示器(CRT)那樣需要不斷刷新亮點。因此,液晶顯示器畫質高而且絕對不會閃爍,把眼睛疲勞降到最低。

⑵ 沒有電磁輻射 傳統顯示器的顯示材料是熒光粉,通過電子束撞擊熒光粉而顯示,電子束在打到熒光粉上的一剎那間會產生強大的電磁輻射,盡管目前有許多顯示器產品在處理輻射問題上進行了比較有效的處理,盡可能地把輻射量降到最低,但要徹底消除是困難的。相對來說,液晶顯示器在防止輻射方面具有先天的優勢,因為它根本就不存在輻射。

⑶ 可視面積大 對于相同尺寸的顯示器來說,液晶顯示器的可視面積要更大一些。液晶顯示器的可視面積跟它的對角線尺寸相同。陰極射線管顯示器顯像管前面板四周有一英寸左右的邊框不能用于顯示。

⑷ 應用范圍廣 最初的液晶顯示器由于無法顯示細膩的字符,通常應用在電子表、計算器上。而隨后出現的DSTN和TFT則被廣泛制作成電腦中的液晶顯示設備,DSTN液晶顯示屏用于早期的筆記本電腦;TFT則既應用在筆記本電腦上(現在大多數筆記本電腦都使用TFT顯示屏),又用于主流臺式顯示器上。

⑸ 畫面效果好 與傳統顯示器相比,液晶顯示器一開始就使用純平面的玻璃板,其顯示效果是平面直角的,讓人有一種耳目一新的感覺。而且液晶顯示器更容易在小面積屏幕上實現高分辨率。

⑹ 數字式接口 液晶顯示器都是數字式的,不像陰極射線管彩顯采用模擬接口。也就是說,使用液晶顯示器,顯卡再也不需要像往常那樣把數字信號轉化成模擬信號再行輸出了。理論上,這會使色彩和定位都更加準確完美。

⑺ 體積小 傳統的陰極射線管顯示器,后面總是拖著一個笨重的射線管。液晶顯示器突破了這一限制,給人一種全新的感覺。傳統顯示器是通過電子槍發射電子束到屏幕,因而顯像管的管頸不能做得很短,當屏幕增加時也必然增大整個顯示器的體積。而液晶顯示器通過顯示屏上的電極控制液晶分子狀態來達到顯示目的,即使屏幕加大,它的體積也不會成正比的增加,而且在重量上比相同顯示面積的傳統顯示器要輕得多。

⑻ 功率消耗小 傳統的顯示器內部由許多電路組成,這些電路驅動著陰極射線顯像管工作時,需要消耗很大的功率,而且隨著體積的不斷增大,其內部電路消耗的功率肯定也會隨之增大。相比而言,液晶顯示器的功耗主要消耗在其內部的電極和驅動IC上,因而耗電量比傳統顯示器也要小得多。

2.2 單片機的開發背景

現代工業控制和一些智能化儀器儀表中,越來越多的場所需要用點陣圖形顯示器顯示漢字。液晶顯示器是人與機器溝通的重要界面,而且液晶顯示器也有如下特點,開發出來會有很大的應用空間。液晶顯示器目前發展最快,也已經成為電子信息產業的支柱性產業之一,受到普遍關注與重視。那么液晶顯示器與傳統的顯示器相比,到底有什么新的特點呢?

⑴ 質量高 由于液晶顯示器每一個點在收到信號后就一直保持那種色彩和亮度,恒定發光,而不像陰極射線管顯示器(CRT)那樣需要不斷刷新亮點。因此,液晶顯示器畫質高而且絕對不會閃爍,把眼睛疲勞降到最低。

⑵ 沒有電磁輻射 傳統顯示器的顯示材料是熒光粉,通過電子束撞擊熒光粉而顯示,電子束在打到熒光粉上的一剎那間會產生強大的電磁輻射,盡管目前有許多顯示器產品在處理輻射問題上進行了比較有效的處理,盡可能地把輻射量降到最低,但要徹底消除是困難的。相對來說,液晶顯示器在防止輻射方面具有先天的優勢,因為它根本就不存在輻射。

⑶ 可視面積大 對于相同尺寸的顯示器來說,液晶顯示器的可視面積要更大一些。液晶顯示器的可視面積跟它的對角線尺寸相同。陰極射線管顯示器顯像管前面板四周有一英寸左右的邊框不能用于顯示。

⑷ 應用范圍廣 最初的液晶顯示器由于無法顯示細膩的字符,通常應用在電子表、計算器上。而隨后出現的DSTN和TFT則被廣泛制作成電腦中的液晶顯示設備,DSTN液晶顯示屏用于早期的筆記本電腦;TFT則既應用在筆記本電腦上(現在大多數筆記本電腦都使用TFT顯示屏),又用于主流臺式顯示器上。

⑸ 畫面效果好 與傳統顯示器相比,液晶顯示器一開始就使用純平面的玻璃板,其顯示效果是平面直角的,讓人有一種耳目一新的感覺。而且液晶顯示器更容易在小面積屏幕上實現高分辨率。

⑹ 數字式接口 液晶顯示器都是數字式的,不像陰極射線管彩顯采用模擬接口。也就是說,使用液晶顯示器,顯卡再也不需要像往常那樣把數字信號轉化成模擬信號再行輸出了。理論上,這會使色彩和定位都更加準確完美。

⑺ 體積小 傳統的陰極射線管顯示器,后面總是拖著一個笨重的射線管。液晶顯示器突破了這一限制,給人一種全新的感覺。傳統顯示器是通過電子槍發射電子束到屏幕,因而顯像管的管頸不能做得很短,當屏幕增加時也必然增大整個顯示器的體積。而液晶顯示器通過顯示屏上的電極控制液晶分子狀態來達到顯示目的,即使屏幕加大,它的體積也不會成正比的增加,而且在重量上比相同顯示面積的傳統顯示器要輕得多。

⑻ 功率消耗小 傳統的顯示器內部由許多電路組成,這些電路驅動著陰極射線顯像管工作時,需要消耗很大的功率,而且隨著體積的不斷增大,其內部電路消耗的功率肯定也會隨之增大。相比而言,液晶顯示器的功耗主要消耗在其內部的電極和驅動IC上,因而耗電量比傳統顯示器也要小得多。

2.3 AT89S52單片機

AT89S52 是一種低功耗、高性能CMOS8 位微控制器,具有8K 在系統可編程存儲器。使用Atmel 公司高密度非易失性存儲器技術制造,與工業80C51產品指令和引腳完全兼容。片上Flash 允許程序存儲器在系統可編程,亦適于常規編程器。在單芯片上,擁有靈巧的8 位CPU 和在系統可編程Flash ,使得AT89S52 為眾多嵌入式控制應用系統提供高靈活、超有效的解決方案。AT89S52 具有以下標準功能:8k 字節Flash,256 字節RAM,32 位I/O 口線,看門狗定時器,2 個數據指針,三個16 位定時器/計數器,一個6 向量2 級中斷結構,全雙工串行口,片內晶振及時鐘電路。另外,AT89S52 可降至0Hz 靜態邏輯操作,支持2 種軟件可選擇節電模式。空閑模式下,CPU停止工作,允許RAM 、定時器/計數器、串口、中斷繼續工作。掉電保護方式下,RAM 內容被保存,振蕩器被凍結,單片機一切工作停止,直到下一個中斷或硬件復位為止。

圖2-1AT89S52的引腳

2.3.1 AT89S52單片機引腳功能

P0 口:P0 口是一個8 位漏極開路的雙向I/O 口。作為輸出口,每位能驅動8 個TTL 邏輯電平。對P0 端口寫“1”時,引腳用作高阻抗輸入。當訪問外部程序和數據存儲器時,P0 口也被作為低8 位地址/數據復用。在這種模式下,P0 具有內部上拉電阻。

P1 口:P1 口是一個具有內部上拉電阻的8 位雙向I/O 口,P1 輸出緩沖器能驅動4 個TTL 邏輯電平。對P1 端口寫“1”時,內部上拉電阻把端口拉高,此時可以作為輸入口使用。作為輸入使用時,被外部拉低的引腳由于內部電阻的原因,將輸出電流(IIL)。此外,P1.0 和P1.2 分別作定時器/計數器2 的外部計數輸入(P1.0/T2)和時器/計數器2的觸發輸入(P1.1/T2EX),具體如下表所示。在flash 編程和校驗時,P1 口接收低8 位地址字節。

P2 口:P2 口是一個具有內部上拉電阻的8 位雙向I/O 口,P2 輸出緩沖器能驅動4 個TTL 邏輯電平。對P2 端口寫“1”時,內部上拉電阻把端口拉高,此時可以作為輸入口使用。作為輸入使用時,被外部拉低的引腳由于內部電阻的原因,將輸出電流(IIL)。在訪問外部程序存儲器或用16 位地址讀取外部數據存儲器(例如執行MOVX @DPTR)時,P2 口送出高八位地址。在這種應用中,P2 口使用很強的內部上拉發送1。在使用8 位地址(如MOVX @RI )訪問外部數據存儲器時,P2 口輸出P2 鎖存器的內容。

P3 口:P3 口是一個具有內部上拉電阻的8 位雙向I/O 口,p2 輸出緩沖器能驅動4 個TTL 邏輯電平。對P3 端口寫“1”時,內部上拉電阻把端口拉高,此時可以作為輸入口使用。作為輸入使用時,被外部拉低的引腳由于內部電阻的原因,將輸出電流(IIL)。

RST: 復位輸入。晶振工作時,RST 腳持續2 個機器周期高電平將使單片機復位。看門狗計時完成后,RST 腳輸出96 個晶振周期的高電平。特殊寄存器AUXR( 地址8EH) 上的DISRTO 位可以使此功能無效。DISRTO 默認狀態下,復位高電平有效。

ALE/PROG:地址鎖存控制信號(ALE)是訪問外部程序存儲器時,鎖存低8 位地址的輸出脈沖。在flash 編程時,此引腳(PROG )也用作編程輸入脈沖。在一般情況下,ALE 以晶振六分之一的固定頻率輸出脈沖,可用來作為外部定時器或時鐘使用。然而,特別強調,在每次訪問外部數據存儲器時,ALE 脈沖將會跳過。如果需要,通過將地址為8EH 的SFR 的第0 位置“1”,ALE 操作將無效。這一位置“1”,ALE 僅在執行MOVX 或MOVC 指令時有效。

PSEN: 外部程序存儲器選通信號(PSEN)是外部程序存儲器選通信號。當AT89S52 從外部程序存儲器執行外部代碼時,PSEN 在每個機器周期被激活兩次,而在訪問外部數據存儲器時,PSEN 將不被激活。

EA/VPP: 訪問外部程序存儲器控制信號。為使能從0000H 到FFFFH 的外部程序存儲器讀取指令,EA 必須接GND。為了執行內部程序指令,EA 應該接VCC。
在flash 編程期間,EA 也接收12 伏VPP 電壓。

2.3.2 AT89S52單片機硬件結構的特點

MCS-51單片機硬件結構有如下一些主要特點:

① 內部程序存儲器(ROM)和內部數據存儲器(RAM)容量

MCS-51單片機的內部ROM和內部RAM的容量如表-1所示:

 

表-1 MCS-51單片機存儲器容量

存儲器類型

單片機類型

掩模ROM

EPROM

RAM

MCS-51

51子系列

8031

/

/

128B

8051

4KB

/

128B

8751

/

4KB

128B

52子系列

8032

/

/

256B

8052

8KB

/

256B

② 輸入/輸出(I/O)口

    MCS-51單片機內的I/O口的數量和種類較多且齊全,尤其是它有一個全雙工的串行口。該串口是利用兩根I/O口線構成的,有四種工作方式,可通過編程選定,MCS-51有32根I/O口線,而MCS-48只有27根。

③ 外部程序存儲器和外部數據存儲器尋址空間

    MCS-51可對64KB的外部數據存儲器尋址且不受該系列中各種芯片型號的影響,而對程序存儲器是內外總空間為64KB,故根據表-1不同的芯片型號,MCS-51外部程序存儲器最大尋址范圍為64KB。

④ 中斷與堆棧

    MCS-51有5個中斷源(對8032/8052為6個),分為2個優先級,每個中斷源的優先級是可編程的。它的堆棧位置也是可編程的,堆棧深度可達128字節。而MCS-48只有不分優先級的2個中斷源,且堆棧設置在片內RAM的16個字節的固定單元內。

⑤ 定時/計數器與寄存器區

MCS-51子系列有2個16位定時/計數器,通過編程可以實現四種工作模式。MCS-52子系列則有3個16位定時/計數器。而MCS-48只有一個8位定時/計數器。MCS-51在內部RAM中開設了四個通用工作寄存器區,共32個通用寄存器,以適應多種中斷或子程序嵌套的要求。而MCS-48的內部RAM中只有兩個通用工作寄存器區,每個寄存器區包含8個8位寄存器。

 


 

2.3.3 AT89S52單片機的硬件原理

                          

⑴ 如圖所示,圖為單片機的基本外圍電路。20管腳接地,40管腳接+5V電源,為單片機工作提供電源。18及19管腳接晶振,為單片機提供時鐘信號,晶振為12MHz。晶振的振蕩頻率越高,系統的時鐘頻率越高,單片機工作的速度也越高。對于液晶顯示電路的設計,需要單片機有較高的工作效率,所以選擇比較高頻率的晶振,從而提高液晶屏幕的刷新速率,獲得更加連貫、流暢的圖像顯示。根據需要還可以加上復位電路,復位是單片機的初始化操作。或者當單片機程序運行出錯導致死鎖狀態的時候,為擺脫困境,也需要按復位鍵以重新啟動。

 

                    圖2-2 AT89S52單片機基本外圍電路

 

 

 

⑵ 如圖2-3所示,左邊為單片機模塊,右邊為液晶模塊。單片機的P0口與液晶模塊的8個數據端口相連,作為數據傳送端口。 P2.4、5、7、8與液晶模塊的片選CS1、CS2和R/W、D/I相連,作為控制字的寫入。液晶模塊的E端為使能端,由單片機的P2.3和P3.7、8三個口送信號至與非門驅動液晶模塊,同時給使能端提供高低電平,控制液晶模塊工作。液晶模塊的VSS接地,VCC和V0接滑動變阻器,VCC接正5V電源,通過滑動變阻器分壓,從而為液晶模塊更好的工作提供電源,也作為液晶顯示屏的亮度控制端。此圖即為單片機控制液晶顯示的基本電路。其中的與非門組合可以用74LS00芯片,74LS00可以提供3個與非門。本設計電路成本低,元件比較普通,市場上可以輕易買到,為整個設計提供方便。電路簡單易于焊接,調試中也能減少很多麻煩。

 

 


3. 方案設計與論證

  按照系統設計功能的要求,初步確定設計系統由復位模塊、時鐘模塊、音樂模塊、光識模塊及顯示模塊共五個模塊組成,后來在時鐘模塊的基礎上又加載了日歷、星期的模塊,為了使本設計中的數字鐘的功能更加完善和強大,最后又將溫度顯示加入了設計方案中。

首先以單片機AT89S52為入手點,通過使用AT89S52的內部的可編程定時器/計數器,結合對外接晶振的調節來確定一個合適的振蕩周期,從而確定出內部的機器周期。再通過對內部中斷程序的設置來設計出時鐘程序,即設計出了電子時鐘的核心。

根據題目的要求,我設計了以下方案:

設計中加載了年、月、日的設計,剛開始時打算用18個共陽數碼管,考慮到數碼管太多是畢會給硬件電路帶來麻煩,經過考慮后,決定把年、月、日與時間設置到一組數碼管上來,即六個數碼管即能顯示時間又能顯示年、月、日,這樣一來就方便了硬件電路。

主控芯片使用51系列AT89S52單片機,溫度模塊設計中,溫度元件采用AD590,利用AD590以及接口電路把溫度轉換成模擬電壓,經由ADC0804轉換成數字信號,然后經AT89S52處理顯示溫度。但由于AD590價錢比較貴,且只能轉換成模擬電壓,這樣一來硬件就要增加更多的器件且又不經濟,經查找發現18B20溫度傳感器價錢便宜且可以直接把溫度轉換成數字量測溫范圍為-55—125度,最大分辨率可達0.0625度,采用3線制與單片機相連,減少了外部的硬件電路,具有低成本和易使用的特點,所以我選擇了18B20溫度傳感器。

 在音樂模塊的設計中,我決定采用音樂芯片,這樣可以避免對鈴聲音樂的編程,即節省了時間,又減少了在程序中發生錯誤的可能性。

 


 

4. 系統總體結構框圖


 

 


圖4-1

 

在本設計中,以按鍵開關作為輸入裝置,LED七段數碼顯示管作為顯示裝置,因此,各按鍵開關的功能為:

S1鍵:P1.0口 時間調整 

S2鍵:P1.1口 日期調整 

S3健;  p1.2口 鬧鈴設置

S4健:  p1.3口 鬧鈴開關

5. 系統的硬件設計

電路是由控制部分和顯示部分兩大部分組成。利用單片機程序進行控制,并通過數碼管進行顯示。

5.1 顯示部分電路的設計

5.1.1 LED數碼顯示管的基本原理

用單片機驅動LED數碼管有很多方法,按顯示方式分,有靜態顯示和動態顯示,按譯碼方式可分為硬件譯碼和軟件譯碼。

靜態顯示是顯示驅動電路具有輸出鎖存功能,單片機將要顯示的數據送出后不再控制LED,直到下次顯示時再傳送一次新的顯示數據。靜態顯示的數據穩定,占用CPU時間少。

動態顯示要CPU時刻對顯示器件進行刷新,顯示數據有閃爍感,占用CPU時間多。

這兩種顯示方式各有利弊:靜態顯示雖然數據顯示穩定,占用很少的CPU時間,但每個顯示單元都需要單獨的顯示驅動電路,使用的電路硬件較多;動態顯示雖然有閃爍感,占用的CPU時間多,但使用的硬件少,能節省線路板空間。

動態掃描顯示接口是單片機中應用最廣泛的一種顯示方式。其接口電路是把所有LED顯示器的8個筆劃段A~D、DP的同名端連在一起,而每一個數碼管的公共端COM是各自獨立地受I/O線控制。CPU向字段輸出口送出字形碼時,所有顯示器接受到相同的字形碼,但究竟是哪個顯示器亮,則取決于COM端,而這一端是由I/O控制的,可以自行決定何時顯示哪一位了。而所謂動態掃描就是指我們采用分時的方法,輪流控制各個顯示器的COM端,是各個顯示器輪流點亮。

在輪流點亮掃描過程中,每位顯示器的點亮時間是極為短暫的,約1ms左右,但由于人的視覺暫留現象及發光二極管的余輝效應,盡管實際上各位顯示器并非同時點亮,但只要掃描的速度足夠快,給人的印象就是一組穩定的顯示數據,不會有閃爍感。

從上述的論述中,可以看出動態顯示方案具備一定的實用性,也是目前單片機數碼管顯示中較為常用的一種顯示方法。所以,本設計也采用動態顯示方案。

5.1.2 數碼管顯示模塊分析

電路先通過電源電路送出+5V電壓,單片機AT89S52通過74LS47和CD4515(4—16譯碼器)驅動數碼管顯示數值, 顯示部分采用普通共陽極數碼管顯示,采用動態掃描,以減少硬件電路。考慮到一次掃描12位數碼管顯示時會出現閃爍情況,設計時分兩排顯示,一排顯示時間和年月日,一排顯示星期和溫度,  共陽極數碼管中8個發光

二極管的陽極(二極管正端)連在一起。通常,公共陽極接高電平(一般接電源),其它管腳接段驅動電路輸出端。當某段驅動電路的輸入端為低電平時,該端所連接的字段導通并點亮。根據發光字段的不同組合可顯示出各種數字或字符。此時,要求段驅動電路能吸收額定的段導通電流,還需根據外接電源及額定段導通電流來確定相應的限流電阻。采用動態顯示方式,比較節省I/O口,硬件電路也較靜態顯示簡單,但其亮度不如靜態顯示方式,而且在顯示位數較多時,CPU要依次掃描,占用CPU較多時間。
 為了提供共陽LED數碼管的驅動電壓,用三極管9012作電源驅動輸出。采用12MHz晶振,有利于提高秒計時的精確性。;

 

5.1.3 LED顯示電路

圖5-1

 

5.2 控制部分電路的設計

5.2.1 時鐘模塊

利用芯片內部的振蕩器,然后在引腳XTAL1和引腳 XTAL2兩端接晶體諧振器,就構成了穩定的自激振蕩器,其發出的脈沖直接送入內部的時鐘電路,如圖外接晶振時,C1和C2的值通常選擇30pF; C1、C2對頻率有微調作用,晶體諧振器的頻率12MHz。為了減少寄生電容,更好地保證振蕩器穩定、可靠地工作,振蕩器和電容應盡可能安裝得與單片機芯片靠近。設置了12—24兩種顯示狀態,調整計時的按鍵、設置定時的按鍵且定時設置了3次定時、還另加載了星期、年、月、日的調整及閏年的自動調整。

5.2.2 溫度模塊

主要由18B20通過單片機AT89S52中的溫度程序不斷的檢測溫度來顯示溫度。

18B20溫度傳感器工作原理:DS18B20溫度傳感器是美國DALLAS半導體公司最新推出的一種改進型智能溫度傳感器,與傳統的熱敏電阻等測溫元件相比,它能直接讀出被測溫度,并可根據實際要求通過簡單的編程實現9—12位的數字值讀數方式,DS18B20的性能特點如下:

   1、獨特的單線接口僅需要一個引腳進行通信;

   2、多個DS18B20可以并聯在唯一的三線上,實現多點組網功能;

   3、無須外部器件;

   4、可通過數據線供電,電壓范圍為3.0---5.5V;

   5、零待機功耗;

   6、溫度以9或12位數字量讀出;

   7、用戶可定義的非易失性溫度報警設置;

   8、報警搜索命令識別并標志超過程序限定溫度(溫度報警條件)的器件;

   9、負電壓特性,電源極性接反是,溫度計不會因發熱而燒毀,但不能正常工作。

5.2.3 音樂模塊

通過LM386N-1給揚聲器信號來發出音樂,這個模塊主要是為時鐘定時到時發出音樂鬧鈴,而在軟件部分設置了可以一次設置3次定時,每次定時到時,音樂程序中編了6種音樂,它可以自動選擇6種音樂中的任一音樂響1分鐘,如果中間不想讓鬧鈴響可以按一按鍵,鬧鈴就立刻停止。

5.2.4 復位模塊

單片機復位電路是使CPU和系統中的其他功能部件都處在一個確定的初始狀態,并從該狀態開始工作,例如復位后PC=0000H,使單片機從第一個單元取指令。無論是在單片機剛接上電源時,還是斷電后或者發生故障后都要復位。

    電路圖為:

圖5-2

 

5.2.5 光識模塊

同樣也是為定時服務的,只要定時到,組成心字的18只發光二極管就會按程序全亮全滅20次,如此循環。

    電路圖為:

 




圖5-3

6. 系統的軟件設計

6.1 各模塊的程序設計

6.1.1 計時程序

計時程序是實現電子時鐘的核心內容,本程序用中斷time0來控制,計時顯示的單元從50h開始,50h=秒的個位,51h=秒的十位,52h=分的個位,53h=分的十位,54h=時的個位,55h=時的十位

org    000bh          

jmp    time0

mov    tmod,#00010001b              

mov    ie,#10001010b               

mov    ip,#00000010b

mov    th0,#(65536-2000)/256

mov    tl0,#low(65536-2000)

mov    4fh,#02;兩個中斷250次為1秒

6.1.2 定時鬧鐘程序

作用是判斷時間是否與設置的鬧鐘時間相等,如相等則開啟鬧鐘。

片機內定時振鈴開關使用軟件開關,即用標志寄存器,且程序設置了3次定時,可見要使電子時鐘定時打鈴,必須同時具備兩個條件,第一:定時振鈴開;第二:當前定時項數不為0項。 因為要使電子時鐘定時打鈴,必須同時具備上述的兩個條件,所以在單片機執行查詢定時各項的程序之前,主程序會首先查詢這兩個條件是否同時滿足,如果滿足的話,則進行一輪查詢,所謂一輪查詢定時,即將當前時間與定時各項一一比較,看是否相符,如果查到某項相符,則調用音樂程序。每查完一項,寄存器中的值會自動減1(即為定時時間的項數)。當定時時間的項數值自動減為0時,則表示這一輪查詢定時時間完畢,只要條件允許(定時音樂開且定時項數不為0),有可以進行一輪新的查詢定時時間。

定時1:33h=分,34h=時,定時2:35h=分,36h=時,定時3:37h=分,38h=時,定時狀態=39h;定時顯示的單元從60h開始,60h=定時狀態,61h=此時;定時狀態的音樂種類,62h=分的個位,63h=分的十位;64h=時的個位,65h=時的十位

6.1.3 溫度程序

57h=溫度的十位,58h=溫度的個位,

6.2 系統程序設計的總體框圖


圖6-1

 

7. 系統電路的制作與調試

7.1 電路硬件焊接制作

電路硬件焊接是設計的重要內容之一,其焊接工藝的好壞直接關系到系統的整體性能。本設計的樣品制作采用手工焊接,在焊接制作中應遵守手工焊接的工藝流程和技術要求。

7.2 調試的主要方法

⑴ 測試單片機軟件功能的完善性。這是針對整個單片機系統功能的測試,測試軟件是否寫的正確完整。單片機是否能正常工作。

⑵ 上電、掉電測試。在使用中用戶必然會遇到上電和掉電的情況,可以進行多次開關電源,測試單片機系統的可靠性。

⑶ 老化測試。測試長時間工作情況下,單片機系統的可靠性。必要的話可以放置在高溫,高壓以及強電磁干擾的環境下測試。

⑷ D和EFT等測試。可以使用各種干擾模擬器來測試單片機系統的可靠性。例如使用靜電模擬器測試單片機系統的抗靜電ESD能力;使用突波雜訊模擬器進行快速脈沖抗干擾EFT測試等等。

⑸ 整個顯示系統的測試。這是針對整個單片機顯示系統功能的測試,單片機正常工作后,加上負載液晶整個系統共同測試。

⑹ 整個顯示系統的調試。編寫不同的程序寫入單片機,用單片機控制液晶顯示不同的畫面,如字符、圖形。

7.3 系統調試

7.3.1 硬件調試

    靜態測試。在電路板制作好以后,先不要急著加電,首先進行靜態測試。

  檢查線路:通過目測和使用萬用表,檢查線路連接的正確性,有無斷路和短路,無虛焊的存在等。

  核對元件:檢查元件是否安裝正確,有無損壞等。

7.3.2 軟件調試

本程序采用單片機匯編語言編寫,用wave 6000編譯器編程模擬調試。

7.3.3 聯機調試

在硬件無故障和軟件模塊調試完成的情況下,還要對系統進行聯機調試。在系統調試時,應將全部硬件電路都接上,應用程序模塊也都組合好,進行全系統軟硬件調試。系統調試的任務是排除軟硬件中的殘留錯誤。使整個系統能夠完成預定的工作任務,達到要求的技術性能指標。

系統聯機調試到能正確顯示時間、日期、12小時和24小時的轉換,并且鬧鈴功能正常,即鈴聲響起的同時,擺成心型的18個二極管閃爍。

7.3.4調試中遇到的問題及解決方法

⑴ 調試中反復檢查,仍沒有錯誤,這時候看是否要排除元器件失效了。造成這類錯誤的原因有兩個:一個是元器件買來時就已壞了;另一個是由于安裝錯誤,造成器件燒壞。可以采取檢查元器件與設計要求的型號、規格和安裝是否一致。在保證安裝無誤后,用替換方法排除錯誤。

⑵ 還有可能是電源故障,所以排除電源故障這項必不可少。在通電前,一定要檢查電源電壓的幅值和極性,否則很容易造成集成塊損壞。加電后檢查各插件上引腳的電位,一般先檢查VCC與GND之間電位,若在5V~4.8V之間屬正常。若有高壓,聯機仿真器調試時,將會損壞仿真器等,有時會使應用系統中的集成塊發熱損壞。

 ⑶ 當判斷單片機不工作時候,需要進行聯機仿真調試。聯機仿真必須借助仿真開發裝置、示波器、萬用表等工具。這些工具是單片機開發的最基本工具。

  信號線是聯絡單片機和外部器件的紐帶,信號線連結錯誤或時序不對,都會造成對外圍電路讀寫錯誤。單片機的信號線大體分為讀、寫信號線、片選信號線、時鐘信號線、外部程序存貯器讀選通信號(PSEN)、地址鎖存信號(ALE)、復位信號等幾類。這些信號大多屬于脈沖信號,對于脈沖信號借助示波器(這里指通用示波器)用常規方法很難觀測到,必須采取一定措施才能觀測到。應該利用軟件編程的方法來實現。例如對片選信號,運行下面的小程序就可以檢測出譯碼片選信號是否正常。

MAIN:MOVDPTR,#DPTR    ;將地址送入DPTR

MOVXA,@DPTR              ;將譯碼地址外RAM中的內容送入

ACC NOP                    ;適當延時

SJMP MAIN                  ;循環

  執行程序后,就可以利用示波器觀察芯片的片選信號引出腳(用示波器掃描時間為1μs/每格檔),這時應看到周期為數微秒的負脈沖波形,若看不到則說明譯碼信號有錯誤。對于電平類信號,觀測起來就比較容易。例如對復位信號觀測就可以直接利用示波器,當按下復位鍵時,可以看到單片機的復位引腳將變為高電平;一旦松開,電平將變低。

總而言之,對于脈沖觸發類的信號我們要用軟件來配合,并要把程序編為死循環,再利用示波器觀察;對于電平類觸發信號,可以直接用示波器觀察。

 

結     論

    經過調試,和多次改進,本設計達到了預期的效果。數字鐘可以正常顯示時間和日期,并且對每個月份的天數進行了處理,特別是2月這個特殊月份,本設計可以自動從2月28日直接過度到3月1日。而且,在本設計中,閏年和平年的2月,其天數可以被正常區分,從而達到了實用和人性化的效果。對溫度的顯示也比較正常,能夠正常反映出室溫情況。當然,還可以根據需要,增加整點報時的功能,以使本設計更加完善。

    總之,本設計提供了一套行之有效的數字鐘的設計方案,并且成本較低,具有較高的實用性。

 

參考文獻

[1] 盧坤,奚大順電子設計技術[M].成都電子科技大學出版社,1997.P103-210

[2] 唐競新.數字電子電路[M].第1版.北京:清華大學出版社,2003.P99-120

[3] 康華光.電子技術基礎[M].數字部分.第4版.北京:高等教育出版社,1998.

P47-79

[4] 電子工程手冊編委會等中外集成電路簡明速查手冊[M]---TTL,CMOS.北京:電子工業出版社,1991.P245-340

[5] 楊長春.論數字技術[J].《電子報》合訂本.第0113期.成都:四川科學技術出版社,2002.12.P13-30

[6] 彭國賢.數碼顯示 [M].北京:電子工業出版社,1993.P21-50

[7] 康華光主編,鄒壽彬副主編《電子技術基礎(數字技術)》高等教育出版,2004.P129-180

[8] 康華光主編,陳大欽副主編《電子技術基礎(模擬技術)》高等教育出版社,2003.P269-307

[9] 袁俊泉,孫敏琪,曹瑞編著 《數字系統設計及其應用》[J].《數字電子》第9908期. 西安電子科技大學出版社,2002.P13-26

[10] 李光飛、樓然苗等 《單片機課程設計實例指導》北京航空航天大學出版社,2004.P5-37

[11] 余永權.《ATMEL 系列Flash單片機原理及應用》北京:電子工業出版社,1997年第一版,P88~121

[12] 沙占友. 《智能化集成溫度傳感器原理與應用》北京:機械工業出版社,2002年第一版,P84~106

[13] 李廣弟,朱月秀,王秀山.《單片機基礎修訂版》北京:北京航空航天大學出版社,2001年第二版,P11~77

[14] 蔡明生.《電子設計》北京:高等教育出版社,2004年第一版,P48~101

[15] 孫安青.《AT89S51單片機實驗及實踐教程》www.supermcu.com.P179~186

[16] 劉云,成后發,尹波.《溫度無線傳輸技術的研究》電腦與信息技術,2004年第 4期,P47~50

[17] 陳躍東.《DS18B20集成溫度傳感器原理及其應用》 安徽機電學院學報,2002年第4期,P34~38

[18] 劉楚浩. 《用單片機實現溫度遠程顯示》單片機與嵌入式系統應用.2002年第9期

[19] William Stallings.《Data and Computer Communications》.北京:高等教育出版社,2001年第一版

[20] CHEE-YEE CHONG,SRIKANTA  PKUMAR. 《Sensor Networks:Evolution》,Opportunities and Challenges[A]. PROCEEDINGS OF THE IEEE[C]. 2003,91(8):1247-1256.

[21]  Altera Corporation.2002. 《 Altera Digital Library.Altera》.P99-101

[22]  Xilinx Inc.2001.Data Book 2001.Xilinx.P31-54


附錄1  數字鐘電路圖


 

 

 

附錄2  程序清單

org 0000h

              jmp start

              org 000bh

              jmp time

              org 30h

start:       mov sp,#5fh              ;//       小時       分鐘       秒

              mov r1,#0              ;//       r2 r1   r5 r0   r3 r4

              mov r2,#0

              mov r7,#0

              mov r0,#0

              mov r6,#0

              mov r5,#0

              mov 20h,#31              ;//20h  日地址                                   日         月               年個位              年十位       年百位       年千位

              mov 21h,#10              ;//21h       月地址                                   20h              21h              22h                     23h         24h       25h

              mov 22h,#6              ;//年個位

              mov 23h,#0              ;//年十位

              mov 24h,#0              ;//年百位

              mov 25h,#2              ;/年千位

 

              mov 34h,#0              ;//鬧鈴1  秒個位                       時十位       時個位       分十位       分個位       秒十位       秒個位

              mov 35h,#0              ;//鬧鈴1  秒十位

              mov 36h,#1              ;//鬧鈴1  分個位                            39h              38h              37h              36h              35h              34h

              mov 37h,#0              ;//鬧鈴1  分十位

              mov 38h,#0              ;//鬧鈴1  時個位

              mov 39h,#0              ;//鬧鈴1  時十位                  時十位       時個位       分十位       分個位       秒十位       秒個位

 

              mov 49h,#1              ;//鬧鈴2 分個位                     4ch       4bh         4ah       49h       48h       47h

              mov 4ah,#0              ;//鬧鈴2 分十位

              mov 4bh,#0              ;//鬧鈴2 時個位

              mov 4ch,#0              ;//鬧鈴2 時十位

 

 

                setb p1.5

 

              mov TMOD,#00000001b

              mov TH0,#3ch              ;//定時器初值

              mov TL0,#0b0h

              setb EA                            ;//開總中斷

              setb ET0                     ;//開定時器一的中斷

              mov p1,#0ffh

              setb TR0                     ;//定時器開始工作

k:              mov 12h,r0

 

              mov 13h,r1

 

              mov 14h,r2                     ; //       小時         分鐘          秒

                                          ;       //       r2 r1     r5 r0   r3 r4

              mov 15h,r5

                                            ;        // 14h 13h       15h 12h

loop:       mov r5,15h

              mov r2,14h

              mov r1,13h                     ;//地址中不是BCD碼而是要顯示的數字

              mov r0,12h

 

              mov a,r6                ; //R6中是秒脈沖個數

              mov b,#10

              div ab

              mov dptr,#tab1         ; //商存在a中

              movc a,@a+dptr

              mov r3,a

 

              mov a,b

              movc a,@a+dptr          ;//余數在b中

              mov r4,a

 

              mov dptr,#tab1

              mov a,r0

              movc a,@a+dptr       ;       //分 個位

              mov r0,a

 

              mov a,r5

              movc a,@a+dptr              ;//分 十位

              mov r5,a;                                                                 //       小時         分鐘          秒

                     ;                                                                        //       r2 r1     r5 r0   r3 r4

              mov a,r1 ;

              movc a,@a+dptr              ;//時 個位                              //   14h 13h         15h 12h

              mov r1,a

;                                                                                             //   18h 17h         19h 16h

              mov a,r2                     ;//時 十位

              movc a,@a+dptr;                                                          //此時地址中是要顯示數字的BCD碼

              mov r2,a

              mov 19h,r5

              mov 18h,r2

              mov 17h,r1

              mov 16h,r0

              mov 46h,r6

 

 

dsp:

              mov p2,r4

              mov p0,#70h                            ;//p0的高位接74LS138

              lcall delay

 

              mov p2,r3

              mov p0,#60h

              lcall delay

 

              mov p2,r0                            ;//       小時         分鐘          秒

              mov p0,#40h

              lcall delay                     ;       //       r2 r1     r5 r0   r3 r4

                                                        ;

              mov p2,r5

              mov p0,#30h

              lcall delay

 

              mov p2,r1

              mov p0,#10h

              lcall delay

 

 

              mov p2,r2

              mov p0,#00h

              lcall delay

 

              mov p0,#50h                            ;//在分與秒之間加  "一"

              mov p2,#3fh

              lcall delay

 

              mov p0,#20h                            ;//在分與秒之間加  "一"

              mov p2,#3fh

              lcall delay

              jnb p1.1,return1              ;//p1.1是年月日調整

              jnb p1.0,jie                     ;//p1.0是時間調整

              jnb p1.2,goto5                     ;//p1.2進入鬧鈴

 

              mov p3,#0ffh

 

                call cheak2

                call cheak3

 

              call zcheak;                                          //2ah.0為0跳轉,不去整點報時

                jb p1.5,out3

                call cheak

out3:           jb p1.6,out2

                call cheak1

 

out2:                 jmp loop

 

goto6:       mov p3,#150

              ljmp notice

goto5:       lcall  delay1                  ;// 跳往鬧鈴的按鍵防抖程序

              jnb p1.2,goto6

              ljmp loop

 

 

return5:mov P3,#190

              ljmp showdate

return1:lcall  delay1                  ;/;/ 跳往日期調整的按鍵防抖程序

              jnb p1.1,return5

              ljmp loop

 

return8:mov p3,#230

              ljmp dsp1

jie:       lcall delay1                 ;// 跳往時間調整的按鍵防抖程序

              jnb p1.0,return8

              ljmp loop

 

 

;//*************鬧鈴校對程序************************************************8

 

cheak:                mov a,46h

              cjne a,#0,out

              mov a,36h                            ;//鬧鈴1比對,若成立就給P3口傳入#00h

              cjne a,12h,out

 

                                                        ; 時十位       時個位       分十位       分個位       秒十位       秒個位

              mov a,37h                            ;;39h              38h              37h              36h              35h              34h

              cjne a,15h,out

 

              mov a,38h

              cjne a,13h,out

 

              mov a,39h

              cjne a,14h,out

 

                mov a,36h                ;4dh存鬧鈴1后一分的 分個位

                inc a

                mov 4dh,a

              clr p1.7

                clr p0.0

out:       ret

 

cheak1:               mov a,46h

              cjne a,#0,out22

              mov a,49h                            ;//鬧鈴1比對,若成立就給P3口傳入#00h

              cjne a,12h,out22

                                                        ; 時十位       時個位       分十位       分個位       秒十位       秒個位

              mov a,4ah                            ;;39h              38h              37h              36h              35h              34h

              cjne a,15h,out22                         ; 4ch              4bh              4ah              49h       48h       47h

 

              mov a,4bh

              cjne a,13h,out22

 

              mov a,4ch

              cjne a,14h,out22

                mov a,49h

                inc a

                mov 4eh,a

              clr p1.7

                clr p0.0

out22:                ret

;***************關鬧鈴報警******************************************************

;關鬧鈴一

cheak2:               mov a,46h

              cjne a,#0,out33

              mov a,4dh                            ;//鬧鈴1比對,若成立就給P3口傳入#00h

              cjne a,12h,out33

                                                        ; 時十位       時個位       分十位       分個位       秒十位       秒個位

              mov a,37h                            ;;39h              38h              37h              36h              35h              34h

              cjne a,15h,out33                            ; 4ch              4bh              4ah              49h       48h       47h

 

              mov a,38h

              cjne a,13h,out33

 

              mov a,39h

              cjne a,14h,out33

              setb p1.7

                setb p0.0

out33:                ret

;關鬧鈴二

cheak3:               mov a,46h

              cjne a,#0,out44

              mov a,4eh                            ;//鬧鈴1比對,若成立就給P3口傳入#00h

              cjne a,12h,out44

                                                        ; 時十位       時個位       分十位       分個位       秒十位       秒個位

              mov a,4ah                            ;;39h              38h              37h              36h              35h              34h

              cjne a,15h,out44                            ; 4ch              4bh              4ah              49h       48h       47h

 

              mov a,4bh

              cjne a,13h,out44

 

              mov a,4ch

              cjne a,14h,out44

              setb p1.7

                setb p1.6

out44:                ret

 

 

 

;********整點報時校對程序******************************************************************

 

 

                                                                 ;       小時         分鐘

zcheak:               mov a,46h

              cjne a,#0,out

              mov a,12h                                   ;   14h 13h         15h 12h

              cjne a,#0,out

              mov a,15h

              cjne a,#0,out

              mov a,14h                                      ;將原來存在13h,14h的小時轉為一個值存在a中

              mov b,#10

              mul ab

              add a,13h

 

 

              cjne a,#1,play1

              mov p3,#0

 

              jmp out1

play1:       cjne a,#2,play2

              mov p3,#10

 

              jmp out1

play2:              cjne a,#3,play3

              mov p3,#20

 

              jmp out1

play3:              cjne a,#4,play4

              mov p3,#30

 

              jmp out1

play4:              cjne a,#5,play5

              mov p3,#40

 

              jmp out1

 

play5:              cjne a,#6,play6

              mov p3,#50

 

              jmp out1

 

play6:              cjne a,#7,play7

              mov p3,#60

 

              jmp out1

play7:              cjne a,#8,play8

              mov p3,#70

 

              jmp out1

play8:              cjne a,#9,play9

              mov p3,#80

 

              jmp out1

play9:              cjne a,#10,play10

              mov p3,#90

 

              jmp out1

play10:              cjne a,#11,play11

              mov p3,#100

 

              jmp out1

play11:              cjne a,#12,play12

              mov p3,#110

 

              jmp out1

play12:              cjne a,#13,play13

              mov p3,#120

 

              jmp out1

play13:              cjne a,#14,play14

              mov p3,#130

 

              jmp out1

play14:              cjne a,#15,play15

              mov p3,#140

 

              jmp out1

play15:              cjne a,#16,play16

              mov p3,#150

 

              jmp out1

play16:              cjne a,#17,play17

              mov p3,#160

 

              jmp out1

play17:              cjne a,#18,play18

              mov p3,#170

 

              jmp out1

play18:              cjne a,#19,play19

              mov p3,#180

 

              jmp out1

 

play19:              cjne a,#20,play20

              mov p3,#190

 

              jmp out1

play20:              cjne a,#21,play21

              mov p3,#200

 

              jmp out1

play21:              cjne a,#22,play22

              mov p3,#210

 

              jmp out1

play22:              cjne a,#23,play23

              mov p3,#220

 

              jmp out1

play23:       cjne a,#24,out1

              mov p3,#230

 

 

out1:       ret

 

 

                                                                 ;鬧鈴調整

notice:       mov dptr,#tab1

              mov a,34h

              movc a,@a+dptr                                          ;         時十位       時個位       分十位       分個位       秒十位       秒個位

              mov 45h,a

                                                                             ;         39h              38h              37h              36h              35h              34h

                                                                      ;BCD碼         40h              41h              42h              43h              44h              45h

              mov a,35h

              movc a,@a+dptr                                       ;   14h               13h              15h               12h

              mov 44h,a

 

              mov a,36h

              movc a,@a+dptr

              mov 43h,a

 

              mov a,37h

              movc a,@a+dptr

              mov 42h,a

 

              mov a,38h

              movc a,@a+dptr

              mov 41h,a

 

              mov a,39h

              movc a,@a+dptr

              mov 40h,a

 

              mov p2,45h

              mov p0,#70h                     ;顯示時間

              lcall delay

 

              mov p2,44h

              mov p0,#60h

              lcall delay

 

              mov p2,43h

              mov p0,#40h

              lcall delay

 

              mov p2,42h

              mov p0,#30h

              lcall delay                                                        ;         40h              41h              42h              43h              44h              45h

 

 

              mov p2,41h

              mov p0,#10h

              lcall delay

 

              mov p2,40h

              mov p0,#00h

              lcall delay

 

              mov p0,#50h

              mov p2,#3fh

              lcall delay

 

              mov p0,#20h

              mov p2,#3fh

              lcall delay

              jnb p1.2,goto7       ; p1.2跳回

              jnb p1.1,addfen              ;p1.1分調整

              jnb p1.0,addshi          ;時調整

                jnb p1.3,light     ;開啟或關閉鬧鈴

              mov p3,#0ffh

              jmp notice

 

 

goto8:       mov p3,#170

              jmp notice1

goto7:       lcall delay1

              jnb p1.2,goto8

              ljmp notice

light:  lcall delay1

        lcall delay1

        cpl p1.5

        ljmp notice

 

addfen:       call delay1

              lcall delay1

              mov r5,37h                                            ;         39h              38h              37h              36h              35h              34h

              mov r2,39h

              mov r1,38h

              mov r0,36h

              inc r0                                            ;       小時         分鐘          秒

              cjne r0,#10,to                              ;       r2 r1     r5 r0   r3 r4

              mov r0,#0

              inc r5                                            ; 14h 13h       15h 12h

              cjne r5,#6,to

              mov r5,#0

              inc r1

              cjne r1,#10,tiao

              mov r1,#0

              inc r2

tiao:       cjne r2,#2,to

              cjne r1,#4,to

              mov r2,#0

              mov r1,#0

to:              mov 36h,r0

 

              mov 38h,r1

 

              mov 39h,r2

 

              mov 37h,r5

 

              ljmp notice

 

 

 

 

addshi:       call delay1

              lcall delay1

              mov r5,37h                                            ;         39h              38h              37h              36h              35h              34h

              mov r2,39h

              mov r1,38h

              mov r0,36h

              inc r1

              cjne r1,#10,tiao1

              mov r1,#0

              inc r2

tiao1:       cjne r2,#2,to1

              cjne r1,#4,to1

              mov r2,#0

              mov r1,#0

to1:       mov 36h,r0

 

              mov 38h,r1

 

              mov 39h,r2

 

              mov 37h,r5

 

              ljmp notice

 

                                     ;鬧鈴二設定

 

notice1:mov dptr,#tab1

              mov a,34h

              movc a,@a+dptr                                          ;         時十位       時個位       分十位       分個位       秒十位       秒個位

              mov 45h,a

                                                                             ;         39h              38h              37h              36h              35h              34h

                                                                             ;         4ch              4bh              4ah              49h       48h       47h

                                                                      ;BCD碼         40h              41h              42h              43h              44h              45h

              mov a,35h

              movc a,@a+dptr                                       ;   14h               13h              15h               12h

              mov 44h,a

 

              mov a,49h

              movc a,@a+dptr

              mov 43h,a

 

              mov a,4ah

              movc a,@a+dptr

              mov 42h,a

 

              mov a,4bh

              movc a,@a+dptr

              mov 41h,a

 

              mov a,4ch

              movc a,@a+dptr

              mov 40h,a

 

              mov p2,45h

              mov p0,#70h                     ;顯示時間

              lcall delay

 

              mov p2,44h

              mov p0,#60h

              lcall delay

 

              mov p2,43h

              mov p0,#40h

              lcall delay

 

              mov p2,42h

              mov p0,#30h

              lcall delay                                          ;         40h              41h              42h              43h              44h              45h

 

 

              mov p2,41h

              mov p0,#10h

              lcall delay

 

              mov p2,40h

              mov p0,#00h

              lcall delay

 

              mov p0,#50h

              mov p2,#3fh

              lcall delay

 

              mov p0,#20h

              mov p2,#3fh

              lcall delay

              jnb p1.2,goto9       ; p1.2跳回

              jnb p1.1,addfen1              ;p1.1分調整

              jnb p1.0,addshi1          ;時調整

                jnb p1.3,light1

              mov p3,#0ffh

              jmp notice1

 

 

goto10:       mov p3,#240

              jmp loop

goto9:       lcall delay1

              jnb p1.2,goto10

              ljmp notice1

light1: lcall delay1

        lcall delay1

        cpl p1.6

        jmp notice1

 

addfen1:call delay1

              lcall delay1

              mov r5,4ah                                            ;         39h              38h              37h              36h              35h              34h

              mov r2,4ch                                      ;         4ch              4bh         4ah              49h       48h       47h

              mov r1,4bh

              mov r0,49h

              inc r0                                            ;       小時         分鐘          秒

              cjne r0,#10,to3                              ;       r2 r1     r5 r0   r3 r4

              mov r0,#0

              inc r5                                            ; 14h 13h       15h 12h

              cjne r5,#6,to3

              mov r5,#0

              inc r1

              cjne r1,#10,tiao3

              mov r1,#0

              inc r2

tiao3:       cjne r2,#2,to3

              cjne r1,#4,to3

              mov r2,#0

              mov r1,#0

to3:       mov 49h,r0

 

              mov 4bh,r1

 

              mov 4ch,r2

 

              mov 4ah,r5

 

              ljmp notice1

 

 

 

 

addshi1:call delay1

              lcall delay1

              mov r5,4ah                                            ;         39h              38h              37h              36h              35h              34h

              mov r2,4ch                                          ;              4ch              4bh         4ah              49h       48h       47h

              mov r1,4bh

              mov r0,49h

              inc r1

              cjne r1,#10,tiao4

              mov r1,#0

              inc r2

tiao4:       cjne r2,#2,to4

              cjne r1,#4,to4

              mov r2,#0

              mov r1,#0

to4:       mov 49h,r0

 

              mov 4bh,r1

 

              mov 4ch,r2

 

              mov 4ah,r5

 

              ljmp notice1

 

 

 

 

 

 

 

 

 

dsp1:

              mov r5,15h                         ;       小時         分鐘          秒

              mov r2,14h                        ;   14h 13h         15h 12h

              mov r1,13h

              mov r0,12h

 

;/*              mov a,r6 ;

;              mov b,#10

;              div ab

;              mov dptr,#tab1                     ;       r2 r1     r5 r0   r3 r4

;              movc a,@a+dptr

;              mov r3,a

  ;

;              mov a,b

;              movc a,@a+dptr

;              mov r4,a

;                               */

              mov dptr,#tab1

              mov a,r0

              movc a,@a+dptr              ;計算BCD碼

              mov r0,a

 

              mov a,r5

              movc a,@a+dptr

              mov r5,a

 

              mov a,r1

              movc a,@a+dptr

              mov r1,a

 

              mov a,r2

              movc a,@a+dptr

              mov r2,a

 

 

              mov p2,r4

              mov p0,#70h                     ;顯示時間

              lcall delay

 

              mov p2,r3

              mov p0,#60h

              lcall delay

 

              mov p2,r0

              mov p0,#40h

              lcall delay

 

              mov p2,r5

              mov p0,#30h

              lcall delay

 

 

              mov p2,r1

              mov p0,#10h

              lcall delay

 

              mov p2,r2

              mov p0,#00h

              lcall delay

 

              mov p0,#50h

              mov p2,#3fh

              lcall delay

 

              mov p0,#20h

              mov p2,#3fh

              lcall delay

              lcall delay

              lcall delay

              lcall delay

              lcall delay

              jnb p1.0,return2       ; p1.0跳回

              jnb p1.1,fen       ;p1.1分調整

              jnb p1.2,shi

                jnb p1.3,mon

              mov p3,#0ffh

              ljmp dsp1

 

return9:mov p3,#240;

              jmp loop

return2:lcall delay1

              jnb p1.0,return9

              jmp dsp1

 

mon:            mov p3,#222

                call delay1

                jmp dsp1

 

fen:       call delay1

              lcall delay1

              mov r5,15h

              mov r2,14h

              mov r1,13h

              mov r0,12h

              inc r0                                            ;       小時         分鐘          秒

              cjne r0,#10,q                              ;       r2 r1     r5 r0   r3 r4

              mov r0,#0

              inc r5

              cjne r5,#6,q

              mov r5,#0

              inc r1

              cjne r1,#10,next2

              mov r1,#0

              inc r2

next2:       cjne r2,#2,q

              cjne r1,#4,q

              mov r2,#0

              mov r1,#0

q:              mov 12h,r0

 

              mov 13h,r1

 

              mov 14h,r2

 

              mov 15h,r5

 

              ljmp dsp1

shi:       call delay1

              lcall delay1

              mov r5,15h

              mov r2,14h                                      ;       小時         分鐘          秒

              mov r1,13h                                      ;       r2 r1     r5 r0   r3 r4

              mov r0,12h

              inc r1

              cjne r1,#10,next3

              mov r1,#0

              inc r2

next3:       cjne r2,#2,pq

              cjne r1,#4,pq

              mov r2,#0

              mov r1,#0

pq:              mov 12h,r0

 

              mov 13h,r1

 

              mov 14h,r2

 

              mov 15h,r5

 

              ljmp dsp1

 

 

showdate:mov a,20h              ; 日     月       年個位      年十位   年百位   年千位

              mov b,#10          ; 20h       21h              22h                     23h         24h       25h

              div ab

              mov dptr,#tab1

              movc a,@a+dptr

              mov 26h,a                ;轉化出來的BCD碼

              mov a,b                            ;                日個位              日十位

              movc a,@a+dptr              ;              27h              26h

              mov 27h,a

 

 

              mov a,21h

              mov b,#10

              div ab                              ;       月個位              月十位

              movc a,@a+dptr

              mov 28h,a                     ;              29h              28h

              mov a,b

              movc a,@a+dptr

              mov 29h,a

 

 

              mov a,22h

              movc a,@a+dptr                ;               年個位              年十位       年百位       年千位

              mov 30h,a                       ;              22h                     23h         24h       25h

                                                   ;BCD碼       30h                     31h         32h       33h

              mov a,23h

              movc a,@a+dptr

              mov 31h,a

 

              mov a,24h

              movc a,@a+dptr

              mov 32h,a

 

 

              mov a,25h

              movc a,@a+dptr

              mov 33h,a

              jnb p1.1,goto2

              jnb p1.2,goto4

              mov p3,#0ffh

 

dsp5:       mov p2,27h

              mov p0,#70h                     ;年月日的BCD碼

              lcall delay                 ;日個位              日十位       月個位              月十位        年個位              年十位       年百位       年千位

                                            ;27h              26h       29h              28h              30h                     31h         32h       33h

              mov p2,26h

              mov p0,#60h

              lcall delay

 

              mov p2,28h

              mov p0,#40h

              lcall delay

 

              mov p2,30h

              mov p0,#30h

              lcall delay

 

              mov p2,32h

              mov p0,#10h

              lcall delay

 

              mov p2,33h

              mov p0,#00h

              lcall delay

 

              mov p0,#50h

              mov p2,29h

              lcall delay

 

              mov p0,#20h

              mov p2,31h

              lcall delay

 

              jmp showdate

 

goto3:       mov p3,#200

              jmp date                        ;跳轉到日期設置中

 

goto2:        lcall delay1

              jnb p1.1,goto3

               ljmp showdate

 

goto4:       lcall delay1

              jmp loop

 

 

 

 

 

 

date:       mov a,20h              ; 日         月               年個位              年十位       年百位       年千位

              mov b,#10          ; 20h       21h              22h                     23h         24h       25h

              div ab

              mov dptr,#tab1

              movc a,@a+dptr

              mov 26h,a                ;轉化出來的BCD碼

              mov a,b                            ;                日個位              日十位

              movc a,@a+dptr              ;              27h              26h

              mov 27h,a

 

 

              mov a,21h

              mov b,#10

              div ab                              ;       月個位              月十位

              movc a,@a+dptr

              mov 28h,a                     ;              29h              28h

              mov a,b

              movc a,@a+dptr

              mov 29h,a

 

 

              mov a,22h

              movc a,@a+dptr                ;               年個位              年十位       年百位       年千位

              mov 30h,a                       ;              22h                     23h         24h       25h

                                                   ;BCD碼       30h                     31h         32h       33h

              mov a,23h

              movc a,@a+dptr

              mov 31h,a

 

              mov a,24h

              movc a,@a+dptr

              mov 32h,a

 

 

              mov a,25h

              movc a,@a+dptr

              mov 33h,a

              jnb p1.1,return

              jnb p1.0,adddate

              jnb p1.2,decdate

              mov p3,#0ffh

dsp2:       mov p2,27h

              mov p0,#70h                     ;年月日的BCD碼

              lcall delay                 ;日個位              日十位       月個位              月十位        年個位              年十位       年百位       年千位

                                             ;27h              26h       29h              28h              30h                     31h         32h       33h

              mov p2,26h

              mov p0,#60h

              lcall delay

 

              mov p2,28h

              mov p0,#40h

              lcall delay

 

              mov p2,30h

              mov p0,#30h

              lcall delay

 

              mov p2,32h

              mov p0,#10h

              lcall delay

 

              mov p2,33h

              mov p0,#00h

              lcall delay

 

              mov p0,#50h

              mov p2,29h

              lcall delay

 

              mov p0,#20h

              mov p2,31h

              lcall delay

 

              jmp date

adddate:lcall delay1

              lcall delay1                ;日加一

              inc 20h

              mov a,20h

              cjne a,#32,over

              mov 20h,#0

 

over:       ljmp date

 

decdate:lcall delay1              ;日減一

              lcall delay1

              dec 20h

              mov a,20h

              cjne a,#-1,over

              mov 20h,#31

              jmp over

 

 

 

return6:mov p3,#210

              jmp r                        ;跳轉到日

 

return:         lcall delay1

                mov p3,#230

              jnb p1.1,return6

               ljmp date

 

r:              mov a,20h

              mov b,#10                                   ;日                月               年個位              年十位       年百位       年千位

              div ab                                          ;20h              21h              22h                     23h         24h       25h

              mov dptr,#tab1

              movc a,@a+dptr

              mov 26h,a

              mov a,b

              movc a,@a+dptr

              mov 27h,a

 

 

              mov a,21h

              mov b,#10

              div ab

              movc a,@a+dptr

              mov 28h,a

              mov a,b

              movc a,@a+dptr

              mov 29h,a

 

 

              mov a,22h

              movc a,@a+dptr

              mov 30h,a

 

              mov a,23h

              movc a,@a+dptr

              mov 31h,a

 

              mov a,24h

              movc a,@a+dptr

              mov 32h,a

 

 

              mov a,25h

              movc a,@a+dptr

              mov 33h,a

              jnb p1.1,back1

              jnb p1.0,addri

              jnb p1.2,decri

              mov p3,#0ffh

dsp3:       mov p2,27h

              mov p0,#70h

              lcall delay

 

              mov p2,26h

              mov p0,#60h

              lcall delay

 

              mov p2,28h

              mov p0,#40h

              lcall delay

 

              mov p2,30h

              mov p0,#30h

              lcall delay

 

              mov p2,32h

              mov p0,#10h

              lcall delay

 

              mov p2,33h

              mov p0,#00h

              lcall delay

 

              mov p0,#50h

              mov p2,29h

              lcall delay

 

              mov p0,#20h

              mov p2,31h

              lcall delay

 

              jmp r

addri:       lcall delay1

              lcall delay1

              inc 21h

              mov a,21h

              cjne a,#13,over1

              mov 21h,#1

 

over1:       ljmp r

 

decri:       lcall delay1

              lcall delay1

              dec 21h

              mov a,21h

              cjne a,#0,over1

              mov 21h,#12

              jmp over1

 

back:       mov P3,#220                     ;跳轉年調整,此倆個back 為按鍵防抖

              jmp nian

 

back1:        lcall delay1

              jnb p1.1,back

               ljmp dsp3

 

 

 

nian:       mov a,20h              ; 日         月               年個位              年十位       年百位       年千位

              mov b,#10          ; 20h       21h              22h                     23h         24h       25h

              div ab

              mov dptr,#tab1

              movc a,@a+dptr

              mov 26h,a                ;轉化出來的BCD碼

              mov a,b                            ;                日個位              日十位

              movc a,@a+dptr              ;              27h              26h

              mov 27h,a

 

 

              mov a,21h

              mov b,#10

              div ab                              ;       月個位              月十位

              movc a,@a+dptr

              mov 28h,a                     ;              29h              28h

              mov a,b

              movc a,@a+dptr

              mov 29h,a

 

 

              mov a,22h

              movc a,@a+dptr                ;               年個位              年十位       年百位       年千位

              mov 30h,a                       ;              22h                     23h         24h       25h

                                                   ;BCD碼       30h                     31h         32h       33h

              mov a,23h

              movc a,@a+dptr

              mov 31h,a

 

              mov a,24h

              movc a,@a+dptr

              mov 32h,a

 

 

              mov a,25h

              movc a,@a+dptr

              mov 33h,a

 

 

dsp4:       mov p2,27h

              mov p0,#70h                     ;年月日的BCD碼

              lcall delay                 ;日個位              日十位       月個位              月十位        年個位              年十位       年百位       年千位

                                             ;27h              26h       29h              28h              30h                     31h         32h       33h

              mov p2,26h

              mov p0,#60h

              lcall delay

 

              mov p2,28h

              mov p0,#40h

              lcall delay

 

              mov p2,30h

              mov p0,#30h

              lcall delay

 

              mov p2,32h

              mov p0,#10h

              lcall delay

 

              mov p2,33h

              mov p0,#00h

              lcall delay

 

              mov p0,#50h

              mov p2,29h

              lcall delay

 

              mov p0,#20h

              mov p2,31h

              lcall delay

 

              jnb p1.1,goto

              jnb p1.0,addnian

              jnb p1.2,decnian

              mov p3,0ffh

              jmp nian

addnian:lcall delay1

              lcall delay1                ;年個位              年十位       年百位       年千位

              inc 22h                            ;22h                     23h         24h       25h

              mov a,22h

              cjne a,#10,over4

              mov 22h,#0

              inc 23h

              mov a,23h

              cjne a,#10,over4

              mov 23h,#0

              inc 24h

              mov a,24h

              cjne a,#10,over4

              mov 24h,#0

              inc 25h

              mov a,25h

              cjne a,#10,over4

              mov 25h,#0

 

over4:       jmp nian

 

decnian:lcall delay1

              lcall delay1                ;年個位              年十位       年百位       年千位

              dec 22h                            ;22h                     23h         24h       25h

              mov a,22h

              cjne a,#-1,over4

              mov 22h,#0

              dec 23h

              mov a,23h

              cjne a,#-1,over4

              mov 23h,#0

              dec 24h

              mov a,24h

              cjne a,#-1,over4

              mov 24h,#0

              dec 25h

              mov a,25h

              cjne a,#-1,over4

              mov 25h,#0

              jmp over4

 

 

goto1:       mov p3,#240

              jmp loop                        ;跳轉到日

 

goto:       lcall delay1

              jnb p1.1,goto1

               ljmp nian

 

 

 

time:       mov r5,15h

              mov r2,14h                                   ;秒脈沖得到后,軟件計算時間

              mov r1,13h

              mov r0,12h

 

              inc r7

              mov a,r7

              cjne a,#20,T_ret

              inc r6

              cjne r6,#60,t

              mov r6,#0

              inc r0

              cjne r0,#10,t

              mov r0,#0

              inc r5

              cjne r5,#6,t

              mov r5,#0

              inc r1

              cjne r1,#10,next1

              mov r1,#0

              inc r2

next1:       cjne r2,#2,t

              cjne r1,#4,t

              mov r2,#0

              mov r1,#0

              inc 20h

                mov p3,#222

                call delay1

                mov a ,20h

                cjne a,#32,t

                mov 20h,#1

 

                inc 21h

                mov a,21h

                cjne a,#13,t

                mov 21h,#1

                inc 22h

 

 

 

 

 

;/*              cjne r1,#24,ask

;              mov r1,#0

;ask:       mov dptr,#tab1

;              mov a,r1

;              mov b,#10

;              div ab

;              movc a,@a+dptr

;              add a,r2

;              mov r2,a

;              mov a,b

;              movc a,@a+dptr

;              add a,r1

;              mov r1,a */

t:              mov r7,#0

T_ret:       mov TH0,#03ch

              mov TL0,#0b0h

              mov 12h,r0

 

              mov 13h,r1

                                                                      ;將算出來的時間賦回地址中

              mov 14h,r2                                          ;       小時         分鐘          秒

                                                                      ;       r2 r1     r5 r0   r3 r4

              mov 15h,r5

              reti

delay:                mov 10h,#4

d3:              mov 11h,#5

d4:              djnz 11h,d4

              djnz 10h,d3

              ret

 

delay1:       mov 10h,#0bfh

d1:              mov 11h,#0ffh

d2:              djnz 11h,d2

              djnz 10h,d1

              ret

tab1:       db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,00h,90h

 

               end

 

 

(3)控制附機的的程序

 

#include"reg52.h"

sbit warmer=P2^4;

sbit led_run=P2^0;

sbit k_power=P2^5;

sbit P3_0=P3^0 ;

sbit P3_2=P3^2 ;

sbit P3_3=P3^3 ;

sbit P3_4=P3^4 ;

sbit P3_5=P3^5 ;

sbit day=P2^7 ;

sbit ge=P3^7;

sbit shi=P3^6;

sbit DQ =P3^1;   //定義通信端口

 

int play()                            //語音芯片控制位

{

       P3_0=1;

       P3_2=0;

       P3_3=0;

       P3_4=0;

       P3_5=0;

       P3_3=1;

 

 

}

 

 

 

 

//延時函數

unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};

                    //0,    1,   2   3    4    5    6    7    8    9

void delay(unsigned int i)

{

     while(i--);

 

}

//初始化函數

Init_DS18B20(void)

{

 unsigned char x=0;

 DQ = 1;    //DQ復位

 delay(8);  //稍做延時

 DQ = 0;    //單片機將DQ拉低

 delay(80); //精確延時 大于 480us

 DQ = 1;    //拉高總線

 delay(14);

 x=DQ;      //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗

 delay(20);

}

//讀一個字節

ReadOneChar(void)

{

unsigned char i=0;

unsigned char dat = 0;

for (i=8;i>0;i--)

 {

  DQ = 0; // 給脈沖信號

  dat>>=1;

  DQ = 1; // 給脈沖信號

  if(DQ)

   dat|=0x80;

  delay(4);

 }

 return(dat);

}

//寫一個字節

WriteOneChar(unsigned char dat)

{

 unsigned char i=0;

 for (i=8; i>0; i--)

 {

  DQ = 0;

  DQ = dat&0x01;

  delay(5);

  DQ = 1;

  dat>>=1;

 }

delay(4);

}

//讀取溫度

ReadTemperature(void)

{

unsigned char a=0;

unsigned char b=0;

unsigned char t=0;

Init_DS18B20();

WriteOneChar(0xCC); // 跳過讀序號列號的操作

WriteOneChar(0x44); // 啟動溫度轉換

Init_DS18B20();

WriteOneChar(0xCC); //跳過讀序號列號的操作

WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度

a=ReadOneChar();   //讀取溫度值低位

b=ReadOneChar();   //讀取溫度值高位

a=a>>4;            //低位右移4位,舍棄小數部分

t=b<<4;            //高位左移4位,舍棄符號位

t=t|a;

return(t);

}

void display_tempmain(unsigned char i)             //主程序溫度顯示函數

{

  P2=tab[i/10];

  shi=0;

  ge=1;

  day=1;

  delay(500);

  P2=tab[i%10];

  shi=1;

  ge=0;

  day=1;

  delay(500);

 

}

void main(void)

{unsigned int temp;

 int play();

 unsigned int i,j=2;

while(1)                         //主循環

   { temp=ReadTemperature();

     display_tempmain(temp);

     P2=tab[j];

     shi=1;

     ge=1;

     day=0;

     if(P0==222){

 

                     j++;

                        if(j==8){

                                 j=1;

                        }

                        for(i=40000;i>0;i--);

                 }

     if(P0==0x00){

                        P1=250;

                     play();

 

                     for(i=60000;i>0;i--);

                     for(i=60000;i>0;i--);

 

                                                                  //語音地址         0          10       20       30       40       50       60       70       80       90 (十進制)

                     P1=0x00;

                     play();

                                            //語音地址              100       110       120       130       140       150       160       170       180       190       200       210       220       230

              }

              if(P0==10){                                   //跳出              現在時刻

                  P1=250;

                     play();

 

                     for(i=60000;i>0;i--);

                     for(i=60000;i>0;i--);

 

                                                                             // 240                250

                     P1=10;

                     play();

              }

              if(P0==20){

                     P1=250;

                     play();

 

                     for(i=60000;i>0;i--);

                     for(i=60000;i>0;i--);

 

                     P1=20;

                     play();

              }

              if(P0==30){

                     P1=250;

                     play();

 

                     for(i=60000;i>0;i--);

                     for(i=60000;i>0;i--);

                     P1=30 ;

                     play();

              }

              if(P0==40){

                     P1=250;

                     play();

 

                     for(i=60000;i>0;i--);

                     for(i=60000;i>0;i--);

                     P1=40;

                     play();

              }

              if(P0==50){

                     P1=250;

                     play();

 

                     for(i=60000;i>0;i--);

                     for(i=60000;i>0;i--);

                     P1=50;

                     play();

              }

              if(P0==60){

                     P1=250;

                     play();

 

                     for(i=60000;i>0;i--);

                     for(i=60000;i>0;i--);

                     P1=60 ;

                     play();

              }

              if(P0==70){

                     P1=250;

                     play();

 

                     for(i=60000;i>0;i--);

                     for(i=60000;i>0;i--);

                     P1=70  ;

                     play();

              }

              if(P0==80){

                     P1=250;

                     play();

 

                     for(i=60000;i>0;i--);

                     for(i=60000;i>0;i--);

                     P1=80;

                     play();

              }

              if(P0==90){

                     P1=250;

                     play();

 

                     for(i=60000;i>0;i--);

                     for(i=60000;i>0;i--);

                     P1=250;

                     play();

 

                     for(i=60000;i>0;i--);

                     for(i=60000;i>0;i--);

                     P1=90 ;

                     play();

              }

              if(P0==100){

                     P1=250;

                     play();

 

                     for(i=60000;i>0;i--);

                     for(i=60000;i>0;i--);

                     P1=100;

                     play();

              }

              if(P0==110){

                     P1=250;

                     play();

 

                     for(i=60000;i>0;i--);

                     for(i=60000;i>0;i--);

                     P1=110;

                     play();

              }

              if(P0==120){

                     P1=250;

                     play();

 

                     for(i=60000;i>0;i--);

                     for(i=60000;i>0;i--);

                     P1=120;

                     play();

              }

              if(P0==130){

                     P1=250;

                     play();

 

                     for(i=60000;i>0;i--);

                     for(i=60000;i>0;i--);

                     P1=130;

                     play();

              }

              if(P0==140){

                     P1=250;

                     play();

 

                     for(i=60000;i>0;i--);

                     for(i=60000;i>0;i--);

                     P1=140 ;

                     play();

              }

              if(P0==150){

 

                     P1=150;

                     play();

              }

              if(P0==170){

 

                     P1=170 ;

                     play();

              }

              if(P0==190){

 

                     P1=190 ;

                     play();

              }

              if(P0==200){

 

                     P1=200;

                     play();

              }

              if(P0==210){

 

                     P1=210;

                     play();

              }

              if(P0==220){

 

                     P1=220;

                     play();

              }

              if(P0==230){

 

                     P1=230;

                     play();

              }

              if(P0==240){

                     P1=240;

                     play();

              }

 

      

附錄3  英文資料

Power Management Techniques and Calculation

Relevant Devices

This application note applies to the following devices: C8051F000, C8051F001, C8051F002, C8051F005, C8051F006, C8051F010, C8051F011, C8051F012, C8051F012, C8051F015, C8051F016, and C8051F017.

Introduction

This application note discusses power management techniques and methods of calculating power in a Cygnet C8051F00x and C8051F01x Sock. Many applications will have strict power requirements, and there are several methods of lowering the rate of power consumption without sacrificing performance. Calculating the predicted power use is important to characterize the system’s power supply requirements.

Key Points

• Supply voltage and system clock frequency strongly affect power consumption.

• Cygnet’s Sock’s feature power management modes: IDLE and STOP.

• Power use can be calculated as a function of system clock frequency, supply voltage, and enabled peripherals.

Power Saving Methods

CMOS digital logic device power consumption is affected by supply voltage and system clock (SYSCLK) frequency. These parameters can be adjusted to realize power savings, and are readily controlled by the designer. This section discusses these parameters and how they affect power usage.

Reducing System Clock Frequency

In CMOS digital logic devices, power consumption is directly proportional to system clock (SYSCLK) frequency: power=CV2ƒ, where C is CMOS load capacitance, V is supply voltage, and ƒ is SYSCLK frequency.

Equation 1.CMOS Power Equation

The system clock on the C8051Fxxx family of devices can be derived from an internal oscillator or an external source. External sources may be a CMOS clock, RC circuit, capacitor, or crystal oscillator. For information on configuring oscillators, see application note: “AN02 - Configuring the Internal and External Oscillators.” The internal oscillator can provide four SYSCLK frequencies: 2, 4, 8, and16 MHz. Many different frequencies can be achieved using the external oscillator.

To conserve power, a designer must decide what the fastest needed SYSCLK frequency and required accuracy is for a given application. A design may require a constant SYSCLK frequency during all device operations. In this case, the designer will choose the lowest possible frequency required, and use the oscillator configuration that consumes the least power. Typical applications include serial communications, and periodic sampling with an ADC that must be performed.

Some operations may require high speed operation, but only in short, intermittent intervals. This is sometimes referred to as “burst” operation. In the C8051Fxxx, the SYSCLK frequency can be changed at anytime. Thus, the device can operate at low frequency until a condition occurs that requires high frequency operation.

Two examples of alternating between SYSCLK sources are (1) an internal oscillator/external crystal configuration, and (2) an external crystal/RC oscillator configuration. If the device is used for occasional high speed data conversion, and a real-time clock is used for time-stamping the data, a combination internal oscillator and external crystal would be ideal. During sampling operations, the high speed internal oscillator would be used. When sampling is complete, the device could then use an external 32 kHz crystal to maintain the real-time clock. Once high speed operations are required again, the device switches to the internal oscillator as necessary (see Figure 1below). An example of this procedure is illustrated in application note “AN008 Implementing a Real-Time Clock”.

The crystal oscillator and internal oscillator may be operated simultaneously and each selected as the SYSCLK source in software as desired. To reduce supply current, the crystal may also be shutdown when using the internal oscillator. In this case, when switching from the internal to external oscillator the designer must consider the start-up delay when switching the SYSCLK source. The C8051F0xx devices have a flag that is set when the external clock signal is valid (XTLVLD bit in the OSCXCN register) to indicate the oscillator is running and stable. This flag is polled before switching to the external oscillator. Note that other operations can continue using the internal oscillator during the crystal start-up time.

Some applications require intermittent high speed and accuracy (e.g., ADC sampling and data processing), but have lower frequency and accuracy requirements at other times (e.g., waiting for sampling interval), a combination of an external oscillator and RC circuit can be useful. In this case, the external RC oscillator is used to derive the lower frequency SYSCLK source, and the crystal is used for high frequency operations. The RC circuit requires a connection to VDD (voltage source) to operate.

Because this connection could load the crystal oscillator circuit while the crystal is in operation, we connect the RC circuit to a general purpose port pin (see Figure 2 below). When the RC circuit is in use, the port pin connection is driven high (to VDD) by selecting its output mode to “push-pull” and writing a ‘1’ to the port latch. When the crystal oscillator is being used, the port pin is placed in a ‘hi- Z’ condition by configuring the output mode of the port to “open-drain” and writing a ‘1’ to the port latch. Note the RC circuit may take advantage of the existing capacitors used for the crystal oscillator.

The start-up of the RC-circuit oscillator is nearly instantaneous. However, there is a notable start-up time for the crystal. Therefore, switching from the RC oscillator to the external crystal oscillator using the following procedure:

1. Switch to the internal oscillator.

2. Configure the port pin used for the RC circuit voltage supply as open-drain and write a ‘1’ to the port pin (Hi-Z condition).

3. Start the crystal (Set the XFCN bits).

4. Wait for 1 ms.

5. Poll for the External Crystal Valid Bit (XTLVLD --> ‘1’).

6. Switch to the external oscillator.

Switch from the external crystal oscillator to the RC oscillator as follows:

1. Switch to the internal oscillator.

2. Shutdown the crystal (clear the XFCN bits).

3. Drive the voltage supply port pin high (to VDD) by putting the port pin in “push pull” mode and writing a ‘1’ to its port latch.

4. Switch back to the external oscillator.

 

 

 

 

 

 

 

 

Supply Voltage

The amount of current used in CMOS logic is directly proportional to the voltage of the power supply. The power consumed by CMOS logic is proportional the power supply voltage squared (See Equation 1). Thus, power consumption may be reduced by lowering the supply voltage to the device. The C8051Fxxx families of devices require a supply voltage of 2.7-3.6 Volts. Thus, to save power, it is recommended to use a 3.0 volt regulator instead of a 3.3 volt regulator for power savings.

CIP-51 Processor Power Management Modes

The C8051 processor has two modes which can be used for power management. These modes are IDLE and STOP.

IDLE Mode

In IDLE Mode, the CPU and FLASH memory are taken off-line. All peripherals external to the CPU remain active, including the internal clocks. The CPU exits IDLE Mode when an enabled interrupt or reset occurs. The CPU is placed in IDLE Mode by setting the Idle Mode Select Bit (PCON.0) to ‘1’.

When the IDLE Mode Select Bit is set to ‘1’, the CPU enters IDLE Mode once the instruction that sets the bit has executed. An asserted interrupt will clear the IDLE Mode Select Bit and the CPU will vector to service the interrupt. After a return from interrupt (RETI), the CPU will return to the next instruction following the one that had set the IDLE Mode Select Bit. If a reset occurs while in IDLE Mode, the normal reset sequence will occur and the CPU will begin executing code at memory location 0x0000.

As an example, the CPU can be placed in IDLE while waiting for a Timer 2 overflow to

Initiate a sample/conversion in the ADC. Once the conversion and sample processing is complete, the ADC end-of-conversion interrupt wakes the CPU from IDLE Mode and processes the sample. After the sample processing is complete, the CPU is placed back into IDLE Mode to save power while waiting for the next interrupt.

As another example, the CPU may wait in IDLE Mode to save power until an external

Interrupt signal is used to “wake up” the CPU as needed. Upon receiving an external interrupt, the CPU will exit IDLE Mode and vector to the corresponding interrupt vector (e.g., / INT0 or /INT1).

STOP Mode

The C8051 STOP Mode is used to shut down the CPU and oscillators. This will effectively shut down all digital peripherals as well. All analog peripherals must be shutdown by software prior to entering STOP Mode. The processor exits STOP Mode only by an internal or external reset. Thus, STOP Mode saves power by reducing the SYSCLK frequency to zero.

Note that the Missing Clock Detector will cause an internal reset (if enabled) that will terminate STOP Mode. Thus, the Missing Clock Detector should be disabled prior to entering STOP Mode if the CPU is to be in STOP Mode longer than the Missing Clock Detector timeout (100 μs).

The C8051 processor is placed in STOP Mode by setting the STOP Mode Select Bit (PCON.1) to ‘1’. Upon reset, the CPU performs the normal reset sequence and begins executing code at 0x0000. Any valid RESET source will exit STOP Mode. Sources of reset to exit STOP Mode are External Reset (/RST), Missing Clock Detector, Comparator 0, and the External ADC Convert Start (/CNVSTR).

As an example, the CPU may be placed in STOP Mode for a period to save power when no device operation is required. When the device is needed, Comparator 0 reset could be used to “wake up” the device.

Generally, a power conscious design will use the lowest voltage supply, lowest SYSCLK frequency, and will use Power Management Modes when possible to maximize power savings. Most of these can be implemented or controlled in software.

Calculating Power Consumption

There are two components of power consumption in Cygnet’s C8051F00x and C8051F01x family of devices: analog and digital. The analog component of power consumption is nearly constant for all SYSCLK frequencies. The digital component of power consumption changes considerably with SYSCLK frequency. The digital and analog components are added to determine the total power consumption.

The current use calculations presented in this application note apply to the C8051F00x and C8051F01x (‘F000, 01, 02, 03, 05, 06, 10, 11, 12, 15, and 16) family of Cygnet devices.

The data sheet section, “Global DC Electrical Characteristics” contains various supply current values for different device conditions. The current values are separated into digital (at three example frequencies) and analog components. The analog numbers presented are values with all analog peripherals active. Supply current values for each analog peripheral can be found in the data sheet section for the peripheral.

For convenience, the Global DC Electrical Characteristics for the C8051F00x and C8051F01x family of devices are presented in the table below.

Internal vs. External Oscillator

Besides using lower SYSCLK frequencies, the designer can realize power savings by making smart SYSCLK source choices. The internal oscillator will typically consume 200μA of current supplied from the digital power supply. The current used to drive an external oscillator can vary. The drive current (supplied from the analog power supply) for an external source, such as a crystal, is set in software by configuring the XFCN bits in the External Oscillator Control Register (OSCXCN). Thus, at higher drive currents the user may save power by using the internal oscillator. However, at the lowest XFCN setting the external oscillator will use less than 1μA which is less current than used by the internal oscillator. Some typical measured current values are listed below. These measurements may vary from device to device. This drive level is kept as low as possible

To minimize power consumption, but must be high enough to start the external oscillator. The following table lists the current vs. External Oscillator Frequency Control Bit settings.

Digital Peripherals

For rough calculations, a good rule of thumb is to assume a 1mA/MHz of operating current (digital) + 1mA if the analog components (ADC, comparators, DAC, VREF, etc.) are enabled. This rule of thumb assumes a 3.6 V supply voltage. A lower supply voltage will reduce power consumption. At 2.7 V, the rule of thumb is 0.5mA/MHz (in NORMAL mode). The rules of thumb for rough calculations are presented in the table below:

Analog Peripherals

The individual supply current values for each analog peripheral are posted in the data sheet section for that component (typically near the end of the section). It is recommended to disable all peripherals not in use to save power. For convenience, the C8051F00x and C8051F10x analog peripherals supply current values are listed below:

Calculating Total Current

When the required SYSCLK frequency, supply voltage, and peripherals have been determined, the total supply current can be estimated. To calculate the total supply current, the analog peripheral current use (found by adding the currents of each of the enabled analog peripherals) is added to the digital current use (calculated for a given frequency, power mode, and supply voltage). If all of the analog peripherals are enabled, analog current use is about 1mA.

Example Calculations

The following are examples of supply current calculations. Each application may use different power modes, SYSCLK frequencies, and peripherals at different times. Thus, power management specifications may require several different supply current calculations. The digital component and analog components of current use are found separately, and then added together for the total.

Example 1

The C8051F000 device is being used in a system with VDD=3.6 V. An ADC is sampling parameters and processing the sample for an output to one DAC. Because of the sampling and processing requirements of the application, SYSCLK frequency is 16 MHz using the internal oscillator.

Analog Components

Peripheral Supply Current (μ A)

ADC 450

VREF (internal) 50

Internal Oscan. 200

One DAC 110

VDD monitor 15

Total Analog 825

Digital Component

In NORMAL Mode @ 16 MHz;

1mA/M Hz * 16 MHz = 16mA

Total

825μA (analog) + 16mA (digital)= 16.8mA

Example 2

Assume we are still estimating the supply current in the same application in Example 1. If the sample processing is a burst operation (i.e., intermittent need for sampling and conversions), we may choose to place the CIP-51 in IDLE Mode to allow a Timer to wake-up the CIP-51 after a specified interval. In this case, the average supply current can be calculated in order to estimate power requirements. The device will switch between NORMAL Mode (for sampling and data conversion) and IDLE Mode (between sample processing operations). The switch between IDLE and NORMAL Modes (and supply current values) will happen in a cycle with a period equal to the sampling rate. (See Figure 3 below). This will allow us to calculate average supply current, after we calculate the supply current in IDLE Mode.

Analog Component

Analog peripherals are disabled during the IDLE Mode period between sample processing and output. Thus, analog current consumption is just:

VDD monitor = 15μA.

Digital Component

In IDLE Mode @ 16 MHz;

0.65mA/MHz * 16 MHz = 10.4mA

Total

The analog component would be considered negligible in most applications, thus, the total is just the digital component:

50μA (analog) + 10.4mA (digital) = 10.4mA

Now that we have calculated IDLE Mode supply current and NORMAL Mode supply current (in Example 1), we must calculate the time we spend in each mode to find the average current the device will use.

Assuming the ADC is in low-power tracking mode and at the maximum SAR conversion

Clock of 2 MHz (ADC set for SAR clock = SYSCLK/8), and we desire a 10 kHz sampling rate. The period of the power cycle in Figure 3 is 1/10,000 (sample rate) = 100μs.

The time in NORMAL Mode will be the ADC tracking/conversion time, and the time to store the value in memory. In low-power tracking mode, it will take 3 SAR clocks for tracking, and 16 SAR clocks for conversion. 19 SAR clocks at 2 MHz will take 9.5μs. To store the number will take to system clock cycles, or 0.125μs. To enter NORMAL Mode, a move instruction is executed, taking 3 SYSCLK cycles which takes 0.188μs. Thus, the total time in NORMAL Mode is 9.5 μs+0.125 μs+0.188μs = 9.8μs.

Because the ADC sample period is 100μs, the time we may be in IDLE Mode during the power cycle is 100μs - 9.8μs (time in NORMAL Mode) = 90.2μs. By integrating the area under the curve in Figure 3 for one period (100μs), and dividing that number by the period, the average supply current is 11mA.

 

 

 

 

 

 

 

 

Example 3

If the oscillator frequency were lowered while in IDLE Mode (in Example 2) to 32 kHz using an external crystal for additional power savings, the current use would be:

The external oscillator control bits will be set to XFCN = 000. This uses 0.6μA of analog current. (0.65mA *.032 MHz) + 0.6μA = 21μA

This is a dramatic difference from Example 2’s IDLE Mode at 16 MHz, by simply reducing oscillator frequency.

Continuing with the average supply current calculation in Example 2 (with 6 extra SYSCLK cycles in NORMAL Mode to lower the frequency), the average supply current would be 1.7mA!

Example 4

In this application, the C8051F000 is being used to sample a parameter using the ADC and store samples in memory, with high accuracy timing of samples required. For more accurate timing, the SYSCLK is derived from an external 18.432 MHz crystal oscillator. To save power, the designer has decided to use a supply voltage of 3.0 V. Timer 2 is used to time the ADC sampling intervals.

Digital Component

In NORMAL Mode @ 18.432 MHz;

0.8mA/MHz * 18.432 MHz = 14.7mA

Total Current Use

3.4mA (analog)+14.7mA (digital)= 18.1mA

Example 4 in IDLE Mode

Placing the application in IDLE Mode with the ADC disabled during intervals that sampling is not required (no CIP-51 operations are needed; digital peripherals continue to operate) will save power if the sampling operation is a burst operation. In IDLE Mode, the digital current consumption is only 0.6mA/MHz, with no ADC, thus the current consumption at 18.432 MHz =11.1 miscalculating the average supply current for one sample period (similarly to Example 2, assuming a 10 kHz sampling rate and low-power tracking mode), the average current is estimated to be 11.9mA

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

附錄4  英文資料翻譯

電源管理技術及計算

本設計應用于下列器件

C8051F000、C8051F001、C8051F002、C8051F005、C8051F006、C8051F010、C8051F011、C8051F012、C8051F015、C8051F016、C8051F017

1 引言

本應用筆記討論電源管理技術及計算C8051F00x和C8051F01x Sock中的功率消耗的方法。很多應用系統對功耗有嚴格的要求,也存在幾種不以犧牲性能為代價的降低功耗的方法,計算預計功耗對于說明系統的供電要求是很重要的 。

2 關鍵點

供電電壓和系統時鐘頻率對功率消耗有很大影響 。

Cygnet的Sock有兩種電源管理方式等待和停止。

功率消耗可以作為系統時鐘電源電壓和被允許的外設的函數來計算。

3 降低功耗的方法

CMOS數字邏輯器件的功耗受供電電壓和系統時鐘(SYSCLK)頻率的影響。可以通過調整這些參數來降低功耗,設計者也很容易控制這些參數。本節討論這些參數及它們對功率消耗的影響 。

4 降低系統時鐘頻率

在CMOS數字邏輯器件中,功耗與系統時鐘(SYSCLK)頻率成正比:

功耗 = CV2f

其中C是CMOS的負載電容,V是電源電壓,f是SYSCLK的頻率 。

C8051Fxxx系列器件的系統時鐘可以來自內部振蕩器或一個外部時鐘源。外部源可以是一個CMOS時鐘、RC電路、電容或晶體振蕩器。有關振蕩器配置方面的信息見應用筆記–“ 配置內部和外部振蕩器”。內部振蕩器可提供四個時鐘頻率2、4、8 和16 MHz。很多不同的頻率可以通過使用外部振蕩器得到,為了節省功耗設計者必須知道給定應用所需要的最高SYSCLK頻率和精度。一個設計可能需要一個在器件全部工作時間內保持不變的SYSCLK頻率。在這種情況下,設計者將選擇滿足要求的最低頻率,采用消耗最低功率的振蕩器配置。典型的應用包括串行通信和必須用ADC完成的周期性采樣。

某些操作可能要求高速度,但只是在很短的、斷續的時間間隔內。這種情況在某些時候被稱為“猝發”操作。在C8051Fxxx中,SYSCLK頻率可在任何時刻改變,因此器件平時可工作在較低的頻率,直到某個需要高速操作的條件發生。

切換系統時鐘源的兩個例子是(1)內部振蕩器/外部晶體配置,(2)外部晶體/RC振蕩器配置。如果器件偶爾進行高速數據轉換,并使用一個實時時鐘為數據提供時間戳,則一個內部振蕩器和外部晶體的組合將是最理想的。在采樣操作期間應使用高速內部振蕩器。采樣結束后,使用一個外部32kHz晶體以維持實時時鐘。一旦重新需要高速操作,器件將切換到內部振蕩器(見圖1)。在應用筆記“ 實現一個實時時鐘”中給出了這種操作過程的一個例子。

圖1. 內部振蕩器和外部晶體源配置

晶體振蕩器和內部振蕩器可以同時工作,每一個都可以根據需要被選為系統時鐘源。為了減小電源電流,在使用內部振蕩器時可停止晶體振蕩器。在這種情況下,當從內部切換到外部振蕩器時,設計者必須考慮切換系統時鐘源時的起動延遲。C8051F0xx器件有一個指示外部時鐘信號有效的標志位(OSCXCN寄存器中的XTLVLD位),該標志在外部振蕩器穩定運行時置位。在切換到外部振蕩器之前應查詢該標志。注意:在外部晶體起動期間,其它操作可繼續使用內部振蕩器。

某些應用需要間歇的高速度和高精度(例如ADC采樣和數據處理),但在其它時間可允許低速度和低精度(例如等待采樣時),這時可以用到外部振蕩器和RC電路的組合。在這種情況下,外部RC振蕩器用于產生低頻SYSCLK源,而晶體用于高頻率操作。RC電路需要接到VDD(電壓源)才能工作。由于在晶體處于工作狀態時,這種連接可能加載晶體振蕩器電路,我們將RC電路接到一個通用端口引腳(見圖2),當使用RC電路時,與之連接的端口引腳被驅動到高電平(到VDD),這可以通過選擇端口為“推挽”輸出方式并向端口鎖存器寫“1”來實現。當使用晶體振蕩器時,端口引腳被置于“高阻”狀態,這是通過設置端口為“漏極開路”輸出方式,并向端口鎖存器寫“1”來實現的。注意:RC電路可以利用晶體振蕩器電路中已有的電容 。

RC電路振蕩器的起動幾乎是瞬間完成的,然而晶體振蕩器的起動時間是比較可觀的。因此從RC振蕩器切換到外部晶體振蕩器時要經過下列過程 :

a. 切換到內部振蕩器 。

   b. 將作為RC電路電源的端口引腳設置為漏極開路并向該端口引腳寫“1”(高阻狀態)。

c. 起動晶體(設置XFCN位)。

d. 等待1ms 。

e. 查詢外部晶體有效位(XTLVLD --> ‘1’ )。

f. 切換到外部振蕩器。

從外部晶體振蕩器切換到RC振蕩器的步驟如下

a. 切換到內部振蕩器。

b. 關閉晶體振蕩器(清除XFCN位)。

c. 驅動電源端口引腳到高電平(到VDD),通過選擇端口為“推挽”輸出方式并向端口鎖存器寫“1”來實現 。

d. 切換到外部振蕩器。

圖2. 外部RC和晶體振蕩器配置

5 電源電壓

CMOS邏輯電路中的電流與電源電壓成正比。CMOS邏輯電路的功耗與電源電壓的平方成正比(見方程1)。因此降低器件的供電電壓可以減小功耗,C8051Fxxx系列器件所要求的電源電壓為2.7-3.6V。為了減小功耗,建議使用3.0V的穩壓器而不采用3.3V的穩壓器 。

CIP51處理器電源管理方式

C8051處理器有兩種電源管理方式。這兩種方式為等待方式和停機方式 。

6 等待方式

在等待方式下,CPU和FLASH存儲器停止工作。所有外設都處于工作狀態,包括內部時鐘。在有中斷(被允許的中斷)產生或發生系統復位時CPU退出等待方式。可通過將等待方式選擇位(PCON.0)設置為‘1’使CPU進入等待狀態 。

當等待方式選擇位被置‘1’時,一旦設置該位的那條指令執行完,CPU立即進入等待狀態。有中斷發生后,等待方式選擇位將被清除,CPU將轉入中斷服務程序。從中斷返回后(RETI),CPU將進入設置等待方式選擇位那條指令的下一條指令。如果在等待方式下有復位條件產生,將產生正常的復位過程,CPU將從存儲器地址0x0000開始執行程序 。

例如,CPU被置于等待方式,等待定時器2溢出后啟動一次A/D轉換。一旦轉換過程結束,ADC轉換結束中斷將CPU從等待狀態喚醒,開始處理采樣值。在樣本處理過程結束后,CPU又重新被置于等待方式以節省功耗,同時等待下一次中斷 。

另一個例子,CPU平時處于等待方式以節省功耗,在需要時用一個外部中斷信號將其“喚醒”。在收到外部中斷時,CPU將退出等待方式并轉到相應的中斷服務向量(例如/INT0或/INT1)。

7 停機方式

C8051的停機方式用于停止CPU和振蕩器。這將使所有數字外設都停止工作。在進入停機方式前必須用軟件將所有的模擬外設關閉,只有內部或外部復位可以使處理器退出停機方式。實際上停機方式節省功耗是靠將SYSCLK頻率降低到0 。

注意:時鐘丟失檢測器會產生一個內部復位(如果被允許),這個內部復位將結束停機方式。因此如果要使CPU處于停機狀態的時間大于時鐘丟失檢測器的超時時間(100 μs),則在進入停機方式之前應禁止時鐘丟失檢測器。

通過將停機方式選擇位置‘1’使C8051處理器處于停機方式。在復位時,CPU完成正常的復位過程并從0x0000地址開始執行程序,任何有效的復位源都可以使CPU退出停機方式。能使CPU退出停機方式的復位源是:外部復位(/RST)、時鐘丟失檢測器、比較器0、外部ADC轉換啟動信號(/CNVSTR)。

例如,CPU在不需要工作的一段時間內可以被置于停機方式以節省功耗,在需要工作時用用比較器0復位信號將其“喚醒”。

一般來說,一個低功耗的設計應采用最低的電源電壓、最低的SYSCLK頻率,并盡可能地使用電源管理方式,以最大限度地節省功耗。這些條件中的大多數都可以用軟件實現或控制 。

8 功耗計算

在Cygnet 的C8051F00x和C8051F01x系列器件中消耗功率的兩大部件是:模擬部件和數字部件。模擬部件的功耗對于所有的SYSCLK頻率來說幾乎是不變的;數字部件的功耗隨著SYSCLK頻率的不同而有較大的變化。模擬部件和數字部件的功耗加在一起構成器件的總功耗 。

本應用筆記中所介紹的器件消耗電流的計算方法適用于C8051F00x和C8051F01x(F000、01、02、05、06、10、11、12、15和16系列器件 )。

數據手冊中“總體直流電氣特性”一節中給出了不同條件下器件的供電電流值。電流值被分為數字部件(在三種示例頻率下)和模擬部件兩部分。所給出的模擬電流值是所有模擬外設都工作時的數值。每個模擬外設的供電電流可以在數據手冊中與外設相關的章節中查到 。

9 內部和外部振蕩器比較

除了使用較低的SYSCLK頻率之外,設計者還可以通過合理地選擇時鐘源達到減小功耗的目的。內部振蕩器消耗數字電源電流的典型值為200 μA,用于驅動外部振蕩器的電流是變化的。對于一個外部振蕩源(例如一個晶體),驅動電流(由模擬電源提供)用軟件通過配置外部振蕩器控制寄存器(OSCXCN)的XFCN位來設置。在驅動電流較大時,用戶可以使用內部振蕩器以節省功耗,但是在最低的XFCN設置下,外部振蕩器使用不到1μA的電流,小于內部振蕩器所使用的電流。下面列出了幾個典型測量電流值。這些測量值對于不同的器件可能不一樣。驅動電平應保持最低以節省功耗,但又應足夠高以使外部振蕩器能夠起振。下表列出了電流與外部振蕩器頻率控制位設置的關系。

10 數字外設

對于粗略的計算,一個經驗公式是假設1mA/MHz的工作電流+1mA,如果模擬部件(ADC、比較器、DAC、VREF等被允許)。這個經驗公式假定使用3.6V的電源電壓。較低的電源電壓將使功耗降低。在2.7V經驗公式為 0.5mA/MHz(在正常方式)。下表列出了用于估算電源電流的經驗數據 。

數字電流消耗典型值

電源方式

VDD=2.7V

VDD=3.6V

正常

0.5mA/MHz

1.0mA/MHz

等待

0.33mA/MHz

0.65mA/MHz

 

注意:數字電源電流與使用多少個數字外設無關 ,電源電流與SYSCLK的頻率及電源  電壓成正比。

11 模擬外設

每個模擬外設的供電電流值都在數據表中關于這個外設的部分給出(通常在該部分的最后)。建議禁止所有不用的外設部件以降低功耗。為方便起見,將C8051F00x和C8051F01x模擬外設的供電電流值列于下表:

C8051F0xx模擬外設供電電流

 

模擬外設

典型電流值μA

VDD監視器

總處于允許狀態

8VDD=2.7V

15VDD=3.6V

ADC

450

VREF內部

50帶隙基準和驅動器

溫度傳感器

10

比較器

1.5每個

DAC

110每個

內部振蕩器

使用數字電源

200

 

注意:模擬功耗與SYSCLK頻率相對無關。

12 總電流計算

當所需要的SYSCLK頻率、電源電壓及外設部件都已經確定后,可以估算總的電源電流。所使用的模擬外設電流(將每個被允許的模擬外設的電流加在一起)加上所使用的數字電流(在給定頻率、電源方式和電源電壓下計算)就得到總的電源電流。如果所有的模擬外設都被允許,則所用模擬電流大約為1mA 。

13 計算舉例

下面是電源電流計算的幾個例子。每個應用在不同的時間,可以使用不同的電源方式、SYSCLK頻率和外設部件。因此,功率管理指標需要幾種不同的電源電流計算。數字部件和模擬部件所使用的電流分別計算然后加到一起得到總電流 。

例1

在一個VDD=3.6V的系統中使用C8051F000器件。ADC對一個參數采樣,將樣本處理后經DAC輸出。由于在該應用中需要進行采樣和處理,選擇內部振蕩器提供16MHz的SYSCLK頻率 。

模擬部件:

外設

供電電流μA

ADC

450

VREF內部

50

內部振蕩器

200

一個DAC

110

VDD監視器

15

總模擬電流

825

 

 

 

數字部件:在正常方式工作頻率為16 MHz;1mA/MHz * 16 MHz = 16mA

總電流:825μA(模擬)+ 16mA(數字)= 16.8mA

例2

假設我們仍然估算例1中同一個應用的電源電流。如果采樣處理是一個猝發操作(即間歇性地需要采樣和轉換),我們可以選擇平時將CIP-51置于等待方式,經過一個規定的時間間隔后,再用一個定時器將其“喚醒”。在這種情況下,可以通過計算平均電流來估算功率需求。器件將在正常方式(用于采樣和數據轉換)和等待方式(在兩個采樣處理操作之間)之間切換。在正常方式和等待方式之間切換的周期等于采樣速率。這就允許我們在計算了等待方式的電源電流之后計算平均電源電流。

模擬部件:

在兩次采樣處理和輸出之間,器件處于等待方式,模擬外設被禁止。這種情況下模擬電流消耗為 :

VDD監視器 = 15μA

數字部件:

在等待方式,工作頻率為16 MHz

0.65mA/MHz * 16 MHz = 10.4mA

總電流

在大多數應用中,模擬部件的功耗可以被忽略,這樣一來總電流就是數字部件的電流 :

50 μA(模擬)+ 10.4mA(數字)= 10.4mA

注意,我們已經計算了等待方式下的電源電流和正常方式下的電源電流(在例1中)。我們還必須計算在每種方式下所消耗的時間,以計算所用器件的平均電流 。

假設ADC工作在低功耗跟蹤方式,使用最大的2MHz SAR轉換時鐘(ADC設置為:SAR時鐘 = SYSCLK/8),我們需要10kHz的采樣速率。圖3中的電源周期為 1/10,000(采樣速率)= 100 μs 。

處在正常方式下的時間是ADC跟蹤/轉換時間和將樣本保存到存儲器的時間。在低功耗跟蹤方式,需要3個SAR時鐘用于跟蹤和16個SAR時鐘用于轉換。這19個SAR時鐘在頻率為2MHz時需要9.5 μs。存儲采樣值需要兩個系統時鐘周期即0.125 μs。為了進入正常方式,要執行一條mov指令,需三個SYSCLK周期,即0.188μs。這樣在正常方式下的總時間為 9.5 μs + 0.125 μs+ 0.188 μs = 9.8 μs 。

因為ADC的采樣周期是100 μs,所以在電源周期中等待方式所占的時間為 100 μs – 9.8 μs(正常方式下的時間)= 90.2 μs。對圖3曲線下方的區域在一個周期(100 μs)內積分,然后除以周期值,得到平均電源電流為 11 mA 。16.8mA\10.4mA等待方式采樣周期時間數據采樣和轉換正常方式電流。

例3

如果在器件處于等待方式(在例2中)時使用一個外部振蕩器,使振蕩器的頻率降低到32kHz,可以進一步降低功耗。這時所用的電流是:

將外部振蕩器控制位設置為XFCN = 000。這樣將使用0.6 μA的模擬電流 。

(0.65mA * 0.032MHz) + 0.6 μA = 21 μA

這與例2中16MHz下的等待方式有驚人的差別,只是通過簡單地降低振蕩器頻率。

繼續進行列2中(在正常方式有6個附加的SYSCLK周期用于降低振蕩器頻率)的平均電流計算得到的平均電流為1.7mA 。

例4

在這個應用中,用C8051F000的ADC對一個參數采樣并將采樣值保存到存儲器中,需要對采樣精確定時。為了滿足更精確的定時要求,SYSCLK由一個外部18.432 MHz晶體振蕩器提供。為了節省功耗,設計者決定使用3.0V的電源電壓。定時器2用于對ADC采樣間隔定時 。

模擬部件:

外設

供電電流μA

ADC

450

外部振蕩器驅動器 XFCN=111

2900

VDD監視器

15

總模擬電流

3361

數字部件:

在正常方式,工作頻率為18.432MHz;0.8mA/MHz * 18.432 MHz = 14.7mA

總電流:3.4mA模擬+ 14.7mA數字= 18.1mA

例4 在等待方式時的電流

如果采樣操作是猝發式的在不需要采樣的時間段內將器件置于等待方式并禁止ADC不需CIP-51操作數字外設繼續工作將節省功耗在等待方式所消耗的數字電流僅為0.6mA/MHz如果沒有ADC轉換在18.432 MHz下電流消耗= 11.1mA

計算一個采樣周期內的平均電源電流與例2類似假設10 kHz的采樣頻率和低功耗跟蹤方式平均電流的估算值為 11.9mA.

 

致   謝

設計是我們的大學學習生活的最后一項學習任務,是對我們大學四年學習的綜合考核。為期兩個多月的設計過程中,我不僅較為系統的復習了以前學的知識,而且又學習了許多新知識,使我的知識更加系統化,更加完善。同時,也提高了獨立分析問題、解決問題的能力。相信設計一定會為我們在不久的將來踏上工作崗位打下了良好的實踐基礎。

本次設計能夠順利地完成,首先要感謝我的指導老師王錦教授。王教授嚴謹的治學態度,深厚的學術造詣以及忘我的工作精神給我留下了深刻的印象。王教授的嚴格要求和孜孜不倦的教導是我完成這次設計的重要保證,她給予了我很大的幫助和支持,在課題研究期間,王教授提供了很多指導性的意見,對存在的問題給予細心的分析并提出許多寶貴的意見,使我受益匪淺;同時為我們提供了良好的設計場所和試驗條件。在此謹向導師表示衷心的感謝!當然,我也要感謝給予我幫助和支持的朋友們,感謝在編程和電路調試過程中給我提供幫助的王博同學,感謝電子工程系的老師為我們做設計提供的各方面的幫助!

同時,我要感謝我的母校——天津工程師范學院。大學四年,這里留下了我們許多美好的回憶。特別是在我即將踏上工作崗位的同時,給了我這樣一個鍛煉、學習的機會,使我加深了對以前知識的理解,拓寬了知識面,也提高了我對所學知識的綜合的應用能力。我忠心地祝愿母校的未來更美好!

 

 

 

 
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线视频一区二区 | 精品日韩一区二区 | 国产一级影片 | www.狠狠操 | 色欧美片视频在线观看 | 欧美精品久久久久久久久老牛影院 | 国产成人jvid在线播放 | 欧美精品久久久久 | 日韩欧美中文 | 欧美日韩在线免费观看 | 国产精品毛片一区二区在线看 | 秋霞av国产精品一区 | 国产九九九九 | 国产精品久久久久aaaa | 久久av资源网 | 婷婷激情综合 | 欧美黑人激情 | 在线观看www高清视频 | 久久精品国产99国产精品 | 欧美v免费| 久久一级免费视频 | 国产精品成人一区二区三区吃奶 | 精品动漫一区 | 国产精品视频导航 | 久久久国产精品 | 免费观看av | 欧美日韩三级视频 | 精品不卡 | 九九热免费看 | 久久精品国产一区二区三区不卡 | 一区二区三区视频在线免费观看 | 国产成人免费在线 | 天天干国产 | 亚洲欧美一区二区三区1000 | av一二三四| 国产欧美一区二区三区另类精品 | 国产精品久久久久久久7电影 | 国产精品96久久久久久 | 亚洲网站在线播放 | 成人免费黄色 | 牛牛热在线视频 |