4.1 系統(tǒng)功能描述 眾所周知,,現(xiàn)階段我國(guó)的能源缺口十分巨大,但人們的生產(chǎn)及生活又少不了能源,。以電力供求為例,,有些家用電器的耗電量很厲害,,如家庭取暖器、冷暖式空調(diào)等,。有些工廠是名符其實(shí)的耗電大戶,,如電解鋁、電解銅生產(chǎn)廠,,煉鋼廠等,。 如能采取一些合理化的用電方式,則可望能較大幅度地節(jié)能或節(jié)支,。其中的一個(gè)較好方法就是分時(shí)控制作業(yè)?,F(xiàn)階段,不僅工業(yè)用電而且生活用電均采取分時(shí)計(jì)費(fèi)的方法,。如果能將白天用電高峰期開(kāi)動(dòng)的一些設(shè)備改在夜晚用電低谷期使用,,則不僅可大幅減輕電網(wǎng)的負(fù)載,而且還可有效減輕用戶的用電費(fèi)用,。 我們以北京市電采暖低谷用電優(yōu)惠辦法實(shí)施細(xì)則來(lái)看,,電采暖用戶每年從11月1日起至次年3月31日止享受低谷用電優(yōu)惠,低谷優(yōu)惠時(shí)段為晚23:00至次日早7:00,。 同樣,,工業(yè)生產(chǎn)中,低谷用電的用戶也能享受到不少的優(yōu)惠,。 這里介紹的“工業(yè)生產(chǎn)節(jié)能時(shí)控器”就是用來(lái)定時(shí)控制生產(chǎn)設(shè)備工作的一種節(jié)能裝置,。由于其體積小、成本低,,不僅適合嵌入到各種能耗大的工控設(shè)備中進(jìn)行控制,,也適合居民的家用電器節(jié)能控制。節(jié)能節(jié)支的效果顯著,。 “工業(yè)生產(chǎn)節(jié)能時(shí)控器”的核心實(shí)際上是一臺(tái)基于單片機(jī)的數(shù)字電子鐘,,設(shè)有四位LED數(shù)碼管顯示,具有二個(gè)時(shí)間控制點(diǎn)(控制一路負(fù)載的通斷),。因要求其具有低成本及小體積,,因此設(shè)計(jì)時(shí)采用單片的精簡(jiǎn)型、小引腳單片機(jī)AT89C2051來(lái)實(shí)現(xiàn)“工業(yè)生產(chǎn)節(jié)能時(shí)控器”的所有功能,。 4.2 系統(tǒng)方案及電路設(shè)計(jì) 4.2.1 系統(tǒng)方案 圖4-1為“工業(yè)生產(chǎn)節(jié)能時(shí)控器”的系統(tǒng)構(gòu)成方框圖,,由單片機(jī)、按鍵輸入,、數(shù)碼管顯示器,、繼電器、蜂鳴器及電源等6部分組成。 單片機(jī)是整個(gè)系統(tǒng)的核心,,整個(gè)系統(tǒng)的所有運(yùn)行如:產(chǎn)生精確時(shí)鐘及計(jì)時(shí),,LED數(shù)碼管顯示器輸出掃描顯示,,輸出驅(qū)動(dòng)繼電器,、驅(qū)動(dòng)蜂鳴器、掃描按鍵輸入等,,均由單片機(jī)完成,。這里也使用了有口皆碑的小引腳、高性能,、低價(jià)位的精簡(jiǎn)單片機(jī):AT89C2051,。 按鍵輸入電路負(fù)責(zé)輸入單片機(jī)中一系列工作參數(shù)及功能設(shè)定:如進(jìn)行走時(shí)設(shè)置、定時(shí)設(shè)置,、…等,。 LED數(shù)碼管顯示器主要用以顯示走時(shí)及定時(shí)設(shè)置。 LED數(shù)碼管顯示器采用程序動(dòng)態(tài)掃描顯示,,這樣與靜態(tài)顯示相比,,可節(jié)約大量的外部元器件。 電源部分負(fù)責(zé)對(duì)整個(gè)系統(tǒng)供電,,平時(shí)交流電經(jīng)降壓后,,整流、濾波,、穩(wěn)壓成5V直流電源供系統(tǒng)工作,,當(dāng)交流電源斷電時(shí),則由3.6V鎳鉻電池進(jìn)行后備供電,,保持走時(shí)準(zhǔn)確,,但此時(shí)LED數(shù)碼管顯示器關(guān)閉顯示,以降低3.6V鎳鉻電池的消耗,。 圖4-1 工業(yè)生產(chǎn)節(jié)能時(shí)控器方框圖 4.2.2 單片機(jī)計(jì)時(shí)原理 單片機(jī)作精確的電子鐘使用,,其根本原因是利用了單片機(jī)內(nèi)部的一個(gè)16位定時(shí)器(T0或T1),通過(guò)設(shè)置,,使T0(或T1)產(chǎn)生一定時(shí)間(例如100ms)的精確定時(shí)中斷,。另外,還需建立幾個(gè)軟件計(jì)數(shù)器單元(例如deda,,sec,,min,…)進(jìn)行配合,。例如:每次定時(shí)中斷時(shí),,使deda加1,…。當(dāng)deda滿10時(shí)(此時(shí)時(shí)間為1000ms)使sec加1,,同時(shí)清除deda,。當(dāng)sec滿60時(shí)(此時(shí)時(shí)間為60s)使min加1,同時(shí)清除sec,?!@樣即可完成精確計(jì)時(shí)。由于軟件編程的靈活性,,實(shí)際上可隨意做出任意進(jìn)制的正計(jì)時(shí)或倒計(jì)時(shí)電子鐘,。圖4-2為單片機(jī)構(gòu)成電子鐘的原理框圖。 圖4-2 單片機(jī)構(gòu)成電子鐘的原理框圖 4.2.3 LED數(shù)碼管顯示器顯示原理 在單片機(jī)系統(tǒng)中,,經(jīng)常用LED(發(fā)光二極管)數(shù)碼顯示器來(lái)顯示單片機(jī)系統(tǒng)的工作狀態(tài),、運(yùn)算結(jié)果等各種信息,LED數(shù)碼顯示器是單片機(jī)與人對(duì)話的一種重要輸出設(shè)備,。 1.LED數(shù)碼顯示器的構(gòu)造及特點(diǎn) 圖4-3是LED數(shù)碼顯示器的構(gòu)造,。它實(shí)際上是由8個(gè)發(fā)光二極管構(gòu)成,其中7個(gè)發(fā)光二極管排列成“8”字形的筆畫(huà)段,,另一個(gè)發(fā)光二極管為圓點(diǎn)形狀,,安裝在顯示器的右下角作為小數(shù)點(diǎn)使用。通過(guò)發(fā)光二極管亮暗的不同組合,,從而可顯示出0~9的阿拉伯?dāng)?shù)字符號(hào)以及其它能由這些筆畫(huà)段構(gòu)成的各種字符,。 圖4-3 LED數(shù)碼顯示器的構(gòu)造 LED數(shù)碼顯示器的內(nèi)部結(jié)構(gòu)共有兩種不同形式,一種是共陽(yáng)極顯示器,,其內(nèi)部電路見(jiàn)圖4-4,,即8個(gè)發(fā)光二極管的正極全部連接在一起組成公共端,8個(gè)發(fā)光二極管的負(fù)極則各自獨(dú)立引出,。另一種是共陰極顯示器,,其內(nèi)部電路見(jiàn)圖4-5,即8個(gè)發(fā)光二極管的負(fù)極全部連接在一起組成公共端,,8個(gè)發(fā)光二極管的正極則各自獨(dú)立引出,。 圖4-4 共陽(yáng)極顯示器內(nèi)部電路 圖4-5 共陰極顯示器內(nèi)部電路 從尺寸上分,LED數(shù)碼管的種類很多,,常用的有0.3,、0.5、0.8,、1.0,、1.2、1.5,、1.8,、2.3,、3.0、4.0,、5.0寸等,。一般小于1.0寸的為單管芯,1.2~1.5寸為雙管芯,,1.8寸以上的為3個(gè)以上管芯,。因而它們的供電電壓要求不同,一般每個(gè)管芯的壓降為2V左右,。通常,,0.8寸以下采用5V供電,,1.0~2.3寸采用12V供電,,3.0以上的選擇更高電壓供電。 LED數(shù)碼顯示器中的發(fā)光二極管共有兩種連接方法: 共陽(yáng)極接法,。把發(fā)光二極管的陽(yáng)極連在一起,,使用時(shí)公共陽(yáng)極接+5V,這時(shí)陰極接低電平的段發(fā)光二極管就導(dǎo)通點(diǎn)亮,,而接高電平的則不點(diǎn)亮,。 共陰極接法。把發(fā)光二極管的陰極連在一起,,使用時(shí)公共陰極接地,,這時(shí)陽(yáng)極接高電平的段發(fā)光二極管就導(dǎo)通點(diǎn)亮,而接低電平的則不點(diǎn)亮,。 驅(qū)動(dòng)電路中的限流電阻R,,通常根據(jù)LED的工作電流計(jì)算而得到,R=(Vcc-Vled)/Iled,。式中,,Vcc為電源電壓(+5V),Vled為L(zhǎng)ED壓降(一般取2V左右),,Iled為工作電流(可取1~20mA),。R通常取數(shù)百歐姆。 我們使用的AT89C2051單片機(jī),,其I/O口具有20mA的灌電流輸出能力,,因此可直接驅(qū)動(dòng)共陽(yáng)極的LED數(shù)碼顯示器。 2.LED數(shù)碼管顯示的基本原理 為了顯示數(shù)字或符號(hào),,要為L(zhǎng)ED數(shù)碼顯示器提供代碼,,因?yàn)檫@些代碼是為顯示字形的,因此稱之為字形代碼,。 七段發(fā)光二極管,,再加上一個(gè)小數(shù)點(diǎn)位,共計(jì)8位代碼,由一個(gè)數(shù)據(jù)字節(jié)提供,。各數(shù)據(jù)位的對(duì)應(yīng)關(guān)系如下所示: 數(shù)據(jù)位 D7 D6 D5 D4 D3 D2 D1 D0 顯示段 h(或稱dp) g F e d c b a LED數(shù)碼顯示器的字形(段)碼表如下所示: 顯示字形 字形碼(共陽(yáng)極) 字形碼(共陰極) 0 C0H 3FH 1 F9H 06H 2 A4H 5BH 3 B0H 4FH 4 99H 66H 5 92H 6DH 6 82H 7DH 7 F8H 07H 8 80H 7FH 9 90H 6FH A 88H 77H B 83H 7CH C C6H 39H D A1H 5EH E 86H 79H F 8EH 71H 熄滅 FFH 00H 4.2.4 LED數(shù)碼顯示器的顯示方法 在單片機(jī)應(yīng)用系統(tǒng)中,,LED數(shù)碼顯示器的顯示方法有兩種:靜態(tài)顯示法和動(dòng)態(tài)掃描顯示法。 1.靜態(tài)顯示法 所謂靜態(tài)顯示,,就是每一個(gè)顯示器各筆畫(huà)段都要獨(dú)占具有鎖存功能的輸出口線,,CPU把欲顯示的字形代碼送到輸出口上,就可以使顯示器顯示出所需的數(shù)字或符號(hào),,此后,,即使CPU不再去訪問(wèn)它,顯示的內(nèi)容也不會(huì)消失(因?yàn)楦鞴P畫(huà)段接口具有鎖存功能),。 靜態(tài)顯示法的優(yōu)點(diǎn)是顯示程序十分簡(jiǎn)單,,顯示亮度大,由于CPU不必經(jīng)常掃描顯示器,,所以節(jié)約了CPU的工作時(shí)間,。但靜態(tài)顯示也有其缺點(diǎn),主要是占用的I/O口線較多,,硬件成本也較高,。所以靜態(tài)顯示法常用在顯示器數(shù)目較少的應(yīng)用系統(tǒng)中。圖4-6為靜態(tài)顯示示意圖,。 圖4-6中由74LS273(8D鎖存器)作擴(kuò)展輸出口,,輸出控制信號(hào)由P2.0和/WR合成,當(dāng)二者同時(shí)為0時(shí),,或門(mén)輸出為0,,將P0口數(shù)據(jù)鎖存到74LS273中,口地址為FEEEH,。輸出口線的低4位和高4位分別接BCD-7段顯示譯碼驅(qū)動(dòng)器74LS47,,它們驅(qū)動(dòng)兩位數(shù)碼管作靜態(tài)的連續(xù)顯示。 圖4-6 靜態(tài)顯示示意圖 2.動(dòng)態(tài)掃描顯示法 動(dòng)態(tài)掃描顯示是單片機(jī)應(yīng)用系統(tǒng)中最常用的顯示方式之一,。它是把所有顯示器的8個(gè)筆畫(huà)段a~h的各同段名端互相并接在一起,,并把它們接到字段輸出口上。為了防止各個(gè)顯示器同時(shí)顯示相同的數(shù)字,,各個(gè)顯示器的公共端COM還要受到另一組信號(hào)控制,,即把它們接到位輸出口上。這樣,,對(duì)于一組LED數(shù)碼顯示器需要由兩組信號(hào)來(lái)控制:一組是字段輸出口輸出的字形代碼,,用來(lái)控制顯示的字形,稱為段碼,;另一組是位輸出口輸出的控制信號(hào),,用來(lái)選擇第幾位顯示器工作,,稱為位碼。在這兩組信號(hào)的控制下,,可以一位一位地輪流點(diǎn)亮各個(gè)顯示器顯示各自的數(shù)碼,,以實(shí)現(xiàn)動(dòng)態(tài)掃描顯示。在輪流點(diǎn)亮一遍的過(guò)程中,,每位顯示器點(diǎn)亮的時(shí)間則是極為短暫的(1~5mS),。由于LED具有余輝特性以及人眼視覺(jué)的惰性,盡管各位顯示器實(shí)際上是分時(shí)斷續(xù)地顯示,,但只要適當(dāng)選取掃描頻率,,給人眼的視覺(jué)印象就會(huì)是在連續(xù)穩(wěn)定地顯示,并不察覺(jué)有閃爍現(xiàn)象,。動(dòng)態(tài)掃描顯示由于各個(gè)數(shù)碼管的字段線是并聯(lián)使用的,,因而大大簡(jiǎn)化了硬件線路。圖4-7為動(dòng)態(tài)顯示示意圖,。 圖4-7 動(dòng)態(tài)顯示示意圖 在實(shí)際的單片機(jī)系統(tǒng)中,,LED顯示程序都是作為一個(gè)子程序供監(jiān)控程序調(diào)用,,因此各位顯示器都掃過(guò)一遍之后,,就返回監(jiān)控程序。返回監(jiān)控程序后,,進(jìn)行一些其它操作,,再調(diào)用顯示掃描程序。通過(guò)這種反復(fù)調(diào)用來(lái)實(shí)現(xiàn)LED數(shù)碼顯示器的動(dòng)態(tài)掃描,。 動(dòng)態(tài)掃描顯示在使用時(shí)必須反復(fù)調(diào)用顯示子程序,,若CPU要進(jìn)行其它操作,那么顯示子程序只能插入循環(huán)程序中,,這往往束縛了CPU的工作,,降低了CPU的工作效率。另外掃描顯示電路中,,顯示器數(shù)目也不宜太多,,一般在12個(gè)以內(nèi),否則會(huì)使人察覺(jué)出顯示器在分時(shí)輪流顯示,。 這兩種顯示方式各有利弊:靜態(tài)顯示法雖然數(shù)據(jù)顯示穩(wěn)定,,占用很少的CPU工作時(shí)間,但每個(gè)顯示單元都需要單獨(dú)的顯示驅(qū)動(dòng)電路,,使用的電路硬件較多,。動(dòng)態(tài)掃描顯示占用的CPU時(shí)間多,但使用的硬件少,,能節(jié)省線路板空間及降低成本,。 動(dòng)態(tài)掃描顯示由于外圍元件少,,節(jié)約了成本,充分發(fā)揮了軟件的優(yōu)勢(shì),,因而在單片機(jī)系統(tǒng)中得到了廣泛的應(yīng)用,。“工業(yè)生產(chǎn)節(jié)能時(shí)控器”也采用動(dòng)態(tài)掃描顯示,。 4.2.5 電路設(shè)計(jì) “工業(yè)生產(chǎn)節(jié)能時(shí)控器”電路原理見(jiàn)圖4-8,。共有4個(gè)按鍵,即on/off,、up,、left、set,。這幾個(gè)鍵的功能為: on/off──定時(shí)1,、2啟動(dòng)/撤消鍵; up──輸入數(shù)據(jù)遞增鍵,; left──左移鍵,; set──工作模式設(shè)定鍵,共可設(shè)定“走時(shí)”,、“調(diào)整走時(shí)時(shí)間”,、“輸入定時(shí)1”、“輸入定時(shí)2” 四個(gè)模式,。 圖4-8 工業(yè)生產(chǎn)節(jié)能時(shí)控器電路圖 “工業(yè)生產(chǎn)節(jié)能時(shí)控器”中,,單片機(jī)AT89C2051只有15條I/O線,由于受I/O線數(shù)量限制,,因此P1口中的Pl.0~P1.3既作為驅(qū)動(dòng)4位LED數(shù)碼管的數(shù)據(jù)輸出一部分,,同時(shí)也用作按鍵的輸入。無(wú)疑,,這種方式大大節(jié)約了硬件的I/O線,,但也給編程者提出了更高的技術(shù)要求。關(guān)于按鍵輸入的工作原理我們?cè)诤竺娴某绦蛟O(shè)計(jì)部分會(huì)加以詳解,。該機(jī)的繼電器觸點(diǎn)負(fù)載電流可達(dá)5A/220V,,如欲控制更大功率的負(fù)載,可外接中間繼電器,、接觸器或固態(tài)繼電器(SSR),。正常工作時(shí)5V電源經(jīng)R1對(duì)3.6V/60mA鎳鉻電池充電,當(dāng)交流電源斷電時(shí),,則由3.6V鎳鉻電池對(duì)單片機(jī)進(jìn)行后備供電,,保持走時(shí)準(zhǔn)確,此時(shí)軟件關(guān)閉LED數(shù)碼管顯示器顯示,,以降低3.6V鎳鉻電池的消耗,。通過(guò)實(shí)際使用,,發(fā)現(xiàn)“工業(yè)生產(chǎn)節(jié)能時(shí)控器”走時(shí)很準(zhǔn),每星期的誤差在10秒之內(nèi),。 4.3 程序設(shè)計(jì) 4.3.1 主程序設(shè)計(jì) 圖4-9為主程序狀態(tài)流程圖,。可見(jiàn)主程序只負(fù)責(zé)進(jìn)行走時(shí)或調(diào)整時(shí)間的運(yùn)算及顯示,,而判斷按鍵輸入則放在Tl定時(shí)中斷 (10ms)服務(wù)子程序中,。T0作為走時(shí)的基準(zhǔn)被設(shè)置為l00ms定時(shí)中斷。這種設(shè)計(jì)的優(yōu)點(diǎn)是大大簡(jiǎn)化了主程序設(shè)計(jì),,并且CPU會(huì)定時(shí)關(guān)心鍵盤(pán),,只要定時(shí)中斷時(shí)間足夠短(如為幾十ms),就不會(huì)漏掉每一次的按鍵輸入,。我們將顯示走時(shí),、顯示調(diào)整走時(shí)、顯示調(diào)整定時(shí)1,、顯示調(diào)整定時(shí)2做成四個(gè)子程序,,分別由set為0、1,、2,、3時(shí)散轉(zhuǎn)后的“顯示走時(shí)并判斷定時(shí)1、2到否程序”,、“顯示調(diào)整走時(shí)程序”,、“顯示調(diào)整定時(shí)1程序”、“顯示調(diào)整定時(shí)2程序”進(jìn)行調(diào)用,。為達(dá)到需輸入的某位顯示最亮(穩(wěn)定顯示),而其它三位顯示較暗 (有閃爍感)的視覺(jué)效顯,,讓三位需顯示較暗的數(shù)碼管每位點(diǎn)亮3ms,,而顯示最亮的那位數(shù)碼管點(diǎn)亮36ms即可。 圖4-9 主程序狀態(tài)流程 4.3.2變量定義及初始化模塊 uchar x[4]; /* 存放走時(shí)的數(shù)組*/ uchar y[4]={0,0,0,0}; /* 存放定時(shí)1的數(shù)組*/ uchar z[4]={0,0,0,0}; /* 存放定時(shí)2的數(shù)組*/ uchar deda=0; /*100mS計(jì)數(shù)單元清零*/ bit d_05s=0; /*0.5秒標(biāo)志*/ bit o_f1=0; /*定時(shí)1啟/停標(biāo)志*/ bit o_f2=0; /*定時(shí)2啟/停標(biāo)志*/ uchar set=0; /*功能鍵標(biāo)志*/ uchar h=0; //全局變量 uchar n=0; uchar m=0; uchar flag; //RAM區(qū)是否受干擾的標(biāo)志 uchar left=0; //左移鍵標(biāo)志 uchar sec=0; //走時(shí)單元sec,、min,、hour初始化 uchar min=0; uchar hour=0; uchar min1=0; //定時(shí)1單元min1、hour1初始化 uchar hour1=0; uchar min2=0; //定時(shí)2單元min1,、hour1初始化 uchar hour2=0; uchar up=0; //遞增鍵標(biāo)志 bit flag1=0; //繼電器輸出控制的位標(biāo)志,,1時(shí)繼電器吸合,0時(shí)繼電器釋放 /********************************************/ /*定時(shí)器T0初始化*/ void init_timer0() { TMOD=0x11; //定時(shí)器T0,、T1方式1 TH0=-(50235/256); //裝載100ms定時(shí)初值 TL0=-(50235%256); IE=0x8a; //開(kāi)CPU中斷 TR0=1; //啟動(dòng)T0 } /*定時(shí)器T1初始化*/ void init_timer1() { TH1=-(5000/256); ////裝載10ms定時(shí)初值 TL1=-(5000%256); } 4.3.3 判斷按鍵輸入的T1定時(shí)中斷服務(wù)子程序模塊 因?yàn)椤肮I(yè)生產(chǎn)節(jié)能時(shí)控器”的一個(gè)設(shè)計(jì)難點(diǎn)就是其按鍵輸入部分,,因此這里詳細(xì)分析一下按鍵輸入子程序模塊。 學(xué)習(xí)過(guò)單片機(jī)技術(shù)的人都知道,,單片機(jī)的按鍵輸入一般可分為簡(jiǎn)單的獨(dú)立式按鍵輸入及行列式鍵盤(pán)輸入兩種,。圖4-10為簡(jiǎn)單的獨(dú)立式鍵盤(pán)輸入示意圖,,獨(dú)立式鍵盤(pán)輸入適合于按鍵輸入不多的情況(<5個(gè)按鍵),具有占用口線較少,、軟件編寫(xiě)簡(jiǎn)單容易等特點(diǎn),。 圖4-10 獨(dú)立式鍵盤(pán)輸入示意圖 圖4-11為行列式鍵盤(pán)輸入示意圖,列線接P1.0~P1.3,,行線接P1.4~P1.7,。行列式鍵盤(pán)輸入適合于按鍵輸入多的情況,如有16個(gè)按鍵輸入,,用簡(jiǎn)單按鍵輸人用要占用2個(gè)輸入口(共16位),,而使用行列式鍵盤(pán)輸入只需占用一個(gè)輸入口(8位)。 圖4-11 行列式鍵盤(pán)輸入示意圖 但行列式鍵盤(pán)輸入軟件編寫(xiě)較復(fù)雜,,對(duì)初學(xué)者而言有一定的難度,。在很多狀態(tài)下,按鍵輸人的值要同時(shí)要在LED數(shù)碼管上顯示出來(lái),。如一個(gè)按鍵設(shè)計(jì)為輸入遞增(加法)鍵,,可以設(shè)計(jì)成每點(diǎn)按一下,數(shù)值遞增加l,,同時(shí)在LED數(shù)碼管上顯示出來(lái),;也可設(shè)計(jì)成持續(xù)按下時(shí),數(shù)值以一定時(shí)間間隔(如0.3秒)累加,。但是當(dāng)欲輸入值較大時(shí)(如三位LED數(shù)碼管作輸入顯示時(shí)的輸入值最大為999),,則可能按下鍵的時(shí)間太長(zhǎng)(最長(zhǎng)達(dá)300秒),看來(lái)這種方式只適用于一位或至多兩位數(shù)值(最大99)的輸入,。當(dāng)然你也可多設(shè)幾個(gè)鍵,,每個(gè)鍵只負(fù)責(zé)一位數(shù)值的輸入,但這樣會(huì)占用較多的口線,,浪費(fèi)寶貴的硬件資源,。 大家可能見(jiàn)到過(guò),一些進(jìn)口的溫度控制器(如日本RKC INSTRUMENT INC.生 產(chǎn)的REX一C700溫控器)的面板設(shè)計(jì)為:溫度測(cè)量值用4位LED數(shù)碼管顯示,,輸入設(shè)定值顯示也用4位LED數(shù)碼管,,輸入按鍵只有4個(gè),一個(gè)為“模式設(shè)定鍵”,,一個(gè)為“左移鍵”,,另兩個(gè)為“加法鍵”、“減法鍵”,。欲輸入設(shè)定值(溫控值)時(shí),,按一下“模式設(shè)定鍵”,程序進(jìn)入設(shè)定狀態(tài),此時(shí)輸入設(shè)定值顯示的4位LED數(shù)碼管中,,個(gè)位顯示最亮(穩(wěn)定顯示),,而十、百,、千位顯示較暗(有閃爍感),,說(shuō)明可對(duì)個(gè)位進(jìn)行輸入。按下“加法鍵”或“減法鍵”,,即可輸入個(gè)位數(shù)的值,;點(diǎn)按一下“左移鍵”,變?yōu)槭伙@示最亮,,而個(gè),、百、千位顯示較暗,,說(shuō)明可對(duì)十位進(jìn)行輸入,。按下“加法鍵”或“減法鍵”,即可輸入十位數(shù)的值,;……這樣可完成4位數(shù)的輸入,。完成輸入后,再按一下“模式設(shè)定鍵”,,程序即退出設(shè)定狀態(tài),,進(jìn)入工作運(yùn)行。用這種輸入方法,,不僅輸入4位數(shù)用4個(gè)鍵即可,,再多位(5位至24位)的輸入也用這4個(gè)鍵就夠了。 “工業(yè)生產(chǎn)節(jié)能時(shí)控器”就是采用這種按鍵輸入方式設(shè)計(jì)的,。下面為按鍵輸入子程序模塊詳解,。 void zd1(void) interrupt 3 //聲明定時(shí)1中斷函數(shù) { //定時(shí)l中斷函數(shù)開(kāi)始 uchar i,j;i=P1;j=P3; /*定義i、j為無(wú)符號(hào)字符型局部變量,,將當(dāng)時(shí)的Pl口,、P3口狀態(tài)送i、j暫存*/ TH1=-(5000/256); TL1=-(5000%256); //定時(shí)器Tl重新載入10ms初值 if(m==1)n++; /*如變量m等于1,,則變量n遞增。說(shuō)明:m,、n為整個(gè)程序開(kāi)始時(shí)定義的元符號(hào)字符型全局變量*/ if(n>=30){n=0;m=0;} //如變量n大于等于30,,則m、n清零 P3_7=0; //P3.7置0,,準(zhǔn)備讀取按鍵輸入 P1=0xff; //P1口置全1,,準(zhǔn)備讀取按鍵輸入 if(P1!=0xff) //如果P1口不等于全1,說(shuō)明4個(gè)按鍵中有鍵按下 { //進(jìn)入if(P1!=0xff)語(yǔ)句范圍 if(n==0)m=1; //如果n等于0,,進(jìn)入if(n==0)語(yǔ)句,,m置l {if(n==1) /*如果n等于1,,迸入if(n==1)語(yǔ)句,同時(shí)進(jìn)行下面的具體判斷按鍵語(yǔ)句,。作用效果為:開(kāi)始時(shí)m,、n均賦0,一旦有鍵按下,,第一次中斷產(chǎn)生時(shí)m賦l,;第二次中斷產(chǎn)生時(shí)n遞增。當(dāng)n等于1時(shí)(第二次中斷產(chǎn)生)進(jìn)入下面的具體判斷按鍵語(yǔ)句,。若持續(xù)按下鍵,,則第三次中斷產(chǎn)生~第三十一次中斷產(chǎn)生時(shí),程序不進(jìn)入具體的判斷按鍵語(yǔ)句過(guò)程(因這時(shí)n不等于1),。由于中斷每10ms產(chǎn)生一次,,這樣可實(shí)現(xiàn)每0.31秒(31x10=0.31秒)進(jìn)行一次加法或移位的操作,與人眼的視覺(jué)特性相吻合,。 { //進(jìn)入具體判斷按鍵語(yǔ)句范圍*/ if(P1_0==0){set++;left=0;} /*如果P1.0等于0(即電路中的set鍵按下),,變量set遞增,變量left清0,。說(shuō)明:set,、left是為了判斷模式設(shè)定及左移而在整個(gè)程序開(kāi)始時(shí)定義的無(wú)符號(hào)字符型全局變量*/ if(set>=4)set=0; /*如果set大于等于4,則set清0,。說(shuō)明:set值只能在0~3間變化,,只有4種工作模式(走時(shí)及輸出控制模式、走時(shí)調(diào)整模式,、定時(shí)l調(diào)整模式,、定時(shí)2調(diào)整模式)*/ if(set==1)flag=0x55; /*在set等于1時(shí),向RAM區(qū)標(biāo)志變量flag寫(xiě)入55H,。說(shuō)明,,flag是在整個(gè)程序開(kāi)始時(shí)定義的無(wú)符號(hào)字符型全局變量,用作判斷RAM區(qū)是否受干擾的依據(jù)*/ if(P1_1==0)left++; //如果P1.1等于0(即電路中的left鍵按下),,變量left遞增 if(left>=4)left=0; /*如果left大于等于4,,則left清0。說(shuō)明:left值只能在0~3間 變化,,LED數(shù)碼管只有4位顯示*/ if(P1_2==0){up++; /*如果P1.2等于0(即電路中的up鍵按下),,進(jìn)入if(P1_2==0)語(yǔ)句,變量up遞增,。說(shuō)明:up是為了判斷數(shù)值增量而在整個(gè)程序開(kāi)始時(shí)定義的無(wú)符號(hào)字符型全局變量*/ switch(left) //隨即進(jìn)入switch(left)開(kāi)關(guān)語(yǔ)句 { //switch(left)開(kāi)關(guān)語(yǔ)句開(kāi)始 case 0:{if(up>=10)up=0;}break; /*left值為0時(shí),,如果up大于等于10,則up清0。隨即退出,。說(shuō)明:電子鐘的個(gè)位可在0~9之間調(diào)整*/ case 1:{if(up>=6)up=0;}break; /*left值為1時(shí),,如果up大于等于6,則up清0,。隨即退出,。說(shuō)明:電子鐘的十位可在0~5之間調(diào)整*/ case 2:{if(up>=10)up=0;}break; /*left值為2時(shí),如果up大于等于10,,則up清0,。隨即退出。說(shuō)明:電子鐘的百位可在0~9之間調(diào)整*/ case 3:{if(up>=3)up=0;}break; /*left值為3時(shí),,如果up大于等于3,,則up清0。隨即退出,。說(shuō)明:電子鐘的千位可在0~2之間調(diào)整*/ default:break; //:若left為其它值,,也退出 } // switch(left)開(kāi)關(guān)語(yǔ)句結(jié)束 } // if(P1_2==0)語(yǔ)句結(jié)束 if(P1_2==0){ /*如果P1.2等于0(即電路中的up鍵按下時(shí)),進(jìn)入if(P1_2==0)語(yǔ)句,,同時(shí)進(jìn)入switch(set)開(kāi)關(guān)語(yǔ)句*/ switch(set) // switch(set)開(kāi)關(guān)語(yǔ)句開(kāi)始 {case 0:break; //set值為0時(shí),,退出 case 1:x[left]=up;break; /*set值為1時(shí),將此時(shí)up值送入X數(shù)組的第len位,。隨即退出,。說(shuō)明:X數(shù)組是顯示走時(shí)緩存區(qū)*/ case 2:{y[left]=up;if(P1_3==0)o_f1=!o_f1;}break; /*set值為2時(shí),將此時(shí)up值送入Y數(shù)組的第left位,。若此時(shí)P1.3等于0(即電路中的on/off鍵按下),,則定時(shí)1啟停標(biāo)志位o_f1取反(啟動(dòng)/關(guān)閉)。隨即退出,。說(shuō)明:Y數(shù)組是定時(shí)l記憶緩存區(qū),。O_f1是為了判斷定時(shí)1啟動(dòng)/關(guān)閉而在整個(gè)程序開(kāi)始時(shí)定義的位標(biāo)志*/ case 3:{z[left]=up;if(P1_3==0)o_f2=!o_f2;}break; /*set值為3時(shí),將此時(shí)up值送入Z數(shù)組的第left位,。若此時(shí)P1.3等于0(即電路中的on/off鍵按下),,則定時(shí)2啟停標(biāo)志位o_f2取反(啟動(dòng)/關(guān)閉)。隨即退出,。說(shuō)明:Z數(shù)組是定時(shí)2記憶緩存區(qū),。O_f2是為了判斷定時(shí)2啟動(dòng)/關(guān)閉而在整個(gè)程序開(kāi)始時(shí)定義的位標(biāo)志*/ default:break;} //若set為其它值,也退出,。switch(set)開(kāi)關(guān)語(yǔ)句結(jié)束 } //if(P1_2)語(yǔ)句結(jié)束 else { //else語(yǔ)句開(kāi)始 switch(set) /*又進(jìn)入switch(set)開(kāi)關(guān)語(yǔ)句,。說(shuō)明:上一個(gè)switch(set)開(kāi)關(guān)語(yǔ)句是將按鍵產(chǎn)生的up值送入X、Y,、Z數(shù)組存放,現(xiàn)在這個(gè)switch (set)開(kāi)關(guān)語(yǔ)句是調(diào)出X、Y,、Z數(shù)組內(nèi)容至變量up,,以便在原來(lái)的基礎(chǔ)上遞增。例如:原來(lái)的X[0]值為5,,則 在調(diào)整時(shí)個(gè)位LED數(shù)碼管顯示就從5開(kāi)始往上調(diào),,而不會(huì)產(chǎn)生從0或其它值開(kāi)始上調(diào)的情況,適合人的一般直覺(jué)*/ {case 0:break; //set值為0時(shí),,退出 case 1:up=x[left];break; /*set值為1時(shí),,將此時(shí)X數(shù)組的第left位值送入變量up。隨即退出*/ case 2:{up=y[left];if(P1_3==0)o_f1=!o_f1;}break; /*set值為2時(shí),,將此時(shí)Y數(shù)組的第left位值送入變量up,。若此時(shí)P1.3等于0(即電路中的on/off鍵按下),則定時(shí)1啟停標(biāo)志位o_f1取反(啟動(dòng)/關(guān)閉),。隨即退出*/ case 3:{up=z[left];if(P1_3==0)o_f2=!o_f2;}break; /*set值為3時(shí),,將此時(shí)Z數(shù)組的第left位值送入變量up。若此時(shí)P1.3等于0(即電路中的on/off鍵按下),,則定時(shí)2啟停標(biāo)志位o_f2取反(啟動(dòng)/關(guān)閉),。隨即退出*/ default:break;} //若set為其它值,也退出 } } //switch(set)開(kāi)關(guān)語(yǔ)句結(jié)束,。else語(yǔ)句結(jié)束 }} //if(n==0)語(yǔ)句結(jié)束,。If(P1!=0xff)語(yǔ)句結(jié)束 P1=i;P3=j; /*本次定時(shí)中斷快結(jié)束時(shí),將暫存于I,j的當(dāng)時(shí)Pl口,、P3口狀態(tài)還原*/ } //定時(shí)1中斷服務(wù)子函數(shù)結(jié)束
4.3.4 完整代碼 #include <AT89x051.H> //器件配置文件 #define uchar unsigned char //變量類型的宏定義 #define uint unsigned int uchar DATA_7SEG[10]={0xfc,0x60,0xda,0xf2,0x66, 0xb6,0xbe,0xe0,0xfe,0xf6};/*0~9的數(shù)碼管段碼*/ uchar x[4]; /* 存放走時(shí)的數(shù)組*/ uchar y[4]={0,0,0,0}; /* 存放定時(shí)1的數(shù)組*/ uchar z[4]={0,0,0,0}; /* 存放定時(shí)2的數(shù)組*/ uchar act[4]={0xfe,0xfd,0xfb,0xf7}; /*四位數(shù)碼管的位選碼*/ void delay(uint k); //延時(shí)子函數(shù)聲明 void conv(); //走時(shí)轉(zhuǎn)換子函數(shù)聲明 void p_out(); //判別定時(shí)到否子函數(shù)聲明 void p_out1(); //判別定時(shí)到否子函數(shù)1聲明 void t_adj(); //走時(shí)調(diào)整子函數(shù)聲明 uchar deda=0; /*100mS計(jì)數(shù)單元清零*/ bit d_05s=0; /*0.5秒標(biāo)志*/ bit o_f1=0; /*定時(shí)1啟/停標(biāo)志*/ bit o_f2=0; /*定時(shí)2啟/停標(biāo)志*/ uchar set=0; /*功能鍵標(biāo)志*/ uchar h=0; uchar n=0; uchar m=0; uchar flag; uchar left=0; uchar sec=0; uchar min=0; uchar hour=0; uchar min1=0; uchar hour1=0; uchar min2=0; uchar hour2=0; uchar up=0; bit flag1=0; bit flag2=0; /*顯示走時(shí)*/ void time() { for(h=0;h<4;h++) {P1=DATA_7SEG[x[h]]; //輸出數(shù)碼管的字形碼 P3=act[h];p_out(); //輸出數(shù)碼管的位碼,。判斷輸出 if(P3_2==0){if(d_05s==1)P1_0=1;else P1_0=0;} /* 百位數(shù)碼管點(diǎn)亮?xí)r,控制小數(shù)點(diǎn) (秒點(diǎn))閃爍*/ delay(2);} //每位數(shù)碼管點(diǎn)亮2ms if(o_f1==1){P1=0x01;P3_3=1;P3_2=1;P3_1=0;P3_0=1;}/* 若定時(shí)1啟動(dòng),, 點(diǎn)亮十位數(shù)碼管小數(shù)點(diǎn)*/ else{P1=0x00;P3_3=1;P3_2=1;P3_1=1;P3_0=1;}p_out();/*否則十位數(shù)碼管 小數(shù)點(diǎn)不亮*/ delay(2); if(o_f2==1){P1=0x01;P3_3=1;P3_2=1;P3_1=1;P3_0=0;} /* 若定時(shí)2啟動(dòng),, 點(diǎn)亮個(gè)位數(shù)碼管小數(shù)點(diǎn)*/ else{P1=0x00;P3_3=1;P3_2=1;P3_1=1;P3_0=1;}p_out();/*否則個(gè)位數(shù)碼管 小數(shù)點(diǎn)不亮*/ delay(2); } /*定時(shí)器T0初始化*/ void init_timer0() { TMOD=0x11; TH0=-(50235/256); TL0=-(50235%256); IE=0x8a; TR0=1; } /*定時(shí)器T1初始化*/ void init_timer1() { TH1=-(5000/256); TL1=-(5000%256); } /*延時(shí)k*1ms子函數(shù)*/ void delay(uint k) { uint i,j; for(i=0;i<k;i++){ for(j=0;j<60;j++) {;}} } /*100mS定時(shí)中斷服務(wù)子函數(shù)*/ void zd0(void) interrupt 1 { TH0=-(50235/256); //重裝100ms定時(shí)初值 TL0=-(50235%256); deda++; //100ms計(jì)時(shí)單元遞增 } /*10mS定時(shí)中斷服務(wù)子函數(shù)*/ void zd1(void) interrupt 3 {uchar i,j;i=P1;j=P3; TH1=-(5000/256); TL1=-(5000%256); if(m==1)n++; if(n>=30){n=0;m=0;} P3_7=0; P1=0xff; if(P1!=0xff) { if(n==0)m=1; {if(n==1) { if(P1_0==0){set++;left=0;} if(set>=4)set=0; if(set==1)flag=0x55; if(P1_1==0)left++; if(left>=4)left=0; if(P1_2==0){up++; switch(left) { case 0:{if(up>=10)up=0;}break; case 1:{if(up>=6)up=0;}break; case 2:{if(up>=10)up=0;}break; case 3:{if(up>=3)up=0;}break; default:break; } } if(P1_2==0){ switch(set) {case 0:break; case 1:x[left]=up;break; case 2:{y[left]=up;if(P1_3==0)o_f1=!o_f1;}break; case 3:{z[left]=up;if(P1_3==0)o_f2=!o_f2;}break; default:break;} } else { switch(set) {case 0:break; case 1:up=x[left];break; case 2:{up=y[left];if(P1_3==0)o_f1=!o_f1;}break; case 3:{up=z[left];if(P1_3==0)o_f2=!o_f2;}break; default:break;} }} }} P1=i;P3=j; } /*顯示調(diào)整走時(shí)*/ void t_adj() {p_out1(); for(h=0;h<4;h++) //四位數(shù)碼管每位點(diǎn)亮3ms {if(h==left)P1=0x00; else {P1=DATA_7SEG[x[h]]; P3=act[h];p_out(); delay(3);}} P1=DATA_7SEG[up];P3=act[left]; hour=x[3]*10+x[2];min=x[1]*10+x[0]; p_out(); delay(12); //需調(diào)整的數(shù)碼管點(diǎn)亮12ms if(o_f1==1){P1=0x01;P3_3=1;P3_2=1;P3_1=0;P3_0=1;} /*若定時(shí)1啟動(dòng), 點(diǎn)亮十位數(shù)碼管小數(shù)點(diǎn)*/ else{P1=0x00;P3_3=1;P3_2=1;P3_1=1;P3_0=1;}p_out();/*否則十位數(shù)碼管 小數(shù)點(diǎn)不亮*/ delay(12); //需調(diào)整的數(shù)碼管點(diǎn)亮12ms if(o_f2==1){P1=0x01;P3_3=1;P3_2=1;P3_1=1;P3_0=0;} /*若定時(shí)2啟動(dòng),, 點(diǎn)亮個(gè)位數(shù)碼管小數(shù)點(diǎn)*/ else{P1=0x00;P3_3=1;P3_2=1;P3_1=1;P3_0=1;}p_out();/*否則個(gè)位數(shù)碼管 小數(shù)點(diǎn)不亮*/ delay(12); //需調(diào)整的數(shù)碼管點(diǎn)亮12ms } /*顯示調(diào)整定時(shí)1*/ void t1_adj() {p_out1(); for(h=0;h<4;h++) //四位數(shù)碼管每位點(diǎn)亮3ms {if(h==left)P1=0x00; else {P1=DATA_7SEG[y[h]]; P3=act[h];p_out(); delay(3);}} P1=DATA_7SEG[up];P3=act[left]; //需調(diào)整的數(shù)碼管點(diǎn)亮18ms hour1=y[3]*10+y[2];min1=y[1]*10+y[0]; p_out(); delay(18); if(o_f1==1){P1=0x01;P3_3=0;P3_2=1;P3_1=0;P3_0=1;} /*若定時(shí)1啟動(dòng),, 點(diǎn)亮十位數(shù)碼管小數(shù)點(diǎn)*/ else{P1=0x01;P3_3=0;P3_2=1;P3_1=1;P3_0=1;} /*否則十位數(shù)碼管 小數(shù)點(diǎn)不亮*/ p_out(); delay(18); //需調(diào)整的數(shù)碼管點(diǎn)亮18ms } /*顯示調(diào)整定時(shí)2*/ void t2_adj() {p_out1(); for(h=0;h<4;h++) //四位數(shù)碼管每位點(diǎn)亮3ms {if(h==left)P1=0x00; else {P1=DATA_7SEG[z[h]]; //需調(diào)整的數(shù)碼管點(diǎn)亮18ms P3=act[h];p_out(); delay(3);}} P1=DATA_7SEG[up];P3=act[left]; hour2=z[3]*10+z[2];min2=z[1]*10+z[0]; p_out(); delay(18); if(o_f2==1){P1=0x01;P3_3=1;P3_2=0;P3_1=1;P3_0=0;} /*若定時(shí)2啟動(dòng), 點(diǎn)亮個(gè)位數(shù)碼管小數(shù)點(diǎn)*/ else{P1=0x01;P3_3=1;P3_2=0;P3_1=1;P3_0=1;} /*否則個(gè)位數(shù)碼管 小數(shù)點(diǎn)不亮*/ p_out(); delay(18); //需調(diào)整的數(shù)碼管點(diǎn)亮18ms } /*時(shí),、分,、秒計(jì)時(shí)單元轉(zhuǎn)換*/ void conv() { if(deda<=5)d_05s=0; //每500ms,秒點(diǎn)取反 else d_05s=1; if(deda>=10){sec++;deda=0;} //每1000ms,,秒單元遞增 if(sec>=60){min++;sec=0;} //每60s,,分單元遞增 if(min>=60){hour++;min=0;} //每60m,時(shí)單元遞增 if(hour>=24){hour=0;} //每24h,,時(shí)單元清零 } /*判別定時(shí)到否子函數(shù)*/ void p_out() { if(o_f1==1) //若定時(shí)1啟動(dòng) {if(hour==hour1) //定時(shí)1時(shí)間到 {if(min==min1) {flag1=1;if(d_05s==1)P3_4=0;else P3_4=1;}}} //繼電器輸出標(biāo)志置1,,蜂鳴器間斷鳴響 if(flag1==1) P3_5=0; //若輸出標(biāo)志為1,,繼電器吸合 if(o_f2==1) //若定時(shí)2啟動(dòng) {if(hour==hour2) //定時(shí)2時(shí)間到 {if(min==min2) {flag1=0;if(d_05s==1)P3_4=0;else P3_4=1;}}} //繼電器輸出標(biāo)志置0,蜂鳴器間斷鳴響 if(flag1==0) P3_5=1; //若輸出標(biāo)志為0,,繼電器釋放 } /*判別定時(shí)到否子函數(shù)1*/ void p_out1() { if(o_f1==1) //若定時(shí)1啟動(dòng) {if(hour==hour1) //定時(shí)1時(shí)間到 {if(min==min1) {flag1=1;}}} //繼電器輸出標(biāo)志置1 if(flag1==1) P3_5=0; //若輸出標(biāo)志為1,,繼電器吸合 if(o_f2==1) //若定時(shí)2啟動(dòng) {if(hour==hour2) //定時(shí)2時(shí)間到 {if(min==min2) {flag1=0;}}} //繼電器輸出標(biāo)志置0 if(flag1==0) P3_5=1; //若輸出標(biāo)志為0,繼電器釋放 } /*主函數(shù)*/ void main() { init_timer0(); /*定時(shí)器T0初始化*/ init_timer1(); /*定時(shí)器T1初始化*/ while(1) { /*將顯示緩沖數(shù)組內(nèi)容移到時(shí),、分計(jì)時(shí)單元*/ hour=x[3]*10+x[2];min=x[1]*10+x[0]; hour1=y[3]*10+y[2];min1=y[1]*10+y[0]; hour2=z[3]*10+z[2];min2=z[1]*10+z[0]; conv(); /*時(shí),、分、秒及100mS單元轉(zhuǎn)換*/ /*將轉(zhuǎn)換后的時(shí),、分計(jì)時(shí)單元內(nèi)容移到顯示緩沖數(shù)組*/ x[3]=hour/10;x[2]=hour%10;x[1]=min/10;x[0]=min%10; y[3]=hour1/10;y[2]=hour1%10;y[1]=min1/10;y[0]=min1%10; z[3]=hour2/10;z[2]=hour2%10;z[1]=min2/10;z[0]=min2%10; switch(set) { case 0:time();break;/*顯示走時(shí)*/ case 1:t_adj();break;/*顯示調(diào)整走時(shí)*/ case 2:t1_adj();break;/*顯示調(diào)整定時(shí)1*/ case 3:t2_adj();break;/*顯示調(diào)整定時(shí)2*/ default:break; } if(flag!=0x55) /*判斷RAM受干擾標(biāo)志,,若受干擾, 則顯示器閃爍告警*/ {uchar i;P3_4=1;P3_5=1; for(i=0;i<100;i++) /*點(diǎn)亮顯示器200mS*/ { P1=DATA_7SEG[x[3]];P3=0xf7;delay(1); P1=DATA_7SEG[x[2]];P3=0xfb;delay(1); P1=DATA_7SEG[x[1]];P3=0xfd;delay(1); P1=DATA_7SEG[x[0]];P3=0xfe;delay(1); } P1=0xff;P3=0xff;delay(400); /*熄滅顯示器200mS*/ P3_7=0; /*如有鍵按下達(dá)0.5S則退出閃爍狀態(tài)同時(shí)掉電標(biāo)志置55H,。*/ if(P1!=0xff){ delay(10);if(P1_0==0)flag=0x55;F0:if(P1!=0xff)goto F0; }P3_7=1; } else TR1=1;/*啟動(dòng)定時(shí)器1*/ }} 4.4 調(diào)試應(yīng)用 4.4.1 功能調(diào)試 “工業(yè)生產(chǎn)節(jié)能時(shí)控器”由于元器件不多,,一般不需作太多調(diào)整即可使用,但應(yīng)確保元器件質(zhì)量及焊接質(zhì)量,。通電時(shí)測(cè)工作電流,,在繼電器K釋放、蜂鳴器不響,、LED數(shù)碼管顯示器點(diǎn)亮的情況下,,整機(jī)電流約為25mA。太大或太小都不正常,。 輸入設(shè)定過(guò)程: 1. 通電后四位LED數(shù)碼管顯示器開(kāi)始閃爍,,顯示0000。原因是初次上電時(shí),,RAM標(biāo)志flag為一隨機(jī)數(shù),。按下set鍵1秒后,數(shù)字變?yōu)榉€(wěn)定顯示,,說(shuō)明flag內(nèi)已置入55H,。 2. 點(diǎn)按set鍵后,個(gè)位顯示最亮而其余三位數(shù)碼管顯示較暗(小數(shù)點(diǎn)均不亮),,說(shuō)明可進(jìn)行校時(shí),,個(gè)位最亮說(shuō)明此時(shí)可對(duì)個(gè)位進(jìn)行調(diào)整,按下up鍵即可調(diào)整個(gè)位數(shù)字,;點(diǎn)按left鍵,,變成十位顯示最亮而其余三位數(shù)碼管顯示較暗,說(shuō)明可對(duì)十位進(jìn)行調(diào)整,,按下up鍵即可調(diào)整十位數(shù)字,;……同理,我們可對(duì)百位和個(gè)位進(jìn)行調(diào)整,。 3. 點(diǎn)按set鍵后,,個(gè)位顯示最亮而其余三位數(shù)碼管顯示較暗(千位小數(shù)點(diǎn)點(diǎn)亮),,說(shuō)明可進(jìn)行定時(shí)1調(diào)整,個(gè)位最亮說(shuō)明此時(shí)可對(duì)個(gè)位進(jìn)行調(diào)整,,按下up鍵即可調(diào)整個(gè)位數(shù)字,;點(diǎn)按left鍵,變成十位顯示最亮而其余三位數(shù)碼管顯示較暗,,說(shuō)明可對(duì)十位進(jìn)行調(diào)整,按下up鍵即可調(diào)整十位數(shù)字,;……同理,,我們可對(duì)百位和個(gè)位進(jìn)行調(diào)整。定時(shí)1的時(shí)間調(diào)整完畢后,,若點(diǎn)按on/off鍵,,則十位數(shù)碼管的小數(shù)點(diǎn)發(fā)亮,說(shuō)明定時(shí)1啟動(dòng),,這樣時(shí)間走到定時(shí)1設(shè)定值時(shí),,繼電器會(huì)吸合,同時(shí)蜂鳴器鳴響1分鐘,。再點(diǎn)按on/off鍵,,則十位數(shù)碼管的小數(shù)點(diǎn)熄滅,說(shuō)明定時(shí)1撤消,。 4. 點(diǎn)按set鍵后,,個(gè)位顯示最亮而其余三位數(shù)碼管顯示較暗(百位小數(shù)點(diǎn)點(diǎn)亮),說(shuō)明可進(jìn)行定時(shí)2調(diào)整,,個(gè)位最亮說(shuō)明此時(shí)可對(duì)個(gè)位進(jìn)行調(diào)整,,按下up鍵即可調(diào)整個(gè)位數(shù)字;點(diǎn)按left鍵,,變成十位顯示最亮而其余三位數(shù)碼管顯示較暗,,說(shuō)明可對(duì)十位進(jìn)行調(diào)整,按下up鍵即可調(diào)整十位數(shù)字,;……同理,,我們可對(duì)百位和個(gè)位進(jìn)行調(diào)整。定時(shí)2的時(shí)間調(diào)整完畢后,,若點(diǎn)按on/off鍵,,則個(gè)位數(shù)碼管的小數(shù)點(diǎn)發(fā)亮,說(shuō)明定時(shí)2啟動(dòng),,這樣時(shí)間走到定時(shí)2設(shè)定值時(shí),,繼電器會(huì)釋放,同時(shí)蜂鳴器鳴響1分鐘,。再點(diǎn)按on/off鍵,,則個(gè)位數(shù)碼管的小數(shù)點(diǎn)熄滅,,說(shuō)明定時(shí)2撤消。 5. 點(diǎn)按set鍵后,,LED數(shù)碼管顯示器變?yōu)榉€(wěn)定顯示,,進(jìn)入正常計(jì)時(shí)工作狀態(tài)。 4.4.2 使用及維護(hù) 本機(jī)嵌入到生產(chǎn)設(shè)備中時(shí),,應(yīng)安裝固定好,,同時(shí)做好防潮防油等工作。家庭使用時(shí),,應(yīng)選配一個(gè)合適美觀的外殼,。 |
|
來(lái)自: 老黃兄 > 《自動(dòng)化技術(shù)》