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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 9625|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)交通信號(hào)燈控制系統(tǒng)設(shè)計(jì)文檔 PPT 仿真 源碼 PCB

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
這個(gè)設(shè)計(jì)很全ppt 還有源程序和仿真都有
下載地址:
基于單片機(jī)的智能交通燈系統(tǒng)的設(shè)計(jì).zip (1.74 MB, 下載次數(shù): 135)

下面是文檔的部分內(nèi)容預(yù)覽:

ppt內(nèi)容預(yù)覽:



2  設(shè)計(jì)要求和設(shè)計(jì)方案

2.1 設(shè)計(jì)要求

2.1.1項(xiàng)目概述

道路交通信號(hào)燈是道路交通安全的產(chǎn)品,它可以加強(qiáng)道路交通管理,減少交通事故的發(fā)生,提高道路使用效率,改善交通狀況的一種重要工具。它適用于各種十字、丁字等交叉路口,由道路交通信號(hào)燈控制,指導(dǎo)車(chē)輛和行人安全而有序地通行。

2.1.2 設(shè)計(jì)任務(wù)

設(shè)計(jì)一種交通信號(hào)燈的控制系統(tǒng)。要求直觀,簡(jiǎn)單。能夠滿足十字路口交通等的使用需求。

2.1.3 設(shè)計(jì)要求

1. 交通路口為十字路口。

2.馬路為雙向六車(chē)道,即要有左轉(zhuǎn)燈,直行燈,右轉(zhuǎn)燈。

3.要考慮人行橫道的信號(hào)燈。

4.有顯示設(shè)備可以顯示通信時(shí)間。

5.要求通行時(shí)間可調(diào)。


2.2 設(shè)計(jì)方案

2.2.1 供電方案

    系統(tǒng)要在正常而穩(wěn)定的狀態(tài)下工作,必須要有可靠的電源。而本次基于單片機(jī)的設(shè)計(jì)需要顯示的芯片較多,電源供應(yīng)量大,因此本次設(shè)計(jì)了如下三種方案。

方案一:利用獨(dú)立的穩(wěn)壓電源供電。優(yōu)點(diǎn)是可提供穩(wěn)定而可靠電源,而且可以利用220V電壓轉(zhuǎn)化,不受各種因素的限制;缺點(diǎn)是各模塊都采用獨(dú)立電源,會(huì)增加本次設(shè)計(jì)的難度,而且對(duì)其他電路還會(huì)造成一定的干擾。

方案二:采用USB轉(zhuǎn)接口5V電壓供電,這樣簡(jiǎn)單明了,但是單單一個(gè)5V電源供電可能會(huì)顯得電源不足,而無(wú)法滿足實(shí)際的需要。

方案三:采用USB轉(zhuǎn)接口5V雙電源電壓供電,這樣把本次設(shè)計(jì)分為兩大模塊,一是交通信號(hào)燈控制系統(tǒng),二是萬(wàn)年歷系統(tǒng),采用雙電源供電,一個(gè)為交通信號(hào)燈控制系統(tǒng)提供電源,另一個(gè)為萬(wàn)年歷系統(tǒng)提供電源。這樣即簡(jiǎn)單而又可提供穩(wěn)定的電源。

考慮到實(shí)際情況和電路的簡(jiǎn)潔,本設(shè)計(jì)采用了第三套方案,此方案在電路的設(shè)計(jì)上可以把系統(tǒng)分為兩大模塊,使系統(tǒng)設(shè)計(jì)簡(jiǎn)單化,從而又可以提供穩(wěn)定而可靠電源。而且在單電源斷電的情況下不影響另一模塊的工作。


2.2.2 輸入方案

    該系統(tǒng)要求能手動(dòng)及智能控制改變交通信號(hào)燈的通行時(shí)間和萬(wàn)年歷時(shí)間的調(diào)整。

方案一:采用8155擴(kuò)展I/O 口及鍵盤(pán)、顯示等。該方案的優(yōu)點(diǎn)是:使用靈活可編程,并且有RAM,及計(jì)數(shù)器。若用該方案,可提供較多I/O 口,但操作起來(lái)稍顯復(fù)雜。

方案二: 直接在I/O口線上接上按鍵開(kāi)關(guān)。該方案優(yōu)點(diǎn)是:編程更加簡(jiǎn)潔,使用更加簡(jiǎn)單,且成本更低。缺點(diǎn)就是功能有限。

綜合考慮本設(shè)計(jì)的實(shí)際需要,在使用輸入的時(shí)候不需要過(guò)于復(fù)雜的功能,因此直接在I/O口線上接上按鍵開(kāi)關(guān)足以滿足本次系統(tǒng)設(shè)計(jì)的需要,故采用方案二。


2.2.3 顯示界面方案

本設(shè)計(jì)涉及到倒計(jì)時(shí)、狀態(tài)燈、時(shí)間、溫度等顯示功能;诠δ苄枨,本設(shè)計(jì)考慮如下四種方案:

方案一:完全采用數(shù)碼管顯示。這種方案只顯示有限的符號(hào)和數(shù)碼字符,無(wú)法勝任功能需求。

方案二:完全采用點(diǎn)陣式LED 顯示。這種方案實(shí)現(xiàn)復(fù)雜,且須完成大量的軟件工作;但功能強(qiáng)大,可方便的顯示各種英文字符,漢字,圖形等。

方案三:采用LCD1602液晶顯示,這種顯示比較樂(lè)觀,但是工作量大,而且設(shè)計(jì)復(fù)雜,再加上需要到的LCD1602較多,從經(jīng)濟(jì)上也不劃算。

方案四:采用數(shù)碼管、LED與LCD1602相結(jié)合的方法因?yàn)樵O(shè)計(jì)既要求倒計(jì)時(shí)數(shù)字輸出,又要求有狀態(tài)燈輸出,同時(shí)還要顯示出年、月、日、時(shí)、分、秒、星期和溫度。為了方便觀看并考慮到實(shí)際情況,用數(shù)碼管顯示交通信號(hào)燈的倒計(jì)時(shí),用LED顯示交通燈的狀態(tài)燈、用LCD1602顯示年、月、日、時(shí)、分、秒、星期和溫度。這種設(shè)計(jì)方案既滿足系統(tǒng)功能要求,又減少了系統(tǒng)實(shí)現(xiàn)的復(fù)雜度。


2.2.4交通燈方案

2.2.4.1交通燈規(guī)則方案

本設(shè)計(jì)的交通燈以十字路口為模型,在實(shí)現(xiàn)基本的功能前提下增加了時(shí)間及溫度的液晶顯示。從而還增加了路口高峰期的智能化人工管理機(jī)制。

    實(shí)際生活中交通信號(hào)燈的規(guī)則千變?nèi)f化,在不同的路口上看到的交通信號(hào)燈的規(guī)則不一樣,但是總體還是相差不大,也有一些根據(jù)實(shí)際的需要而設(shè)置不同的交通規(guī)則,本次系統(tǒng)交通規(guī)則的設(shè)置是根據(jù)現(xiàn)實(shí)生活中的交通規(guī)則和多加考慮各種現(xiàn)實(shí)因素結(jié)合起來(lái)而制定了以下交通規(guī)則。

下圖所示為一種紅綠燈規(guī)則的狀態(tài)圖:



                 



      


共四種狀態(tài),分別設(shè)定為S1、S2、S3、S4,交通燈以這四種狀態(tài)為一個(gè)周期,循環(huán)執(zhí)行如下圖所示:


依據(jù)上述車(chē)輛行駛的狀態(tài)圖,可以列出正常模式下各個(gè)路口交通信號(hào)燈的邏輯表如下表所示(其中邏輯值“1”表示直行通行,邏輯值“0”表示禁止通行,邏輯值“L”表示左轉(zhuǎn)通行):


表2.1 正常模式下工作表

S1的狀態(tài)

E

S

W

N

邏輯值

0

1

0

1

顯示時(shí)間

正常模式下為40S


S2的狀態(tài)

E

S

W

N

邏輯值

0

L

0

L

顯示時(shí)間

正常模式下為20S


S3的狀態(tài)

E

S

W

N

邏輯值

1

0

1

0

顯示時(shí)間

正常模式下為40S


S4的狀態(tài)

E

S

W

N

邏輯值

L

0

L

0

顯示時(shí)間

正常模式下為20S


程序就是在上述四種狀態(tài)下循環(huán)轉(zhuǎn)化的,而每種狀態(tài)下又包括綠燈通行和黃燈閃爍警告狀態(tài)。系統(tǒng)在正常模式下循環(huán)一個(gè)周期所需要的時(shí)間為120S,數(shù)碼管顯示的工作模式為半周期60.


2.2.4.2各種模式下通行時(shí)間

   本系統(tǒng)結(jié)合實(shí)際的需要,而在上述四種狀態(tài)的每種狀態(tài)下再細(xì)分為綠燈通行、黃燈閃爍兩種狀態(tài),總共八種工作狀態(tài)。系統(tǒng)在正常工作模式下又可分為三種工作模式,分別為:正常模式、繁忙模式和特殊模式。各種模式下的時(shí)間分配如下表2.2:

表2.2 各模式下時(shí)間分配表



S1

S2

S3

S4

S5

S6

S7

S8

周期

正常模式

35S

5S

15S

5S

35S

5S

15S

5S

120S

繁忙模式

25S

5S

10S

5S

25S

5S

10S

5S

90S

特殊模式

50S

5S

15S

5S

50S

5S

15S

5S

150S



2.2.5 萬(wàn)年歷設(shè)計(jì)方案

電路設(shè)計(jì)框圖

本系統(tǒng)的電路系統(tǒng)框圖如圖2.6所示。AT89C51單片機(jī)對(duì)DS1302和DS18B20寫(xiě)入控制字并讀取相應(yīng)的數(shù)據(jù),繼而控制LCD1602作出對(duì)應(yīng)的顯示,同時(shí)也向交通信號(hào)燈外部發(fā)出定時(shí)中斷,從而改變交通信號(hào)燈的工作模式。


3  芯片的介紹及應(yīng)用

3.1 AT89C51單片機(jī)介紹及應(yīng)用

單片微型計(jì)算機(jī)簡(jiǎn)稱單片機(jī),同時(shí)又稱為微控制器、嵌入式微控制器等,它屬于第四代電子計(jì)算機(jī)。它把各種芯片電路集成在一塊芯片上,因此它具有體積小、抗干擾能力強(qiáng)、功耗低、可靠性高以及低廉的價(jià)格。它廣泛應(yīng)用于工業(yè)過(guò)程控制、測(cè)控系統(tǒng)及各種智能儀器儀表等。因此國(guó)際上逐漸采用微控制器(MCU)代替單片微型計(jì)算機(jī)(SCM)這一名稱。微控制器可以更準(zhǔn)確的反應(yīng)出單片機(jī)的本質(zhì),但單片機(jī)這一名稱以為大多數(shù)人所接受,所以單片微型計(jì)算機(jī)即是單片機(jī),同時(shí)又稱為微控制器。


3.1.1單片機(jī)的引腳及功能

AT89C51單片機(jī)的 引腳圖如圖3.1 所示

圖3.1 AT89C51單片機(jī)引腳圖


VCC:電源電壓

GND:地

P0口:P0口是一個(gè)漏極開(kāi)路型8位雙向I/0口,即數(shù)據(jù)/地址總線的復(fù)用口。當(dāng)它作為輸出端口使用時(shí),每位能驅(qū)動(dòng)8個(gè)TTL邏輯門(mén)電路。

P1口:Pl 口是一個(gè)帶內(nèi)部上拉電阻的8位雙向I/O口,Pl口的輸出緩沖級(jí)能驅(qū)動(dòng)4個(gè)TTL邏輯門(mén)電路。當(dāng)我們對(duì)端口寫(xiě)入“1”時(shí),通過(guò)內(nèi)部上拉電阻來(lái)把端口拉到高電平,此時(shí)P1口可做為輸入端口。當(dāng)P1口做為輸入口時(shí),由于內(nèi)部存在上拉電阻,當(dāng)被外部引腳拉低時(shí)會(huì)輸出數(shù)據(jù)。P1口除了以上功能外,最重要的是它的第二功能如表3.1所示。



表3.1 P1口引腳的第二功能

端口引腳

第二功能:

P1.5

MOSI(用于ISP編程)

P1.6

MOSI(用于ISP編程)

P1.7

MOSI(用于ISP編程)



P2口:P2口也是一個(gè)帶有內(nèi)部上拉電阻的8 位雙向I/O 口。P2 的輸出緩沖級(jí)也能驅(qū)動(dòng)4 個(gè)TTL邏輯門(mén)電路。當(dāng)我們對(duì)端口寫(xiě)入“1”時(shí),通過(guò)內(nèi)部上拉電阻來(lái)把端口拉到高電平,此時(shí)P2口可做為輸入端口。當(dāng)P2口做為輸入口時(shí),由于內(nèi)部存在上拉電阻,當(dāng)被外部引腳拉低時(shí)會(huì)輸出數(shù)據(jù)。當(dāng)訪問(wèn)外部程序存儲(chǔ)器或16位地址外部數(shù)據(jù)的存儲(chǔ)器時(shí),P2口輸出高8位數(shù)據(jù)地址。當(dāng)訪問(wèn)8 位外部數(shù)據(jù)存儲(chǔ)器地址時(shí),P2口的內(nèi)容在整個(gè)訪問(wèn)過(guò)程將不會(huì)改變。

P3 口:P3 口也是一個(gè)帶有內(nèi)部上拉電阻的8 位雙向I/0 口。P3 口輸出緩沖級(jí)也能驅(qū)動(dòng)4 個(gè)TTL邏輯門(mén)電路。當(dāng)我們對(duì)端口寫(xiě)入“1”時(shí),通過(guò)內(nèi)部上拉電阻來(lái)把端口拉到高電平,此時(shí)P3口可做為輸入端口。當(dāng)P3口做為輸入口時(shí),由于內(nèi)部存在上拉電阻,當(dāng)被外部引腳拉低時(shí)會(huì)輸出數(shù)據(jù)。P3口除了以上用途外,最重要的是它的第二功能如表3.2所示。

