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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 25170|回復(fù): 14
收起左側(cè)

51單片機電子萬年歷畢業(yè)設(shè)計(論文)下載 含源碼 proteus仿真,原理圖

  [復(fù)制鏈接]
ID:192429 發(fā)表于 2017-4-23 20:22 | 顯示全部樓層 |閱讀模式
這是我做的基于51單片機的電子萬年歷畢業(yè)設(shè)計論文資料
內(nèi)含有設(shè)計的C語言代碼,proteus仿真圖,實驗報告以及元器件清單
電子萬年歷的功能包括,顯示時間,顯示溫度,顯示日期,顯示星期,并且含有鬧鈴。
0.png 0.png

全部資料下載:
8、電子萬年歷.zip (1.28 MB, 下載次數(shù): 782)



下面是論文的部分內(nèi)容預(yù)覽:
畢業(yè)設(shè)計(論文)


題   目:基于51單片機電子萬年歷的設(shè)計


系    部:
專    業(yè):
學(xué)    號:
學(xué)生姓名:
指導(dǎo)教師姓名:
指導(dǎo)教師職稱:

XXXXXXXX學(xué)院(論文)

摘    要

電子萬年歷是一種應(yīng)用非常廣泛日常計時工具,對現(xiàn)代社會越來越重要。此電子萬年歷在硬件方面主要采用AT89C51單片機作為主控核心,由DS1302時鐘芯片提供時鐘、LCD1602液晶顯示屏顯示。AT89C51單片機是由STC公司推出的,功耗小,電壓可選用4~6V電壓供電;DS1302時鐘芯片是美國DALLAS公司推出的低功耗實時時鐘芯片,它可以對年、月、日、星期、時、分、秒進(jìn)行計時,還具有閏年補償?shù)榷喾N功能,而且DS1302的使用壽命長,誤差小;對于數(shù)字電子萬年歷采用直觀的數(shù)字顯示,數(shù)字顯示是采用的LCD1602液晶顯示屏來顯示,可以同時顯示年、月、日、星期、時、分、秒等信息。此外,該電子萬年歷還具有時間校準(zhǔn)等功能。在軟件方面,主要包括日歷程序、時間調(diào)整程序,顯示程序等。所有程序編寫完成后,在Keil軟件中進(jìn)行調(diào)試,確定沒有問題后,燒寫到單片機上進(jìn)行測試。

此設(shè)計主要由時鐘芯片DS1302和溫度傳感器DS18B20采集數(shù)據(jù)到單片機進(jìn)行處理再通過LCD1602顯示出來,本論文主要研究了液晶顯示器LCD1602及時鐘芯片DS1302,溫度傳感器DS18B20與單片機之間的硬件互聯(lián)及通信,對數(shù)種硬件連接方案進(jìn)行了詳盡的比較,在軟件方面對日歷算法也進(jìn)行了論述。





目錄
前  言
第一章  工作原理
1.1設(shè)計目標(biāo)
1.1.1基本功能
第二章  硬件設(shè)計與原理
2.1 總設(shè)計框圖
2.2 硬件設(shè)計分析
2.2.1 電源的設(shè)計
2.2.2 單片機最小系統(tǒng)
2.2.3 顯示系統(tǒng)
2.2.4 LCD1602的指令說明及時序
2.2.5 LCD1602RAM地址映射及標(biāo)準(zhǔn)字庫表
2.2.6 DS1302原理及說明
2.2.7 DS18B20工作原理及說明
2.2.8 按鍵電路
第三章  軟件設(shè)計與分析
3.1 軟件設(shè)計的組成
3.2  源程序
第四章  軟件仿真
4.1 PROTEUS
4.2仿真圖
4.3原理圖
4.4 元件清單
總結(jié)
致  謝
參考文獻(xiàn)




XXXXXXXX學(xué)院(論文)
前  言

最近幾年來,隨著科技的飛速發(fā)展,單片機領(lǐng)域正在不斷的走向社會各個角落,還帶動傳統(tǒng)控制檢測日新月異更新。在實時運作和自動控制的單片機應(yīng)用到系統(tǒng)中,單片機如今是作為一個核心部件來使用,僅掌握單片機方面知識是不夠的,還應(yīng)根據(jù)其具體硬件結(jié)構(gòu),以及針對具體應(yīng)用對象特點的軟件結(jié)合,加以完善。“單片機原理及應(yīng)用課程設(shè)計”是電子類專業(yè)的學(xué)科基礎(chǔ)科,它是繼“匯編語言程序設(shè)計”,“接口技術(shù)”等課程之后開出的實踐環(huán)節(jié)課程。

第一章  工作原理1.1設(shè)計目標(biāo)1.1.1基本功能

此萬年歷主要具有:年、月、日、星期、時、分、秒、溫度顯示。

主要功能:

1、萬年歷

2、時間

3、星期

4、溫度顯示

(以上四項內(nèi)容同時顯示)

5、四鍵調(diào)時(設(shè)置鍵、上調(diào)鍵、下調(diào)鍵、關(guān)音按鍵)

第二章  硬件設(shè)計與原理

以AT89C51單片機為核心,起著控制作用。系統(tǒng)包括LCD1602液晶顯示電路、復(fù)位電路、時鐘電路、按鍵電路、溫度傳感器電路、時鐘芯片電路。設(shè)計思路分為七個模塊:復(fù)位電路、晶振電路模塊、AT89C51、LCD1602液晶顯示電路、按鍵電路、溫度傳感器電路、時鐘芯片電路這七個模塊。

2.1 總設(shè)計框圖

1.001.jpg

2.2 硬件設(shè)計分析2.2.1 電源的設(shè)計

系統(tǒng)電源使用直流5伏。

由電腦USB接口提供電源。

USB是通用串行總線(Universal Serial Bus)接口的簡稱。它是目前使用比較廣泛的電腦接口之一,主要版本有1.0、1.1和最新的2.0三種版本。根據(jù)USB總線的工業(yè)標(biāo)準(zhǔn),它可以提供額定功率為5V/500mA的電源供USB設(shè)備使用。

2.2.2 單片機最小系統(tǒng)

51單片機是對目前所有兼容intel 8031指令系統(tǒng)的單片機的統(tǒng)稱。該系列單片機的始祖是intel的8031單片機,后來隨著技術(shù)的發(fā)展,成為目前廣泛應(yīng)用的8為單片機之一。單片機是在一塊芯片內(nèi)集成了CPU、RAM、ROM、定時器/計數(shù)器和多功能I/O口等計算機所需要的基本功能部件的大規(guī)模集成電路,又稱為MCU。51系列單片機內(nèi)包含以下幾個部件:

一個8位CPU;一個片內(nèi)振蕩器及時鐘電路;

4KB的ROM程序存儲器;

一個128B的RAM數(shù)據(jù)存儲器;

尋址64KB外部數(shù)據(jù)存儲器和64KB外部程序存儲空間的控制電路;

32條可編程的I/O口線;

兩個16位定時/計數(shù)器;

一個可編程全雙工串行口;

5個中斷源、兩個優(yōu)先級嵌套中斷結(jié)構(gòu)。

如圖2-2-1所示為AT89C51單片機基本構(gòu)造,其基本性能介紹如下:

1.002.jpg
圖2-2-1 AT89C51單片機

AT89C51本身內(nèi)含40個引腳,32個外部雙向輸入/輸出(I/O)端口,同時內(nèi)含2個外中端口,3個16位可編程定時計數(shù)器,2個全雙工串行通信口,AT89C51可以按照常規(guī)方法進(jìn)行編程,但不可以在線編程。其將通用的微處理器和Flash存儲器結(jié)合在一起,特別是可反復(fù)擦寫的Flash存儲器可有效地降低開發(fā)成本。

AT89C51的主要特性如下表所示:

兼容MCS—51指令系統(tǒng)
32個可編程I/O線
4k字節(jié)可編程閃爍存儲器
可編程UARL通道
三個16位可編程定時/計數(shù)器中斷
時鐘頻率0-24MHz
2個外部中斷源,共8個中斷源
256×8bit內(nèi)部RAM
2個讀寫中斷口線
可直接驅(qū)動LED
軟件設(shè)置睡眠和喚醒功能
低功耗空閑和掉電模式
表2-2-1 AT89C51主要功能描述

