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

QQ登錄

只需一步,快速開始

帖子
查看: 25261|回復(fù): 14
收起左側(cè)

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

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

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



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


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


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

XXXXXXXX學(xué)院(論文)

摘    要

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

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





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




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

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

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

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

主要功能:

1、萬年歷

2、時(shí)間

3、星期

4、溫度顯示

(以上四項(xiàng)內(nèi)容同時(shí)顯示)

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

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

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

2.1 總設(shè)計(jì)框圖

1.001.jpg

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

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

由電腦USB接口提供電源。

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

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

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

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

4KB的ROM程序存儲(chǔ)器;

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

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

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

兩個(gè)16位定時(shí)/計(jì)數(shù)器;

一個(gè)可編程全雙工串行口;

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

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

1.002.jpg
圖2-2-1 AT89C51單片機(jī)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

單片機(jī)最小原理圖如圖2-2-2所示。

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

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

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

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

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

2.2.3 顯示系統(tǒng)

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

1.004.jpg

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

1、顯示容量:16×2個(gè)字符

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所示:

編號(hào)
符號(hào)
引腳說明
編號(hào)
符號(hào)
引腳說明
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
使能信號(hào)
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為液晶顯示器對(duì)比度調(diào)整端,接正電源時(shí)對(duì)比度最弱,接地時(shí)對(duì)比度最高,對(duì)比度過高時(shí)會(huì)產(chǎn)生“鬼影”,使用時(shí)可以通過一個(gè)10K的電位器調(diào)整對(duì)比度。

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

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

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

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

第15腳:背光源正極。

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