表3.2 P3口引腳的第二功能

端口引腳

第二功能:

P3.0

RXD(串行輸入)

P3.1

TXD(串行輸出)

P3.2

/INT0(外中斷0)

P3.3

/ INT1(外中斷1)

P3.4

T0(定時(shí)/計(jì)數(shù)器0外部輸入)

P3.5

T1(定時(shí)/計(jì)數(shù)器1外部輸入)

P3.6

/ WR(外部數(shù)據(jù)存儲(chǔ)器寫(xiě)選通)

P3.7

/ RD(外部數(shù)據(jù)存儲(chǔ)器讀選通)



P3口還可用于接收一些Flash閃速存儲(chǔ)器的編程及程序的校驗(yàn)控制等。

RST:復(fù)位輸入引腳。振蕩器在工作時(shí),RST引腳將會(huì)出現(xiàn)兩個(gè)或兩個(gè)以上的機(jī)器周期高電平來(lái)使單片機(jī)進(jìn)行復(fù)位。WDT 溢出將使該引腳輸出高電平,設(shè)置SFR AUXR的DISRT0 位(地址8EH)可打開(kāi)或關(guān)閉該功能。DISRT0位缺省為RESET輸出高電平打開(kāi)狀態(tài)。

ALE/:在訪問(wèn)外部數(shù)據(jù)存儲(chǔ)器或程序存儲(chǔ)器時(shí),ALE(地址鎖存)主要是利用輸出脈沖來(lái)鎖存地址低8位字節(jié)。ALE還可以用于對(duì)外輸出時(shí)鐘信號(hào)或定時(shí)功能,因?yàn)锳LE時(shí)刻以時(shí)鐘振蕩器的1/6頻率輸出固定的脈沖信號(hào)。

值得注意的是:當(dāng)我們?cè)谠L問(wèn)外部數(shù)據(jù)存儲(chǔ)器時(shí)將會(huì)跳過(guò)一個(gè)ALE脈沖。在F1ash存儲(chǔ)器編程期間,該引腳還可用于輸入編程脈沖。還可以通過(guò)特殊的功能寄存器中的8EH單元的D0位置來(lái)禁止ALE工作。執(zhí)行該操作后,需要通過(guò)MOVX和MOVC指令A(yù)LE才能被激活,從而恢復(fù)工作狀態(tài)。在執(zhí)行單片機(jī)外部程序時(shí),ALE應(yīng)設(shè)置為無(wú)效。

程序的儲(chǔ)存是在()允許輸出外部程序存儲(chǔ)器時(shí)進(jìn)行,當(dāng)單片機(jī)需要進(jìn)行讀寫(xiě)數(shù)據(jù)時(shí),此時(shí)該引腳在每個(gè)周期下就會(huì)兩次有效,從而發(fā)出兩次脈沖,當(dāng)訪問(wèn)外部的數(shù)據(jù)存儲(chǔ)器時(shí),則是發(fā)出一次脈沖信號(hào)。

/VPP:外部訪問(wèn)允許。當(dāng)EA端設(shè)置為低電平時(shí),CPU可單獨(dú)訪問(wèn)外部程序存儲(chǔ)器(即:0000H-FFFFH地址)。

XTAL1:振蕩器的反相放大器和內(nèi)部時(shí)鐘發(fā)生器的輸入端。


3.1.2單片機(jī)最小系統(tǒng)的設(shè)置

本次基于單片機(jī)交通信號(hào)燈控制系統(tǒng)的設(shè)計(jì)的單片機(jī)最小系統(tǒng)設(shè)置的如下圖所示:

圖3.2 AT89C51單片機(jī)最小系統(tǒng)圖


3.2 LCD1602芯片介紹及應(yīng)用

3.2.1 液晶顯示器的介紹           

液晶顯示器有多種分類方法,通常按顯示的方式分可分為字符式、段式、點(diǎn)陣式等。液晶顯示器即可顯示黑白又可顯示多彩色灰度,因此可分為黑白顯示器和彩色顯示器。如果按驅(qū)動(dòng)方式分,它又可以分為單純矩陣驅(qū)動(dòng)(Simple Matrix)、靜態(tài)驅(qū)動(dòng)(Static)和主動(dòng)矩陣驅(qū)動(dòng)(Active Matrix)三種。液晶顯示器它具有厚度薄、體積小,適用于大規(guī)模集成電路的驅(qū)動(dòng)等特點(diǎn),目前已廣泛應(yīng)用在數(shù)字?jǐn)z像機(jī)、便攜式電腦、MP3、MP4、PDA移動(dòng)通信工具等領(lǐng)域。


3.2.2 液晶顯示器各種圖形的顯示原理                                                            

液晶顯示器是利用液晶的物理特性,通過(guò)高低電壓來(lái)控制顯示的區(qū)域,高電平則亮,低電平則滅,這樣就可以顯示出圖形。液晶顯示器圖形的顯示是通過(guò)N*M個(gè)液晶顯示單元構(gòu)成,通過(guò)控制各個(gè)顯示單元的亮暗而達(dá)到顯示圖形的目的。例如一個(gè)液晶顯示器有64行顯示屏,而每行有128列,每字節(jié)又由8列組成,因此每行可顯示16個(gè)字節(jié),即整個(gè)顯示器可顯示1024個(gè)字節(jié)。最后通過(guò)控制液晶顯示相應(yīng)位置的亮暗從而顯示出每字節(jié)上的內(nèi)容。


3.2.3 LCD1602的基本參數(shù)及引腳功能

LCD1602采用標(biāo)準(zhǔn)的14腳(無(wú)背光)或16腳(帶背光)接口,本次設(shè)計(jì)采用16腳(帶背光)來(lái)顯示年、月、日、時(shí)、分、秒、星期和溫度。各引腳接口說(shuō)明如表3.3所示:

第1腳:VSS為地電源。

第2腳:VDD接5V正電源。

第3腳:VL是顯示器對(duì)比度調(diào)整端,當(dāng)接地信號(hào)時(shí)液晶對(duì)比度最高,當(dāng)接正電源時(shí)對(duì)比度最弱,對(duì)比度的高低將會(huì)影響液晶顯示器的顯示,對(duì)比度過(guò)高時(shí)會(huì)產(chǎn)生“鬼影”。因此我們通常接一個(gè)10K的電位器來(lái)調(diào)節(jié)。

第4腳:RS是寄存器的選擇,高電平表示數(shù)據(jù)寄存器、低電平表示指令寄存器。

第5腳:R/W是信號(hào)線的讀寫(xiě),當(dāng)高電平時(shí)表示正在進(jìn)行讀操作,當(dāng)?shù)碗娖綍r(shí)表示正在進(jìn)行寫(xiě)操作,如果RS和R/W同時(shí)為低電平時(shí)可進(jìn)行顯示地址或?qū)懭胫噶睿绻鸕S為低電平且R/W為高電平時(shí)可進(jìn)行讀取信號(hào),如果RS為高電平R/W為低電平時(shí)可進(jìn)行寫(xiě)入數(shù)據(jù)。

第6腳:E端是使能信號(hào)端,當(dāng)E端由高電平變化為低電平時(shí),液晶模塊命令開(kāi)始執(zhí)行。

第7~14腳:D0~D7是8位雙向數(shù)據(jù)線。

第15腳:背光源正極。

第16腳:背光源負(fù)極。




表3.3引腳接口說(shuō)明表

編號(hào)

符號(hào)

引腳說(shuō)明

編號(hào)

符號(hào)

引腳說(shuō)明

1

VSS

電源地

9

D2

數(shù)據(jù)

2

VDD

電源正極

10

D3

數(shù)據(jù)

3

VL

液晶顯示偏壓

11

D4

數(shù)據(jù)

4

RS

數(shù)據(jù)/命令選擇

12

D5

數(shù)據(jù)

5

R/W

讀/寫(xiě)選擇

13

D6

數(shù)據(jù)

6

E

使能信號(hào)

14

D7

數(shù)據(jù)

7

D0

數(shù)據(jù)

15

BLA

背光源正極

8

D1

數(shù)據(jù)

16

BLK

背光源負(fù)極




3.2.4 LCD1602的指令說(shuō)明及時(shí)序

LCD1602內(nèi)部液晶顯示模塊控制器指令共11條,如表3.4所示:

LCD1602的讀寫(xiě)操作、光標(biāo)操作以及屏幕顯示等都是通過(guò)各種指令程序而實(shí)現(xiàn)的,具體說(shuō)明如下:(注:1為高電平,0為低電平)

指令1:清顯示,指令碼由01H復(fù)位到00H位置。

指令2:光標(biāo)復(fù)位,執(zhí)行時(shí)光標(biāo)將返回到00H位置。

指令3:光標(biāo)以及顯示模式的設(shè)置。光標(biāo)的移動(dòng)方向?yàn)椋焊唠娖奖硎居乙疲碗娖絼t表示左移。S:屏幕文字是否進(jìn)行右移或者進(jìn)行左移。高電平表示有效,低電平表示無(wú)效。

指令4:顯示控制開(kāi)關(guān)。B:光標(biāo)閃爍的控制,高電平表示閃爍,低電平則表示不閃爍。

C:光標(biāo)開(kāi)關(guān)的控制,高電平表示有光標(biāo),低電平則表示無(wú)光標(biāo) 。D:整體顯示的開(kāi)關(guān)控制,高電平表示打開(kāi)顯示,低電平則表示關(guān)閉顯示。

指令5:光標(biāo)或者顯示移位 S/C的控制。高電平表示文字移動(dòng)的顯示,低電平表示光標(biāo)的移動(dòng)。

指令6:功能命令的設(shè)置。DL為高電平表示4位總線,低電平則表示8位總線。F: 低電平表示顯示5x7的點(diǎn)陣字符,高電平表示顯示5x10的點(diǎn)陣字符。 N:低電平表示單行顯示,高電平表示雙行顯示

指令7:字符發(fā)生器RAM地址設(shè)置。

指令8:DDRAM地址的設(shè)置。

指令9:光標(biāo)地址和讀忙信號(hào)。 BF:表示忙標(biāo)志位,高電平時(shí)表示忙,此時(shí)模塊不能進(jìn)行命令或者數(shù)據(jù)的接受,低電平則表示不忙。

指令10:寫(xiě)數(shù)據(jù)。

指令11:讀數(shù)據(jù)


表3.4 控制命令表

序號(hào)

指令

RS

R/W

D7

D6

D5

D4

D3

D2

D1

D0

1

清顯示

0

0

0

0

0

0

0

0

0

1

2

光標(biāo)返回

0

0

0

0

0

0

0

0

1

*

3

置輸入模式

0

0

0

0

0

0

0

1

I/D

S

4

顯示開(kāi)/關(guān)控制

0

0

0

0

0

0

1

D

C

B

5

光標(biāo)或字符移位

0

0

0

0

0

1

S/C

R/L

*

*

6

置功能

0

0

0

0

1

DL

N

F

*

*

7

置字符發(fā)生存貯器地址

0

0

0

1

字符發(fā)生存貯器地址

8

置數(shù)據(jù)存貯器地址

0

0

1

顯示數(shù)據(jù)存貯器地址

9

讀忙標(biāo)志或地址

0

1

BF

計(jì)數(shù)器地址

10

寫(xiě)數(shù)據(jù)到CGRAM或DDRAM)

1

0

寫(xiě)入的數(shù)據(jù)內(nèi)容

11

從CGRAM或DDRAM讀數(shù)

1

1

讀出的數(shù)據(jù)內(nèi)容


LCD1602液晶顯示器有多種,其中市場(chǎng)上最常見(jiàn)的是HD44780。HD44780內(nèi)置了DDRA(80字節(jié)),CGRAM(64字節(jié),用來(lái)存放用戶自定義字符,每個(gè)字符需要用到8個(gè)字節(jié),所以以一共可以存放8個(gè)用戶自定義字符),CGROM(內(nèi)存了160個(gè)字符,包括了標(biāo)準(zhǔn)的ASCII碼表上的字符等)。與HD44780相兼容的芯片時(shí)序表如表3.5所示:


表3.5 基本操作時(shí)序表

讀狀態(tài)

輸入

RS=L,R/W=H,E=H

輸出

D0—D7=狀態(tài)字

寫(xiě)指令

輸入

RS=L,R/W=L,D0—D7=指令碼,E=高脈沖

輸出

無(wú)

讀數(shù)據(jù)

輸入

RS=H,R/W=H,E=H

輸出

D0—D7=數(shù)據(jù)

寫(xiě)數(shù)據(jù)

輸入

RS=H,R/W=L,D0—D7=數(shù)據(jù),E=高脈沖

輸出

無(wú)



讀寫(xiě)操作時(shí)序如圖3.3和3.4所示。

圖3.3 讀操作時(shí)序

圖3.4寫(xiě)操作時(shí)序   

      LCD1602液晶顯示是一個(gè)慢顯示器件,所以每次在執(zhí)行指令時(shí)一定要先進(jìn)行確認(rèn)模塊的忙標(biāo)志位是否為低電平,否而指令將會(huì)失效。要進(jìn)行字符的顯示,首先要進(jìn)行輸入顯示字符的地址,實(shí)際就是輸入顯示的內(nèi)容。LCD1602內(nèi)部顯示地址如圖3.5所示。                                                      


對(duì)液晶模塊的初始化中要先設(shè)置其顯示模式,在液晶模塊顯示字符時(shí)光標(biāo)將會(huì)自動(dòng)右移。液晶模塊在繁忙狀態(tài)下將不能輸入指令。

3.2.5 LCD1602液晶顯示模塊原理圖

LCD1602顯示模塊電路,首先VSS接地信號(hào),VDD接5V高電平,VEE接10K的變阻器,變阻器兩端分別接5V電壓和大地。接著RS、RW和E是數(shù)據(jù)信號(hào)線分別接單片機(jī)的P2.5、P2.6和P2.7引腳。最后D0到D7接單片機(jī)的P0.0到P0.7引腳,要接排阻。而實(shí)際的LCD1602還有兩個(gè)背光調(diào)節(jié)引腳,分別是BLA和BLK接5V電壓和大地。

