|
前言
不知不覺上大學(xué)已經(jīng)差不多一年了。這么長時間,我對大學(xué)有了更深的了解,深刻的認識到大學(xué)的高等教育跟以前的中學(xué)小學(xué)上課有著很大的不同。大學(xué)有著前所未有的自由度,在這自由的時光里,我們就可以在更大程度上支配我們的時間。因此在我的世界觀里,大學(xué)是一個想學(xué)什么就學(xué)什么的地方。因為我們在修專業(yè)課程的同時,我們也有時間來學(xué)習我們的興趣課程。對于我來說,單片機是我們大三的一門課程。而且在我認識它的過程中,發(fā)現(xiàn)它正是我感興趣的東西。那時候我加入了我們學(xué)校航空工程系的飛行器創(chuàng)新實驗室。由于我是唯一一個電子類專業(yè)的成員,所以我在實驗室將來的主要任務(wù)就是為旋翼飛行器的主控制單元——單片機編寫程序。所以負責這一塊的學(xué)長希望我能夠盡早掌握單片機的原理及應(yīng)用,早日投入到旋翼機的設(shè)計工作中。學(xué)長給我手機里傳了一本有關(guān)單片機學(xué)習的資料,在此之前我是從來沒有聽說過單片機這個名詞的。聽過學(xué)長的簡單介紹之后,發(fā)現(xiàn)單片機真是一種很有意思的東西,你給它輸入程序后,它會按照你的意愿去做,好像是你養(yǎng)的一只高智商寵物一樣。你怎么說,它就怎么做,不過我得學(xué)會用它能夠聽得懂的語言——機器語言跟它交流。這就涉及到KEIL軟件的使用和C程序設(shè)計問題。因此寒假期間我在家先看了一下C程序方面的簡單知識,就開始了單片機的學(xué)習。寒假期間先后學(xué)習了KEIL軟件的使用,簡單的編程語句,數(shù)碼管顯示原理和數(shù)碼管動靜態(tài)顯示,鍵盤檢測原理和其作用,A/D,D/A工作原理,中斷的概念,單片機內(nèi)部定時器原理及應(yīng)用。這時候我是很有成就感,當時唯一想做的就是買一塊和那本書配套的單片機學(xué)習板,在其上進行編程控制。大一下學(xué)期一開學(xué)我就網(wǎng)購了一塊那本書的配套單片機學(xué)習板,買回來之后我就迫不及待的在我的筆記本上裝上了相關(guān)的軟件,要說之前的都是理論學(xué)習,現(xiàn)在終于可以開始進行實踐編程了。當我第一次把我寫好的C程序代碼轉(zhuǎn)換為HEX文件,燒寫進單片機,板子上的發(fā)光管按照我的意愿亮起來時。心中是萬分喜悅,突然感覺那些高大上的高科技原來離我們這么近。那幾天,除了上課,基本上都坐在電腦前邊寫C程序代碼。看著板子上的器件我都基本上可以控制了,我就又想更進一步自己動手做一些自己的單片機作品。我在看那本書的配套視頻里聽郭天祥郭老師講:假如你畢業(yè)了到別人公司應(yīng)聘,人家問你會單片機嗎?你說會。那你都做過些什么東西呢?然后你吭哧半天說不出一個作品,人家肯定不會看好你。聽了這樣的話我做東西的想法更加強烈了。接著我就按著書中提及到的東西買了很多各種各樣的洞洞板和其它元件,還有就是各種工具:電烙鐵、焊錫、吸錫器之類的。準備做一個最簡單單片機最小系統(tǒng),經(jīng)歷了數(shù)次失敗之后我終于做好了我的第一個單片機作品——單片機最小系統(tǒng)。后來又做了一個紅綠燈模型,這個定時器是我的第三個單片機作品。下面介紹一下這個可設(shè)置時間定時器。
一 緒論
1.1設(shè)計概述
這是一個基于STC11F02E單片機的可設(shè)置時間定時器。以STC11F02E單片機為中心控制單元,外擴兩個獨立按鍵作為時間輸入設(shè)備,一個蜂鳴器和一個LED作為聲光示警設(shè)備,一個四位共陰數(shù)碼管配合一個74HC573鎖存器執(zhí)行時間顯示任務(wù),一個繼電器作為最終執(zhí)行終端。這個定時器的功能:輸入一個小于等于99分鐘59秒的時間,開始倒計時,時間到后,繼電器閉合。這個定時器可以作為各種電壓、電流較小的用電器(電流1A,交流電壓120V,直流電壓30V)的定時開關(guān)。
1.2 設(shè)計原因
我高中時候就想做一個定時炸彈,那時候簡單的了解了三極管的接法和作用,后來就用一個三極管,一個電子表,一個去了玻璃殼的燈珠(燈絲)設(shè)想了一個定時炸彈,經(jīng)過了好多次失敗后,我就沒有再做。后來我查資料,才發(fā)現(xiàn)三極管的應(yīng)用遠沒有那么簡單(我對三極管的學(xué)習從來沒有放棄,這學(xué)期剛開始的時候我除了學(xué)習單片機,還著重看了有關(guān)三極管方面的知識,現(xiàn)在已經(jīng)對三極管已經(jīng)有了一定的了解,具體到其內(nèi)部各區(qū)兩種載流子的流動)。因此,我就放棄了。在一個月前突然想起了那時候的定時炸彈,一直對它不甘心,如今我學(xué)會了單片機的應(yīng)用,我想驗證一下我學(xué)習單片機的成果,再說假如成功了,也算實現(xiàn)了我的一個愿望吧。再有就是,廣到制造工業(yè)、軍工領(lǐng)域,狹到玩具、家用電器,定時器應(yīng)該都能發(fā)揮一定作用,所以我這個定時器還是有一定用途的。
二 硬件
2.1 元件介紹
2.1.1蜂鳴器
蜂鳴器分為有源蜂鳴器和無源蜂鳴器兩種 (外觀如圖a、b所示),這里的“源”并不是指電源,而是震蕩源。這也是有源蜂鳴器直接接上額定電源(新的蜂鳴器在標簽上都有注明)就可連續(xù)發(fā)聲而無源蜂鳴器則和電磁揚聲器一樣,需要接在音頻輸出電路中才能發(fā)聲的原因。
b639ad6d-59a6-406e-98e9-76c08d8f65aa.png (47.33 KB, 下載次數(shù): 108)
下載附件
2016-6-18 01:28 上傳
a有源蜂鳴器 b無源蜂鳴器
一般來說,有源蜂鳴器比較貴一些,因為里面多個震蕩電路。當然不是有源蜂鳴器就比無源蜂鳴器要好,而是要看應(yīng)用場合了,有源蜂鳴器內(nèi)部帶震蕩源,所以只要一通電就會叫,這種蜂鳴器多適用于提示或報警,而無源蜂鳴器則一般適用于需要發(fā)出不同音調(diào)聲音的地方,即音樂或其它有音調(diào)變化的聲音。這個定時器上的蜂鳴器是聲音示警用的,所以用的是有源蜂鳴器。
2.1.2繼電器
繼電器是具有隔離功能的自動開關(guān)元件,廣泛應(yīng)用于遙控、遙測、通訊、自動控制、機電一體化及電力電子設(shè)備中,是最重要的控制元件之一。我覺得它的基本原理無非就是中學(xué)時候?qū)W的電磁鐵的應(yīng)用。
da9cb4e7-9e0d-4a8d-873e-da4b01f7a9d0.png (15.86 KB, 下載次數(shù): 106)
下載附件
2016-6-18 01:28 上傳
89fa09c9-4d72-4f69-9895-4250b19063c0.png (51.61 KB, 下載次數(shù): 102)
下載附件
2016-6-18 01:28 上傳
實物圖
2.1.3 數(shù)碼管
數(shù)碼管,我們可能在不只一處見到過它。價格便宜,使用簡單,在各種儀表及家電上有著廣泛的應(yīng)用。比如,空調(diào),熱水器,萬年歷,冰箱上都能看到它的影子。它能夠顯示不同的數(shù)字,來告訴我們當前室內(nèi)溫度,現(xiàn)在的時間,飯卡內(nèi)的余額等等。如下圖所示,這是我們經(jīng)常見到的七段顯示數(shù)碼管。
10792b2c-80ac-4ed3-8b5d-06dbb95c20bc.png (25.63 KB, 下載次數(shù): 108)
下載附件
2016-6-18 01:28 上傳
從圖中,我們可以看得出來,它可以顯示兩個個數(shù)字,稱之為二位數(shù)碼管,相應(yīng)的有一位、三位、四位的,這是從位數(shù)上分。從其內(nèi)部構(gòu)造上分,可為兩種:共陰數(shù)碼管和共陽數(shù)碼管。
ffad1266-b423-4450-a681-b37e9f723fd0.png (58.41 KB, 下載次數(shù): 96)
下載附件
2016-6-18 01:28 上傳
說到內(nèi)部結(jié)構(gòu),只有我們了結(jié)了其內(nèi)部結(jié)構(gòu),我們才能知曉其顯示原理。參照上圖,其實,從圖中a看出,一個八段數(shù)碼管其實是八個發(fā)光二極管并聯(lián)組合的,這八個發(fā)光二極管的連接方式有兩種,如圖b、c。b圖是共陰式連接,c圖是共陽式連接。分別對應(yīng)的實物就是上邊所說的共陰數(shù)碼管和共陽數(shù)碼管。欲使其顯示出某個數(shù)字,則只需點亮相應(yīng)的發(fā)光二極管即可。比如說,你想讓其顯示出阿拉伯數(shù)字“3”,就可以將發(fā)光二極管a.b.g.c.d點亮即可。數(shù)字的顯示都是變化的,所以一般來講數(shù)碼管大多都需單片機之類的中央控制單元來控制其顯示數(shù)字。圖a中那個一位數(shù)碼管有十個管腳,那么這十個管腳在數(shù)碼管內(nèi)部都是連接的什么呢?通過上邊的介紹,我們知道了數(shù)碼管的內(nèi)部構(gòu)造其實是幾個LED成數(shù)字狀排列的,連接方式是并聯(lián)連接(如圖b、c)。在圖中,我們看到的線頭其實就是數(shù)碼管引出的管腳。一般來說一位數(shù)碼管一般都是引出來十個管腳,有兩個管腳(gnd)是一樣的,就是說兩個管腳其實就是一根分出了兩支。這個數(shù)碼管是共陰數(shù)碼管,因為其公共端標注的是gnd。其他八個管腳就分別是八個發(fā)光二極管的陽極,這個gnd叫做數(shù)碼管的位選端,那八個陽極叫做數(shù)碼管的段選端。上邊說到數(shù)碼管顯示數(shù)字的方法,知道內(nèi)部結(jié)構(gòu)后,具體講,假如欲使數(shù)碼管顯示一個“3”,那么我們就將位選管腳接負極,段選管腳abgcd都接正極,最終就會在數(shù)碼管上顯示出來一個數(shù)字“3”,共陽數(shù)碼管同理。上邊介紹的是一位數(shù)碼管,二位,多位數(shù)碼管也都大同小異。只不過比一位數(shù)碼管多了幾個位選端而已。
2.2芯片簡介
2.2.1 STC11F02E單片機
單片機有成千上萬種,說實話,我目前接觸過的單片機型號無非就三種89C52RC、89C51RC、11F02E,其實用起來都一樣,都是51內(nèi)核的單片機。只是某些功能上會略有差異,比如說89C51RC和89C52RC不一樣在一個“1”,一個“2”上,這個“1”代表的是其芯片內(nèi)部儲存空間是4K,“2”是8K。后邊的“RC”代表STC單片機內(nèi)部RAM(隨機讀寫存儲器)為512B,有的后邊不是“RC”而是“RD+”表示內(nèi)部RAM為1280B。以上兩種單片機都是40管腳的。其體積相對都比11F02E要大,本定時器用的是20管腳的單片機11F02E單片機,因為它體積較小,且IO口剛好夠用 ,適合在較小的板子上集成,能滿足成品體積盡量小的要求。這種單片機只有兩組IO口,P1口,P3口。但是其內(nèi)核和其他兩個一樣有4組IO口,只是引出來的只有兩組罷了。還有之前有一點我不知道的就是,11F02E內(nèi)部自帶時鐘電路。我的程序?qū)懞煤鬅M單片機時,驚奇的發(fā)現(xiàn)定時器倒計時的速度并不是每秒減一,后來才知道原來我是用的其內(nèi)部的時鐘電路而不是外部晶振。后來在網(wǎng)友的幫助下,才知道像這種自帶內(nèi)部時鐘電路的單片機,在用下載器往單片機內(nèi)燒寫程序時需要進行相關(guān)設(shè)置。
2315d681-1892-41bd-8062-8edfa029af1b.png (25.4 KB, 下載次數(shù): 104)
下載附件
2016-6-18 01:28 上傳
54977d4c-90de-4b7e-a1cf-3bc7e0050d99.png (19.59 KB, 下載次數(shù): 105)
下載附件
2016-6-18 01:28 上傳
2.2.2 74HC573鎖存器
下圖是74HC573鎖存器的實物圖:
57aaa7f7-b4cc-4f38-ae12-634ba862cdd2.png (65.57 KB, 下載次數(shù): 99)
下載附件
2016-6-18 01:28 上傳
從圖中可以看出,這個芯片是一個20腳的芯片。每個芯片都有每個芯片的作用,就比如單片機可以作為中央控制單元。那么這個鎖存器在這個定時器上起一個什么作用呢?“鎖存器”三字里邊注意這個“鎖”字。鎖的是什么,鎖的是數(shù)據(jù)。下面看它的引腳圖和真值表。
06536d8c-f22d-48a7-8a6a-2db9ed62aaf6.png (55.1 KB, 下載次數(shù): 98)
下載附件
2016-6-18 01:28 上傳
總共是二十個管腳,Vcc、GND分別是該芯片的正極和地(負極)管腳,基本上每個芯片上都有這兩個管腳。OE的專業(yè)術(shù)語為三態(tài)允許控制端(低電平有效),通常叫做輸出允許端。LE叫做鎖存控制端。1D~8D為數(shù)據(jù)輸入端,1Q~8Q為數(shù)據(jù)輸出端。
上面,我們了解了鎖存器的管腳的定義,下面就介紹其“鎖”的作用。真值表中L是低電平,H是高電平,Q0是上次的電平狀態(tài),X是任意電平,Z是高阻態(tài),也就是既不是高電平也不是低電平,而它的輸出狀態(tài)與它相連接的其他器件(在這里與鎖存器相連接的是單片機的IO口)的電平狀態(tài)來決定。看真值表,當OE管腳為高電平時LE管腳和D管腳不論是什么電平狀態(tài),數(shù)據(jù)輸出管腳Q的電平狀態(tài)都為高阻態(tài),即鎖存器不起任何作用,相當于導(dǎo)線。所以,一般都要使OE端置低電平或直接接地。在OE為低電平的前提下,若LE端為低電平,數(shù)據(jù)輸入端D不論是高還是低,數(shù)據(jù)輸出端Q將保持上次的電平狀態(tài)。既只要LE端電平保持低電平不曾改變,無論數(shù)據(jù)輸入端的電平狀態(tài)如何改變,數(shù)據(jù)輸出端Q的電平狀態(tài)將保持不變,通俗地講,就是將數(shù)據(jù)輸出端的輸出的數(shù)據(jù)給鎖住了不能改變。若想把“數(shù)據(jù)鎖”打開換另外一組輸出數(shù)據(jù),直接將LE端置高即可。LE置高,置高期間將想要輸出的數(shù)據(jù)直接送入數(shù)據(jù)輸入端D,再將LE置低,數(shù)據(jù)就又被鎖住。此時數(shù)據(jù)輸出端輸出的數(shù)據(jù)就是在“上鎖”之前數(shù)據(jù)輸入端輸入的數(shù)據(jù)。該組數(shù)據(jù)在“上鎖(LE為低電平時)”后不隨數(shù)據(jù)輸入端輸入的數(shù)據(jù)的改變而改變。綜上所述,鎖存器的作用就是鎖存一個字節(jié)(8位(Q1~Q8))的數(shù)據(jù)。它的應(yīng)用一般都是為了節(jié)約IO口。但在本處的作用并不是為了節(jié)約IO 口,而是放大電流,這是鎖存器的第二個作用。因為單片機的輸出電流是不足以驅(qū)動發(fā)光二極管,所以在單片機驅(qū)動數(shù)碼管時,需要在單片機和數(shù)碼管之間加上電流放大器件,像實現(xiàn)單片機電流放大驅(qū)動數(shù)碼管一般都采用三極管,但是為了簡單起見我還是選擇了鎖存器。
2.3 制作過程
“凡事預(yù)則立,不預(yù)則廢”。這句話很有道理,在做每一件事之前,沒有充足的準備是不行的。我在焊接這個定時器之前,我也是斟酌再三,先是預(yù)算了一下所需元件的種類和數(shù)量,確定焊接這些東西所占面積最大可能是多少,確定了使用萬用板的規(guī)格是5*7cm的。然后將洞洞板上的每一個孔都在紙上排列出來,再將每個元件的管腳布局和數(shù)量一一陳列出來,在紙上將各元件進行一次模擬焊接,最終做到跳線的數(shù)量盡可能的少。最后確定下最終方案。確定下來之后,就開始焊接。焊接完成后,往單片機里燒寫一些簡單的試驗性程序,上電觀察硬件的運行情況。運行不正常,開始查找硬件問題,找到問題后,調(diào)整原來方案繼續(xù)檢查。最終硬件沒問題后,開始結(jié)合最終定形的硬件編寫程序。編寫程序前,以數(shù)碼管和單片機的連接情況為依據(jù)為數(shù)碼管顯示進行編碼,進而確定數(shù)碼管的顯示數(shù)組。再在草紙上大致規(guī)劃一下整個程序的結(jié)構(gòu)框圖,使程序模塊化,化整為零,使其結(jié)構(gòu)更清晰,減小程序編寫的繁瑣程度。完成后,開始用KEIL軟件編程,每一個模塊完成后都要在硬件上試驗一下,若有問題,繼續(xù)調(diào)試,運行情況和預(yù)想一致后就可以進入下一個模塊的編寫。最終逐個擊破,完成整個程序的編寫。現(xiàn)在硬件軟件結(jié)合,這個板子就成了有“靈魂”的硬件了,而不是一塊洞洞板和一個蜂鳴器,兩塊芯片,一個數(shù)碼管,兩個按鈕因為焊錫而粘連在一塊的不知名的東西了。它的名字叫做可設(shè)置時間定時器。通俗的講,這是幾個各自有自己特殊功能的東西以某種連接方式連接到一起形成的集合。在我告訴它使命之后,它就按照我的命令工作的機器。
2.4 功能操作
它的名字叫做“可設(shè)置時間定時器”,顧名思義,它是用來定時的,且定時時間是可以人為設(shè)置的。
234c6d19-401c-4f91-a869-271bf7cbb5b4.png (190.42 KB, 下載次數(shù): 115)
下載附件
2016-6-18 01:28 上傳
定時器實物圖
具體操作方法:插上5V電源后,按下總開關(guān),此時數(shù)碼管顯示如右圖所示。
fb1e65a4-3e66-46a3-a0a8-efba695c1436.png (50.44 KB, 下載次數(shù): 105)
下載附件
2016-6-18 01:28 上傳
此時,使用者就可以開始設(shè)置定時時間了,先按一次換位按鍵,數(shù)碼管顯示如下圖所示。
050f23f9-fe8b-47ca-be2a-bbf1af7070de.png (88.12 KB, 下載次數(shù): 96)
下載附件
2016-6-18 01:28 上傳
顯示正常,這時就可以開始設(shè)置定時時間分鐘的十位數(shù)字,按下一次加數(shù)鍵,十位數(shù)字加一(第四位顯示和第一位相同),到數(shù)字9后歸零。若分鐘十位數(shù)字設(shè)置完畢或不需要設(shè)置,直接按換位鍵選中下一位同第一位那樣進行分鐘個位數(shù)字設(shè)置,然后進行秒鐘十位數(shù)字設(shè)置,最后進行最后一位設(shè)置,若現(xiàn)在覺得前邊三位數(shù)字設(shè)置有不妥之處,可再次按下?lián)Q位鍵便可再次回到第一位設(shè)置環(huán)節(jié)。需要注意的是,四位必須全部設(shè)置后才可以開始倒計時,也就是說,在開始倒計時的前一步一定是設(shè)置第四位數(shù)字環(huán)節(jié)。一切設(shè)置妥當之后,就可以啟動倒計時了。啟動的方式是:先按住換位鍵不放,然后按下加數(shù)鍵,此時加數(shù)鍵松開之后,倒計時就開始了。
2.5 電路描述
由于目前我還沒有掌握任何一個軟件來畫電路圖,所以我只能把我的電路描述一下了。以單片機為中心,從鎖存器開始,鎖存器Vcc端和LE端接正極,OE和GND接地,1D接P1.7,2D接P1.6,3D接P1.5,4D接P1.4,5D接P1.3,6D接P1.2,7D接P1.1,8D接P1.0;Q1~Q8分別接四位共陰數(shù)碼管的8個段選;一位位選接P3.7,二位位選接P3.5,三位位選接P3.2,四位位選接P3.3;繼電器(繼電器的開關(guān)公共端引出2根排針,常閉端引出4根排針,常開端引出1根排針)的線圈端串聯(lián)一個1K電阻一端接Vcc,另一端接單片機的P3.4,蜂鳴器陽極接Vcc,陰極直接接單片機的P3.0,發(fā)光二極管的陽極接Vcc陰極串聯(lián)一個1K電阻然后接到單片機的P3.0(所以定時器工作時蜂鳴器響和二極管亮一直是同步的)。復(fù)位電路和時鐘電路(晶振11.0592MHZ,兩個起振電容用的是30PF瓷片電容)都是很典型的電路,就不再介紹了。
三 軟件
3.1 程序設(shè)計流程
3208d21a-d397-4220-966e-5843e15fd2fd.PNG (16.81 KB, 下載次數(shù): 114)
下載附件
2016-6-18 01:28 上傳
3.2 C程序代碼
#include
sbit key1=P3^0;
sbit key2=P3^1;
sbit go=P3^4;
int numt,fenshi=0,fenge=0,miaoshi=0,miaoge=0,a=0;
unsigned char code table[]={0xfa,0x22,0xb9,0xab,0x63,0xcb,0xdb,0xa2,0xfb,0xeb};
unsigned char code table1[]={0xfe,0x26,0xbd,0xaf,0x67,0xcf,0xdf,0xa6,0xff,0xef};
sbit wela1=P3^7;
sbit wela2=P3^5;
sbit wela3=P3^2;
sbit wela4=P3^3;
void delayms(int xms)//定義延時函數(shù)
{
int x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
void initial()//定時器初始化
{
TMOD=0x01;
EA=1;
ET0=1;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
}
void main()
{
initial();
while(1)//等待換位鍵按下否則數(shù)碼管保持初始顯示----
{
P1=0x01;//初始顯示----
wela1=wela2=wela3=wela4=0;
if(key1==0)
{
delayms(10);
if(key1==0)
while(!key1);
goto k0;//開始選中第一位
}
}
//輸入設(shè)定時間并時時顯示
k0: while(1)//選中第一位
{
if(key1==0)//檢測是否換下一位
{
delayms(10);
if(key1==0)
while(!key1);
goto k1;
}
wela1=0; wela2=wela4=wela3=1;
P1=table[fenshi];
delayms(5);
wela1=1;wela4=wela3=wela2=0;
P1=0x01;
delayms(5);
if(key2==0)
{
delayms(10);
if(key2==0)
{
fenshi++;//歸零
if(fenshi==10)
fenshi=0;
}
while(!key2);
}
} //while終止括號
k1: while(1)//選中第二位
{
if(key1==0)//檢測是否換下一位
{
delayms(10);
if(key1==0)
while(!key1);
goto k2;//換下一位
}
wela1=0; wela2=1;wela3=1;wela4=1;
P1=table[fenshi];
delayms(5);
wela2=0;wela3=wela4=wela1=1;
P1=table1[fenge];
delayms(5);
wela1=wela2=1;wela3=wela4=0;
P1=0x01;
if(key2==0)
{
delayms(10);
if(key2==0)
{
fenge++;//歸零
if(fenge==10)
fenge=0;
}
while(!key2);
}
}//while終止括號
k2:while(1)//選中第三位
{
if(key1==0)//檢測是否換下一位
{
delayms(10);
if(key1==0)
while(!key1);
goto k3;//換下一位
}
wela1=0; wela2=1;wela3=1;wela4=1;
P1=table[fenshi];
delayms(5);
wela2=0;wela3=wela4=wela1=1;
P1=table1[fenge];
delayms(5);
wela1=wela2=1;wela3=0;wela4=1;
P1=table[miaoshi];
delayms(5);
wela1=wela2=wela3=1;wela4=0;
P1=0x01;
if(key2==0)
{
delayms(10);
if(key2==0)
{
miaoshi++;//歸零
if(miaoshi==6)
miaoshi=0;
}
while(!key2);
}
}//while終止括號
k3:while(1)//選中第四位
{
if(key1==0)//檢測是否做出開始倒計時動作
{
delayms(10);
if(key1==0)
{
while(!key1);
if(key2==0)
{
delayms(15);
if(key2==0)
goto k4;//程序跳到倒計時狀態(tài)區(qū)
}
goto k0;//回去重新設(shè)置倒計時時間
}
}
wela1=0; wela2=1;wela3=1;wela4=1;
P1=table[fenshi];
delayms(5);
wela2=0;wela3=wela4=wela1=1;
P1=table1[fenge];
delayms(5);
wela1=wela2=1;wela3=0;wela4=1;
P1=table[miaoshi];
delayms(5);
wela1=wela2=wela3=1;wela4=0;
P1=table[miaoge];
delayms(10);
if(key2==0)
{
delayms(10);
if(key2==0)
{
miaoge++;//歸零
if(miaoge==10)
miaoge=0;
}
while(!key2);
}
if(key1==0&&key2==0)
{
delayms(15);
if(key1==0&&key2==0)
while(!key1);
goto k4;
}
}//while終止括號
k4: while(1)//開始進入倒計時狀態(tài)
{
TR0=1;//開總中斷
wela1=0;wela2=wela3=wela4=1;//數(shù)碼動態(tài)顯示倒計時分鐘秒鐘
P1=table[fenshi];
delayms(5);
wela2=0;wela1=wela3=wela4=1;//分鐘和秒鐘之間的點閃爍
if(numt>=0&&numt<=10)
P1=table1[fenge];
else
P1=table[fenge];
delayms(5);
wela3=0;wela2=wela1=wela4=1;
P1=table[miaoshi];
delayms(5);
wela4=0;wela2=wela1=wela3=1;
P1=table[miaoge];
delayms(5);
if(fenshi==0&&fenge==0&&(miaoshi<1||miaoshi==1&&miaoge==0))//判斷是否到達倒計時十秒內(nèi)
a=1;
if(a==1&&numt%5==0)
key1=0;
else key1=1;
if(a==0&&numt>=0&&numt<=3)//蜂鳴器每秒響一次
key1=0;
if(miaoge==-1)//各位之間進制規(guī)則設(shè)定
{
miaoge=9;
miaoshi--;
}
if(miaoshi==-1)
{
miaoshi=5;
fenge--;
}
if(fenge==-1)
{
fenge=9;
fenshi--;
}
if(fenshi==0&&fenge==0&&miaoshi==0&&miaoge==0)//判斷是否到定時時間
{
go=0;//繼電器閉合
while(1);//一切都結(jié)束了
}
}
}
void T0time() interrupt 1//中斷服務(wù)函數(shù)
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
numt++;
if(numt==20)
{
numt=0;
miaoge--;
}
}
我覺得程序是整個過程中最困難的地方,在做這個之前我甚至覺得,我還沒有這個能力去寫這個定時程序。看來我錯了,有的東西看起來很難,其實實踐過程是“車到山前必有路”,只要有恒心有毅力有信心,那都不是事兒!
四.整個過程遇到的問題和經(jīng)驗總結(jié)
1、有關(guān)內(nèi)部自帶時鐘電路單片機使用外部晶振問題:可以將外部晶振接上,在下載器里選擇下次上電使用外部晶振還是內(nèi)部RC。若選擇內(nèi)部RC,外部晶振是不起作用的,也不會有什么影響。 但請注意,若正在使用內(nèi)部RC但下載程序時選擇了下次啟動使用外部晶振,而你又沒有外部晶振,那你除非焊上外部晶振,否則你單片機一旦斷電,下次再上電就這個單片機就廢了。
2、STC11F02E單片機的串口引腳在連接其他部件的同時是燒不進去程序的。
3、STC11F02E單片機的P3.6管腳(同時也是復(fù)位管腳)不能接其他部件,接其他部件時候,要置低電平,否則會復(fù)位,導(dǎo)致程序不正常執(zhí)行。在11F02E單片機中復(fù)位管腳同時是該單片機P3口的一個IO口管腳,這個特殊的管腳用作復(fù)位還是IO口可以在下載器里進行設(shè)置如上圖。
|
|