AT89C51為40腳雙列直插封裝的8位通用微處理器,采用工業(yè)標(biāo)準(zhǔn)的C51內(nèi)核,在內(nèi)部功能及管腳排布上與通用的8xc52相同,其主要用于會聚調(diào)整時的功能控制。功能包括對會聚主IC內(nèi)部寄存器、數(shù)據(jù)RAM及外部接口等功能部件的初始化,會聚調(diào)整控制,會聚測試圖控制,紅外遙控信號IR的接收解碼及與主板CPU通信等。主要管腳有:XTAL1(19腳)和XTAL2(18腳)為振蕩器輸入輸出端口,外接12MHz 晶振。RST/Vpd(9腳)為復(fù)位輸入端口,外接電阻電容組成的復(fù)位電路。VCC(40腳)和VSS(20腳)為供電端口,分別接+5V電源的正負(fù)端。P0~P3 為可編程通用I/O腳,其功能用途由軟件定義,在本設(shè)計中,P0端口(32~39腳)被定義為N1功能控制端口,分別與N1的相應(yīng)功能管腳相連接,13腳定義為IR輸入端,10腳和11腳定義為I2C總線控制端口,分別連接N1的SDAS(18腳)和SCLS(19腳)端口,12腳、27腳及28腳定義為握手信號功能端口,連接主板CPU的相應(yīng)功能端,用于當(dāng)前制式的檢測及會聚調(diào)整狀態(tài)進(jìn)入的控制功能。

P0口:P0口是一組8位漏極開路型雙向I/O 口,也即地址/數(shù)據(jù)總線復(fù)用口。作為輸出口用時,每位能吸收電流的方式驅(qū)動8個TTL邏輯門電路,對端口P0寫“1”時,可作為高阻抗輸入端用。在訪問外部數(shù)據(jù)存儲器或程序存儲器時,這組口線分時轉(zhuǎn)換地址(低8位)和數(shù)據(jù)總線復(fù)用,在訪問期間激活內(nèi)部上拉電阻。在Flash 編程時,P0口接收指令字節(jié),而在程序校驗時,輸出指令字節(jié),校驗時,要求外接上拉電阻。

P1口:P1是一個帶內(nèi)部上拉電阻的8位雙向I/O口,P1的輸出緩沖級可驅(qū)動(吸收或輸出電流)4個TTL邏輯門電路。對端口寫“1”,通過內(nèi)部的上拉電阻把端口拉到高電平,此時可作輸入口。作輸入口使用時,因為內(nèi)部存在上拉電阻,某個引腳被外部信號拉低時會輸出一個電流(IIL)。與AT89C51不同之處是,P1.0和P1.1還可分別作為定時/計數(shù)器2 的外部計數(shù)輸入(P1.0/T2)和輸入(P1.1/T2EX)。Flash編程和程序校驗期間,P1接收低8位地址。

P2口:P2是一個帶有內(nèi)部上拉電阻的8 位雙向I/O口,P2的輸出緩沖級可驅(qū)動(吸收或輸出電流)4個TTL邏輯門電路。對端口P2寫“1”,通過內(nèi)部的上拉電阻把端口拉到高電平,此時可作輸入口,作輸入口使用時,因為內(nèi)部存在上拉電阻,某個引腳被外部信號拉低時會輸出一個電流(IIL)。在訪問外部程序存儲器或16位地址的外部數(shù)據(jù)存儲器(例如執(zhí)行MOVX @DPTR指令)時,P2口送出高8位地址數(shù)據(jù)。在訪問8位地址的外部數(shù)據(jù)存儲器(如執(zhí)行MOVX @RI指令)時,P2口輸出P2鎖存器的內(nèi)容。Flash編程或校驗時,P2亦接收高位地址和一些控制信號。

P3口:P3口是一組帶有內(nèi)部上拉電阻的8位雙向I/O口。P3口輸出緩沖級可驅(qū)動(吸收或輸出電流)4個TTL邏輯門電路。對P3口寫入“1”時,它們被內(nèi)部上拉電阻拉高并可作為輸入端口。此時,被外部拉低的P3口將用上拉電阻輸出電流(IIL)。P3口除了作為一般的I/O口線外,更重要的用途是它的第二功能P3口還接收一些用于Flash 閃速存儲器編程和程序校驗的控制信號。

RST:復(fù)位輸入。當(dāng)振蕩器工作時,RST引腳出現(xiàn)兩個機器周期以上高電平將使單片機復(fù)位。

ALE/PROG:當(dāng)訪問外部程序存儲器或數(shù)據(jù)存儲器時,ALE(地址鎖存允許)輸出脈沖用于鎖存地址的低8位字節(jié)。一般情況下,ALE仍以時鐘振蕩頻率的1/6輸出固定的脈沖信號,因此它可對外輸出時鐘或用于定時目的。要注意的是:每當(dāng)訪問外部數(shù)據(jù)存儲器時將跳過一個AL脈沖。對Flash存儲器編程期間,該引腳還用于輸入編程脈沖(PROG)。如有必要,可通過對特殊功能寄存器(SFR)區(qū)中的8EH單元的D0位置位,可禁止ALE操作。該位置位后,只有一條 MOVX 和MOVC指令才能將ALE激活。此外,該引腳會被微弱拉高,單片機執(zhí)行外部程序時,應(yīng)設(shè)置ALE禁止位無效。

PSEN:程序儲存允許(PSEN)輸出是外部程序存儲器的讀選通信號,當(dāng)AT89C51由外部程序存儲器取指令(或數(shù)據(jù))時,每個機器周期兩次PSEN有效,即輸出兩個脈沖。在此期間,當(dāng)訪問外部數(shù)據(jù)存儲器,將跳過兩次PSEN信號。

EA/VPP:外部訪問允許。欲使CPU僅訪問外部程序存儲器(地址為0000H—FFFFH),EA端必須保持低電平(接地)。需注意的是:如果加密位LB1被編程,復(fù)位時內(nèi)部會鎖存EA端狀態(tài)。如EA端為高電平(接Vcc端),CPU則執(zhí)行內(nèi)部程序存儲器中的指令。Flash存儲器編程時,該引腳加上+12V的編程允許電源Vpp,當(dāng)然這必須是該器件是使用12V編程電壓Vpp。

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

XTAL2:振蕩器反相放大器的輸出端。

單片機最小原理圖如圖2-2-2所示。

1.003.jpg
圖2-2-2 單片機最小系統(tǒng)
單片機最小系統(tǒng)說明:

時鐘信號的產(chǎn)生:在MCS-51芯片內(nèi)部有一個高增益反相放大器,其輸入端為芯片引腳XTAL1,其輸出端為引腳XTAL2。而在芯片的外部,XTAL1和XTAL2之間跨接晶體振蕩器和微調(diào)電容,從而構(gòu)成一個穩(wěn)定的自激振蕩器,這就是單片機的時鐘振蕩電路。

時鐘電路產(chǎn)生的振蕩脈沖經(jīng)過觸發(fā)器進(jìn)行二分頻之后,才成為單片機的時鐘脈沖信號。

一般地,電容C2和C3取30pF左右,晶體的振蕩頻率范圍是1.2-12MHz。如果晶體振蕩頻率高,則系統(tǒng)的時鐘頻率也高,單片機的運行速度也就快。

單片機復(fù)位使CPU和系統(tǒng)中的其他功能部件都處在一個確定的初始狀態(tài)下,并從這個狀態(tài)開始工作。單片機復(fù)位條件:必須使9腳加上持續(xù)兩個機器周期(即24個振蕩周期)的高電平。

2.2.3 顯示系統(tǒng)

LCD1602分為帶背光和不帶背光兩種,基控制器大部分為HD44780,帶背光的比不帶背光的厚,是否帶背光在應(yīng)用中并無差別,兩者尺寸差別如下圖2-2-3所示:

1.004.jpg

LCD1602的主要技術(shù)參數(shù):

1、顯示容量:16×2個字符

2、芯片工作電壓:4.5—5.5V

3、工作電流:2.0mA(5.0V)

4、模塊最佳工作電壓:5.0V

5、字符尺寸:2.95×4.35(W×H)mm

引腳功能說明

LCD1602采用標(biāo)準(zhǔn)的14腳(無背光)或16腳(帶背光)接口,各引腳接口說明如圖2-2-4所示:

編號
符號
引腳說明
編號
符號
引腳說明
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
讀/寫選擇
13
D6
數(shù)據(jù)
6
E
使能信號
14
D7
數(shù)據(jù)
7
D0
數(shù)據(jù)
15
BLA
背光源正極
8
D1
數(shù)據(jù)
16
BLK
背光源負(fù)極

1.005.jpg

圖2-2-4:引腳接口說明表

第1腳:VSS為地電源。

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