圖3.6 LCD1602顯示電路

3.3 DS1302芯片介紹及應(yīng)用

DS1302是美國(guó) DALLAS 公司推出的一種高性能、低功耗的時(shí)鐘芯片,它采用 SPI 三線接口與 CPU 進(jìn)行同步通信,并可采用突發(fā)方式一次傳送一個(gè)或多個(gè)字節(jié)的時(shí)鐘信號(hào)和 RAM數(shù)據(jù)。它可提供年、月、日、星期、時(shí)、分、秒的計(jì)時(shí)顯示,各月天數(shù)它可進(jìn)行自動(dòng)的調(diào)整,同時(shí)還具有閏年的補(bǔ)償功能。工作電壓范圍為2.5~5.5V。DS1302芯片采用雙電源供電,即有主電源和備用電源。同時(shí)還可設(shè)置備用電源的充電方式,提供了對(duì)備用電源進(jìn)行電流充電的能力。DS1302也可用于數(shù)據(jù)的記錄, 特別是對(duì)于某些特殊意義的數(shù)據(jù)點(diǎn)的記錄上,它能實(shí)現(xiàn)數(shù)據(jù)和數(shù)據(jù)出現(xiàn)的時(shí)間同時(shí)記錄,因此在各種測(cè)量系統(tǒng)中得到廣泛的應(yīng)用。


3.3.1 DS1302引腳功能

DS1302芯片的外部引腳分配如圖3.7所示。

圖3.7 DS1302的外部引腳分配


Vcc1:表示主電源;Vcc2:表示備份電源。如果 Vcc2>Vcc1+0.2V, 則 Vcc2向 DS1302供電,如果 Vcc2< Vcc1,由則Vcc1向 DS1302供電。

SCLK:串行時(shí)鐘,輸入,控制數(shù)據(jù)的輸入與輸出。

I/O:三線接口時(shí)的雙向數(shù)據(jù)線。

CE:輸入信號(hào)。DS1302在進(jìn)行讀寫(xiě)數(shù)據(jù)時(shí),此位必須為高。該引腳有兩個(gè)功能:首先是CE 開(kāi)始控制字進(jìn)行訪問(wèn)移位寄存器的邏輯控制;其次是CE 提供結(jié)束單字節(jié)或者多字節(jié)數(shù)據(jù)的傳輸方法。


3.3.2 DS1302讀寫(xiě)說(shuō)明

DS1302是 SPI 總線方式來(lái)驅(qū)動(dòng)。它不僅需要向寄存器寫(xiě)入控制字, 同時(shí)還需要讀取相應(yīng)寄存器的數(shù)據(jù)。


1:DS1302的讀寫(xiě)寄存器

DS1302的時(shí)間寄存器總共有12個(gè),其中讀寄存器(81H-8DH)和寫(xiě)寄存器(81H-8DH)是以BCD碼格式進(jìn)行數(shù)據(jù)的存取。

表3.6 DS1302的讀寫(xiě)寄存器

寫(xiě)寄存器

讀寄存器

Bit7

Bit6

Bit5

Bit4

Bit3

Bit2

Bit1

Bit0

80H

81H

CH

10秒

82H

83H



10分

84H

85H

12/24

0

10

時(shí)

時(shí)

AM/PM

86H

87H

0

0

10日

88H

89H

0

0

0

10月

8A

8BH

0

0

0

0

0

星期

8C

8DH

10年

8E

8FH

WP

0

0

0

0

0

0

0

DS1302小時(shí)寄存器(84H、85H)的位7應(yīng)用于DS1302是運(yùn)行的模式。即12小時(shí)制還是24小時(shí)制。當(dāng)位7為1時(shí),表示12小時(shí)模式,此時(shí)相應(yīng)的寄存器位5為高時(shí)表示AM,為低時(shí)表示PM。當(dāng)位7為0時(shí), 表示24小時(shí)模式。

DS1302秒寄存器(80H、81H)的位7應(yīng)用于時(shí)鐘暫停標(biāo)志(CH)位。當(dāng)該位為1時(shí),時(shí)鐘振蕩器停止,DS1302處于低功耗狀態(tài);當(dāng)該位為0時(shí),時(shí)鐘開(kāi)始運(yùn)行。

DS1302 控制寄存器(8EH、8FH)的位7是寫(xiě)入保護(hù)位,其它7位均為0。當(dāng)WP位為0時(shí)可以開(kāi)始進(jìn)行對(duì)時(shí)鐘和RAW進(jìn)行寫(xiě)入,當(dāng)WP位為1時(shí),禁止對(duì)寄存器的寫(xiě)入操作。


2:DS1302中靜態(tài)RAM地址

   DS1302在靜態(tài)工作模式下的RAW地址如表3.7所示。

表3.7 靜態(tài) RAM 的地址表

讀地址

寫(xiě)地址



數(shù)據(jù)范圍

C1H

C0H



00-FFH

C3H

C2H



00-FFH

C5H

C4H



00-FFH

.

.

.

.

.

.



.

.

.

FDH

FCH



00-FFH


3:DS1302的工作模式寄存器

DS1302的工作模式寄存器又分為時(shí)鐘突發(fā)模式寄存器、RAW突發(fā)模式寄存器等。突發(fā)模式是指一次傳送多個(gè)字節(jié)的時(shí)鐘信號(hào)和 RAM 數(shù)據(jù)。 突發(fā)模式寄存器如表3.8所示。

表3.8突發(fā)模式寄存器

工作模式寄存器

讀寄存器

寫(xiě)寄存器

時(shí)鐘突發(fā)模式寄器

CLOCK BURST

BFH

BEH

RAW突發(fā)模式寄存器

RAW BURST

FFH

FEH



4:DS1302控制字符表

DS1302的控制字最高位(位7)必須是1,才能進(jìn)行數(shù)據(jù)的寫(xiě)入,否則不能寫(xiě)入數(shù)據(jù);次高位(位6)表示RAW數(shù)據(jù)或者時(shí)鐘日歷的存取,當(dāng)為1時(shí)表示RAW數(shù)據(jù)存取,為0則表示時(shí)鐘日歷的存取;接著是數(shù)據(jù)操作地址(位5-位1);最后是位0表示數(shù)據(jù)的讀寫(xiě)操作,當(dāng)為1時(shí)表示讀操作,為0表示寫(xiě)操作。如表3.9所示。

表3.9              控制字(即地址及命令字節(jié))


5:DS1302的讀寫(xiě)時(shí)序

DS1302數(shù)據(jù)的讀寫(xiě)規(guī)則是在控制字的基礎(chǔ)上從低位到高位的輸出,每當(dāng)控制字指令輸入后下一個(gè)SCLK脈沖上升沿到來(lái)時(shí),數(shù)據(jù)就會(huì)被寫(xiě)入到DS1302中,數(shù)據(jù)從最低位開(kāi)始寫(xiě)入,下一個(gè)SCLK脈沖的下降沿到來(lái)時(shí),就會(huì)讀出DS1302里面的數(shù)據(jù),讀出的規(guī)則也是從低位到高位。

圖3.8 數(shù)據(jù)讀寫(xiě)時(shí)序


3.3.3 DS1302時(shí)鐘采集模塊原理圖

圖3.9 DS1302原理圖

此圖為DS1302時(shí)鐘芯片模塊采集原理圖,X1和X2接的是時(shí)鐘晶振,,大小為32.768MHz,VCC1和VCC2分別接3V和5V電壓,I/O、SCLK和ST分別接單片機(jī)的P1.6、P1.7和P1.5引腳。



3.4 DS18B20芯片介紹及應(yīng)用

   DS18B20數(shù)字溫度計(jì)是DALLAS公司生產(chǎn)的One-Wire,即單總線器件,它具有體積小而且線路簡(jiǎn)單的優(yōu)點(diǎn)。它只有三個(gè)引腳,分別是接高電源、地信號(hào)和一條數(shù)據(jù)信號(hào)線,設(shè)計(jì)簡(jiǎn)單而又方便。因此它廣泛應(yīng)用于溫度的測(cè)溫系統(tǒng)。

    DS18B20除了體積小、線路設(shè)計(jì)簡(jiǎn)單優(yōu)點(diǎn)外,它在實(shí)際應(yīng)用中不需要其它外部任何器件即可實(shí)現(xiàn)溫度的測(cè)溫功能,測(cè)量溫度范圍為-55—+125 °C 之間,如超出檢測(cè)的溫度,DS18B20將會(huì)發(fā)出報(bào)警信號(hào)。數(shù)字溫度計(jì)的讀取可以從9位到12位選擇?捎脭(shù)據(jù)線供電,供電范圍+3.0-5.5V電壓。


3.4.1 DS18B20引腳功能

DS18B20器件的封裝引腳排列及引腳功能的描述如圖3.10和表3.10。

圖3.10(底視圖)


表3.10 DS18B20引腳功能

序號(hào)

名稱

引腳功能描

1

GND

地信號(hào)

2

DQ

數(shù)據(jù)輸入/輸出引腳。開(kāi)漏單總線接口引腳。當(dāng)被用在寄生電源下,也可以向器件提供電源。

3

VDD

可選擇的VDD引腳。當(dāng)工作于寄生電源時(shí),此引腳必須接地。


3.4.2 DS18B20的應(yīng)用及原理圖

DS18B20采用的是one-Wire總線協(xié)議方式連接,實(shí)際就是在一根數(shù)據(jù)線進(jìn)行數(shù)據(jù)的雙向傳輸,,然而對(duì)于51單片機(jī)在硬件上并不支持單總線協(xié)議方式的連接,因此我們采用軟件的方法來(lái)模擬單總線的協(xié)議方式來(lái)完成對(duì)DS18B20溫度芯片的訪問(wèn)。

DS18B20的讀寫(xiě)是在一根I/O線上進(jìn)行,因此,對(duì)數(shù)據(jù)的讀寫(xiě)有著嚴(yán)格的要求。DS18B20的通信協(xié)議也有著嚴(yán)格的要求來(lái)確保數(shù)據(jù)傳輸?shù)恼_性和完整性。

DS18B20有嚴(yán)格的通信協(xié)議來(lái)保證各位數(shù)據(jù)傳輸?shù)恼_性和完整性。該通信協(xié)議又細(xì)分了幾種信號(hào)的時(shí)序,即:初始化時(shí)序、讀時(shí)序、寫(xiě)時(shí)序。然而在這幾種時(shí)序的工作下都是以主機(jī)作為主設(shè)備,單總線器件作為從設(shè)備。數(shù)據(jù)的傳輸是在主機(jī)先啟動(dòng)讀入時(shí)序,讀出數(shù)據(jù)后進(jìn)入寫(xiě)時(shí)序命令,從而啟動(dòng)讀寫(xiě)時(shí)序功能,完成數(shù)據(jù)的傳輸。數(shù)據(jù)和命令的傳輸都是低位在先。下面為DS18B20在本次設(shè)計(jì)的溫度采集模塊原理圖3.11所示。

圖3.11 DS18B20溫度采集原理圖

溫度采集模塊圖主要是由DS18B20芯片進(jìn)行,通過(guò)AT89C51單片機(jī)進(jìn)行數(shù)據(jù)的傳輸和接受,從而再送到LCD1602,從LCD1602顯示出來(lái)。DS18B20只有三個(gè)引腳,分別是VCC為正電源接5V電壓,GND地信號(hào)接大地,最后是DQ數(shù)據(jù)輸入/輸出引腳連接AT89C51單片機(jī)的P1.0引腳。


4  程序的設(shè)計(jì)流程

4.1 交通燈程序設(shè)計(jì)的流程

4.1.1倒計(jì)時(shí)顯示的理論分析

利用定時(shí)器中斷,設(shè)置              TH0= (65536-50000)/256,TH1=(65536-50000)%256,即每0.05秒中斷一次。每到第20次中斷即過(guò)了20*0.05秒=1秒時(shí),使時(shí)間的計(jì)數(shù)值減1,便實(shí)現(xiàn)了倒計(jì)時(shí)的功能。


4.1.2狀態(tài)燈顯示的理論分析

黃燈閃爍同樣可以利用定時(shí)器中斷。每到第10次中斷即過(guò)了10*0.05秒=0.5秒時(shí),使黃燈標(biāo)志位反置,即可讓黃燈1秒閃爍一次。


4.1.3 交通燈主程序設(shè)計(jì)流程

交通燈系統(tǒng)在正常模式下工作的

  • 首先,正常進(jìn)入系統(tǒng)開(kāi)始運(yùn)行,交通燈在默認(rèn)正常模式下工作,數(shù)碼管顯示時(shí)間為60。
  • 交通信號(hào)燈開(kāi)始正常工作,右轉(zhuǎn)彎為常亮燈(綠色)。南北直行方向綠燈亮,其它方向亮紅燈,數(shù)碼管開(kāi)始倒計(jì)時(shí),南北方向從40倒計(jì),東西方向從60倒計(jì)。
  • 35S后,南北直行方向滅綠燈,閃爍黃燈,閃爍時(shí)間為5S。
  • 40S后,南北直行方向亮紅燈,左轉(zhuǎn)方向亮綠燈,亮?xí)r15S,同時(shí)數(shù)碼管從20倒計(jì),其它不變。
  • 55S后,南北左轉(zhuǎn)方向滅綠燈,閃爍黃燈,閃爍時(shí)間為5S。
  • 60S后,南北左轉(zhuǎn)方向黃燈滅,亮紅燈,數(shù)碼管從60倒計(jì),東西直行方向亮綠燈,數(shù)碼管從40倒計(jì),其它不變。
  • 95S后,東西直行方向滅綠燈,閃爍黃燈,閃爍時(shí)間為5S。
  • 100S后,東西直行方向滅黃燈,亮紅燈,左轉(zhuǎn)方向亮綠燈,亮?xí)r為15S,同時(shí)數(shù)碼管從20倒計(jì),其它不變。
  • 115S后,東西左轉(zhuǎn)方向滅綠燈,閃爍黃燈,閃爍時(shí)間為5S。
  • 120S后,東西左轉(zhuǎn)方向滅黃燈,亮紅燈,數(shù)碼管從60倒計(jì)。南北直行亮綠燈,數(shù)碼管從40倒計(jì)。