2.2.4 LCD1602的指令說明及時(shí)序
1602液晶模塊內(nèi)部的控制器共有11條控制指令,如圖2-2-5所示:
序號(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
顯示開/關(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
寫數(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)的操作都是通過指令編程來實(shí)現(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)移動(dòng)方向,高電平右移,低電平左移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:高電平時(shí)移動(dòng)顯示的文字,低電平時(shí)移動(dòng)光標(biāo)。

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

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

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

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

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

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

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

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

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

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

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

1.008.jpg

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

2.2.6 DS1302原理及說明

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

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

(2) DS1302的控制字

DS1302的控制字如圖2.1所示。控制字節(jié)的高有效位(位7)必須是邏輯1,如果它為0,則不能把數(shù)據(jù)寫入DS1302中,位6如果0,則表示存取日歷時(shí)鐘數(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ù)輸入輸出

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

1.010.jpg

                              圖2-2-9 DS1302讀與寫的時(shí)序圖

  • DS1302的寄存器

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

表2.2 DS1302的日歷、時(shí)間寄存器

1.011.jpg                  

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

1.012.jpg

圖2-2-10 DS1302電路

2.2.7 DS18B20工作原理及說明

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


1.013.jpg

圖2-2-11 DS18B20測(cè)溫原理框圖


1.014.jpg

圖2-2-12 DS18B20電路

2.2.8 按鍵電路

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

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

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

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

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

1.015.jpg

圖2-2-13 按鍵電路



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

該系統(tǒng)由延時(shí)子函數(shù)、LCD1602液晶寫命令子函數(shù)、LCD1602液晶寫數(shù)據(jù)子函數(shù)、DS18B20初始化子函數(shù)、DS18B20讀1位數(shù)據(jù)子函數(shù)、讀一個(gè)字節(jié)數(shù)據(jù)子函數(shù)、向DS18B20寫一個(gè)字節(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讀取日期和時(shí)間流程圖

1.017.jpg

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

1.018.jpg

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

1.019.jpg

1.020.jpg

圖3-1-4 整體流程圖

1.021.jpg

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

3.2  源程序

第四章  軟件仿真4.1 PROTEUS簡(jiǎn)

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

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

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

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

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

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

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

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

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

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

4.2仿真

1.022.jpg

1.023.jpg

4.3原理圖
1.024.jpg



4.4 元件清單
1.025.jpg



總結(jié)

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

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

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

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

致  謝

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

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

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


源程序:


  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第一行的初始位置,因?yàn)長(zhǎng)CD1602字符地址首位D7恒定為1(100000000=80)
  6. #define er 0x80+0x40 //LCD第二行初始位置(因?yàn)榈诙械谝粋€(gè)字符位置地址是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時(shí)鐘芯片與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是一個(gè)8位的存儲(chǔ)單元,是用來放數(shù)據(jù)的。但是,這個(gè)存儲(chǔ)單元有其特殊的地位,
  24. 是單片機(jī)中一個(gè)非常關(guān)鍵的單元,很多運(yùn)算都要通過ACC來進(jìn)行。以后在學(xué)習(xí)指令時(shí),
  25. 常用A來表示累加器。但有一些地方例外,比如在PUSH指令中,就必須用ACC這樣的名字。
  26. 一般的說法,A代表了累加器中的內(nèi)容、而ACC代表的是累加器的地址。
  27. ***************************************************************/
  28. //校時(shí)按鍵與C51的引腳連接定義
  29. sbit key1=P1^5;  //設(shè)置鍵
  30. sbit key2=P1^6;  //加鍵
  31. sbit key3=P1^7;  //減鍵
  32. sbit buzzer=P1^3;//蜂鳴器,通過三極管9012驅(qū)動(dòng),端口低電平響
  33. /**************************************************************/
  34. uchar code tab1[]={"20  -  -   "}; //年顯示的固定字符
  35. uchar code tab2[]={"  :  :  "};//時(shí)間顯示的固定字符
  36. uchar code tab3[]={"    HELLO WELCOME"};//開機(jī)動(dòng)畫
  37. //延時(shí)函數(shù),后面經(jīng)常調(diào)用
  38. void delay(uint xms)//延時(shí)函數(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. /*在這個(gè)程序中,液晶寫入有關(guān)函數(shù)會(huì)在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點(diǎn)陣,8位數(shù)據(jù)
  81.         write_1602com(0x0c);//開顯示不顯示光標(biāo)
  82.         write_1602com(0x06);//整屏不移動(dòng),光標(biāo)自動(dòng)右移
  83.         write_1602com(0x01);//清顯示
  84.         /***開機(jī)動(dòng)畫顯示hello welcome dianzizhong****/
  85.         write_1602com(yh+1);//日歷顯示固定符號(hào)從第一行第1個(gè)位置之后開始顯示
  86.         for(a=0;a<14;a++)
  87.         {
  88.                 write_1602dat(tab1[a]);//向液晶屏寫日歷顯示的固定符號(hào)部分
  89.                 //delay(3);
  90.         }
  91.         write_1602com(er+2);//時(shí)間顯示固定符號(hào)寫入位置,從第2個(gè)位置后開始顯示        
  92.         for(a=0;a<8;a++)
  93.         {
  94.                 write_1602dat(tab2[a]);//寫顯示時(shí)間固定符號(hào),兩個(gè)冒號(hào)
  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)//寫一個(gè)字節(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()//讀一個(gè)字節(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;//取得個(gè)位數(shù)字
  181.                 sw=dat%100/10;//取得十位數(shù)字
  182.                 bw=dat/100        ;//取得百位數(shù)字        
  183.         }
  184.         else
  185.         {
  186.                 dat=256-dat;
  187.                 gw=dat%10;//取得個(gè)位數(shù)字
  188.                 sw=dat%100/10;//取得十位數(shù)字
  189.                 bw=-3;                 //0x30-3表示為負(fù)號(hào)
  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);//顯示溫度的小圓圈符號(hào),0xdf是液晶屏字符庫(kù)的該符號(hào)地址碼
  196.           write_1602dat(0x43);        //顯示"C"符號(hào),0x43是液晶屏字符庫(kù)里大寫C的地址碼               
  197. }
  198. //------------------------------------
  199. //時(shí)分秒顯示子函數(shù)
  200. void write_sfm(uchar add,uchar dat)//向LCD寫時(shí)分秒,有顯示位置加、現(xiàn)示數(shù)據(jù),兩個(gè)參數(shù)
  201. {
  202.         uchar gw,sw;
  203.         gw=dat%10;//取得個(gè)位數(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ù),兩個(gè)參數(shù)
  212. {
  213.         uchar gw,sw;
  214.         gw=dat%10;//取得個(gè)位數(shù)字
  215.         sw=dat/10;//取得十位數(shù)字
  216.         write_1602com(yh+add);//設(shè)定顯示位置為第一個(gè)位置+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時(shí),顯示
  227.                                    write_1602dat('O');
  228.                                    write_1602dat('N');
  229.                                    break;
  230.            
  231.                 case 2:        write_1602dat('T');//星期數(shù)據(jù)為2時(shí)顯示
  232.                                    write_1602dat('U');
  233.                                    write_1602dat('E');
  234.                                    break;
  235.                
  236.                 case 3:        write_1602dat('W');//星期數(shù)據(jù)為3時(shí)顯示
  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時(shí)顯示
  247.                                    write_1602dat('R');
  248.                                    write_1602dat('I');
  249.                                    break;
  250.                
  251.                 case 6:        write_1602dat('S');//星期數(shù)據(jù)為6時(shí)顯示
  252.                                    write_1602dat('T');
  253.                                    write_1602dat('A');
  254.                                    break;
  255.                
  256.                 case 7:        write_1602dat('S');//星期數(shù)據(jù)為7時(shí)顯示
  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);//延時(shí),用于消抖動(dòng)
  268.                 if(key1==0)//延時(shí)后再次確認(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è)置按鍵共有秒、分、時(shí)、星期、日、月、年、返回,8個(gè)功能循環(huán)
  277.                         switch(key1n)
  278.                         {               
  279.                                 case 1: TR0=0;//關(guān)閉定時(shí)器
  280.                                                 //TR1=0;
  281.                                                 write_1602com(er+0x09);//設(shè)置按鍵按動(dòng)一次,秒位置顯示光標(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);//按動(dòng)3次,shi
  292.                                             //write_1602com(0x0f);
  293.                                                 break;
  294.                                 
  295.                                 case 4: write_1602com(yh+0x0e);//按動(dòng)4次,week
  296.                                             //write_1602com(0x0f);
  297.                                                 break;
  298.                                 case 5: write_1602com(yh+0x0a);//按動(dòng)5次,ri
  299.                                             //write_1602com(0x0f);
  300.                                                 break;
  301.                                 case 6: write_1602com(yh+0x07);//按動(dòng)6次,yue
  302.                                             //write_1602com(0x0f);
  303.                                                 break;
  304.                                 case 7: write_1602com(yh+0x04);//按動(dòng)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);//按動(dòng)到第8次,設(shè)置光標(biāo)不閃爍
  323.                                                 TR0=1;//打開定時(shí)器
  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è)置鍵按動(dòng)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);//因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,光標(biāo)自動(dòng)右移,所以要指定返回
  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);//因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,在這里是寫回原來的位置
  366.                                                         break;
  367.                                         case 3:        shi++;
  368.                                                         if(shi==24)
  369.                                                                 shi=0;
  370.                                                         write_sfm(2,shi);//令LCD在正確的位置顯示"加"設(shè)定好的小時(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)寫小時(shí)寄存器84H寫入調(diào)整后的小時(shí)數(shù)據(jù)BCD碼
  374.                                                            write_1302(0x8e,0x80);//打開寫保護(hù)
  375.                                                         write_1602com(er+3);//因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,所以需要光標(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);//因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,所以需要光標(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);//因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,所以需要光標(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);//因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,所以需要光標(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);//因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,所以需要光標(biāo)回位
  448.                                                         break;
  449.                                         case 8:        write_1602com(er+9); //設(shè)置鬧鐘的秒定時(shí)
  450.                                                 miao1++;
  451.                                                         if(miao1==60)
  452.                                                            miao1=0;
  453.                                                         write_sfm(0x08,miao1);//令LCD在正確位置顯示"加"設(shè)定好秒的數(shù)據(jù)
  454.                                                         write_1602com(er+9);//因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,在這里是寫回原來的位置
  455.                                                         break;
  456.                                         case 9:        write_1602com(er+6); //設(shè)置鬧鐘的分鐘定時(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);//因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,在這里是寫回原來的位置
  462.                                                         break;
  463.                                         case 10:write_1602com(er+3); //設(shè)置鬧鐘的小時(shí)定時(shí)
  464.                                                 shi1++;
  465.                                                 if(shi1==24)
  466.                                                                 shi1=0;
  467.                                                         write_sfm(0x02,shi1);//令LCD在正確的位置顯示"加"設(shè)定好的小時(shí)數(shù)據(jù)
  468.                                                         write_1602com(er+3);//因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,所以需要光標(biāo)回位
  469.                                                         break;
  470.                                 }
  471.                         }
  472.                 }
  473.                 //------------------減鍵key3,各句功能參照'加鍵'注釋---------------
  474.                 if(key3==0)
  475.                 {
  476.                         delay(10);//調(diào)延時(shí),消抖動(dòng)
  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時(shí)自動(dòng)變成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);//因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,在這里是寫回原來的位置
  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);//因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,在這里是寫回原來的位置
  505.                                                         break;




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



相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表