第3腳:VL為液晶顯示器對比度調(diào)整端,接正電源時對比度最弱,接地時對比度最高,對比度過高時會產(chǎn)生“鬼影”,使用時可以通過一個10K的電位器調(diào)整對比度。

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

第5腳:R/W為讀寫信號線,高電平時進(jìn)行讀操作,低電平時進(jìn)行寫操作。當(dāng)RS和R/W共同為低電平時可以寫入指令或者顯示地址,當(dāng)RS為低電平R/W為高電平時可以讀忙信號,當(dāng)RS為高電平R/W為低電平時可以寫入數(shù)據(jù)。

第6腳:E端為使能端,當(dāng)E端由高電平跳變成低電平時,液晶模塊執(zhí)行命令。

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

第15腳:背光源正極。

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

2.2.4 LCD1602的指令說明及時序
1602液晶模塊內(nèi)部的控制器共有11條控制指令,如圖2-2-5所示:
序號
指令
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
顯示開/關(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
計數(shù)器地址
10
寫數(shù)到CGRAM或DDRAM)
1
0
要寫的數(shù)據(jù)內(nèi)容
11
從CGRAM或DDRAM讀數(shù)
1
1
讀出的數(shù)據(jù)內(nèi)容

1.006.jpg

1602液晶模塊的讀寫操作、屏幕和光標(biāo)的操作都是通過指令編程來實現(xiàn)的。(說明:1為高電平、0為低電平)

指令1:清顯示,指令碼01H,光標(biāo)復(fù)位到地址00H位置。

指令2:光標(biāo)復(fù)位,光標(biāo)返回到地址00H。

指令3:光標(biāo)和顯示模式設(shè)置I/D:光標(biāo)移動方向,高電平右移,低電平左移S:屏幕上所有文字是否左移或者右移。高電平表示有效,低電平則無效。

指令4:顯示開關(guān)控制。D:控制整體顯示的開與關(guān),高電平表示開顯示,低電平表示關(guān)顯示C:控制光標(biāo)的開與關(guān),高電平表示有光標(biāo),低電平表示無光標(biāo)B:控制光標(biāo)是否閃爍,高電平閃爍,低電平不閃爍。

指令5:光標(biāo)或顯示移位S/C:高電平時移動顯示的文字,低電平時移動光標(biāo)。

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

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

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

指令9:讀忙信號和光標(biāo)地址BF:為忙標(biāo)志位,高電平表示忙,此時模塊不能接收命令或者數(shù)據(jù),如果為低電平表示不忙。

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

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

2.2.5 LCD1602的RAM地址映射及標(biāo)準(zhǔn)字庫表

1.007.jpg 液晶顯示模塊是一個慢顯示器件,所以在執(zhí)行每條指令之前一定要確認(rèn)模塊的忙標(biāo)志為低電平,表示不忙,否則此指令失效。要顯示字符時要先輸入顯示字符地址,也就是告訴模塊在哪里顯示字符,圖2-2-6是1602的內(nèi)部顯示地址。

例如第二行第一個字符的地址是40H,那么是否直接寫入40H就可以將光標(biāo)定位在第二行第一個字符的位置呢?這樣不行,因為寫入顯示地址時要求最高位D7恒定為高電平1所以實際寫入的數(shù)據(jù)應(yīng)該是01000000B(40H)+10000000B(80H)=11000000B(C0H)。

在對液晶模塊的初始化中要先設(shè)置其顯示模式,在液晶模塊顯示字符時光標(biāo)是自動右移的,無需人工干預(yù)。每次輸入指令前都要判斷液晶模塊是否處于忙的狀態(tài)。

1602液晶模塊內(nèi)部的字符發(fā)生存儲器(CGROM)已經(jīng)存儲了160個不同的點陣字符圖形,這些字符有:阿拉伯?dāng)?shù)字、英文字母的大小寫、常用的符號、和日文假名等,每一個字符都有一個固定的代碼,比如大寫的英文字母“A”的代碼是01000001B(41H),顯示時模塊把地址41H中的點陣字符圖形顯示出來,我們就能看到字母“A”。

1.008.jpg

圖2-2-7 液晶顯示電路

2.2.6 DS1302原理及說明

(1) 時鐘芯片DS1302的工作原理

DS1302在每次進(jìn)行讀、寫程序前都必須初始化,先把SCLK端置 “0”,接著把RST端置“1”,最后才給予SCLK脈沖;讀/寫時序如下圖2.2所示。圖2.1為DS1302的控制字,此控制字的位7必須置1,若為0則不能把對DS1302進(jìn)行讀寫數(shù)據(jù)。對于位6,若對程序進(jìn)行讀/寫時RAM=1,對時間進(jìn)行讀/寫時,CK=0。位1至位5指操作單元的地址。位0是讀/寫操作位,進(jìn)行讀操作時,該位為1;該位為0則表示進(jìn)行的是寫操作。控制字節(jié)總是從最低位開始輸入/輸出的。表2.2為DS1302的日歷、時間寄存器內(nèi)容:“CH”是時鐘暫停標(biāo)志位,當(dāng)該位為1時,時鐘振蕩器停止,DS1302處于低功耗狀態(tài);當(dāng)該位為0時,時鐘開始運行。“WP”是寫保護(hù)位,在任何的對時鐘和RAM的寫操作之前,WP必須為0。當(dāng)“WP”為1時,寫保護(hù)位防止對任一寄存器的寫操作。

(2) DS1302的控制字

DS1302的控制字如圖2.1所示。控制字節(jié)的高有效位(位7)必須是邏輯1,如果它為0,則不能把數(shù)據(jù)寫入DS1302中,位6如果0,則表示存取日歷時鐘數(shù)據(jù),為1表示存取RAM數(shù)據(jù);位5至位1指示操作單元的地址;最低有效位(位0)如為0表示要進(jìn)行寫操作,為1表示進(jìn)行讀操作,控制字節(jié)總是從最低位開始輸出。

1.009.jpg

圖2-2-8 DS1302的控制字                                                                     

(3) 數(shù)據(jù)輸入輸出

在控制指令字輸入后的下一個SCLK時鐘的上升沿時,數(shù)據(jù)被寫入DS1302,數(shù)據(jù)輸入從低位即位0開始。同樣,在緊跟8位的控制指令字后的下一個SCLK脈沖的下降沿讀出DS1302的數(shù)據(jù),讀出數(shù)據(jù)時從低位0位到高位7。如下圖2-2-9所示:

1.010.jpg

                              圖2-2-9 DS1302讀與寫的時序圖

  • DS1302的寄存器

DS1302有12個寄存器,其中有7個寄存器與日歷、時鐘相關(guān),存放的數(shù)據(jù)位為BCD碼形式,其日歷、時間寄存器及其控制字見表2.2。

表2.2 DS1302的日歷、時間寄存器

1.011.jpg                  

此外,DS1302 還有年份寄存器、控制寄存器、充電寄存器、時鐘突發(fā)寄存器及與RAM相關(guān)的寄存器等。時鐘突發(fā)寄存器可一次性順序讀寫除充電寄存器外的所有寄存器內(nèi)容。 DS1302與RAM相關(guān)的寄存器分為兩類:一類是單個RAM單元,共31個,每個單元組態(tài)為一個8位的字節(jié),其命令控制字為C0H~FDH,其中奇數(shù)為讀操作,偶數(shù)為寫操作;另一類為突發(fā)方式下的RAM寄存器,此方式下可一次性讀寫所有的RAM的31個字節(jié),命令控制字為FEH(寫)、FFH(讀)。

1.012.jpg

圖2-2-10 DS1302電路

2.2.7 DS18B20工作原理及說明

DS18B20的讀寫時序和測溫原理與DS1820相同,只是得到的溫度值的位數(shù)因分辨率不同而不同,且溫度轉(zhuǎn)換時的延時時間由2s減為750ms。 DS18B20測溫原理如圖2-1-10所示。圖中低溫度系數(shù)晶振的振蕩頻率受溫度影響很小,用于產(chǎn)生固定頻率的脈沖信號送給計數(shù)器1。高溫度系數(shù)晶振隨溫度變化其振蕩率明顯改變,所產(chǎn)生的信號作為計數(shù)器2的脈沖輸入。計數(shù)器1和溫度寄存器被預(yù)置在-55℃所對應(yīng)的一個基數(shù)值。計數(shù)器1對低溫度系數(shù)晶振產(chǎn)生的脈沖信號進(jìn)行減法計數(shù),當(dāng)計數(shù)器1的預(yù)置值減到0時,溫度寄存器的值將加1,計數(shù)器1的預(yù)置將重新被裝入,計數(shù)器1重新開始對低溫度系數(shù)晶振產(chǎn)生的脈沖信號進(jìn)行計數(shù),如此循環(huán)直到計數(shù)器2計數(shù)到0時,停止溫度寄存器值的累加,此時溫度寄存器中的數(shù)值即為所測溫度。圖2-1-10中的斜率累加器用于補償和修正測溫過程中的非線性,其輸出用于修正計數(shù)器1的預(yù)置值。