圖4.1   程序設(shè)計(jì)流程圖



4.2萬(wàn)年歷的設(shè)計(jì)流程

萬(wàn)年歷的設(shè)置一方面可以更好的顯示時(shí)間和溫度,其次可以對(duì)交通信號(hào)燈系統(tǒng)的控制,定時(shí)向交通信號(hào)燈控制系統(tǒng)發(fā)出外部中斷,從而該變當(dāng)前工作模式,以致在實(shí)際中更具有實(shí)用性。


圖4.2 萬(wàn)年歷主程序流程圖


       此次萬(wàn)年歷的設(shè)計(jì)功能主要是兩個(gè),一個(gè)是通過(guò)LCD1602顯示時(shí)間和溫度,另一個(gè)則是為交通信號(hào)燈提供外部定時(shí)中斷,從而改變當(dāng)前的工作模式。而萬(wàn)年歷的設(shè)計(jì)流程和普通設(shè)計(jì)的一樣,開(kāi)始先是對(duì)各種芯片的初始化,接著是從DS1302、DS18B20讀取時(shí)間和溫度信息,從而傳送到AT89C51單片機(jī)進(jìn)行時(shí)間、溫度的分離轉(zhuǎn)化,再傳送到LCD1602顯示出來(lái),其次是時(shí)間的調(diào)整和校正,通過(guò)調(diào)整按鍵可以對(duì)秒、分、時(shí)、星期、日、月和年進(jìn)行加減1的修改。最近是定時(shí)發(fā)出外部中斷,利用IF語(yǔ)句進(jìn)行判斷,適合條件則輸出低電平到交通信號(hào)燈,否則為高電平。從而達(dá)到了實(shí)驗(yàn)的目的。


4.3萬(wàn)年歷時(shí)間的調(diào)整流程

本次萬(wàn)年歷系統(tǒng)的設(shè)計(jì)只是采用DS1302進(jìn)行時(shí)間的掃描和讀取,而沒(méi)用進(jìn)行掉電保存電路的設(shè)計(jì),因此在每次硬件的開(kāi)啟,系統(tǒng)都是進(jìn)入初始化設(shè)置,以致要進(jìn)行時(shí)間的調(diào)整和校正。

圖4.3 時(shí)間調(diào)整控制圖

時(shí)間的調(diào)整程序設(shè)計(jì)。首先,系統(tǒng)在正常工作下,由DS1302時(shí)鐘芯片進(jìn)行時(shí)間的讀取,傳遞到AT89C51單片機(jī)進(jìn)行對(duì)時(shí)間進(jìn)行分離和轉(zhuǎn)化,最后由LCD1602顯示出來(lái)。在進(jìn)行時(shí)間的調(diào)整和校正時(shí),先進(jìn)入調(diào)整模式,即按下第一個(gè)按鍵,執(zhí)行調(diào)整程序,先是進(jìn)入秒程序調(diào)整,按加減按鍵相應(yīng)的進(jìn)行加1或減1,再按調(diào)整切換鍵進(jìn)入分程序調(diào)整,按加減減進(jìn)行相應(yīng)的加1減1,再接著是時(shí)、星期、日、月、年的調(diào)整。按加減鍵進(jìn)行相應(yīng)的加減1,在進(jìn)行調(diào)整途中,如果按退出時(shí)間調(diào)整按鍵都將會(huì)退出時(shí)間調(diào)整程序。如圖4.3時(shí)間調(diào)整控制圖所示。

4.4交通信號(hào)系統(tǒng)工作模式的工作流程


圖4.4 工作模式切換圖

開(kāi)始進(jìn)入系統(tǒng)時(shí),默認(rèn)模式為正常模式60S,到了早上7:00時(shí)上班高峰期,萬(wàn)年歷發(fā)出中斷,從而使系統(tǒng)進(jìn)入繁忙模式45S,從而可以減少路口上交通的擁堵。時(shí)間到了早上9:00,車(chē)輛逐漸減少,萬(wàn)年歷又發(fā)出定時(shí)中斷使系統(tǒng)進(jìn)入正常模式,到了11:00,萬(wàn)年歷再次發(fā)出定時(shí)中斷,重新使系統(tǒng)進(jìn)入繁忙模式,減少車(chē)輛的擁堵。到了下午14:00,萬(wàn)年歷發(fā)出定時(shí)中斷,使系統(tǒng)進(jìn)入正常模式,在正常模式下運(yùn)行到下午17:00下班時(shí)間,為了減少交通的擁堵,萬(wàn)年歷發(fā)出定時(shí)中斷,使系統(tǒng)進(jìn)入繁忙模式,到了晚上19:00,道口上車(chē)輛減少,萬(wàn)年歷最后發(fā)出定時(shí)中斷,使系統(tǒng)在正常模式下正常運(yùn)行。系統(tǒng)在正常模式、繁忙模式和特殊模式下運(yùn)行時(shí),還可以進(jìn)行外部手動(dòng)進(jìn)行中斷來(lái)進(jìn)行通行時(shí)間的調(diào)整。如:在正常模式下按下繁忙模式,系統(tǒng)將會(huì)進(jìn)入繁忙模式,當(dāng)下次中斷再次到來(lái)時(shí),系統(tǒng)會(huì)根據(jù)中斷的要求而進(jìn)入相應(yīng)的模式,不會(huì)受上次中斷或下次中斷的影響。


5  軟硬件的仿真調(diào)試

5.1 PROTEUS仿真圖

整個(gè)交通燈控制系統(tǒng)在PROTEUS仿真圖中的仿真如下所示,雙向通行,倒計(jì)時(shí)是2位時(shí)間提醒。每個(gè)路口分別有左轉(zhuǎn)、直行和右轉(zhuǎn),分別有紅燈、綠燈和黃燈提示。每個(gè)路口還相應(yīng)配有行人的紅綠燈指示 。圖右上角數(shù)碼管顯示的工作模式,60代表是在正常模式下工作,45和75分別代表是在繁忙模式和特殊模式,右下角是開(kāi)關(guān)調(diào)節(jié)按鍵,左邊三個(gè)開(kāi)關(guān)從上到下是交通燈各種模式轉(zhuǎn)換開(kāi)關(guān),右邊四個(gè)是時(shí)間調(diào)節(jié)開(kāi)關(guān),從而更具有實(shí)用性。

圖5.1 PROTEUS仿真圖


5.2 硬件實(shí)物圖

   此次硬件實(shí)物的設(shè)計(jì)分為兩部分,一部分是電子器件的設(shè)計(jì),另一部分是顯示界面的設(shè)計(jì)。電子器件的設(shè)計(jì)主要是單片機(jī)的最小系統(tǒng)設(shè)置、DS1302時(shí)鐘模塊的設(shè)置、DS18B20溫度模塊的設(shè)置以及非門(mén)74HC04的設(shè)置等;顯示界面的設(shè)置主要是LCD1602液晶顯示模塊、各個(gè)方向數(shù)碼管倒計(jì)時(shí)、數(shù)碼管顯示系統(tǒng)工作模式、各個(gè)道口的交通燈、人行道的交通燈以及控制開(kāi)關(guān)調(diào)節(jié)按鍵的設(shè)置。兩部分的分開(kāi)設(shè)計(jì)可以使實(shí)物顯得更美觀,同時(shí)對(duì)于實(shí)物的器件的修改和調(diào)整也提供了更好的條件。也更聯(lián)系了實(shí)際生活,顯得簡(jiǎn)單、整潔和美觀。

顯示界面如圖5.2所示。

圖5.2 硬件實(shí)物圖


結(jié) 論

本次基于單片機(jī)的交通信號(hào)燈控制系統(tǒng)的設(shè)計(jì)是在一般交通燈的基礎(chǔ)上加上時(shí)間的智能控制,從而改變各方向通行的時(shí)間。因此本次智能交通燈的設(shè)計(jì)可以更好的解決了車(chē)流量較大的十字路口車(chē)輛的通行,與一般交通燈相比,它更具有實(shí)用性、簡(jiǎn)單化和智能化。從而也更好的應(yīng)用到實(shí)際生活中,因此具有一定的實(shí)用價(jià)值。

此次基于單片機(jī)的交通信號(hào)燈控制系統(tǒng)的設(shè)計(jì)可以說(shuō)得到了成功,但是還是存在很多的不足和缺陷。如:工作模式的時(shí)間只有三種選擇,而不能通過(guò)按鍵進(jìn)行隨意更改,工作模式時(shí)間的智能切換也不能進(jìn)行手動(dòng)調(diào)節(jié),以及對(duì)通過(guò)道口車(chē)流量的統(tǒng)計(jì)、車(chē)輛速度的檢測(cè)和拍攝功能等都還沒(méi)實(shí)現(xiàn),而且此次設(shè)計(jì)需要用到的電子元器件較多,從經(jīng)濟(jì)上不劃算,因此本次基于單片機(jī)的交通信號(hào)燈控制系統(tǒng)的設(shè)計(jì)也還存在著很大的不足,還有待改善。

致 謝

歷時(shí)三個(gè)月的設(shè)計(jì)已經(jīng)告一段落。經(jīng)過(guò)自己不斷的搜索努力以及大家的耐心指導(dǎo)和熱情幫助,本設(shè)計(jì)已經(jīng)基本完成。同時(shí)系里興趣小組實(shí)驗(yàn)室的開(kāi)放和大部分興趣小組同學(xué)也為我的設(shè)計(jì)提供指導(dǎo),在他們的幫助和指導(dǎo)下得到了完成。在此對(duì)于他們的幫助給與深刻的致謝。

在本次基于單片機(jī)的交通信號(hào)燈的控制系統(tǒng)設(shè)計(jì)中一路遇到了很多的困難,首先從開(kāi)始電路原理圖的設(shè)計(jì)、畫(huà)PCB圖和制板都遇到了困難。先是對(duì)芯片的不理解,專業(yè)知識(shí)的不夠從而導(dǎo)致在程序的編寫(xiě)中經(jīng)常出錯(cuò)。接著是在最后的調(diào)試中,由于本次設(shè)計(jì)分為兩塊電路板,線路繁多因此也很容易混亂等問(wèn)題。但是在大家的幫助和鼓勵(lì)下一一得到了解決。

通過(guò)這次設(shè)計(jì),使我對(duì)自己有了一個(gè)深刻的認(rèn)識(shí)。認(rèn)識(shí)到了自己專業(yè)知識(shí)的不足和專業(yè)知識(shí)的重要性,同時(shí)也理解了理論要聯(lián)系實(shí)際含義。通過(guò)這次的設(shè)計(jì)也檢驗(yàn)了自己的學(xué)習(xí)成果,認(rèn)識(shí)到了自己的不足和缺陷,在今后的工作和學(xué)習(xí)中將會(huì)繼續(xù)努力,不斷完善,從而為今后的發(fā)展打下良好的基礎(chǔ)。

