2023年全國(guó)碩士研究生考試考研英語(yǔ)一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩27頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論