1.013.jpg

圖2-2-11 DS18B20測溫原理框圖


1.014.jpg

圖2-2-12 DS18B20電路

2.2.8 按鍵電路

按鍵是由一組按壓式或觸摸式開關(guān)構(gòu)成的陣列,是一種常用的輸入設(shè)備。鍵盤可分為編碼式鍵盤和非編碼式鍵盤兩種。

1.編碼鍵盤通過硬件電路產(chǎn)生被按按鍵的鍵碼,這種鍵盤所需程序簡單,但硬件電路復(fù)雜、價格昂貴通常不被單片機系統(tǒng)采用。

2.非編碼鍵盤常用一些按鍵排列成行列矩陣,其硬件邏輯與按鍵編碼不存在嚴(yán)格的對應(yīng)關(guān)系,而要由所用的程序來決定。非編碼鍵盤的硬件接口簡單,但是要占用較多的CPU時間,通常采用可編程鍵盤管理芯片來克服這個缺點。本設(shè)計使用兩種按鍵,一種是按鍵式非編碼鍵盤和輕觸式非編碼開關(guān)。

在接線時由于有四個引腳,連接時需要用萬用表進(jìn)行測量,然后接通兩個引腳,原理圖如下。

要進(jìn)行數(shù)據(jù)的計算就必須先進(jìn)行數(shù)據(jù)的輸入,也就必須確定按鍵輸入的數(shù)值是什么,這就需要對鍵盤進(jìn)行掃描,從而確定究竟是哪個鍵按下。

1.015.jpg

圖2-2-13 按鍵電路



第三章  軟件設(shè)計與分析3.1 軟件設(shè)計的組成

該系統(tǒng)由延時子函數(shù)、LCD1602液晶寫命令子函數(shù)、LCD1602液晶寫數(shù)據(jù)子函數(shù)、DS18B20初始化子函數(shù)、DS18B20讀1位數(shù)據(jù)子函數(shù)、讀一個字節(jié)數(shù)據(jù)子函數(shù)、向DS18B20寫一個字節(jié)數(shù)據(jù)子函數(shù)、DS18B20開始獲取溫度并轉(zhuǎn)換子函數(shù)、獲取溫度子函數(shù)、初始化子函數(shù)、DS1302地址、數(shù)據(jù)發(fā)送子函數(shù)、DS1302數(shù)據(jù)讀取子函數(shù)、DS1302初始化子函數(shù)、顯示年,月,日,周子函數(shù)、按鍵掃描子函數(shù)、主函數(shù)和數(shù)據(jù)定義這幾部分組成。

1.016.jpg

圖3-1-1 DS1302讀取日期和時間流程圖

1.017.jpg

圖3-1-2 DS18B20溫度傳感器流程圖

1.018.jpg

圖3-1-3 時間調(diào)整程序流程圖

1.019.jpg

1.020.jpg

圖3-1-4 整體流程圖

1.021.jpg

圖3-1-5 DS1302讀寫程序流程圖

3.2  源程序

第四章  軟件仿真4.1 PROTEUS

Proteus ISIS是英國Labcenter公司開發(fā)的電路分析與實物仿真軟件。它運行于Windows操作系統(tǒng)上,可以仿真、分析(SPICE)各種模擬器件和集成電路,該軟件的特點是:

(1)現(xiàn)了單片機仿真和SPICE電路仿真相結(jié)合。具有模擬電路仿真、數(shù)字電路仿真、單片機及其外圍電路組成的系統(tǒng)的仿真、RS232動態(tài)仿真、I2C調(diào)試器、SPI調(diào)試器、鍵盤和LCD系統(tǒng)仿真的功能;有各種虛擬儀器,如示波器、邏輯分析儀、信號發(fā)生器等。

(2)支持主流單片機系統(tǒng)的仿真。目前支持的單片機類型有:68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各種外圍芯片。

(3)提供軟件調(diào)試功能。在硬件仿真系統(tǒng)中具有全速、單步、設(shè)置斷點等調(diào)試功能,同時可以觀察各個變量、寄存器等的當(dāng)前狀態(tài),因此在該軟件仿真系統(tǒng)中,也必須具有這些功能;同時支持第三方的軟件編譯和調(diào)試環(huán)境,如Keil C51 uVision2等軟件。

(4)具有強大的原理圖繪制功能。

可以仿真51系列、AVR、PIC、ARM、等常用主流單片機。還可以直接在基于原理圖的虛擬原型上編程,再配合顯示及輸出,能看到運行后輸入輸出的效果。配合系統(tǒng)配置的虛擬邏輯分析儀、示波器等,Proteus建立了完備的電子設(shè)計開發(fā)環(huán)境。

在PROTEUS繪制好原理圖后,調(diào)入已編譯好的目標(biāo)代碼文件:*.HEX,可以在PROTEUS的原理圖中看到模擬的實物運行狀態(tài)和過程。 PROTEUS 是單片機課堂教學(xué)的先進(jìn)助手。

PROTEUS不僅可將許多單片機實例功能形象化,也可將許多單片機實例運行過程形象化。前者可在相當(dāng)程度上得到實物演示實驗的效果,后者則是實物演示實驗難以達(dá)到的效果。

它的元器件、連接線路等卻和傳統(tǒng)的單片機實驗硬件高度對應(yīng)。這在相當(dāng)程度上替代了傳統(tǒng)的單片機實驗教學(xué)的功能,例:元器件選擇、電路連接、電路檢測、電路修改、軟件調(diào)試、運行結(jié)果等。

課程設(shè)計、畢業(yè)設(shè)計是學(xué)生走向就業(yè)的重要實踐環(huán)節(jié)。由于PROTEUS提供了實驗室無法相比的大量的元器件庫,提供了修改電路設(shè)計的靈活性、提供了實驗室在數(shù)量、質(zhì)量上難以相比的虛擬儀器、儀表,因而也提供了培養(yǎng)學(xué)生實踐精神、創(chuàng)造精神的平臺。         

4.2仿真

1.022.jpg

1.023.jpg

4.3原理圖
1.024.jpg



4.4 元件清單
1.025.jpg



總結(jié)

經(jīng)過近一個月的努力,終于順利完成了畢業(yè)設(shè)計。剛開始,我們頭緒不是很清楚,不知道從哪里入手,但通過老師的耐心指導(dǎo)并和同學(xué)認(rèn)真研究設(shè)計課題,跑圖書館查資料、確定基本設(shè)計方案、對所用芯片功能進(jìn)行查找、調(diào)試、上機仿真等,經(jīng)歷了一次次的困難,卻積累了很多寶貴的經(jīng)驗。在整個設(shè)計的過程中遇到的問題主要有以下三點,第一:基礎(chǔ)知識掌握的不牢固,主要表現(xiàn)在一些常用的電路的形式和功能不清楚,對書本上的內(nèi)容理解不夠透徹。第二:對一些常用的應(yīng)用軟件缺少應(yīng)用,體現(xiàn)在畫電路圖和系統(tǒng)的仿真的時候,對這些軟件的操作不熟練,浪費了很多時間。第三:相關(guān)知識掌握的不夠全面,缺少系統(tǒng)設(shè)計的經(jīng)驗。

這次設(shè)計進(jìn)一步端了我的學(xué)習(xí)態(tài)度,學(xué)會了實事求是,嚴(yán)謹(jǐn)?shù)淖黠L(fēng),對自己要嚴(yán)格要求,不能夠一知半解,要力求明明白白。急于求成是不好的,我有所感受。如果省略了那些必要的步驟,急于求成,不僅會浪費時間,還會適得其反。我覺得動手之前,頭腦里必須清楚該怎么做,這一點是很重要的。就目前來說,我的動手能力雖然差一點,但我想,通過我的不懈努力,在這方面,我總會得到提高。這一點,我堅信。因為別人能做到的,我也一定能做到。