由于自身水平有限,設(shè)計(jì)中一定還存在很多不足之處,敬請(qǐng)各位批評(píng)指正。


  1. 附錄單片機(jī)程序:
  2. 1:  十字路口交通燈控制C程序1:
  3.         /***********************************************************
  4.                十字路口交通燈控制 C 程序
  5.         ***********************************************************/
  6.         #include <reg51.h>
  7.         #define        uchar        unsigned char
  8.         #define        uint        unsigned int
  9.         /*****定義控制位*******************************************/
  10. sbit   Time_Show_LED1=P2^4;  //Time_Show_LED1(直行時(shí)間顯示)控制位
  11. sbit   Time_Show_LED2=P2^5;  //Time_Show_LED2(直行時(shí)間顯示)控制位
  12. sbit   SN_LED1=P2^0;             //SN_LED1控制位
  13. sbit   SN_LED2=P2^1;             //SN_LED2控制位
  14. sbit   EW_LED1=P2^2;             //EW_LED1控制位
  15. sbit   EW_LED2=P2^3;             //EW_LED2控制位
  16. sbit   SN_Yellow=P1^6;       //SN黃燈
  17. sbit   EW_Yellow=P1^2;       //EW黃燈
  18. sbit   EW_ManGreen=P3^0;     //EW人行道綠燈
  19. sbit   SN_ManGreen=P3^1;     //SN人行道綠燈
  20. sbit   Special_LED=P2^6;     //交通特殊指示燈
  21. sbit   Busy_LED=P2^7;        //交通繁忙指示燈
  22. sbit   Nomor_Button=P3^5;    //交通正常按鍵
  23. sbit   Busy_Btton=P3^6;      //交通繁忙按鍵
  24. sbit   Special_Btton=P3^7;   //交通特殊按鍵  
  25. sbit   EW_ManRed=P3^3;       //EW人行道紅燈
  26. sbit   SN_ManRed=P3^4;       //SN人行道紅燈
  27. sbit   x=P1^7;
  28. sbit   y=P1^3;
  29. bit    Flag_SN_Yellow;       //SN黃燈標(biāo)志位
  30. bit    Flag_EW_Yellow;       //EW黃燈標(biāo)志位
  31. char   Time_EW;        //東西方向倒計(jì)時(shí)單元
  32. char   Time_SN;        //南北方向倒計(jì)時(shí)單元
  33. uchar  EW=60,SN=40,EWL=19,SNL=19;      //程序初始化賦值,正常模式
  34. uchar  EW1=60,SN1=40,EWL1=19,SNL1=19;  //用于存放修改值的變量
  35. uchar code table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};  //0-9段選碼
  36. uchar code S[8]={0x28,0x48,0x98,0x88,0x82,0x84,0x89,0x88};  
  37. //交通信號(hào)燈控制代碼
  38. /**********************延時(shí)子程序**************************/
  39. void Delay(uchar a)
  40. {
  41.         uchar        i;
  42.         i=a;
  43.         while(i--){;}
  44.         }
  45. /*****************顯示子函數(shù)******************************/
  46. void Display(void)
  47.         {
  48.         uchar h,l;
  49.         h=Time_EW/10;
  50.         l=Time_EW%10;
  51.         P0=table[l];        
  52.         EW_LED2=1;              //點(diǎn)亮EW_LED2
  53.         Delay(2);
  54.         EW_LED2=0;        //熄滅EW_LED2
  55.         P0=table[h];
  56.         EW_LED1=1;        //點(diǎn)亮EW_LED1
  57.         Delay(2);
  58.         EW_LED1=0;

  59.         h=Time_SN/10;
  60.         l=Time_SN%10;
  61.         P0=table[l];
  62.         SN_LED2=1;        //點(diǎn)亮SN_LED2
  63.         Delay(2);
  64.         SN_LED2=0;
  65.         P0=table[h];
  66.         SN_LED1=1;                  //點(diǎn)亮SN_LED1
  67.         Delay(2);
  68.         SN_LED1=0;
  69.                         
  70.         h= EW1/10;
  71.         l= EW1%10;
  72.         P0=table[l];
  73.         Time_Show_LED1=1;         //點(diǎn)亮Time_Show_LED1
  74.         Delay(2);
  75.    Time_Show_LED1=0;
  76.                
  77. P0=table[h];
  78.         Time_Show_LED2=1;        //點(diǎn)亮Time_Show_LED2
  79.         Delay(2);
  80.         Time_Show_LED2=0;
  81.         }
  82. /**********************外部0中斷服務(wù)程序******************/
  83.         void INT0_srv(void)interrupt 0 using 1
  84.         {
  85.          EX0=0;               //關(guān)中斷
  86.          if(Nomor_Button==0) //測(cè)試按鍵是否按下,按下為正常狀態(tài)
  87.           {
  88.         EW1=60;
  89.         SN1=40;
  90.         EWL1=19;
  91.         SNL1=19;
  92.         Busy_LED=0;     //關(guān)繁忙信號(hào)燈
  93.         Special_LED =0; //關(guān)特殊信號(hào)燈
  94.             }
  95.   if(Busy_Btton==0)   //測(cè)試按鍵是否按下,按下為繁忙狀態(tài)
  96.             {
  97.         EW1=45;
  98.         SN1=30;
  99.         EWL1=14;
  100.         SNL1=14;
  101.         Special_LED=0;  //關(guān)特殊信號(hào)燈
  102.         Busy_LED=1;     //開(kāi)繁忙信號(hào)燈
  103.         
  104.             }
  105.             if(Special_Btton==0)//測(cè)試按鍵是否按下,按下為特殊狀態(tài)
  106.             {
  107.         EW1=75;
  108.         SN1=55;
  109.         EWL1=19;
  110.         SNL1=19;
  111.         Busy_LED=0;    //關(guān)繁忙信號(hào)燈
  112.         Special_LED =1;//開(kāi)特殊信號(hào)燈
  113.             }                                       
  114.                         EX0=1;         //開(kāi)中斷
  115.         }
  116.         /**********************T0中斷服務(wù)程序*******************/
  117.         void timer0(void)interrupt 1 using 1
  118.         {
  119.                 static uchar count;
  120.                 TH0=(65536-50000)/256;
  121.                 TL0=(65536-50000)%256;
  122.                 count++;
  123.                 if(count==10)
  124.                 {
  125.                     if(Flag_SN_Yellow==1)  //測(cè)試南北黃燈標(biāo)志位
  126.                         {SN_Yellow=~SN_Yellow;}
  127.                     if(Flag_EW_Yellow==1)  //測(cè)試東西黃燈標(biāo)志位
  128.                         {EW_Yellow=~EW_Yellow;}
  129.                 }
  130.                 if(count==20)
  131.                 {
  132.             Time_EW--;
  133.                    Time_SN--;
  134.                    if(Flag_SN_Yellow==1)  //測(cè)試南北黃燈標(biāo)志位
  135.                         {SN_Yellow=~SN_Yellow;}
  136.                    if(Flag_EW_Yellow==1)  //測(cè)試東西黃燈標(biāo)志位
  137.                         {EW_Yellow=~EW_Yellow;}
  138.                    count=0;
  139.                 }
  140.         }
  141.         /*********************主程序開(kāi)始***********************/
  142.         void        main(void)
  143.         {
  144.         Busy_LED=0;
  145.         Special_LED=0;
  146.         IT0=1;           //INT0負(fù)跳變觸發(fā)
  147.         TMOD=0x01; //定時(shí)器工作于方式1
  148.         TH0=(65536-50000)/256; //定時(shí)器賦初值
  149.         TL0=(65536-50000)%256;
  150.         EA=1;  //CPU開(kāi)中斷總允許
  151.         ET0=1; //開(kāi)定時(shí)中斷
  152.         EX0=1; //開(kāi)外部INTO中斷
  153.         TR0=1; //啟動(dòng)定
  154.             while(1)
  155.             {                                
  156.                 /*******S0狀態(tài)**********/
  157.         SN_ManRed=0;
  158.         SN_ManGreen=1;  //SN人行道通行
  159.         EW_ManRed=1;        //EW人行道禁止
  160.         EW_ManGreen=0;
  161.         Flag_EW_Yellow=0;           //EW關(guān)黃燈顯示信號(hào)
  162.         Time_EW=EW;
  163.         Time_SN=SN;
  164.         while(Time_SN>=5)
  165.                         {   
  166.                             P1=S[0];        //SN綠燈,EW紅燈
  167.                             Display();
  168.                         }
  169.                         /*******S1狀態(tài)**********/
  170.                         P1=0x00;
  171.                         while(Time_SN>=0)
  172.                         {
  173.         Flag_SN_Yellow=1; //SN開(kāi)黃燈信號(hào)位
  174.         P1=P1|0x08;    //保持EW紅燈
  175.         Display();
  176.                         }
  177.                         /*******S2狀態(tài)**********/
  178.         SN_ManRed=1;      //SN人行道禁止
  179.         SN_ManGreen=0;
  180.         EW_ManRed=1;          //EW人行道禁止
  181.         EW_ManGreen=0;
  182.         Flag_SN_Yellow=0; //SN關(guān)黃燈顯示信號(hào)
  183.         Time_SN=SNL;
  184.         while(Time_SN>=5)
  185.                         {
  186.         P1=S[2];      //SN左拐綠燈亮,EW紅燈
  187.         Display();
  188.                         }
  189.                         /*******S3狀態(tài)**********/
  190.                         P1=0x00;
  191.                         while(Time_SN>=0)
  192.                         {
  193.         //Flag_SN_Yellow=0;        //SN開(kāi)黃燈信號(hào)位
  194.         x=1;
  195.         P1=P1|0x08;    //保持EW紅燈
  196.         Display();
  197.                         }
  198.                         /***********賦值*********/
  199.         EW=EW1;
  200.         SN=SN1;
  201.         EWL=EWL1;
  202.         SNL=SNL1;
  203.                         /*******S4狀態(tài)**********/
  204.         SN_ManRed=1;      //SN人行道禁止
  205.         SN_ManGreen=0;
  206.         EW_ManRed=0;
  207.         EW_ManGreen=1;          //EW人行道通行
  208.         Flag_SN_Yellow=0; //SN關(guān)黃燈顯示信號(hào)
  209.         Time_EW=SN;
  210.         Time_SN=EW;
  211.         while(Time_EW>=5)
  212.                         {
  213.                             P1=S[4];          //EW通行,SN紅燈
  214.                                 Display();
  215.                         }
  216.                         /*******S5狀態(tài)**********/
  217.                         P1=0X00;
  218.                         while(Time_EW>=0)
  219.                         {
  220.         Flag_EW_Yellow=1;//EW開(kāi)黃燈信號(hào)位
  221.         P1=P1|0x80;    //保持SN紅燈
  222.         Display();
  223.                         }
  224.                         /*******S6狀態(tài)**********/
  225.         SN_ManRed=1;     //SN人行道禁止
  226.         SN_ManGreen=0;
  227.         EW_ManRed=1;         //EW人行道禁止
  228.         EW_ManGreen=0;
  229.         Flag_EW_Yellow=0;//EW關(guān)黃燈顯示信號(hào)
  230.         Time_EW=EWL;
  231.         while(Time_EW>=5)
  232.                         {
  233.         P1=S[6];     //EW左拐綠燈亮,SN紅燈
  234.         Display();
  235.                         }
  236.                         /*******S7狀態(tài)**********/
  237.                         P1=0X00;
  238.                         while(Time_EW>=0)
  239.                         {
  240.         //Flag_EW_Yellow=0; //EN開(kāi)黃燈信號(hào)位
  241.         y=1;
  242.         P1=P1|0x80;    //保持SN紅燈
  243.         Display();
  244.                         }               
  245.                         /***********賦值********/
  246.                         EW=EW1;
  247.                         SN=SN1;
  248.                         EWL=EWL1;
  249.                         SNL=SNL1;
  250.                 }
  251.         }

  252. 2:十字路口交通燈控制C程序2
  253.         /***********************************************************
  254.                十字路口交通燈控制 C 程序
  255.         ***********************************************************/
  256.         #include <reg51.h>
  257.         #define        uchar        unsigned char
  258.         #define        uint        unsigned int
  259.         /*****定義控制位*******************************************/
  260.         sbit   EW_Green1 =P1^0;  //EW直行綠燈
  261.         sbit   EW_Green12 =P1^1; //EW左轉(zhuǎn)綠燈
  262. sbit   EW_Green13= P1^2; //EW右轉(zhuǎn)綠燈
  263.         sbit   EW_Yellow1 =P1^3; //EW直行黃燈
  264.         sbit   EW_Yellow2 =P1^4; //EW左轉(zhuǎn)黃燈
  265.         sbit   EW_Yellow3 =P1^5; //EW右轉(zhuǎn)黃燈
  266.         sbit   EW_Red1=P1^6;     //RE直行紅燈
  267.         sbit   EW_Red2 =P1^7;    //RE左轉(zhuǎn)紅燈
  268.         bit    Flag_SN_Yellow;  //SN黃燈標(biāo)志位
  269.         bit    Flag_EW_Yellow;  //EW黃燈標(biāo)志位
  270.         uchar  EW=60,SN=40,EWL=19,SNL=19;      //程序初始化賦值,正常模式
  271.         uchar  EW1=60,SN1=40,EWL1=19,SNL1=19;  //用于存放修改值的變量
  272.         uchar code table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};  //0-9段選碼
  273.         uchar code S[8]={0xA0,0xA0,0x80,0xC0,0xA0,0xA0,0x20,0x24};  
  274.         //交通信號(hào)燈控制代碼
  275.         /**********************延時(shí)子程序**************************/
  276.         void Delay(uchar a)
  277.         {
  278.                 uchar        i;
  279.                 i=a;
  280.                 while(i--){;}
  281.         }
  282.         /*****************顯示子函數(shù)******************************/
  283.         void Display(void)
  284.         {
  285.                 uchar h,l;
  286.                 h=Time_EW/10;
  287.                 l=Time_EW%10;
  288.                   P0=table[l];        
  289.                 EW_LED2=1;              //點(diǎn)亮EW_LED2
  290.                 Delay(2);
  291.                 EW_LED2=0;        //熄滅EW_LED2
  292.                 P0=table[h];
  293.                 EW_LED1=1;        //點(diǎn)亮EW_LED1
  294.                 Delay(2);
  295.                 EW_LED1=0;

  296.                 h=Time_SN/10;
  297.                 l=Time_SN%10;
  298.                 P0=table[l];
  299.                 SN_LED2=1;        //點(diǎn)亮SN_LED2
  300.                 Delay(2);
  301.                 SN_LED2=0;
  302.                 P0=table[h];
  303.                 SN_LED1=1;                  //點(diǎn)亮SN_LED1
  304.                 Delay(2);
  305.                 SN_LED1=0;
  306.                         
  307.                 h= EW1/10;
  308.                 l= EW1%10;
  309.                 P0=table[l];
  310.                 Time_Show_LED1=1;         //點(diǎn)亮Time_Show_LED1
  311.                 Delay(2);
  312.            Time_Show_LED1=0;
  313.                 P0=table[h];
  314.                 Time_Show_LED2=1;        //點(diǎn)亮Time_Show_LED2
  315.                 Delay(2);
  316.                 Time_Show_LED2=0;
  317.         }
  318.         /**********************外部0中斷服務(wù)程序******************/
  319.         void INT0_srv(void)interrupt 0 using 1
  320.         {
  321.                  EX0=0;               //關(guān)中斷
  322.             if(Nomor_Button==0) //測(cè)試按鍵是否按下,按下為正常狀態(tài)
  323.             {
  324.         EW1=60;
  325.         SN1=40;
  326.         EWL1=19;
  327.         SNL1=19;
  328.         Busy_LED=0;     //關(guān)繁忙信號(hào)燈
  329.         Special_LED =0; //關(guān)特殊信號(hào)燈
  330.             }
  331.             if(Busy_Btton==0)   //測(cè)試按鍵是否按下,按下為繁忙狀態(tài)
  332.             {
  333.         EW1=45;
  334.         SN1=30;
  335.         EWL1=14;
  336.         SNL1=14;
  337.         Special_LED=0;  //關(guān)特殊信號(hào)燈
  338.         Busy_LED=1;     //開(kāi)繁忙信號(hào)燈
  339.             }
  340.             if(Special_Btton==0)//測(cè)試按鍵是否按下,按下為特殊狀態(tài)
  341.             {
  342.         EW1=75;
  343.         SN1=55;
  344.         EWL1=19;
  345.         SNL1=19;
  346.         Busy_LED=0;    //關(guān)繁忙信號(hào)燈
  347.         Special_LED =1;//開(kāi)特殊信號(hào)燈
  348.             }                                       
  349.                         EX0=1;         //開(kāi)中斷
  350.         }
  351.         /**********************T0中斷服務(wù)程序*******************/
  352.         void timer0(void)interrupt 1 using 1
  353.         {
  354.                 static uchar count;
  355.                 TH0=(65536-50000)/256;
  356.                 TL0=(65536-50000)%256;
  357.                 count++;
  358.                 if(count==10)
  359.                 {
  360.                     if(Flag_SN_Yellow==1)  //測(cè)試南北黃燈標(biāo)志位
  361.                         {SN_Yellow=~SN_Yellow;}
  362.                     if(Flag_EW_Yellow==1)  //測(cè)試東西黃燈標(biāo)志位
  363.                         {EW_Yellow=~EW_Yellow;}
  364.                 }
  365.                 if(count==20)
  366.                 {
  367.                     Time_EW--;
  368.                     Time_SN--;
  369.                     if(Flag_SN_Yellow==1)  //測(cè)試南北黃燈標(biāo)志位
  370.                         {SN_Yellow=~SN_Yellow;}
  371.                     if(Flag_EW_Yellow==1)  //測(cè)試東西黃燈標(biāo)志位
  372.                         {EW_Yellow=~EW_Yellow;}
  373.                     count=0;
  374.                 }
  375.         }
  376.         /*********************主程序開(kāi)始***********************/
  377.         void        main(void)
  378.         {
  379.         Busy_LED=0;
  380.         Special_LED=0;
  381.         IT0=1;           //INT0負(fù)跳變觸發(fā)
  382.         TMOD=0x01; //定時(shí)器工作于方式1
  383.         TH0=(65536-50000)/256; //定時(shí)器賦初值
  384.         TL0=(65536-50000)%256;
  385.         EA=1;  //CPU開(kāi)中斷總允許
  386.         ET0=1; //開(kāi)定時(shí)中斷
  387.         EX0=1; //開(kāi)外部INTO中斷
  388.         TR0=1; //啟動(dòng)定時(shí)
  389.             while(1)
  390.             {                                
  391.                 /*******S0狀態(tài)**********/
  392.         SN_ManGreen=1;  //SN人行道通行
  393.         EW_ManGreen=0;
  394.         Flag_EW_Yellow=0;           //EW關(guān)黃燈顯示信號(hào)
  395.         Time_EW=EW;
  396.         Time_SN=SN;
  397.         while(Time_SN>=5)
  398.                         {   
  399.                             P1=S[0];        //SN綠燈,EW紅燈
  400.                             Display();
  401.                         }
  402.                         /*******S1狀態(tài)**********/
  403.                         P1=0x00;
  404.                         while(Time_SN>=0)
  405.                         {
  406.         x=1;
  407.         y=1;
  408.         P1=P1|0xA0;    //保持EW紅燈
  409.         Display();
  410.                         }
  411.                         /*******S2狀態(tài)**********/
  412.         EW_ManGreen=0;
  413.         Flag_SN_Yellow=0; //SN關(guān)黃燈顯示信號(hào)
  414.         Time_SN=SNL;
  415.         while(Time_SN>=5)
  416.                         {
  417.         P1=S[2];      //SN左拐綠燈亮,EW紅燈
  418.         Display();
  419.                         }
  420.                         /*******S3狀態(tài)**********/
  421.                         P1=0x00;
  422.                         while(Time_SN>=0)
  423.                         {
  424.         Flag_SN_Yellow=1;        //SN開(kāi)黃燈信號(hào)位
  425.         y=1;
  426.         c=0;
  427.         Display();
  428.                         }
  429.                         /***********賦值*********/
  430.         EW=EW1;
  431.         SN=SN1;
  432.         EWL=EWL1;
  433.         SNL=SNL1;
  434.                         /*******S4狀態(tài)**********/
  435.         SN_ManGreen=0;
  436.         EW_ManGreen=1;          //EW人行道通行
  437.         Flag_SN_Yellow=0; //SN關(guān)黃燈顯示信號(hào)
  438.         x=1;
  439.         d=0;
  440.         Time_EW=SN;
  441.         Time_SN=EW;
  442.         while(Time_EW>=5)
  443.                         {
  444.                             P1=S[4];          //EW通行,SN紅燈
  445.                                 Display();
  446.                         }
  447.                         /*******S5狀態(tài)**********/
  448.                         P1=0X00;
  449.                         while(Time_EW>=0)
  450.                         {
  451.         x=1;
  452.         P1=P1|0x80;    //保持SN紅燈
  453.         Display();
  454.                         }
  455.                         /*******S6狀態(tài)**********/
  456.         SN_ManGreen=0;
  457.         EW_ManGreen=0;
  458.         Flag_EW_Yellow=0;//EW關(guān)黃燈顯示信號(hào)
  459.         Time_EW=EWL;
  460.         while(Time_EW>=5)
  461.                         {
  462.         P1=S[6];     //EW左拐綠燈亮,SN紅燈
  463.         Display();
  464.                         }
  465.                         /*******S7狀態(tài)**********/
  466.                         P1=0X00;
  467.                         while(Time_EW>=0)
  468.                         {
  469.         Flag_EW_Yellow=1; //EN開(kāi)黃燈信號(hào)位
  470.         x=1;
  471.         P1=P1|0x20;    //保持SN紅燈
  472.         Display();
  473.                         }
  474.                         /***********賦值********/
  475.                         EW=EW1;
  476.                         SN=SN1;
  477.                         EWL=EWL1;
  478.                         SNL=SNL1;
  479.                 }
  480.         }
  481. 3:萬(wàn)年歷程序:
  482. #include <REG51.H>
  483. #include <intrins.h>
  484. //#include "LCD1602.h"
  485. //#include "DS1302.h"
  486. #define uint unsigned int
  487. #define uchar unsigned char
  488. sbit  DS1302_CLK = P1^7;              //實(shí)時(shí)時(shí)鐘時(shí)鐘線引腳
  489. sbit  DS1302_IO  = P1^6;              //實(shí)時(shí)時(shí)鐘數(shù)據(jù)線引腳
  490. sbit  DS1302_RST = P1^5;              //實(shí)時(shí)時(shí)鐘復(fù)位線引腳
  491. sbit  wireless_1 = P3^0;
  492. sbit  wireless_2 = P3^1;
  493. sbit  wireless_3 = P3^2;
  494. sbit  wireless_4 = P3^3;
  495. sbit  zhengchang = P3^5;               //正常模式切換
  496. sbit  fanmang = P3^6;                  //繁忙模式切換
  497. sbit  ACC0 = ACC^0;
  498. sbit  ACC7 = ACC^7;
  499. char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year;  //秒,分,時(shí)到日,月,年位閃的計(jì)數(shù)
  500. void show_time();   //液晶顯示程序
  501. /***********1602液晶顯示部分子程序****************/

  502. //Port Definitions**********************************************************
  503. sbit LcdRs                = P2^5;
  504. sbit LcdRw                = P2^6;
  505. sbit LcdEn          = P2^7;
  506. sfr  DBPort         = 0x80;                //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.數(shù)據(jù)端口

  507. //內(nèi)部等待函數(shù)**************************************************************************
  508. unsigned char LCD_Wait(void)
  509. {
  510.         LcdRs=0;
  511.         LcdRw=1;        _nop_();
  512.         LcdEn=1;        _nop_();
  513.                                                 
  514.         LcdEn=0;
  515.         return DBPort;               
  516. }
  517. //向LCD寫(xiě)入命令或數(shù)據(jù)************************************************************
  518. #define LCD_COMMAND                        0      // Command
  519. #define LCD_DATA                        1      // Data
  520. #define LCD_CLEAR_SCREEN        0x01      // 清屏
  521. #define LCD_HOMING                  0x02      // 光標(biāo)返回原點(diǎn)
  522. void LCD_Write(bit style, unsigned char input)
  523. {
  524.         LcdEn=0;
  525.         LcdRs=style;
  526.         LcdRw=0;                _nop_();
  527.         DBPort=input;        _nop_();//注意順序
  528.         LcdEn=1;                _nop_();//注意順序
  529.         LcdEn=0;                _nop_();
  530.         LCD_Wait();        
  531. }

  532. //設(shè)置顯示模式************************************************************
  533. #define LCD_SHOW                        0x04    //顯示開(kāi)
  534. #define LCD_HIDE                        0x00    //顯示關(guān)         

  535. #define LCD_CURSOR                        0x02         //顯示光標(biāo)
  536. #define LCD_NO_CURSOR                0x00    //無(wú)光標(biāo)                     

  537. #define LCD_FLASH                        0x01    //光標(biāo)閃動(dòng)
  538. #define LCD_NO_FLASH                0x00    //光標(biāo)不閃動(dòng)

  539. void LCD_SetDisplay(unsigned char DisplayMode)
  540. {
  541.         LCD_Write(LCD_COMMAND, 0x08|DisplayMode);        
  542. }

  543. //設(shè)置輸入模式************************************************************
  544. #define LCD_AC_UP                        0x02
  545. #define LCD_AC_DOWN                        0x00      // default

  546. #define LCD_MOVE                        0x01      // 畫(huà)面可平移
  547. #define LCD_NO_MOVE                        0x00      //default

  548. void LCD_SetInput(unsigned char InputMode)
  549. {
  550.         LCD_Write(LCD_COMMAND, 0x04|InputMode);
  551. }

  552. //初始化LCD************************************************************
  553. void LCD_Initial()
  554. {
  555.         LcdEn=0;
  556.         LCD_Write(LCD_COMMAND,0x38);           //8位數(shù)據(jù)端口,2行顯示,5*7點(diǎn)陣
  557.         LCD_Write(LCD_COMMAND,0x38);
  558.         LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);    //開(kāi)啟顯示, 無(wú)光標(biāo)
  559.         LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
  560.         LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);       //AC遞增, 畫(huà)面不動(dòng)
  561. }

  562. //液晶字符輸入的位置************************
  563. void GotoXY(unsigned char x, unsigned char y)
  564. {
  565.         if(y==0)
  566.                 LCD_Write(LCD_COMMAND,0x80|x);
  567.         if(y==1)
  568.                 LCD_Write(LCD_COMMAND,0x80|(x-0x40));
  569. }

  570. //將字符輸出到液晶顯示
  571. void Print(unsigned char *str)
  572. {
  573.         while(*str!='\0')
  574.         {
  575.                 LCD_Write(LCD_DATA,*str);
  576.                 str++;
  577.         }
  578. }
  579. /***********DS1302時(shí)鐘部分子程序******************/
  580. typedef struct __SYSTEMTIME__
  581. {
  582.         unsigned char Second;
  583.         unsigned char Minute;
  584.         unsigned char Hour;
  585.         unsigned char Week;
  586.         unsigned char Day;
  587.         unsigned char Month;
  588.         unsigned char  Year;
  589.         unsigned char DateString[11];
  590.         unsigned char TimeString[9];
  591. }SYSTEMTIME;        //定義的時(shí)間類型
  592. SYSTEMTIME CurrentTime;

  593. #define AM(X)        X
  594. #define PM(X)        (X+12)                      // 轉(zhuǎn)成24小時(shí)制
  595. #define DS1302_SECOND        0x80          //時(shí)鐘芯片的寄存器位置,存放時(shí)間
  596. #define DS1302_MINUTE        0x82
  597. #define DS1302_HOUR                0x84
  598. #define DS1302_WEEK                0x8A
  599. #define DS1302_DAY                0x86
  600. #define DS1302_MONTH            0x88
  601. #define DS1302_YEAR                0x8C

  602. void DS1302InputByte(unsigned char d)         //實(shí)時(shí)時(shí)鐘寫(xiě)入一字節(jié)(內(nèi)部函數(shù))
  603. {
  604.     unsigned char i;
  605.     ACC = d;
  606.     for(i=8; i>0; i--)
  607.     {
  608.         DS1302_IO = ACC0;                   //相當(dāng)于匯編中的 RRC
  609.         DS1302_CLK = 1;
  610.         DS1302_CLK = 0;
  611.         ACC = ACC >> 1;
  612.     }
  613. }

  614. unsigned char DS1302OutputByte(void)         //實(shí)時(shí)時(shí)鐘讀取一字節(jié)(內(nèi)部函數(shù))
  615. {
  616.     unsigned char i;
  617.     for(i=8; i>0; i--)
  618.     {
  619.         ACC = ACC >>1;                                 //相當(dāng)于匯編中的 RRC
  620.         ACC7 = DS1302_IO;
  621.         DS1302_CLK = 1;
  622.         DS1302_CLK = 0;
  623.     }
  624.     return(ACC);
  625. }

  626. void Write1302(unsigned char ucAddr, unsigned char ucDa)        //ucAddr: DS1302地址, ucData: 要寫(xiě)的數(shù)據(jù)
  627. {
  628.     DS1302_RST = 0;
  629.     DS1302_CLK = 0;
  630.     DS1302_RST = 1;
  631.     DS1302InputByte(ucAddr);               // 地址,命令
  632.     DS1302InputByte(ucDa);               // 寫(xiě)1Byte數(shù)據(jù)
  633.     DS1302_CLK = 1;
  634.     DS1302_RST = 0;
  635. }
  636. unsigned char Read1302(unsigned char ucAddr)        //讀取DS1302某地址的數(shù)據(jù)
  637. {
  638.     unsigned char ucData;
  639.     DS1302_RST = 0;
  640.     DS1302_CLK = 0;
  641.     DS1302_RST = 1;
  642.     DS1302InputByte(ucAddr|0x01);        // 地址,命令
  643.     ucData = DS1302OutputByte();         // 讀1Byte數(shù)據(jù)
  644.     DS1302_CLK = 1;
  645.     DS1302_RST = 0;
  646.     return(ucData);
  647. }
  648. void DS1302_GetTime(SYSTEMTIME *Time)  //獲取時(shí)鐘芯片的時(shí)鐘數(shù)據(jù)到自定義的結(jié)構(gòu)型數(shù)組
  649. {
  650.         unsigned char ReadValue;
  651.         ReadValue = Read1302(DS1302_SECOND);
  652.         Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  653.         ReadValue = Read1302(DS1302_MINUTE);
  654.         Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  655.         ReadValue = Read1302(DS1302_HOUR);
  656.         Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  657.         ReadValue = Read1302(DS1302_DAY);
  658.         Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);        
  659.         ReadValue = Read1302(DS1302_WEEK);
  660.         Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  661.         ReadValue = Read1302(DS1302_MONTH);
  662.         Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
  663.         ReadValue = Read1302(DS1302_YEAR);
  664.         Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);        
  665. }

  666. void DateToStr(SYSTEMTIME *Time)    //將時(shí)間年,月,日,星期數(shù)據(jù)轉(zhuǎn)換成液晶顯示字符串,放到數(shù)組里DateString[]
  667. {   if(hide_year<2)                 //這里的if,else語(yǔ)句都是判斷位閃爍,<2顯示數(shù)據(jù),>2就不顯示,輸出字符串為 2012/05/25
  668.     {                              
  669.           Time->DateString[0] = '2';
  670.           Time->DateString[1] = '0';         
  671.           Time->DateString[2] = Time->Year/10 + '0';
  672.           Time->DateString[3] = Time->Year%10 + '0';
  673.         }
  674.           else
  675.             {
  676.               Time->DateString[0] = ' ';
  677.               Time->DateString[1] = ' ';                 
  678.               Time->DateString[2] = ' ';
  679.               Time->DateString[3] = ' ';
  680.                 }
  681.         Time->DateString[4] = '/';
  682.         if(hide_month<2)
  683.         {
  684.           Time->DateString[5] = Time->Month/10 + '0';
  685.           Time->DateString[6] = Time->Month%10 + '0';
  686.         }
  687.           else
  688.           {
  689.             Time->DateString[5] = ' ';
  690.             Time->DateString[6] = ' ';
  691.           }
  692.         Time->DateString[7] = '/';
  693.         if(hide_day<2)
  694.         {
  695.           Time->DateString[8] = Time->Day/10 + '0';
  696.           Time->DateString[9] = Time->Day%10 + '0';
  697.         }
  698.           else
  699.           {
  700.             Time->DateString[8] = ' ';
  701.             Time->DateString[9] = ' ';            
  702.           }
  703.         if(hide_week<2)
  704.         {
  705.           week_value[0] = Time->Week%10 + '0';  //星期的數(shù)據(jù)另外放到 week_value[]數(shù)組里,跟年,月,日的分開(kāi)存放,因?yàn)榈纫幌乱谧詈箫@示
  706.         }
  707.           else
  708.           {
  709.             week_value[0] = ' ';
  710.           }
  711.           week_value[1] = '\0';
  712.         Time->DateString[10] = '\0'; //字符串末尾加 '\0' ,判斷結(jié)束字符
  713. }

  714. void TimeToStr(SYSTEMTIME *Time)  //將時(shí),分,秒數(shù)據(jù)轉(zhuǎn)換成液晶顯示字符放到數(shù)組 TimeString[];
  715. {   if(hide_hour<2)
  716.     {
  717.           Time->TimeString[0] = Time->Hour/10 + '0';
  718.           Time->TimeString[1] = Time->Hour%10 + '0';
  719.         }
  720.           else
  721.             {
  722.               Time->TimeString[0] = ' ';
  723.               Time->TimeString[1] = ' ';
  724.                 }
  725.         Time->TimeString[2] = ':';
  726.     if(hide_min<2)
  727.         {
  728.           Time->TimeString[3] = Time->Minute/10 + '0';
  729.           Time->TimeString[4] = Time->Minute%10 + '0';
  730.         }
  731.           else
  732.             {
  733.               Time->TimeString[3] = ' ';
  734.               Time->TimeString[4] = ' ';
  735.                }
  736.         Time->TimeString[5] = ':';
  737.     if(hide_sec<2)
  738.     {
  739.           Time->TimeString[6] = Time->Second/10 + '0';
  740.           Time->TimeString[7] = Time->Second%10 + '0';
  741.     }
  742.       else
  743.        {
  744.          Time->TimeString[6] = ' ';
  745.              Time->TimeString[7] = ' ';
  746.        }
  747.         Time->DateString[8] = '\0';
  748. }
  749. void Initial_DS1302(void)   //時(shí)鐘芯片初始化
  750. {   
  751.         unsigned char Second=Read1302(DS1302_SECOND);
  752.         if(Second&0x80)              //判斷時(shí)鐘芯片是否關(guān)閉         
  753.     {
  754.         Write1302(0x8e,0x00); //寫(xiě)入允許
  755.         Write1302(0x8c,0x12); //以下寫(xiě)入初始化時(shí)間 日期:12/05/25.星期: 5. 時(shí)間: 10:59:55
  756.         Write1302(0x88,0x05);
  757.         Write1302(0x86,0x25);
  758.         Write1302(0x8a,0x05);
  759.         Write1302(0x84,0x10);
  760.         Write1302(0x82,0x59);
  761.         Write1302(0x80,0x55);
  762.         Write1302(0x8e,0x80); //禁止寫(xiě)入
  763.         }
  764. }
  765. /***********ds18b20子程序*************************/
  766. /***********ds18b20延遲子函數(shù)(晶振12MHz )*******/

  767. void delay_18B20(unsigned int i)
  768. {
  769.         while(i--);
  770. }

  771. /**********ds18b20初始化函數(shù)**********************/

  772. void Init_DS18B20(void)
  773. {
  774.          unsigned char x=0;
  775.          DQ = 1;          //DQ復(fù)位
  776.          delay_18B20(8);  //稍做延時(shí)
  777.          DQ = 0;          //單片機(jī)將DQ拉低
  778.          delay_18B20(80); //精確延時(shí) 大于 480us
  779.          DQ = 1;          //拉高總線
  780.          delay_18B20(14);
  781.          x=DQ;            //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗
  782.          delay_18B20(20);
  783. }

  784. /***********ds18b20讀一個(gè)字節(jié)**************/  
  785. unsigned char ReadOneChar(void)
  786. {
  787.         uchar i=0;
  788.         uchar dat = 0;
  789.         for (i=8;i>0;i--)
  790.          {
  791.                   DQ = 0; // 給脈沖信號(hào)
  792.                   dat>>=1;
  793.                   DQ = 1; // 給脈沖信號(hào)
  794.                   if(DQ)
  795.                   dat|=0x80;
  796.                   delay_18B20(4);
  797.          }
  798.          return(dat);
  799. }

  800. /*************ds18b20寫(xiě)一個(gè)字節(jié)****************/  

  801. void WriteOneChar(uchar dat)
  802. {
  803.          unsigned char i=0;
  804.          for (i=8; i>0; i--)
  805.          {
  806.                   DQ = 0;
  807.                  DQ = dat&0x01;
  808.             delay_18B20(5);
  809.                  DQ = 1;
  810.             dat>>=1;
  811. }
  812. }

  813. /**************讀取ds18b20當(dāng)前溫度************/
  814. void ReadTemp(void)
  815. {
  816.         unsigned char a=0;
  817.         unsigned char b=0;
  818.         unsigned char t=0;

  819.         Init_DS18B20();
  820.         WriteOneChar(0xCC);            // 跳過(guò)讀序號(hào)列號(hào)的操作
  821.         WriteOneChar(0x44);         // 啟動(dòng)溫度轉(zhuǎn)換
  822.         delay_18B20(100);       // this message is wery important
  823.         Init_DS18B20();
  824.         WriteOneChar(0xCC);         //跳過(guò)讀序號(hào)列號(hào)的操作
  825.         WriteOneChar(0xBE);         //讀取溫度寄存器等前兩個(gè)就是溫度
  826.         delay_18B20(100);
  827.         a=ReadOneChar();            //讀取溫度值低位
  828.         b=ReadOneChar();                   //讀取溫度值高位
  829.         temp_value=b<<4;
  830.         temp_value+=(a&0xf0)>>4;               
  831. }
  832. void temp_to_str()   //溫度數(shù)據(jù)轉(zhuǎn)換成液晶字符顯示
  833. {
  834.   TempBuffer[0]=temp_value/10+'0';  //十位
  835.   TempBuffer[1]=temp_value%10+'0';  //個(gè)位
  836.   TempBuffer[2]=0xdf;   //溫度符號(hào)
  837.   TempBuffer[3]='C';
  838.   TempBuffer[4]='\0';
  839. }
  840. void Delay1ms(unsigned int count)
  841. {
  842.         unsigned int i,j;
  843.         for(i=0;i<count;i++)
  844.         for(j=0;j<120;j++);
  845. }
  846. /*延時(shí)子程序*/
  847. void mdelay(uint delay)
  848. {        uint i;
  849.          for(;delay>0;delay--)
  850.                    {for(i=0;i<62;i++) //1ms延時(shí).
  851.                        {;}
  852.                    }
  853. }
  854. void outkey()                    //跳出調(diào)整模式,返回默認(rèn)顯示
  855. { uchar Second;
  856.   if(out==0||wireless_1==1)         
  857.   { mdelay(8);
  858.         count=0;
  859.         hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_year=0;
  860.         Second=Read1302(DS1302_SECOND);
  861.     Write1302(0x8e,0x00); //寫(xiě)入允許
  862.         Write1302(0x80,Second&0x7f);
  863.         Write1302(0x8E,0x80);          //禁止寫(xiě)入
  864.         done=0;           
  865.         while(out==0);
  866.         while(wireless_1==1);
  867.   }
  868. }
  869. ///////////////////////////////////////////////////////////////////////
  870. void Upkey()//升序按鍵
  871. {           
  872.                 Up=1;
  873.                 if(Up==0||wireless_2==1)
  874.                           {
  875.                                    mdelay(8);
  876.                                        switch(count)
  877.                                           {case 1:
  878.                              temp=Read1302(DS1302_SECOND);  //讀取秒數(shù)
  879.                                                                   temp=temp+1;  //秒數(shù)加1
  880.                                   up_flag=1;    //數(shù)據(jù)調(diào)整后更新標(biāo)志
  881.                                                                   if((temp&0x7f)>0x59)   //超過(guò)59秒,清零
  882.                                   temp=0;                                                                  
  883.                                                                   break;
  884.                                            case 2:
  885.                              temp=Read1302(DS1302_MINUTE);  //讀取分?jǐn)?shù)
  886.                                                                   temp=temp+1;  //分?jǐn)?shù)加1
  887.                                   up_flag=1;
  888.                                                                   if(temp>0x59)          //超過(guò)59分,清零
  889.                                                                   temp=0;
  890.                                                                   break;
  891.                                            case 3:
  892.                              temp=Read1302(DS1302_HOUR);  //讀取小時(shí)數(shù)
  893.                                                                   temp=temp+1;  //小時(shí)數(shù)加1
  894.                                   up_flag=1;
  895.                                                                   if(temp>0x23)   //超過(guò)23小時(shí),清零
  896.                                                                   temp=0;
  897.                                                                   break;
  898.                                            case 4:
  899.                              temp=Read1302(DS1302_WEEK);  //讀取星期數(shù)
  900.                                                                   temp=temp+1;  //星期數(shù)加1
  901.                                   up_flag=1;
  902.                                                                   if(temp>0x7)  
  903.                                                                   temp=1;
  904.                                                                   break;
  905.                                            case 5:
  906.                                  temp=Read1302(DS1302_DAY);  //讀取日數(shù)
  907.                                                                   temp=temp+1;  //日數(shù)加1
  908.                                   up_flag=1;
  909.                                                                   if(temp>0x31)
  910.                                                                   temp=1;
  911.                                                                   break;
  912.                                            case 6:
  913.                              temp=Read1302(DS1302_MONTH);  //讀取月數(shù)
  914.                                                                   temp=temp+1;  //月數(shù)加1
  915.                                   up_flag=1;
  916.                                                                   if(temp>0x12)
  917.                                                                   temp=1;
  918.                                                                   break;
  919.                                            case 7:
  920.                                temp=Read1302(DS1302_YEAR);  //讀取年數(shù)
  921.                                                                   temp=temp+1;  //年數(shù)加1
  922.                                   up_flag=1;
  923.                                                                   if(temp>0x85)
  924.                                                                   temp=0;
  925.                                                                   break;
  926.                                                default:break;
  927.                                           }
  928.                                           
  929.                                    while(Up==0);
  930.                        while(wireless_2==1);
  931.                                   }
  932. }
  933. ///////////////////////////////////////////////////////////////////////void Downkey()//降序按鍵
  934. {            
  935.                 Down=1;
  936.             if(Down==0||wireless_3==1)
  937.                           {
  938.                                    mdelay(8);
  939.                                      switch(count)
  940.                                           {case 1:
  941.                              temp=Read1302(DS1302_SECOND);  //讀取秒數(shù)
  942.                                                                   temp=temp-1;                                    //秒數(shù)減1
  943.                                   down_flag=1;     //數(shù)據(jù)調(diào)整后更新標(biāo)志
  944.                                                                   if(temp==0x7f)     //小于0秒,返回59秒
  945.                                                                   temp=0x59;
  946.                                                                   break;
  947.                                            case 2:
  948.                              temp=Read1302(DS1302_MINUTE);  //讀取分?jǐn)?shù)
  949.                                                                   temp=temp-1;  //分?jǐn)?shù)減1
  950.                                   down_flag=1;
  951.                                                                   if(temp==-1)
  952.                                                                   temp=0x59;      //小于0分,返回59分
  953.                                                                   break;
  954.                                            case 3:
  955.                              temp=Read1302(DS1302_HOUR);  //讀取小時(shí)數(shù)
  956.                                                                   temp=temp-1;  //小時(shí)數(shù)減1
  957.                                   down_flag=1;
  958.                                                                   if(temp==-1)
  959.                                                                   temp=0x23;
  960.                                                                   break;
  961.                                            case 4:
  962.                              temp=Read1302(DS1302_WEEK);  //讀取星期數(shù)
  963.                                                                   temp=temp-1;  //星期數(shù)減1
  964.                                   down_flag=1;
  965.                                                                   if(temp==0)
  966.                                                                   temp=0x7;;
  967.                                                                   break;
  968.                                            case 5:
  969.                                  temp=Read1302(DS1302_DAY);  //讀取日數(shù)
  970.                                                                   temp=temp-1;  //日數(shù)減1
  971.                                   down_flag=1;
  972.                                                                   if(temp==0)
  973.                                                                   temp=31;
  974.                                                                   break;
  975.                                            case 6:
  976.                              temp=Read1302(DS1302_MONTH);  //讀取月數(shù)
  977.                                                                   temp=temp-1;  //月數(shù)減1
  978.                                   down_flag=1;
  979.                                                                   if(temp==0)
  980.                                                                   temp=12;
  981.                                                                   break;
  982.                                            case 7:
  983.                                temp=Read1302(DS1302_YEAR);  //讀取年數(shù)
  984.                                                                   temp=temp-1;  //年數(shù)減1
  985.                                   down_flag=1;
  986.                                                                   if(temp==-1)
  987.                                                                   temp=0x85;
  988.                                                                   break;
  989.                                               default:break;
  990.                                          }
  991.                                          
  992.                                    while(Down==0);
  993.                                    while(wireless_3==1);
  994.                                   }
  995. }
  996. void Setkey()//模式選擇按鍵
  997. {
  998.                 Set=1;
  999.                 if(Set==0||wireless_4==1)
  1000.             {
  1001.            mdelay(8);
  1002.            count=count+1;         //Setkey按一次,count就加1
  1003.                    done=1;                         //進(jìn)入調(diào)整模式
  1004.            while(Set==0);
  1005.            while(wireless_4==1);
  1006.                  }
  1007. }
  1008. void keydone()//按鍵功能執(zhí)行
  1009. {        uchar Second;
  1010.                  if(flag==0)    //關(guān)閉時(shí)鐘,停止計(jì)時(shí)
  1011.          { Write1302(0x8e,0x00); //寫(xiě)入允許
  1012.            temp=Read1302(0x80);
  1013.            Write1302(0x80,temp|0x80);
  1014.                Write1302(0x8e,0x80); //禁止寫(xiě)入
  1015.            flag=1;
  1016.          }
  1017.          Setkey();                                            //掃描模式切換按鍵
  1018.                  switch(count)
  1019.                  {case 1:do                                                //count=1,調(diào)整秒
  1020.                           {
  1021.                  outkey();                           //掃描跳出按鈕
  1022.                                    Upkey();                //掃描加按鈕
  1023.                                    Downkey();              //掃描減按鈕
  1024.                                  if(up_flag==1||down_flag==1)  //數(shù)據(jù)更新,重新寫(xiě)入新的數(shù)據(jù)
  1025.                                    {
  1026.                                    Write1302(0x8e,0x00); //寫(xiě)入允許
  1027.                                    Write1302(0x80,temp|0x80); //寫(xiě)入新的秒數(shù)
  1028.                                    Write1302(0x8e,0x80); //禁止寫(xiě)入
  1029.                                    up_flag=0;
  1030.                                    down_flag=0;
  1031.                    }

  1032.                                    hide_sec++;          //位閃計(jì)數(shù)
  1033.                                    if(hide_sec>3)
  1034.                                     hide_sec=0;
  1035.                    show_time();         //液晶顯示數(shù)據(jù)
  1036.                                   }while(count==2);break;  
  1037.                   case 2:do                                                //count=2,調(diào)整分
  1038.                           {
  1039.                                    hide_sec=0;
  1040.                                    outkey();
  1041.                                    Upkey();
  1042.                                    Downkey();
  1043.                                    if(temp>0x60)
  1044.                                      temp=0;
  1045.                                    if(up_flag==1||down_flag==1)
  1046.                                    {
  1047.                                    Write1302(0x8e,0x00); //寫(xiě)入允許
  1048.                                    Write1302(0x82,temp); //寫(xiě)入新的分?jǐn)?shù)
  1049.                                    Write1302(0x8e,0x80); //禁止寫(xiě)入
  1050.                                    up_flag=0;
  1051.                                    down_flag=0;
  1052.                                    }
  1053.                                    hide_min++;
  1054.                                    if(hide_min>3)
  1055.                                      hide_min=0;
  1056.                    show_time();
  1057.                                   }while(count==3);break;
  1058.                   case 3:do                                                //count=3,調(diào)整小時(shí)
  1059.                           {
  1060.                    hide_min=0;
  1061.                                    outkey();
  1062.                                    Upkey();
  1063.                                    Downkey();
  1064.                                    if(up_flag==1||down_flag==1)
  1065.                                    {
  1066.                                    Write1302(0x8e,0x00); //寫(xiě)入允許
  1067.                                    Write1302(0x84,temp); //寫(xiě)入新的小時(shí)數(shù)
  1068.                                    Write1302(0x8e,0x80); //禁止寫(xiě)入
  1069.                                    up_flag=0;
  1070.                                    down_flag=0;
  1071.                                    }
  1072.                                    hide_hour++;
  1073.                                    if(hide_hour>3)
  1074.                                      hide_hour=0;
  1075.                    show_time();
  1076.                                   }while(count==4);break;
  1077.                   case 4:do                                                //count=4,調(diào)整星期
  1078.                           {
  1079.                    hide_hour=0;
  1080.                                    outkey();
  1081.                                    Upkey();
  1082.                                    Downkey();
  1083.                                    if(up_flag==1||down_flag==1)
  1084.                                    {
  1085.                                    Write1302(0x8e,0x00); //寫(xiě)入允許
  1086.                                    Write1302(0x8a,temp); //寫(xiě)入新的星期數(shù)
  1087.                                    Write1302(0x8e,0x80); //禁止寫(xiě)入
  1088.                                    up_flag=0;
  1089.                                    down_flag=0;
  1090.                                    }
  1091.                                    hide_week++;
  1092.                                    if(hide_week>3)
  1093.                                      hide_week=0;
  1094.                    show_time();
  1095.                                   }while(count==5);break;
  1096.                   case 5:do                                                //count=5,調(diào)整日
  1097.                           {
  1098.                                    hide_week=0;
  1099.                                    outkey();
  1100.                                    Upkey();
  1101.                                    Downkey();
  1102.                                    if(up_flag==1||down_flag==1)
  1103.                                    {
  1104.                                    Write1302(0x8e,0x00); //寫(xiě)入允許
  1105.                                    Write1302(0x86,temp); //寫(xiě)入新的日數(shù)
  1106.                                    Write1302(0x8e,0x80); //禁止寫(xiě)入
  1107.                                    up_flag=0;
  1108.                                    down_flag=0;
  1109.                                    }
  1110.                                    hide_day++;
  1111.                                    if(hide_day>3)
  1112.                                      hide_day=0;
  1113.                    show_time();
  1114.                                   }while(count==6);break;
  1115.                   case 6:do                                                //count=6,調(diào)整月
  1116.                           {
  1117.                    hide_day=0;
  1118.                                    outkey();
  1119.                                    Upkey();
  1120.                                    Downkey();
  1121.                                    if(up_flag==1||down_flag==1)
  1122.                                    {
  1123.                                    Write1302(0x8e,0x00); //寫(xiě)入允許
  1124.                                    Write1302(0x88,temp); //寫(xiě)入新的月數(shù)
  1125.                                    Write1302(0x8e,0x80); //禁止寫(xiě)入
  1126.                                    up_flag=0;
  1127.                                    down_flag=0;
  1128.                                    }
  1129.                                    hide_month++;
  1130.                                    if(hide_month>3)
  1131.                                      hide_month=0;
  1132.                    show_time();
  1133.                                   }while(count==7);break;
  1134.                   case 7:do                                                //count=7,調(diào)整年
  1135.                           {
  1136.                    hide_month=0;
  1137.                                    outkey();
  1138.                                    Upkey();
  1139.                                    Downkey();
  1140.                                    if(up_flag==1||down_flag==1)
  1141.                                    {
  1142.                                    Write1302(0x8e,0x00); //寫(xiě)入允許
  1143.                                    Write1302(0x8c,temp); //寫(xiě)入新的年數(shù)
  1144.                                    Write1302(0x8e,0x80); //禁止寫(xiě)入
  1145.                                    up_flag=0;
  1146.                                    down_flag=0;
  1147.                                    }
  1148.                                    hide_year++;
  1149.                                    if(hide_year>3)
  1150.                                      hide_year=0;
  1151.                    show_time();
  1152.                                   }while(count==8);break;
  1153.                   case 8: count=0;hide_year=0;  // 跳出調(diào)整模式,返回默認(rèn)顯示狀態(tài)
  1154.                       Second=Read1302(DS1302_SECOND);
  1155.                   Write1302(0x8e,0x00); //寫(xiě)入允許
  1156.                       Write1302(0x80,Second&0x7f);
  1157.                       Write1302(0x8E,0x80);          //禁止寫(xiě)入
  1158.                                   done=0;
  1159.                   break; //count=7,開(kāi)啟中斷,標(biāo)志位置0并退出
  1160.                   default:break;
  1161.                  }
  1162. }
  1163. void show_time()   //液晶顯示程序
  1164. {
  1165.   DS1302_GetTime(&CurrentTime);  //獲取時(shí)鐘芯片的時(shí)間數(shù)據(jù)
  1166.   TimeToStr(&CurrentTime);       //時(shí)間數(shù)據(jù)轉(zhuǎn)換液晶字符
  1167.   DateToStr(&CurrentTime);       //日期數(shù)據(jù)轉(zhuǎn)換液晶字符
  1168.   ReadTemp();                    //開(kāi)啟溫度采集程序
  1169.   temp_to_str();                 //溫度數(shù)據(jù)轉(zhuǎn)換成液晶字符
  1170.   GotoXY(12,1);                  //液晶字符顯示位置
  1171.   Print(TempBuffer);             //顯示溫度
  1172.   GotoXY(0,1);
  1173.   Print(CurrentTime.TimeString); //顯示時(shí)間
  1174.   GotoXY(0,0);
  1175.   Print(CurrentTime.DateString); //顯示日期
  1176.   GotoXY(15,0);
  1177.   Print(week_value);             //顯示星期
  1178.   GotoXY(11,0);
  1179.   Print("Week");        //在液晶上顯示 字母 week
  1180.   Delay1ms(400);                 //掃描延時(shí)
  1181. }

  1182. main()
  1183. {
  1184.    flag=1;           //時(shí)鐘停止標(biāo)志
  1185.         LCD_Initial();    //液晶初始化
  1186.         Init_DS18B20( ) ;      //DS18B20初始化
  1187.         Initial_DS1302(); //時(shí)鐘芯片初始化
  1188.         up_flag=0;
  1189.         down_flag=0;
  1190.         done=0;           //進(jìn)入默認(rèn)液晶顯示
  1191.         wireless_1=0;
  1192.         wireless_2=0;
  1193.         wireless_3=0;
  1194.         wireless_4=0;
  1195.         while(1)
  1196.         {   
  1197.         while(done==1)
  1198.           keydone();    //進(jìn)入調(diào)整模式
  1199.                 while(done==0)
  1200.              {  
  1201.             show_time();                //液晶顯示數(shù)據(jù)
  1202.             flag=0;                  
  1203.                       Setkey();                                 //掃描各功能鍵
  1204. if((CurrentTime.TimeString[0]=='0'
  1205. && CurrentTime.TimeString[1]=='7'
  1206. && CurrentTime.TimeString[3]=='0'
  1207. &&CurrentTime.TimeString[4]=='0')
  1208. || (CurrentTime.TimeString[0]=='1'
  1209. && CurrentTime.TimeString[1]=='1'
  1210. &&CurrentTime.TimeString[3]=='0
  1211. && CurrentTime.TimeString[4]=='0')
  1212. ||(CurrentTime.TimeString[0]=='1'
  1213. &&CurrentTime.TimeString[1]=='7'
  1214. && CurrentTime.TimeString[3]=='0'
  1215. && CurrentTime.TimeString[4]=='0') )  
  1216. fanmang=0;
  1217. else fanmang=1;
  1218. if((CurrentTime.TimeString[0]=='0'
  1219. && CurrentTime.TimeString[1]=='9'
  1220. && CurrentTime.TimeString[3]=='0'
  1221. &&CurrentTime.TimeString[4]=='0')
  1222. || (CurrentTime.TimeString[0]=='1'
  1223. && CurrentTime.TimeString[1]=='4'
  1224. &&CurrentTime.TimeString[3]=='0'
  1225.   && CurrentTime.TimeString[4]=='0')
  1226. ||(CurrentTime.TimeString[0]=='1'
  1227. &&CurrentTime.TimeString[1]=='9'
  1228.   && CurrentTime.TimeString[3]=='0'
  1229. && CurrentTime.TimeString[4]=='0') )  
  1230.      zhengchang=0;
  1231. else zhengchang=1;
  1232.                  }
  1233.         }
  1234. }
