版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 單片機(jī)課程設(shè)計(jì)報(bào)告</b></p><p> 設(shè)計(jì)題目:基于51單片機(jī)電子鐘</p><p><b> 學(xué)院:機(jī)電工程學(xué)院</b></p><p><b> 班級(jí):09電氣二班</b></p><p><b> 姓名: <
2、/b></p><p><b> 學(xué)號(hào): </b></p><p> 摘要:本設(shè)計(jì)是簡(jiǎn)單定時(shí)鬧鐘系統(tǒng),不僅能實(shí)現(xiàn)系統(tǒng)要求的功能:(1)顯示當(dāng)前時(shí)間:年—月—日;時(shí)時(shí)—分分—秒秒。(2)由LED閃動(dòng)做秒顯示。(3)定利用按鍵可以對(duì)時(shí)間及鬧鈴進(jìn)行設(shè)置,并可顯示鬧鈴時(shí)間。當(dāng)鬧鈴間到蜂鳴器發(fā)出聲響,按停止鍵可使鬧鈴聲停止。(4)能顯示溫度。</p>&
3、lt;p> 本設(shè)計(jì)采用單片機(jī)STC89C52作為核心元件,配備液晶顯示模塊、時(shí)鐘芯片、等功能模塊。數(shù)字鐘采用24小時(shí)制方式顯示時(shí)間,定時(shí)信息以及年月日顯示等功能。12MHZ晶振,由P0口輸出所要顯示的字形段碼,由P2口輸出字位信號(hào)。在其基礎(chǔ)上擴(kuò)展外圍芯片與電路,附加時(shí)鐘電路及LED電路。LED采用共陰極接法,低電平有效選中相應(yīng)的LED。并添加溫度采集與處理功能。</p><p> 文章的核心主要從硬件設(shè)
4、計(jì)和軟件編程兩個(gè)大的方面。硬件電路設(shè)計(jì)主要包括中央處理單元電路、時(shí)鐘電路、人機(jī)接口電路、信號(hào)處理電路、執(zhí)行電路等幾部分組成。單片機(jī)具有集成度高、功能強(qiáng)、通用性好、特別是它能耗低、價(jià)格便宜、可靠性高、抗干擾能力強(qiáng)和使用方便等獨(dú)特的優(yōu)點(diǎn)。</p><p> 關(guān)鍵字:STC89C52單片機(jī) 電子時(shí)鐘 數(shù)碼管 溫度傳感器DS18B20。</p><p><b> 目錄</
5、b></p><p> 設(shè)計(jì)任務(wù)和要求……………………………………… 4 頁(yè)</p><p> 方案設(shè)計(jì)與論證……………………………………… 4 頁(yè)</p><p> 2.1各方案的優(yōu)點(diǎn)……………………………… 4 頁(yè)</p><p> 2.2各方案的缺點(diǎn)……………………………… 4 頁(yè)</p><p>
6、 2.3對(duì)比選擇…………………………………… 5 頁(yè)</p><p> 系統(tǒng)設(shè)計(jì)……………………………………………… 5 頁(yè)</p><p> 3.1系統(tǒng)的硬件設(shè)計(jì)……………………………… 5 頁(yè)</p><p> 3.2系統(tǒng)的軟件設(shè)計(jì)……………………………… 10 頁(yè)</p><p> 電路安裝調(diào)試及結(jié)果…………………………………
7、 25 頁(yè)</p><p> 設(shè)計(jì)總結(jié)……………………………………………… 25 頁(yè)</p><p> 參考文獻(xiàn)………………………………………………… 26頁(yè)</p><p> 元器件清單……………………………………………… 27頁(yè)</p><p><b> 設(shè)計(jì)任務(wù)和要求</b></p><
8、p> ?。?)顯示當(dāng)前時(shí)間:年—月—日;時(shí)時(shí)—分分—秒秒。</p><p> ?。?)由LED閃動(dòng)做秒顯示。</p><p> (3)定利用按鍵可以對(duì)時(shí)間及鬧鈴進(jìn)行設(shè)置,并可顯示鬧鈴時(shí)間。當(dāng)鬧鈴間到蜂鳴器發(fā)出聲響,按停止鍵可使鬧鈴聲停止。</p><p><b> ?。?)能顯示溫度。</b></p><p>&
9、lt;b> 2 方案設(shè)計(jì)與論證</b></p><p> 時(shí)鐘電路在計(jì)算機(jī)系統(tǒng)中起著非常重要的作用,是保證系統(tǒng)正常工作的基礎(chǔ)。在一個(gè)單片機(jī)應(yīng)用系統(tǒng)中,時(shí)鐘有兩方面的含義:一是指為保障系統(tǒng)正常工作的基準(zhǔn)振蕩定時(shí)信號(hào),主要由晶振和外圍電路組成,晶振頻率的大小決定了單片機(jī)系統(tǒng)工作的快慢;二是指系統(tǒng)的標(biāo)準(zhǔn)定時(shí)時(shí)鐘,即定時(shí)時(shí)間,它通常有兩種實(shí)現(xiàn)方法:一是用軟件實(shí)現(xiàn),即用單片機(jī)內(nèi)部的可編程定時(shí)/ 計(jì)數(shù)器
10、來(lái)實(shí)現(xiàn);二是用專(zhuān)門(mén)的時(shí)鐘芯片實(shí)現(xiàn)。</p><p> 2.1 各方案優(yōu)點(diǎn):</p><p> (1)數(shù)宇時(shí)鐘方案:</p><p> 數(shù)字時(shí)鐘是本設(shè)計(jì)的最主要的部分。根據(jù)需要,可利用兩種方案實(shí)現(xiàn)。</p><p> 方案一:本方案采用Dallas公司的專(zhuān)用時(shí)鐘芯片DS12887A。該芯片內(nèi)部采用石英晶體振蕩器,其芯片精度不大于10ms
11、/年,且具有完備的時(shí)鐘鬧鐘功能,因此,可直接對(duì)其以用于顯示或設(shè)置,使得軟件編程相對(duì)簡(jiǎn)單。</p><p> 方案二:本方案完全用軟件實(shí)現(xiàn)數(shù)字時(shí)鐘。原理為:在單片機(jī)內(nèi)部存儲(chǔ)器設(shè)三個(gè)字節(jié)分別存放時(shí)鐘的時(shí)、分、秒信息。利用定時(shí)器與軟件結(jié)合實(shí)現(xiàn)1秒定時(shí)中斷,每產(chǎn)生一次中斷,存儲(chǔ)器內(nèi)相應(yīng)的秒值加1;若秒值達(dá)到60,則將其清零,并將相應(yīng)的分字節(jié)值加1;若分值達(dá)到60,則清零分字節(jié),并將時(shí)字節(jié)值加1;若時(shí)值達(dá)到24,則將十字
12、節(jié)清零。</p><p> (2)數(shù)碼管顯示方案</p><p> 方案一:靜態(tài)顯示。所謂靜態(tài)顯示,就是當(dāng)顯示器顯示某一字符時(shí),相應(yīng)的發(fā)光二極管恒定的導(dǎo)通或截止。該方式每一位都需要一個(gè)8 位輸出口控制。靜態(tài)顯示時(shí)較小的電流能獲得較高的亮度,且字符不閃爍。</p><p> 方案二:動(dòng)態(tài)顯示。所謂動(dòng)態(tài)顯示就是一位一位的輪流點(diǎn)亮各個(gè)位,對(duì)于顯示器的每一位來(lái)說(shuō),每隔
13、一段時(shí)間點(diǎn)亮一次。顯示器的亮度既與導(dǎo)通電流有關(guān),也于點(diǎn)亮?xí)r間與間隔時(shí)間的比例有關(guān)。調(diào)整參數(shù)可以實(shí)現(xiàn)較高穩(wěn)定度的顯示。動(dòng)態(tài)顯示節(jié)省了I/O口,降低了能耗。</p><p> 2.2 各方案缺點(diǎn):</p><p> ?。?)數(shù)宇時(shí)鐘方案:</p><p> 方案一:本方案采用Dallas公司的專(zhuān)用時(shí)鐘芯片DS12887A。為保證時(shí)鐘在電網(wǎng)電壓不足或突然掉電等突發(fā)情況
14、下仍能正常工作,芯片內(nèi)部包含鋰電池。當(dāng)電網(wǎng)電壓不足或突然掉電時(shí),系統(tǒng)自動(dòng)轉(zhuǎn)換到內(nèi)部鋰電池供電系統(tǒng)。而且即使系統(tǒng)不上電,程序不執(zhí)行時(shí),鋰電池也能保證芯片的正常運(yùn)行,以備隨時(shí)提供正確的時(shí)間。</p><p> 方案二:本方案完全用軟件實(shí)現(xiàn)數(shù)字時(shí)鐘。該方案具有硬件電路簡(jiǎn)單的特點(diǎn)。但由于每次執(zhí)行程序時(shí),定時(shí)器都要重新賦初值,所以該時(shí)鐘精度不高。而且,由于是軟件實(shí)現(xiàn),當(dāng)單片機(jī)不上電,程序不執(zhí)行時(shí),時(shí)鐘將不工作。</
15、p><p> ?。?)數(shù)碼管顯示方案:</p><p> 方案一:靜態(tài)顯示。當(dāng)所顯示的位數(shù)較多時(shí),靜態(tài)顯示所需的I/O口太多,造成了資源的浪費(fèi)。</p><p> 方案二:動(dòng)態(tài)顯示。利用人的視覺(jué)暫留功能可以看到整個(gè)顯示,但必須保證掃描速度足夠快,字符才不閃爍。</p><p><b> 2.3對(duì)比選擇</b></
16、p><p> 基于硬件電路的考慮,本設(shè)計(jì)采用方案二完成數(shù)字時(shí)鐘的功能。從節(jié)省I/O口和降低能耗出發(fā),本設(shè)計(jì)采用方案二完成數(shù)碼管顯示。</p><p> 本設(shè)計(jì)使用的是單片機(jī)作為核心的控制元件,使得電路的可靠性比較高,功能也比較強(qiáng)大,而且可以隨時(shí)的更新系統(tǒng),進(jìn)行不同狀態(tài)的組合。 </p><p> 本系統(tǒng)采用單片機(jī)STC89C52作為本設(shè)計(jì)的核心元件,利用7段
17、共陰LED作為顯示器件,可顯示時(shí),分鐘,秒。并設(shè)置定時(shí)鬧鐘,定時(shí)時(shí)間到,揚(yáng)聲器發(fā)出聲響,通過(guò)AT24C02與溫度傳感器DS18B20相連,用于檢測(cè)溫度并斷電存儲(chǔ)。</p><p><b> 3系統(tǒng)設(shè)計(jì)</b></p><p> 電路由下列部分組成:時(shí)鐘電路、復(fù)位電路、控制電路、LED顯示,溫度檢測(cè),報(bào)警電路,芯片選用STC89C52單片機(jī)。</p>
18、<p><b> 3.1系統(tǒng)硬件設(shè)計(jì)</b></p><p> ?。?)STC89C52單片機(jī):STC89C52是一種帶8K字節(jié)閃爍可編程可檫除只讀存儲(chǔ)器的低電壓,高性能COMOS8的微處理器,俗稱(chēng)單片機(jī)。該器件采用ATMEL搞密度非易失存儲(chǔ)器制造技術(shù)制造,與工業(yè)標(biāo)準(zhǔn)的MCS-51指令集和輸出管腳相兼容。具有 8K 在系統(tǒng)可編程Flash 存儲(chǔ)器。在單芯片上,擁有靈巧的8 位CP
19、U 和在系統(tǒng)可編程Flash,是目前使用最廣泛的一類(lèi)單片機(jī)。</p><p><b> (1)系統(tǒng)原理圖</b></p><p> (2)數(shù)碼管顯示電路:?jiǎn)纹瑱C(jī)中通常使用7段LED,LED是發(fā)光二極管顯示器的縮寫(xiě)。LED顯示器由于結(jié)構(gòu)簡(jiǎn)單,價(jià)格便宜,體積小,亮度高,電壓低,可靠性高,壽命長(zhǎng),響應(yīng)速度快,顏色鮮艷,配置靈活,與單片機(jī)接口方便而得到廣泛應(yīng)用。LED顯示
20、器是由若干個(gè)發(fā)光二極管組成顯示字段的顯示部件,當(dāng)發(fā)光二極管導(dǎo)通時(shí),相應(yīng)的一個(gè)點(diǎn)或一個(gè)筆劃發(fā)光,控制不同組合的二極管導(dǎo)通,就能顯示出各種字符。</p><p> LED七段數(shù)碼顯示器由8個(gè)發(fā)光二極管組成顯示字符,根據(jù)內(nèi)部發(fā)光二極管的連接形式不同,LED有共陰極和共陽(yáng)極兩種,本系統(tǒng)采用共陰極。</p><p> LED的結(jié)構(gòu)及連接如圖所示:</p><p><
21、b> LED顯示原理</b></p><p> 當(dāng)選用共陰極的LED時(shí),所有發(fā)光二極管陰極連在一起接地,當(dāng)某個(gè)發(fā)光二極管的陽(yáng)極加入高電平時(shí),對(duì)應(yīng)的二極管點(diǎn)亮。因此要顯示某字形就應(yīng)使此字形的相應(yīng)段的二極管點(diǎn)亮,實(shí)際上就是送一個(gè)用不同電平組合代表的數(shù)據(jù)字來(lái)控制LED的顯示,此數(shù)據(jù)為字符的段碼或稱(chēng)為字型碼。字型碼與LED顯示器各段的關(guān)系為</p><p><b>
22、 表2-1</b></p><p> dp為小數(shù)點(diǎn),字符0、1、2……F的段碼如表2-2所示</p><p><b> 表2-2</b></p><p> 下圖是本系統(tǒng)采用的共陰極LED七段數(shù)碼顯示器:</p><p> 集成器件74HC573:八個(gè)鎖存器都是透明的D型鎖存器,當(dāng)使能G為高時(shí),Q輸出
23、將隨D輸入而變。當(dāng)使能為低時(shí),輸出講鎖存在已建立的數(shù)據(jù)電平上。輸出控制不影響鎖存器的內(nèi)部工作,即老數(shù)據(jù)可以繼續(xù)保持,甚至當(dāng)輸出被關(guān)閉時(shí),新的數(shù)據(jù)也可以置入。這種電路可以驅(qū)動(dòng)大電容或低阻抗負(fù)載,可以與系統(tǒng)總線(xiàn)接口并驅(qū)動(dòng)總線(xiàn),而不需要外接口。特別適用于緩沖寄存器,I/O通道,雙向總線(xiàn)驅(qū)動(dòng)器和工作寄存器。</p><p> 74HC573引腳圖:</p><p> 電源模塊:STC89C52
24、RC的工作電壓范圍是:3.3V~5.5V,次開(kāi)發(fā)板沒(méi)有設(shè)計(jì)專(zhuān)門(mén)的穩(wěn)壓電路,直接通過(guò)外部提供穩(wěn)定的5V穩(wěn)壓電源供電。</p><p> 鬧鈴模塊:采用蜂鳴器鬧鈴,當(dāng)?shù)皆O(shè)定時(shí)間時(shí),單片機(jī)向蜂鳴器送出低電平,蜂鳴器響鈴。采用蜂鳴器鬧鈴結(jié)構(gòu)簡(jiǎn)單,只需要單路信號(hào)控制,發(fā)出的鬧鈴聲音可以根據(jù)響和不響的不同的軟件延時(shí)時(shí)間來(lái)控制。</p><p> ?。?)輸入輸出電路:該系統(tǒng)輸入電路采用的是P1口以及
25、4個(gè)上拉電阻,其阻值為10千歐。</p><p> (7)溫度檢測(cè)電路:采用美國(guó)DALLAS半導(dǎo)體公司推出的一種改進(jìn)型智能溫度傳感器DS18B20作為檢測(cè)元件,溫度范圍為-55~125 ºC,最高分辨率可達(dá)0.0625 ºC。DS18B20可以直接讀出被側(cè)溫度值,而且采用三線(xiàn)制與單片機(jī)相連,減少了外部的硬件電路,具有低成本和易使用的特點(diǎn)。將DS18B20的數(shù)據(jù)輸入/輸出端與單片機(jī)STC89X
26、52端口相連,并將溫度值通過(guò)P1端口顯示出來(lái)。</p><p> 單片機(jī)晶振電路:51單片機(jī)內(nèi)部的振蕩電路是一個(gè)增益反相放大器,引線(xiàn)XYAL1和XTAL2分別為反相放大器的輸入和內(nèi)部時(shí)鐘電路輸入和來(lái)自反相放大器的輸出,該反相放大器可以配置為片內(nèi)振蕩器。晶振電路如下圖所示。</p><p> 復(fù)位電路:?jiǎn)纹瑱C(jī)小系統(tǒng)采用上電自動(dòng)復(fù)位和手動(dòng)按鍵復(fù)位兩種方式實(shí)現(xiàn)系統(tǒng)的復(fù)位操作。上電復(fù)位要求接通
27、電源后,自動(dòng)實(shí)現(xiàn)復(fù)位操作。手動(dòng)復(fù)位要求在電源接通的條件下,在單片機(jī)運(yùn)行期間,如果發(fā)生死機(jī),用按鈕開(kāi)關(guān)操作使單片機(jī)復(fù)位。單片機(jī)要完成復(fù)位,必須向復(fù)位端輸出并持續(xù)兩個(gè)機(jī)器周期以上的高電平,從而實(shí)現(xiàn)復(fù)位操作。上電自動(dòng)復(fù)位通過(guò)電容C1充電來(lái)實(shí)現(xiàn)和限流電阻R2。手動(dòng)按鍵復(fù)位是通過(guò)按鍵將電阻R1與VCC接通來(lái)實(shí)現(xiàn)。R1作為上拉電阻,當(dāng)復(fù)位鍵按下是產(chǎn)生一個(gè)觸發(fā)脈沖,進(jìn)行復(fù)位操作。 </p><p&g
28、t; 外部EEPROM電路:24CO2是電可擦除PROM,采用256-bit的組織結(jié)構(gòu)以及兩線(xiàn)串行接口,電壓可允許低至1.8V,待機(jī)電流和工作電流分別為1uA和1mA,它具有頁(yè)寫(xiě)能力,每頁(yè)為8字節(jié)。其實(shí)在次開(kāi)發(fā)板中,STC80C52已經(jīng)具備8K的存儲(chǔ)空間,已經(jīng)沒(méi)有必要加上24C02芯片,但是由于此芯片具有頁(yè)寫(xiě)能力,可以進(jìn)行程序的分頁(yè)寫(xiě)入和讀出,因此使用起來(lái)很方便。</p><p> 外部EEPROM電路<
29、;/p><p> (11)按鍵電路:按鍵的開(kāi)關(guān)狀態(tài)通過(guò)一定的電路轉(zhuǎn)換為高、低電平狀態(tài)。按鍵閉合過(guò)程在相應(yīng)的I/O端口形成一個(gè)負(fù)脈沖。閉合和釋放過(guò)程都要經(jīng)過(guò)一定的過(guò)程才能達(dá)到穩(wěn)定,這一過(guò)程是處于高、低電平之間的一種不穩(wěn)定狀態(tài),稱(chēng)為抖動(dòng)。抖動(dòng)持續(xù)時(shí)間的常長(zhǎng)短與開(kāi)關(guān)的機(jī)械特性有關(guān),一般在5-10ms之間。為了避免CPU多次處理按鍵的一次閉合,應(yīng)采用措施消除抖動(dòng)。本文采用的是獨(dú)立式按鍵,直接用I/O口線(xiàn)構(gòu)成單個(gè)按鍵電路,每
30、個(gè)按鍵占用一條I/O口線(xiàn),每個(gè)按鍵的工作狀態(tài)不會(huì)產(chǎn)生互相影響。</p><p> 3.2 系統(tǒng)軟件設(shè)計(jì)</p><p><b> 程序流程圖:</b></p><p><b> 中斷服務(wù)程序</b></p><p> 本實(shí)驗(yàn)中,T0的定時(shí)長(zhǎng)度為0.01s,工作于方式1,計(jì)數(shù)1次,時(shí)長(zhǎng)1us,
31、故計(jì)數(shù)器計(jì)數(shù)10000次,進(jìn)入中斷,計(jì)數(shù)初值為65536-10000=55536=#0D8F0,裝滿(mǎn)定時(shí)器需要0.01s的時(shí)間,從而100次中斷為一秒,一秒之后,判斷是否到60秒,若不到則秒加一,然后返回,若到,則秒賦值為0,分加一,依次類(lèi)推。包括日期顯示的功能也是如此?;谝陨峡紤],以下為定時(shí)中斷流程圖:</p><p> 計(jì)數(shù)器T1工作于方式1, 當(dāng)調(diào)用響鈴程序時(shí),其計(jì)數(shù)功能開(kāi)啟,為音樂(lè)音調(diào)不同頻率的方波的
32、形成,提供延時(shí)。其中斷服務(wù)程序就是根據(jù)音調(diào)改變音樂(lè)方波輸出口電平的高低,用語(yǔ)句 CPL實(shí)現(xiàn)。</p><p> 中斷服務(wù)程序中日歷的實(shí)現(xiàn)較為復(fù)雜,要考慮平年,閏年,特殊的2月,每月的天數(shù)的不盡相同。具體的邏輯判斷方法為:首先,要考慮年份是不是閏年,閏年的判斷方法是:將年份除以100,若能整除,則將年份除以400,若還能整除,則為閏年,若不能,則為平年;若不能被100整除,則判斷是否能被4整除,若能,則為閏年,若
33、不能則為平年。只有2月與平、閏年相關(guān),因此在閏年和平年的子程序中,要判斷是不是2月,若是則在相應(yīng)的年中進(jìn)行日期的增加,若不是則轉(zhuǎn)入平時(shí)的月份。其中1、3、5、7、8、10、12月是每月31天,4、6、9、11月為每月30天。</p><p> 日歷進(jìn)位判斷流程圖如下:</p><p> 本實(shí)驗(yàn)用8個(gè)數(shù)碼管,剛好能顯示年,月,日,掃描顯示與時(shí)間的掃描顯示類(lèi)似。年比較特殊,由兩個(gè)寄存器存儲(chǔ)
34、,個(gè)位,十位為0時(shí),表明年數(shù)能被100整除,若此時(shí)千位,百位</p><p> 組成兩位數(shù)能被4整除,則年數(shù)被400整除,為閏年。若十位,個(gè)位組成兩位數(shù)能被4整除,則年數(shù)能被4整除,為閏年。</p><p><b> 主程序</b></p><p> 主程序主要對(duì)按鍵進(jìn)行掃描,以及判斷定時(shí)和鬧鈴時(shí)間是否已到,若到則調(diào)用相關(guān)程序,該段程序如
35、下:</p><p> #include<reg52.h></p><p> #include<intrins.h></p><p> #define uint unsigned int</p><p> #define uchar unsigned char</p><p> uch
36、ar code table[]={</p><p> 0xfc,0x60,0xda,0xf2,</p><p> 0x66,0xb6,0xbe,0xe0,</p><p> 0xfe,0xf6,0xee,0x3e,</p><p> 0x9c,0x7a,0x9e,0x8e};</p><p> uchar c
37、ode table1[]={</p><p> 0xfd,0x61,0xdb,0xf3,</p><p> 0x67,0xb7,0xbf,0xe1,</p><p> 0xff,0xf7,0xef,0x3f,</p><p> 0x9d,0x7b,0x9f,0x8f}; //帶小數(shù)的 </p><p> uc
38、har IRCOM[7];</p><p> uchar tem_1[3];</p><p> uchar tem_2[3];</p><p> uchar tem_3[3];</p><p> uchar tem_4[3];</p><p> uchar month,day,mode,num,num_day
39、,flag,data_flag,</p><p> clock_flag,time_flag,flag_rom,b,c,time; char miao,fen,shi,miao1,fen1,shi1; //miao1,fen1,shi1是鬧鐘的設(shè)置時(shí)間 </p><p> uint temper,year,tempe;</p><p> uchar
40、 a1,a2,a3,a4,a5;</p><p> uint tem_hh=35000; //溫度上限:28度</p><p> uint tem_ll=15000; //溫度下限:21度</p><p> sbit wela=P1^7;</p><p> sbit dula=P1^6;</p><p&
41、gt; sbit led_hh=P1^0;</p><p> sbit led_h=P1^1;</p><p> sbit led_l=P1^3;</p><p> sbit led_ll=P1^4;</p><p> sbit k1=P2^0; //模式鍵</p><p> sbit k2=P2^1;
42、 //加 鍵</p><p> sbit k3=P2^2; //減鍵</p><p> sbit k4=P2^3;</p><p> sbit k5=P2^4;</p><p> sbit k6=P3^2;//外部中斷0調(diào)取歷史溫度和時(shí)間</p><p> sbit IRIN=P3^3; //紅
43、外接INT1</p><p> sbit buzzer=P2^7;</p><p> sbit DQ=P3^7; //溫度傳感器DS18B20</p><p> sbit sda=P2^6; //24C02數(shù)據(jù)線(xiàn)</p><p> sbit scl=P2^5; //24C02時(shí)鐘線(xiàn)</p><p>
44、; void delay(uint z);</p><p> void init();</p><p> void back();</p><p> void alarm_ring();</p><p> void display_time();//顯示時(shí)間函數(shù)</p><p> void display
45、_time1();</p><p> void display_data();//顯示日期函數(shù)</p><p> void point_time1(); //標(biāo)志鬧鈴時(shí)間</p><p> void buzze(uchar z);</p><p> void key_scan();</p><p>
46、void delayus(uint x,uchar y);</p><p> void display_tem(uchar a,uchar b,uchar c,uchar d,uchar e);//顯示溫度函數(shù)</p><p> void display_tim_tem(uchar time,uchar tem_h,uchar tem_l);//顯示歷史溫度和時(shí)間</p&
47、gt;<p> void reset();</p><p> void write_byte(uchar date); /*DS18B20相關(guān)函數(shù)*/</p><p> uchar read_byte();/*DS18B20的相關(guān)函數(shù)*/</p><p> void get_tem();/*DS18B20的獲取相關(guān)函數(shù)*/</p>
48、;<p> void warn(uint s,uchar led);</p><p> void tem_ctrl();</p><p> void delay_nop();</p><p> void start();//24C02根據(jù)時(shí)序的函數(shù)啟動(dòng)信號(hào)</p><p> void stop(); /
49、/24C02停止信號(hào)</p><p> void respons(); //24C02應(yīng)答信號(hào)</p><p> void init_rom(); //24C02總線(xiàn)初始化</p><p> void maindelay();</p><p> void write_byte_rom(uchar date);//24C02寫(xiě)
50、一字節(jié)</p><p> uchar read_byte_rom(); //24C02讀一個(gè)字節(jié)</p><p> void write_add(uchar address,uchar date); //24C02寫(xiě)數(shù)據(jù)到確定的地址</p><p> uchar read_add(uchar address);//24C02讀地址數(shù)據(jù)</p>
51、<p> void delay(uint z)</p><p><b> {</b></p><p><b> uint x,y;</b></p><p> for(x=z;x--;x<0)</p><p> for(y=110;y--;y<0);</p>
52、;<p><b> }</b></p><p> void delayus(uint x,uchar y)</p><p> { uint i; uchar j;</p><p> for(i=x;i>0;i--);</p><p> for(j=y;j>0;j--);
53、 }</p><p> void IRdelay(unsigned char x) //x*0.14MS</p><p> { unsigned char i;</p><p> while(x--)</p><p> { for (i = 0; i<13; i++) { }</p><
54、p><b> }}</b></p><p> void init() //系統(tǒng)總的初始化</p><p> { fen=miao=shi=shi1=fen1=miao1=mode=num=flag=data_flag=0;</p><p> year=2012; month=10; day=10; </p>
55、<p><b> buzzer=1;</b></p><p> wela=dula=0;</p><p> TMOD=0x01; </p><p> TH0=(65536-50000)/256; //要定時(shí)50ms</p><p> TL0=(65536-50000)%256;</p
56、><p><b> EA=1;</b></p><p> ET0=1; //開(kāi)啟定時(shí)器0</p><p> TR0=1; //啟動(dòng)定時(shí)器0</p><p> TCON |= 0x01; //觸發(fā)方式為脈沖負(fù)邊沿觸發(fā)</p><p> EX0=1;
57、 //開(kāi)外部中斷0 </p><p> EX1=1; //開(kāi)外部中斷1</p><p><b> IRIN=1;</b></p><p> init_rom(); //24C02總線(xiàn)初始化</p><p> get_tem(); }</p><p> voi
58、d buzze(uchar z)</p><p> { uchar i,j;</p><p> for(i=z;i>0;i--)</p><p> { buzzer=0; for(j=10;j>0;j--)</p><p> { maindelay(); }// 設(shè)置的主函數(shù),即蜂鳴器在響的時(shí)候數(shù)碼管顯示日期
59、和溫度</p><p> buzzer=1;//蜂鳴器聲音實(shí)際上連續(xù)的</p><p><b> }</b></p><p><b> }</b></p><p> /*******************************************</p><p
60、><b> 加天數(shù)</b></p><p> *******************************************void dayadd()</p><p><b> { day++;</b></p><p> if((year%4==0&&year%100!=0)||ye
61、ar%400==0){ switch (month)</p><p> { case 1: if(day==32) day=1;break;</p><p> case 2: if(day==30) day=1; break;</p><p> case 3:if(day==32) day=1; break;</p><p&
62、gt; case 4: if(day==31) day=1; break;</p><p> case 5: if(day==30) day=1; break;</p><p> case 6:if(day==31) day=1; break;</p><p> case 7: if(day==32) day=1; break;</
63、p><p> case 8: if(day==32) day=1; break;</p><p> case 9:if(day==31) day=1; break;</p><p> case 10:if(day==32) day=1; break;</p><p> case 11:if(day==31) day=1;
64、break;</p><p> case 12:if(day==32) day=1; break;</p><p><b> }}</b></p><p><b> else </b></p><p> { switch (month)</p><p> {
65、 case 1: if(day==32) day=1;break;</p><p> case 2: if(day==29) day=1; break;</p><p> case 3: if(day==32) day=1; break;</p><p> case 4: if(day==31) day=1; break;</p&g
66、t;<p> case 5: if(day==30) day=1; break;</p><p> case 6:if(day==31) day=1; break;</p><p> case 7:if(day==32) day=1; break;</p><p> case 8:if(day==32) day=1; break
67、;</p><p> case 9:if(day==31) day=1; break;</p><p> case 10:if(day==32) day=1; break;</p><p> case 11:if(day==31) day=1; break;</p><p> case 12:if(day==32) da
68、y=1; break;</p><p><b> } }}</b></p><p> /******************************************* 減天數(shù)</p><p> *******************************************/void dayreduce()</p
69、><p><b> { day--;</b></p><p> if((year%4==0&&year%100!=0)||year%400==0)</p><p> { switch (month)</p><p> { case 1: if(day==0) day=31;break; ca
70、se 2: if(day==0) day=29;break;</p><p> case 3:if(day==0) day=31;break;</p><p> case 4: if(day==0) day=30;break;</p><p> case 5: if(day==0) day=31;break;</p>&l
71、t;p> case 6:if(day==0) day=30;break;</p><p> case 7:if(day==0) day=31;break;</p><p> case 8:if(day==0) day=31;break;</p><p> case 9:if(day==0) day=30;break;</p>
72、<p> case 10:if(day==0) day=31;break;</p><p> case 11:if(day==0) day=30;break;</p><p> case 12:if(day==0) day=31;break;</p><p><b> }}</b></p>&l
73、t;p><b> else </b></p><p> { switch (month)</p><p> { case 1: if(day==0) day=31;break;</p><p> case 2: if(day==0) day=28;break;</p><p> cas
74、e 3: if(day==0) day=31;break;</p><p> case 4: if(day==0) day=30;break;</p><p> case 5: if(day==0) day=31;break;</p><p> case 6:if(day==0) day=30;break;</p><p&
75、gt; case 7: if(day==0) day=31;break;</p><p> case 8: if(day==0) day=31;break;</p><p> case 9:if(day==0) day=30;break;</p><p> case 10:if(day==0) day=31;break;</p>
76、<p> case 11:if(day==0) day=30;break;</p><p> case 12:if(day==0) day=31;break;</p><p><b> } } }</b></p><p> /*******************************************
77、</p><p><b> 鍵盤(pán)掃描函數(shù)</b></p><p> *******************************************/</p><p> void key_scan()</p><p> { if(mode>=10) / /判斷鬧鐘,需清除mode標(biāo)記</p&
78、gt;<p><b> mode=0;</b></p><p> if(mode==0)</p><p> { if(shi1!=0||fen1!=0||miao1!=0)</p><p> {if(shi1==shi&&fen1==fen&&miao1==miao)</p>
79、<p> { alarm_ring();}</p><p><b> }</b></p><p><b> } </b></p><p> if(k1==0)//k1是第二個(gè)開(kāi)關(guān),即模式設(shè)置按鍵</p><p> { delay(10); //消除抖動(dòng)</p>
80、<p><b> if(k1==0)</b></p><p> {mode++; //功能鍵按下次數(shù)確定,其實(shí)k1就是mode鍵, mode初始值等于0</p><p> while(!k1)</p><p> { if(time_flag==1) //data_flag初始值等于0,也就是第一次按下顯示時(shí)間time
81、,data_flag是日期標(biāo)志</p><p> display_time();//按住不動(dòng)顯示時(shí)間和日期</p><p> else if(data_flag==1)</p><p> display_data();</p><p> else if(clock_flag==1)</p><p> dis
82、play_time1();</p><p><b> }</b></p><p> if(mode==1)</p><p> { TR0=0;</p><p> time_flag=1;</p><p><b> }</b></p><p&g
83、t; if(mode==2)</p><p> { TR0=0;</p><p> time_flag=1;</p><p> display_time(); //停止計(jì)時(shí),顯示時(shí)間</p><p> delay(1000);</p><p><b> }</b></p&g
84、t;<p> if(mode==3)</p><p> { TR0=0;</p><p> time_flag=1; //關(guān) 定時(shí)器0</p><p> display_time();</p><p><b> }</b></p><p> if(mode=
85、=4) //停止計(jì)時(shí),顯示日期</p><p> { TR0=0;</p><p> time_flag=0;</p><p> data_flag=1;</p><p> display_data();</p><p><b> }</b></p><p>
86、 if(mode==5)</p><p> { TR0=0;</p><p> time_flag=0;</p><p> display_data();//顯示日期</p><p><b> }</b></p><p> if(mode==6)</p><p
87、> { TR0=0;</p><p> time_flag=0;</p><p> display_data();//顯示日期</p><p><b> }</b></p><p> if(mode==7)</p><p><b> {TR0=0;</b&
88、gt;</p><p> data_flag=0;</p><p> time_flag=0;</p><p> clock_flag=1;</p><p> display_time1();</p><p><b> }</b></p><p> if(mod
89、e==8)</p><p><b> {TR0=0; </b></p><p> data_flag=0;</p><p> clock_flag=1;</p><p> display_time1();</p><p><b> }</b></p>
90、<p> if(mode==9)</p><p><b> {TR0=0;</b></p><p> data_flag=0;</p><p> clock_flag=1;</p><p> display_time1();</p><p><b> }<
91、/b></p><p> if(mode==10)//循環(huán)</p><p> { data_flag=0;</p><p> display_time();</p><p><b> TR0=1;</b></p><p><b> } } }</b&
92、gt;</p><p> if(mode!=0)</p><p> { if(k2==0) //年月日,時(shí)間加操作 { delay(10);</p><p><b> if(k2==0)</b></p><p> { while(!k2)</p><p> {if(tim
93、e_flag==1) display_time(); else if(data_flag==1)</p><p> display_data();</p><p> else if(clock_flag==1)</p><p> display_time1();</p><p><b>
94、 }</b></p><p><b> buzze(1);</b></p><p> if(mode==1)</p><p> { miao++;</p><p> if(miao==60)</p><p> miao=0; display_time();</p&
95、gt;<p><b> }</b></p><p> if(mode==2)</p><p><b> { fen++;</b></p><p> if(fen==60)</p><p> fen=0; display_time();</p><p&g
96、t;<b> }</b></p><p> if(mode==3)</p><p><b> { shi++;</b></p><p> if(shi==24)</p><p> shi=0;display_time();}</p><p> if(mo
97、de==4)</p><p> { dayadd();</p><p> display_data();</p><p><b> }</b></p><p> if(mode==5)</p><p><b> {month++;</b></p>&l
98、t;p> if(month==13)</p><p> month=1;display_data();</p><p><b> }</b></p><p> if(mode==6)</p><p><b> {year++;</b></p><p> di
99、splay_data();</p><p><b> }</b></p><p> if(mode==7)</p><p> { miao1++;</p><p> display_time1();</p><p><b> }</b></p><
100、;p> if(mode==8)</p><p><b> {fen1++;</b></p><p> display_time1();</p><p><b> }</b></p><p> if(mode==9)</p><p><b> {sh
101、i1++;</b></p><p> display_time1();</p><p><b> } } }</b></p><p> if(k3==0) //時(shí)間年月日減操作</p><p> { delay(10);</p><p><b> if(k
102、3==0)</b></p><p> { while(!k3)</p><p> { if(time_flag==1) //data_flag初始值等于0,也就是第一次按下顯示時(shí)間time,data_flag是日期標(biāo)志</p><p> display_time(); else if(data_flag==1)</p&
103、gt;<p> display_data();</p><p> else if(clock_flag==1)</p><p> display_time1();</p><p><b> } </b></p><p> if(mode==1)</p><p><b
104、> {miao--;</b></p><p> if(miao==-1)</p><p> miao=59;display_time(); }</p><p> if(mode==2)</p><p> { fen--;</p><p> if(fe
105、n==-1)</p><p><b> fen=59;</b></p><p> delay(10);display_time(); }</p><p> if(mode==3)</p><p><b> {shi--;</b></p><
106、p> if(shi==-1)</p><p><b> shi=23;</b></p><p> delay(10); display_time();}</p><p> if(mode==4)</p><p> { dayreduce();</p><p> di
107、splay_data();</p><p><b> }</b></p><p> if(mode==5)</p><p> { month--;</p><p> if(month==0)</p><p> month=12;display_data();</p>
108、<p><b> }</b></p><p> if(mode==6)</p><p> { year--;</p><p> if(year==0)</p><p> year=2012;display_data();</p><p><b> }</b
109、></p><p> if(mode==7)</p><p> { miao1--;</p><p> if(miao1==-1)</p><p> miao1=59;display_time1(); }</p><p> if(mode==8)</p><
110、p><b> {</b></p><p><b> fen1--;</b></p><p> if(fen1==-1)</p><p><b> fen1=59;</b></p><p> delay(10);display_time1();</p&
111、gt;<p><b> }</b></p><p> if(mode==9)</p><p><b> {</b></p><p><b> shi1--;</b></p><p> if(shi1==-1)</p><p>
112、shi1=23;delay(10);</p><p> display_time1(); }</p><p><b> }</b></p><p><b> }</b></p><p> back(); </p><p><
113、;b> }</b></p><p> if(k4==0) //按一次顯示當(dāng)前溫度,按第二次返回時(shí)間顯示,這樣循環(huán)下去</p><p> { delay(10);</p><p> if(k4==0) </p><p> {while(!k4)</p><p> {if(fl
114、ag==0)</p><p> display_time();</p><p><b> else </b></p><p> display_tem(a1,a2,a3,a4,a5); //顯示溫度}</p><p> flag=!flag;</p><p><b>
115、 }</b></p><p><b> }</b></p><p><b> if(k5==0)</b></p><p> { delay(10);</p><p><b> if(k5==0)</b></p><p> {
116、 while(!k5)</p><p> { display_data();}</p><p> if(b==1) b=0; //如果是調(diào)整時(shí)間和日期的狀態(tài),則按下后返回顯示時(shí)間</p><p><b> }</b></p><p><b> }</b></p>&l
117、t;p><b> }</b></p><p> void back(void)</p><p> {if(k5==0) </p><p> {delay(10);</p><p> if(k5==0)//k5按下后就執(zhí)行以下程序</p><p> {while(!k5)<
118、;/p><p> {display_time();} //按下顯示時(shí)間</p><p> mode=0;b=0;data_flag=0;TR0=1;</p><p> display_time();</p><p><b> } </b></p><p><b> }
119、</b></p><p><b> }</b></p><p> /*******************************************</p><p> 日期標(biāo)志 功能:調(diào)整日期時(shí)顯示的</p><p> *************************************
120、******/</p><p> void point_data()</p><p> { P0=0x00;dula=1;P0=table[year/1000];dula=0;</p><p> P0=0xff;wela=1;</p><p> P0=0xfe;wela=0;delay(1);P0=0x00;dula=1;</
121、p><p> P0=table[year%1000/100];dula=0;</p><p> P0=0xff;wela=1; P0=0xfd; wela=0;delay(1);</p><p> P0=0x00;dula=1;P0=table[year%100/10];dula=0;</p><p> P0=0xff;wela=1;P0
122、=0xfb; wela=0;delay(1);</p><p> P0=0x00;dula=1;</p><p> if(mode==6)//按下6次后 調(diào)整年份</p><p> { P0=table1[year%10];}</p><p><b> else</b></p><p>
123、; P0=table[year%10];dula=0;P0=0xff;wela=1;</p><p> P0=0xf7; wela=0;delay(1);P0=0x00;dula=1;</p><p> P0=table[month/10];dula=0;P0=0xff;wela=1;</p><p> P0=0xef; wela=0;delay(1);P0
124、=0x00;dula=1;</p><p> if(mode==5) //按下5次后調(diào)整月</p><p> {P0=table1[month%10];}</p><p><b> else</b></p><p> P0=table[month%10];dula=0;P0=0xff;wela=1;</p
125、><p> P0=0xdf; wela=0;delay(1);P0=0x00;dula=1;</p><p> P0=table[day/10];dula=0;P0=0xff;wela=1;</p><p> P0=0xbf;wela=0;delay(1);P0=0x00;</p><p><b> dula=1;</b&
126、gt;</p><p> if(mode==4)</p><p> {P0=table1[day%10]; //按下4次后調(diào)整天</p><p><b> }</b></p><p><b> else</b></p><p> P0=table[day%10]
127、;dula=0;P0=0xff;wela=1; </p><p> P0=0x7f; wela=0;delay(1);P0=0x00;</p><p><b> }</b></p><p> /*******************************************</p><p><b&
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機(jī)實(shí)訓(xùn)課程設(shè)計(jì)--液晶時(shí)鐘顯示
- 單片機(jī)課程設(shè)計(jì)-單片機(jī)課程設(shè)計(jì)---電子時(shí)鐘
- 單片機(jī)課程設(shè)計(jì)---單片機(jī)數(shù)字時(shí)鐘
- 單片機(jī)課程設(shè)計(jì)--led數(shù)字顯示電子時(shí)鐘
- 單片機(jī)課程設(shè)計(jì)報(bào)告---單片機(jī)數(shù)字時(shí)鐘
- 單片機(jī)課程設(shè)計(jì)---單片機(jī)數(shù)字時(shí)鐘.doc
- 單片機(jī)課程設(shè)計(jì)--數(shù)字時(shí)鐘
- 單片機(jī)簡(jiǎn)易時(shí)鐘課程設(shè)計(jì)
- 單片機(jī)數(shù)字時(shí)鐘課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--數(shù)字時(shí)鐘
- 單片機(jī)課程設(shè)計(jì)(數(shù)字時(shí)鐘)
- 單片機(jī)課程設(shè)計(jì)---時(shí)鐘系統(tǒng)設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--時(shí)鐘及液晶顯示器設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--基于單片機(jī)的數(shù)字時(shí)鐘設(shè)計(jì)
- 課程設(shè)計(jì)-單片機(jī)基于單片機(jī)的數(shù)字時(shí)鐘設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---單片機(jī)電子時(shí)鐘
- 單片機(jī)課程設(shè)計(jì)--單片機(jī)模擬電子時(shí)鐘設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)時(shí)鐘設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--電子日歷時(shí)鐘顯示器設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--單片機(jī)模擬電子時(shí)鐘設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論