在此次的畢業(yè)設(shè)計中我最大的體會就是進(jìn)一步認(rèn)識到了理論聯(lián)系實踐的重要性。一份耕耘,一份收獲。通過這段時間的設(shè)計,讓我明白科學(xué)的思維方法和學(xué)習(xí)方法是多么重要,只有這樣才能夠有很高的效率,才能夠讓自己的工作更完美。總而言之,此次畢業(yè)設(shè)計讓我學(xué)到了好多平時在課堂上學(xué)不到的東西,增加了我的知識運用能力,增強我的實際操作能力。謝謝老師給我們提供這么好的機會,為我們之后走向社會奠定了一個好的基礎(chǔ)。

本次畢業(yè)設(shè)計讓我學(xué)到了很多,也學(xué)會到了要怎么樣去面對困難,不要對知識一知半截,要有的求實的能力,通過老師的幫助我學(xué)到了很多在平時的沒有注意到的動?xùn)|西及知識,更美沒有深入的的去理解,通過這次我要更加的明確自己。更要注重自己在各方面的鍛煉能力,把握機會。這次的設(shè)計非常的感謝老師們。

致  謝

四年的大學(xué)生活接近尾聲,我的畢業(yè)設(shè)計也順利的完成了,這里首先向我的指導(dǎo)老師xxx表示最誠摯的感謝,同時也感謝那些幫助過我的同學(xué)們。

在本次的畢業(yè)設(shè)計中張老師給我提供了極大的幫助,首先在一開始的選題中我便遇到了難題,由于當(dāng)時選題的時候過于疏忽大意,沒有認(rèn)真的加以分析,所選擇的題目并不是自己愛好的方向,張老師便告訴我,最重要的就是找對方向找準(zhǔn)目標(biāo),選擇一個自己擅長和喜歡的方向不僅能夠促使我們積極的完成設(shè)計,而且對于自己來說也是充滿著興趣,這樣做出來的東西會更加完美和輕松,所以我毅然的改題,選擇了一個自己喜歡的方向,其次,在畢業(yè)設(shè)計的過程中,x老師不厭其煩的為我們講解了畢業(yè)設(shè)計中可能出現(xiàn)的問題,并為我們提供了完整的畢業(yè)設(shè)計模板無論我遇到什么樣的問題,她總能很耐心的為我們講解,同時她每個周一要求見面一次,督促我們抓緊時間完成畢業(yè)設(shè)計,每次見面她都要求我詳解上周所做的東西以及自己下周要做的東西,有問題或者不合理的地方她便為我指出來,加以指導(dǎo)。張老師認(rèn)真負(fù)責(zé)的態(tài)度讓我倍受感激。同時在此也感謝xx同學(xué),他解決了許多我在畢業(yè)設(shè)計中遇到的問題,特別是剛開始軟件的學(xué)習(xí)中,他給了我很大的幫助。

在此向所有畢業(yè)設(shè)計的過程中給予我?guī)椭睦蠋熀屯瑢W(xué)最誠摯的謝意。