復(fù)制代碼

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:550782 發(fā)表于 2021-3-23 16:08 | 只看該作者
實(shí)物怎么做
回復(fù)

使用道具 舉報(bào)

板凳
ID:343934 發(fā)表于 2022-11-26 18:04 | 只看該作者
.DSN是protues文件 需要安裝7.5版本才能打開(kāi)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕日韩三级 | 四虎海外| 日韩一区二区在线视频 | 在线免费观看日本 | 欧美日韩精品区 | 欧美黄色片 | 精品久久久久久一区二区 | 综合九九 | 国产一区二区三区在线看 | 国产福利视频在线观看 | 亚洲精品一区二区三区中文字幕 | 国产98色在线 | 日韩 | 99精彩视频 | 米奇7777狠狠狠狠视频 | 一级一级毛片免费看 | 国产精品一区二区av | 午夜免费电影院 | 最新国产精品精品视频 | v片网站 | 免费电影av| 国产精品久久久久aaaa樱花 | 精品久久久久久久 | 久久一二区 | 国产精品日韩欧美一区二区三区 | 日韩欧美国产一区二区三区 | 国产成人一区二区三区精 | 日韩欧美一区二区三区四区 | 99久久婷婷国产综合精品电影 | 免费小视频在线观看 | 成年人的视频免费观看 | 四虎影院在线观看av | 中文字幕1区 | 国产精品久久性 | 日韩高清一区二区 | 欧美精品一区二区免费 | 久久久999免费视频 999久久久久久久久6666 | 久热精品在线播放 | 精品欧美在线观看 | 欧美日韩国产一区二区三区 | www.99热.com | 99综合|