源程序:


  1. [color=rgb(0, 0, 0)]#include
  2. #include"DS18B20.h"
  3. uchar a,b,miao,shi,fen,ri,yue,nian,week,flag,key1n,temp,miao1,shi1=12,fen1=1,miao1=0,clock=0 ;
  4. //flag用于讀取頭文件中的溫度值,和顯示溫度值
  5. #define yh 0x80 //LCD第一行的初始位置,因為LCD1602字符地址首位D7恒定為1(100000000=80)
  6. #define er 0x80+0x40 //LCD第二行初始位置(因為第二行第一個字符位置地址是0x40)
  7. //液晶屏的與C51之間的引腳連接定義(顯示數(shù)據(jù)線接C51的P0口)
  8. sbit rs=P2^0;
  9. sbit en=P2^2;
  10. sbit rw=P2^1; //如果硬件上rw接地,就不用寫這句和后面的rw=0了
  11. sbit led=P2^6; //LCD背光開關(guān)
  12. //DS1302時鐘芯片與C51之間的引腳連接定義
  13. sbit IO=P1^1;
  14. sbit SCLK=P1^0;
  15. sbit RST=P1^2;
  16. sbit CLO=P1^4;
  17. sbit ACC0=ACC^0;
  18. sbit ACC7=ACC^7;
  19. /************************************************************
  20. ACC累加器=A
  21. ACC.0=E0H

  22. ACC.0就是ACC的第0位。Acc可以位尋址。

  23. 累加器ACC是一個8位的存儲單元,是用來放數(shù)據(jù)的。但是,這個存儲單元有其特殊的地位,
  24. 是單片機中一個非常關(guān)鍵的單元,很多運算都要通過ACC來進(jìn)行。以后在學(xué)習(xí)指令時,
  25. 常用A來表示累加器。但有一些地方例外,比如在PUSH指令中,就必須用ACC這樣的名字。
  26. 一般的說法,A代表了累加器中的內(nèi)容、而ACC代表的是累加器的地址。
  27. ***************************************************************/
  28. //校時按鍵與C51的引腳連接定義
  29. sbit key1=P1^5;  //設(shè)置鍵
  30. sbit key2=P1^6;  //加鍵
  31. sbit key3=P1^7;  //減鍵
  32. sbit buzzer=P1^3;//蜂鳴器,通過三極管9012驅(qū)動,端口低電平響
  33. /**************************************************************/
  34. uchar code tab1[]={"20  -  -   "}; //年顯示的固定字符
  35. uchar code tab2[]={"  :  :  "};//時間顯示的固定字符
  36. uchar code tab3[]={"    HELLO WELCOME"};//開機動畫
  37. //延時函數(shù),后面經(jīng)常調(diào)用
  38. void delay(uint xms)//延時函數(shù),有參函數(shù)
  39. {
  40.         uint x,y;
  41.         for(x=xms;x>0;x--)
  42.                 for(y=110;y>0;y--);
  43. }
  44. /********液晶寫入指令函數(shù)與寫入數(shù)據(jù)函數(shù),以后可調(diào)用**************/

  45. /*在這個程序中,液晶寫入有關(guān)函數(shù)會在DS1302的函數(shù)中調(diào)用,所以液晶程序要放在前面*/

  46. void write_1602com(uchar com)//****液晶寫入指令函數(shù)****
  47. {
  48.         rs=0;//數(shù)據(jù)/指令選擇置為指令
  49.         rw=0; //讀寫選擇置為寫
  50.         P0=com;//送入數(shù)據(jù)
  51.         delay(1);
  52.         en=1;//拉高使能端,為制造有效的下降沿做準(zhǔn)備
  53.         delay(1);
  54.         en=0;//en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令
  55. }
  56. void write_1602dat(uchar dat)//***液晶寫入數(shù)據(jù)函數(shù)****
  57. {
  58.         rs=1;//數(shù)據(jù)/指令選擇置為數(shù)據(jù)
  59.         rw=0; //讀寫選擇置為寫
  60.         P0=dat;//送入數(shù)據(jù)
  61.         delay(1);
  62.         en=1; //en置高電平,為制造下降沿做準(zhǔn)備
  63.         delay(1);
  64.         en=0; //en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令
  65. }
  66. void lcd_init()//***液晶初始化函數(shù)****
  67. {
  68.         uchar j;
  69.     write_1602com(0x0f|0x08);
  70.         for(a=0;a<17;a++)
  71.                 write_1602dat(tab3[a]);
  72.         j=17;
  73.         while(j--)
  74.         {
  75.                 write_1602com(0x1c);//循環(huán)左移
  76.                 delay(700);
  77.         }
  78.         write_1602com(0x01);
  79.         delay(10);
  80.         write_1602com(0x38);//設(shè)置液晶工作模式,意思:16*2行顯示,5*7點陣,8位數(shù)據(jù)
  81.         write_1602com(0x0c);//開顯示不顯示光標(biāo)
  82.         write_1602com(0x06);//整屏不移動,光標(biāo)自動右移
  83.         write_1602com(0x01);//清顯示
  84.         /***開機動畫顯示hello welcome dianzizhong****/
  85.         write_1602com(yh+1);//日歷顯示固定符號從第一行第1個位置之后開始顯示
  86.         for(a=0;a<14;a++)
  87.         {
  88.                 write_1602dat(tab1[a]);//向液晶屏寫日歷顯示的固定符號部分
  89.                 //delay(3);
  90.         }
  91.         write_1602com(er+2);//時間顯示固定符號寫入位置,從第2個位置后開始顯示        
  92.         for(a=0;a<8;a++)
  93.         {
  94.                 write_1602dat(tab2[a]);//寫顯示時間固定符號,兩個冒號
  95.                 //delay(3);
  96.         }
  97.         write_1602com(er+0);
  98.         write_1602dat(0x24);
  99.         write_1602com(er+1);
  100.         write_1602dat(0x20);
  101. }
  102. /***************DS1302有關(guān)子函數(shù)********************/
  103. void write_byte(uchar dat)//寫一個字節(jié)
  104. {
  105.         ACC=dat;
  106.         RST=1;
  107.         for(a=8;a>0;a--)
  108.         {
  109.                 IO=ACC0;
  110.                 SCLK=0;
  111.                 SCLK=1;
  112.                 ACC=ACC>>1;
  113.         }
  114. }
  115. uchar read_byte()//讀一個字節(jié)
  116. {
  117.         RST=1;
  118.         for(a=8;a>0;a--)
  119.         {
  120.                 ACC7=IO;
  121.                 SCLK=1;
  122.                 SCLK=0;
  123.                 ACC=ACC>>1;
  124.         }
  125.         return(ACC);
  126. }
  127. //----------------------------------------
  128. void write_1302(uchar add,uchar dat)//向1302芯片寫函數(shù),指定寫入地址,數(shù)據(jù)
  129. {
  130.         RST=0;
  131.         SCLK=0;
  132.         RST=1;
  133.         write_byte(add);
  134.         write_byte(dat);
  135.         SCLK=1;
  136.         RST=0;
  137. }
  138. uchar read_1302(uchar add)//從1302讀數(shù)據(jù)函數(shù),指定讀取數(shù)據(jù)來源地址
  139. {
  140.         uchar temp;
  141.         RST=0;
  142.         SCLK=0;
  143.         RST=1;
  144.         write_byte(add);
  145.         temp=read_byte();
  146.         SCLK=1;
  147.         RST=0;
  148.         return(temp);
  149. }
  150. uchar BCD_Decimal(uchar bcd)//BCD碼轉(zhuǎn)十進(jìn)制函數(shù),輸入BCD,返回十進(jìn)制
  151. {
  152.          uchar Decimal;
  153.          Decimal=bcd>>4;
  154.          return(Decimal=Decimal*10+(bcd&=0x0F));
  155. }
  156. //--------------------------------------
  157. void ds1302_init() //1302芯片初始化子函數(shù)(2010-01-07,12:00:00,week4)
  158. {
  159.         RST=0;
  160.         SCLK=0;
  161.         write_1302(0x8e,0x00); //允許寫,禁止寫保護(hù)
  162.         miao=BCD_Decimal(read_1302(0x81));
  163.         fen=BCD_Decimal(read_1302(0x83));
  164.         shi=BCD_Decimal(read_1302(0x85));
  165.         ri=BCD_Decimal(read_1302(0x87));
  166.         yue=BCD_Decimal(read_1302(0x89));
  167.         nian=BCD_Decimal(read_1302(0x8d));
  168.         week=BCD_Decimal(read_1302(0x8b));
  169.         
  170.         //寫入初始年份數(shù)據(jù)10
  171.         write_1302(0x8e,0x80); //打開寫保護(hù)
  172. }
  173. //------------------------------------
  174. //溫度顯示子函數(shù)
  175. void write_temp(uchar add,uchar dat)//向LCD寫溫度數(shù)據(jù),并指定顯示位置
  176. {
  177.         uchar gw,sw,bw;
  178.         if(dat>=0&&dat<=128)
  179.         {
  180.                 gw=dat%10;//取得個位數(shù)字
  181.                 sw=dat%100/10;//取得十位數(shù)字
  182.                 bw=dat/100        ;//取得百位數(shù)字        
  183.         }
  184.         else
  185.         {
  186.                 dat=256-dat;
  187.                 gw=dat%10;//取得個位數(shù)字
  188.                 sw=dat%100/10;//取得十位數(shù)字
  189.                 bw=-3;                 //0x30-3表示為負(fù)號
  190.         }
  191.         write_1602com(er+add);//er是頭文件規(guī)定的值0x80+0x40
  192.         write_1602dat(0x30+bw);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼
  193.         write_1602dat(0x30+sw);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼
  194.         write_1602dat(0x30+gw);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼
  195.     write_1602dat(0xdf);//顯示溫度的小圓圈符號,0xdf是液晶屏字符庫的該符號地址碼
  196.           write_1602dat(0x43);        //顯示"C"符號,0x43是液晶屏字符庫里大寫C的地址碼               
  197. }
  198. //------------------------------------
  199. //時分秒顯示子函數(shù)
  200. void write_sfm(uchar add,uchar dat)//向LCD寫時分秒,有顯示位置加、現(xiàn)示數(shù)據(jù),兩個參數(shù)
  201. {
  202.         uchar gw,sw;
  203.         gw=dat%10;//取得個位數(shù)字
  204.         sw=dat/10;//取得十位數(shù)字
  205.         write_1602com(er+add);//er是頭文件規(guī)定的值0x80+0x40
  206.         write_1602dat(0x30+sw);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼
  207.         write_1602dat(0x30+gw);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼                                
  208. }
  209. //-------------------------------------
  210. //年月日顯示子函數(shù)
  211. void write_nyr(uchar add,uchar dat)//向LCD寫年月日,有顯示位置加數(shù)、顯示數(shù)據(jù),兩個參數(shù)
  212. {
  213.         uchar gw,sw;
  214.         gw=dat%10;//取得個位數(shù)字
  215.         sw=dat/10;//取得十位數(shù)字
  216.         write_1602com(yh+add);//設(shè)定顯示位置為第一個位置+add
  217.         write_1602dat(0x30+sw);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼
  218.         write_1602dat(0x30+gw);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼        
  219. }
  220. //-------------------------------------------
  221. void write_week(uchar week)//寫星期函數(shù)
  222. {
  223.         write_1602com(yh+0x0c);//星期字符的顯示位置
  224.         switch(week)
  225.         {
  226.                 case 1:        write_1602dat('M');//星期數(shù)為1時,顯示
  227.                                    write_1602dat('O');
  228.                                    write_1602dat('N');
  229.                                    break;
  230.            
  231.                 case 2:        write_1602dat('T');//星期數(shù)據(jù)為2時顯示
  232.                                    write_1602dat('U');
  233.                                    write_1602dat('E');
  234.                                    break;
  235.                
  236.                 case 3:        write_1602dat('W');//星期數(shù)據(jù)為3時顯示
  237.                                    write_1602dat('E');
  238.                                    write_1602dat('D');
  239.                                    break;
  240.                
  241.                 case 4:        write_1602dat('T');//星期數(shù)據(jù)為4是顯示
  242.                                    write_1602dat('H');
  243.                                    write_1602dat('U');
  244.                                    break;
  245.                
  246.                 case 5:        write_1602dat('F');//星期數(shù)據(jù)為5時顯示
  247.                                    write_1602dat('R');
  248.                                    write_1602dat('I');
  249.                                    break;
  250.                
  251.                 case 6:        write_1602dat('S');//星期數(shù)據(jù)為6時顯示
  252.                                    write_1602dat('T');
  253.                                    write_1602dat('A');
  254.                                    break;
  255.                
  256.                 case 7:        write_1602dat('S');//星期數(shù)據(jù)為7時顯示
  257.                                    write_1602dat('U');
  258.                                    write_1602dat('N');
  259.                                    break;
  260.         }
  261. }
  262. //****************鍵盤掃描有關(guān)函數(shù)**********************
  263. void keyscan()
  264. {
  265.         if(key1==0)//---------------key1為功能鍵(設(shè)置鍵)--------------------
  266.         {
  267.                 delay(9);//延時,用于消抖動
  268.                 if(key1==0)//延時后再次確認(rèn)按鍵按下
  269.                 {
  270.                     buzzer=0;//蜂鳴器短響一次
  271.                     delay(20);
  272.                     buzzer=1;
  273.                         while(!key1);
  274.                         key1n++;
  275.                         if(key1n==12)
  276.                                 key1n=1;//設(shè)置按鍵共有秒、分、時、星期、日、月、年、返回,8個功能循環(huán)
  277.                         switch(key1n)
  278.                         {               
  279.                                 case 1: TR0=0;//關(guān)閉定時器
  280.                                                 //TR1=0;
  281.                                                 write_1602com(er+0x09);//設(shè)置按鍵按動一次,秒位置顯示光標(biāo)
  282.                                                    write_1602com(0x0f);//設(shè)置光標(biāo)為閃爍
  283.                                                    temp=(miao)/10*16+(miao)%10;//秒數(shù)據(jù)寫入DS1302
  284.                                                    write_1302(0x8e,0x00);
  285.                                                    write_1302(0x80,0x80|temp);//miao
  286.                                             write_1302(0x8e,0x80);
  287.                                                    break;
  288.                                 case 2: write_1602com(er+6);//按2次fen位置顯示光標(biāo)                                                
  289.                                             //write_1602com(0x0f);
  290.                                                 break;
  291.                                 case 3: write_1602com(er+3);//按動3次,shi
  292.                                             //write_1602com(0x0f);
  293.                                                 break;
  294.                                 
  295.                                 case 4: write_1602com(yh+0x0e);//按動4次,week
  296.                                             //write_1602com(0x0f);
  297.                                                 break;
  298.                                 case 5: write_1602com(yh+0x0a);//按動5次,ri
  299.                                             //write_1602com(0x0f);
  300.                                                 break;
  301.                                 case 6: write_1602com(yh+0x07);//按動6次,yue
  302.                                             //write_1602com(0x0f);
  303.                                                 break;
  304.                                 case 7: write_1602com(yh+0x04);//按動7次,nian
  305.                                             //write_1602com(0x0f);
  306.                                                 break;
  307.                                 case 8: write_1602com(er+1);
  308.                                         write_1602dat(0x4d);
  309.                                                 write_1602com(er+1);
  310.                                         break;
  311.                                 case 9: write_1602com(er+1);
  312.                                         write_1602dat(0x46);
  313.                                                 write_1602com(er+1);
  314.                                         break;
  315.                                 case 10:write_1602com(er+1);
  316.                                         write_1602dat(0x53);
  317.                                                 write_1602com(er+1);
  318.                                                 break;
  319.                                 case 11:
  320.                                         write_1602com(er+1);
  321.                                         write_1602dat(0x20);
  322.                                                 write_1602com(0x0c);//按動到第8次,設(shè)置光標(biāo)不閃爍
  323.                                                 TR0=1;//打開定時器
  324.                                          temp=(miao)/10*16+(miao)%10;
  325.                                                    write_1302(0x8e,0x00);
  326.                                                    write_1302(0x80,0x00|temp);//miao數(shù)據(jù)寫入DS1302
  327.                                                    write_1302(0x8e,0x80);
  328.                                     break;                                                                                                                                                
  329.                         }
  330.                 }
  331.         }
  332.         //------------------------------加鍵key2----------------------------               
  333.         if(key1n!=0)//當(dāng)key1按下以下。再按以下鍵才有效(按鍵次數(shù)不等于零)
  334.         {
  335.                 if(key2==0)  //上調(diào)鍵
  336.                 {
  337.                         delay(10);
  338.                         if(key2==0)
  339.                         {
  340.                             buzzer=0;//蜂鳴器短響一次
  341.                             delay(20);
  342.                             buzzer=1;
  343.                                 while(!key2);
  344.                                 switch(key1n)
  345.                                 {
  346.                                         case 1:        miao++;//設(shè)置鍵按動1次,調(diào)秒
  347.                                                         if(miao==60)
  348.                                                                 miao=0;//秒超過59,再加1,就歸零
  349.                                                         write_sfm(0x08,miao);//令LCD在正確位置顯示"加"設(shè)定好的秒數(shù)
  350.                                                         temp=(miao)/10*16+(miao)%10;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼
  351.                                                            write_1302(0x8e,0x00); //允許寫,禁止寫保護(hù)
  352.                                                            write_1302(0x80,temp); //向DS1302內(nèi)寫秒寄存器80H寫入調(diào)整后的秒數(shù)據(jù)BCD碼
  353.                                                            write_1302(0x8e,0x80); //打開寫保護(hù)
  354.                                                         write_1602com(er+0x09);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,光標(biāo)自動右移,所以要指定返回
  355.                                                         //write_1602com(0x0b);
  356.                                                         break;
  357.                                         case 2:        fen++;
  358.                                                         if(fen==60)
  359.                                                                 fen=0;
  360.                                                         write_sfm(0x05,fen);//令LCD在正確位置顯示"加"設(shè)定好的分?jǐn)?shù)據(jù)
  361.                                                         temp=(fen)/10*16+(fen)%10;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼
  362.                                                            write_1302(0x8e,0x00);//允許寫,禁止寫保護(hù)
  363.                                                            write_1302(0x82,temp);//向DS1302內(nèi)寫分寄存器82H寫入調(diào)整后的分?jǐn)?shù)據(jù)BCD碼
  364.                                                            write_1302(0x8e,0x80);//打開寫保護(hù)
  365.                                                         write_1602com(er+6);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,在這里是寫回原來的位置
  366.                                                         break;
  367.                                         case 3:        shi++;
  368.                                                         if(shi==24)
  369.                                                                 shi=0;
  370.                                                         write_sfm(2,shi);//令LCD在正確的位置顯示"加"設(shè)定好的小時數(shù)據(jù)
  371.                                                         temp=(shi)/10*16+(shi)%10;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼
  372.                                                            write_1302(0x8e,0x00);//允許寫,禁止寫保護(hù)
  373.                                                            write_1302(0x84,temp);//向DS1302內(nèi)寫小時寄存器84H寫入調(diào)整后的小時數(shù)據(jù)BCD碼
  374.                                                            write_1302(0x8e,0x80);//打開寫保護(hù)
  375.                                                         write_1602com(er+3);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標(biāo)回位
  376.                                                         break;
  377.                                         case 4:        week++;
  378.                                                         if(week==8)
  379.                                                                 week=1;
  380.                                             write_1602com(yh+0x0C);//指定'加'后的周數(shù)據(jù)顯示位置
  381.                                                         write_week(week);//指定周數(shù)據(jù)顯示內(nèi)容
  382.                                             temp=(week)/10*16+(week)%10;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼
  383.                                                            write_1302(0x8e,0x00);//允許寫,禁止寫保護(hù)
  384.                                                            write_1302(0x8a,temp);//向DS1302內(nèi)寫周寄存器8aH寫入調(diào)整后的周數(shù)據(jù)BCD碼
  385.                                                            write_1302(0x8e,0x80);//打開寫保護(hù)
  386.                                                         write_1602com(yh+0x0e);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標(biāo)回位
  387.                                                         break;
  388.                                         case 5:        ri++;
  389.                                                         switch(yue)
  390.                                                         {
  391.                                                     case 1:
  392.                                                                 case 3:
  393.                                                                 case 5:
  394.                                                                 case 7:
  395.                                                                 case 8:
  396.                                                                 case 10:
  397.                                                                 case 12:
  398.                                                                                 if(ri>31)
  399.                                                                                         ri=1;
  400.                                                                         break;
  401.                                                 case 2:
  402.                                                                                 if(nian%4==0||nian%400==0)
  403.                                                                                  {
  404.                                                                                      if(ri>29)
  405.                                                                                                 ri=1;
  406.                                                                             }        
  407.                                                                            else                                                  
  408.                                                                          {                                            
  409.                                                                                     if(ri>28)
  410.                                                                                                 ri=1;
  411.                                                                            }
  412.                                                                                 break;
  413.                                                case 4:
  414.                                                            case 6:
  415.                                                            case 9:
  416.                                                            case 11:
  417.                                                                               ri++;
  418.                                                                             if(ri>30)
  419.                                                                                         ri=1;
  420.                                                                          break;
  421.                                             }                 
  422.                                                         write_nyr(9,ri);//令LCD在正確的位置顯示"加"設(shè)定好的日期數(shù)據(jù)
  423.                                                         temp=(ri)/10*16+(ri)%10;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼
  424.                                                            write_1302(0x8e,0x00);//允許寫,禁止寫保護(hù)
  425.                                                            write_1302(0x86,temp);//向DS1302內(nèi)寫日期寄存器86H寫入調(diào)整后的日期數(shù)據(jù)BCD碼
  426.                                                            write_1302(0x8e,0x80);//打開寫保護(hù)
  427.                                                         write_1602com(yh+10);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標(biāo)回位
  428.                                                         break;
  429.                                         case 6:        yue++;
  430.                                                         if(yue==13)
  431.                                                                 yue=1;
  432.                                                         write_nyr(6,yue);//令LCD在正確的位置顯示"加"設(shè)定好的月份數(shù)據(jù)
  433.                                                         temp=(yue)/10*16+(yue)%10;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼
  434.                                                            write_1302(0x8e,0x00);//允許寫,禁止寫保護(hù)
  435.                                                            write_1302(0x88,temp);//向DS1302內(nèi)寫月份寄存器88H寫入調(diào)整后的月份數(shù)據(jù)BCD碼
  436.                                                            write_1302(0x8e,0x80);//打開寫保護(hù)
  437.                                                         write_1602com(yh+7);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標(biāo)回位
  438.                                                         break;
  439.                                         case 7:        nian++;
  440.                                                          if(nian==100)
  441.                                                                 nian=0;
  442.                                                         write_nyr(3,nian);//令LCD在正確的位置顯示"加"設(shè)定好的年份數(shù)據(jù)
  443.                                             temp=(nian)/10*16+(nian)%10;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼
  444.                                                            write_1302(0x8e,0x00);//允許寫,禁止寫保護(hù)
  445.                                                            write_1302(0x8c,temp);//向DS1302內(nèi)寫年份寄存器8cH寫入調(diào)整后的年份數(shù)據(jù)BCD碼
  446.                                                            write_1302(0x8e,0x80);//打開寫保護(hù)
  447.                                                         write_1602com(yh+4);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標(biāo)回位
  448.                                                         break;
  449.                                         case 8:        write_1602com(er+9); //設(shè)置鬧鐘的秒定時
  450.                                                 miao1++;
  451.                                                         if(miao1==60)
  452.                                                            miao1=0;
  453.                                                         write_sfm(0x08,miao1);//令LCD在正確位置顯示"加"設(shè)定好秒的數(shù)據(jù)
  454.                                                         write_1602com(er+9);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,在這里是寫回原來的位置
  455.                                                         break;
  456.                                         case 9:        write_1602com(er+6); //設(shè)置鬧鐘的分鐘定時
  457.                                                 fen1++;
  458.                                                 if(fen1==60)
  459.                                                                 fen1=0;
  460.                                                         write_sfm(0x05,fen1);//令LCD在正確位置顯示"加"設(shè)定好的分?jǐn)?shù)據(jù)
  461.                                                         write_1602com(er+6);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,在這里是寫回原來的位置
  462.                                                         break;
  463.                                         case 10:write_1602com(er+3); //設(shè)置鬧鐘的小時定時
  464.                                                 shi1++;
  465.                                                 if(shi1==24)
  466.                                                                 shi1=0;
  467.                                                         write_sfm(0x02,shi1);//令LCD在正確的位置顯示"加"設(shè)定好的小時數(shù)據(jù)
  468.                                                         write_1602com(er+3);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標(biāo)回位
  469.                                                         break;
  470.                                 }
  471.                         }
  472.                 }
  473.                 //------------------減鍵key3,各句功能參照'加鍵'注釋---------------
  474.                 if(key3==0)
  475.                 {
  476.                         delay(10);//調(diào)延時,消抖動
  477.                         if(key3==0)
  478.                         {
  479.                             buzzer=0;//蜂鳴器短響一次
  480.                             delay(20);
  481.                             buzzer=1;
  482.                                 while(!key3);
  483.                                 switch(key1n)
  484.                                 {
  485.                                         case 1:        miao--;
  486.                                                         if(miao==-1)
  487.                                                                 miao=59;//秒數(shù)據(jù)減到-1時自動變成59
  488.                                                         write_sfm(0x08,miao);//在LCD的正確位置顯示改變后新的秒數(shù)
  489.                                             temp=(miao)/10*16+(miao)%10;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼
  490.                                                            write_1302(0x8e,0x00); //允許寫,禁止寫保護(hù)
  491.                                                            write_1302(0x80,temp); //向DS1302內(nèi)寫秒寄存器80H寫入調(diào)整后的秒數(shù)據(jù)BCD碼
  492.                                                            write_1302(0x8e,0x80); //打開寫保護(hù)
  493.                                                         write_1602com(er+0x09);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,在這里是寫回原來的位置
  494.                                                         //write_1602com(0x0b);
  495.                                                         break;
  496.                                         case 2:        fen--;
  497.                                                         if(fen==-1)
  498.                                                                 fen=59;
  499.                                                         write_sfm(5,fen);
  500.                                                         temp=(fen)/10*16+(fen)%10;//十進(jìn)制轉(zhuǎn)換成DS1302要求的DCB碼
  501.                                                            write_1302(0x8e,0x00);//允許寫,禁止寫保護(hù)
  502.                                                            write_1302(0x82,temp);//向DS1302內(nèi)寫分寄存器82H寫入調(diào)整后的分?jǐn)?shù)據(jù)BCD碼
  503.                                                            write_1302(0x8e,0x80);//打開寫保護(hù)
  504.                                                         write_1602com(er+6);//因為設(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,在這里是寫回原來的位置
  505.                                                         break;




  506. …………限于本文篇幅 余下代碼請從51黑論壇下載附件(在本文頂部)………
復(fù)制代碼



相關(guān)帖子

回復(fù)

使用道具 舉報

ID:240024 發(fā)表于 2017-10-16 19:49 | 顯示全部樓層
好東西~~學(xué)習(xí)!
回復(fù)

使用道具 舉報

ID:250467 發(fā)表于 2017-11-17 16:56 | 顯示全部樓層
謝謝!
回復(fù)

使用道具 舉報

ID:230826 發(fā)表于 2017-11-17 18:11 | 顯示全部樓層
LCD1602的主要技術(shù)參數(shù):
1、顯示容量:16×2個字符
2、芯片工作電壓:4.5—5.5V
3、工作電流:2.0mA(5.0V)?????
回復(fù)

使用道具 舉報

ID:303018 發(fā)表于 2018-4-7 09:41 | 顯示全部樓層
changle11 發(fā)表于 2017-11-17 18:11
LCD1602的主要技術(shù)參數(shù):
1、顯示容量:16×2個字符
2、芯片工作電壓:4.5—5.5V

非常感謝,厲害!
回復(fù)

使用道具 舉報

ID:358267 發(fā)表于 2018-6-25 10:34 | 顯示全部樓層
大佬太強了
回復(fù)

使用道具 舉報

ID:359074 發(fā)表于 2018-7-4 21:49 | 顯示全部樓層
非常感謝,正在做這個
回復(fù)

使用道具 舉報

ID:370060 發(fā)表于 2018-7-13 08:38 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報

ID:370060 發(fā)表于 2018-7-16 09:09 | 顯示全部樓層
謝謝分享 ,絕世好貼
回復(fù)

使用道具 舉報

ID:452252 發(fā)表于 2018-12-23 11:08 | 顯示全部樓層
想問一下為什么把代碼下到單片機里了,LCD不顯示東西呀
回復(fù)

使用道具 舉報

ID:463517 發(fā)表于 2019-1-7 10:31 | 顯示全部樓層
為啥我的原理圖下載好后,打不開呀。我的dxp是可以正常使用的
回復(fù)

使用道具 舉報

ID:470570 發(fā)表于 2019-6-26 18:14 | 顯示全部樓層
網(wǎng)上好多程序燒進(jìn)去后都不能用,不知道這個咋樣
回復(fù)

使用道具 舉報

ID:443000 發(fā)表于 2019-12-3 13:05 | 顯示全部樓層
你好,請問有實物嘛
回復(fù)

使用道具 舉報

ID:788783 發(fā)表于 2020-6-24 15:52 | 顯示全部樓層
謝謝分享,火鉗劉銘
回復(fù)

使用道具 舉報

ID:764569 發(fā)表于 2020-11-17 19:21 | 顯示全部樓層
沒成功
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 九九热免费在线观看 | 黑人巨大精品 | 久久99精品久久 | 一区二区三区四区毛片 | 天堂av中文在线 | 日韩欧美手机在线 | 毛色毛片免费看 | 成人毛片网站 | 99亚洲 | 久久99蜜桃综合影院免费观看 | 人干人人 | 亚洲精品www久久久久久广东 | 日本一区二区不卡 | 精品国产欧美一区二区三区成人 | 欧美一区二区三区的 | 99久久婷婷国产综合精品电影 | 一级片在线观看视频 | 夜夜骑首页 | 日韩二区 | 在线观看黄色 | 亚洲高清中文字幕 | av一级一片 | 免费大黄视频 | 日本不卡在线观看 | 欧美v日韩v | 91在线免费观看 | 欧美激情精品久久久久 | 亚洲精品性视频 | 91久久伊人| 一区久久 | 日韩免费一二三区 | 国产99久久久国产精品 | 精品欧美乱码久久久久久1区2区 | 久久一区精品 | 特级a欧美做爰片毛片 | 国产精品久久久久av | 日韩一区二区福利视频 | 久久久国产一区 | 国产精品九九视频 | 精品久久国产老人久久综合 | 美女爽到呻吟久久久久 |