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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 25051|回復: 14
打印 上一主題 下一主題
收起左側

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

  [復制鏈接]
跳轉到指定樓層
樓主
這是我做的基于51單片機的電子萬年歷畢業設計論文資料
內含有設計的C語言代碼,proteus仿真圖,實驗報告以及元器件清單
電子萬年歷的功能包括,顯示時間,顯示溫度,顯示日期,顯示星期,并且含有鬧鈴。


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



下面是論文的部分內容預覽:
畢業設計(論文)


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


系    部:
專    業:
學    號:
學生姓名:
指導教師姓名:
指導教師職稱:

XXXXXXXX學院(論文)

摘    要

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

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





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




XXXXXXXX學院(論文)
前  言

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

第一章  工作原理1.1設計目標1.1.1基本功能

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

主要功能:

1、萬年歷

2、時間

3、星期

4、溫度顯示

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

5、四鍵調時(設置鍵、上調鍵、下調鍵、關音按鍵)

第二章  硬件設計與原理

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

2.1 總設計框圖

2.2 硬件設計分析2.2.1 電源的設計

系統電源使用直流5伏。

由電腦USB接口提供電源。

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

2.2.2 單片機最小系統

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

一個8位CPU;一個片內振蕩器及時鐘電路;

4KB的ROM程序存儲器;

一個128B的RAM數據存儲器;

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

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

兩個16位定時/計數器;

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

5個中斷源、兩個優先級嵌套中斷結構。

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

圖2-2-1 AT89C51單片機

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

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

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

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

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

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

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

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

RST:復位輸入。當振蕩器工作時,RST引腳出現兩個機器周期以上高電平將使單片機復位。

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

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

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

XTAL1:振蕩器反相放大器的及內部時鐘發生器的輸入端。

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

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

圖2-2-2 單片機最小系統
單片機最小系統說明:

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

時鐘電路產生的振蕩脈沖經過觸發器進行二分頻之后,才成為單片機的時鐘脈沖信號。

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

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

2.2.3 顯示系統

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

LCD1602的主要技術參數:

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采用標準的14腳(無背光)或16腳(帶背光)接口,各引腳接口說明如圖2-2-4所示:

編號
符號
引腳說明
編號
符號
引腳說明
1
VSS
電源地
9
D2
數據
2
VDD
電源正極
10
D3
數據
3
VL
液晶顯示偏壓
11
D4
數據
4
RS
數據/命令選擇
12
D5
數據
5
R/W
讀/寫選擇
13
D6
數據
6
E
使能信號
14
D7
數據
7
D0
數據
15
BLA
背光源正極
8
D1
數據
16
BLK
背光源負極

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

第1腳:VSS為地電源。

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

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

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

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

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

第7~14腳:D0~D7為8位雙向數據線。

第15腳:背光源正極。

第16腳:背光源負極。

2.2.4 LCD1602的指令說明及時序
1602液晶模塊內部的控制器共有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
光標返回
0
0
0
0
0
0
0
0
1
*
3
置輸入模式
0
0
0
0
0
0
0
1
I/D
S
4
顯示開/關控制
0
0
0
0
0
0
1
D
C
B
5
光標或字符移位
0
0
0
0
0
1
S/C
R/L
*
*
6
置功能
0
0
0
0
1
DL
N
F
*
*
7
置字符發生存貯器地址
0
0
0
1
字符發生存貯器地址
8
置數據存貯器地址
0
0
1
顯示數據存貯器地址
9
讀忙標志或地址
0
1
BF
計數器地址
10
寫數到CGRAM或DDRAM)
1
0
要寫的數據內容
11
從CGRAM或DDRAM讀數
1
1
讀出的數據內容

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

指令1:清顯示,指令碼01H,光標復位到地址00H位置。

指令2:光標復位,光標返回到地址00H。

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

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

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

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

指令7:字符發生器RAM地址設置。

指令8:DDRAM地址設置。

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

指令10:寫數據。

指令11:讀數據。

2.2.5 LCD1602的RAM地址映射及標準字庫表

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

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

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

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

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

2.2.6 DS1302原理及說明

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

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

(2) DS1302的控制字

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

圖2-2-8 DS1302的控制字                                                                     

(3) 數據輸入輸出

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

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

  • DS1302的寄存器

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

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

                 

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

圖2-2-10 DS1302電路

2.2.7 DS18B20工作原理及說明

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


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


圖2-2-12 DS18B20電路

2.2.8 按鍵電路

按鍵是由一組按壓式或觸摸式開關構成的陣列,是一種常用的輸入設備。鍵盤可分為編碼式鍵盤和非編碼式鍵盤兩種。

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

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

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

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

圖2-2-13 按鍵電路



第三章  軟件設計與分析3.1 軟件設計的組成

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

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

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

圖3-1-3 時間調整程序流程圖

圖3-1-4 整體流程圖

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

3.2  源程序

第四章  軟件仿真4.1 PROTEUS

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

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

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

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

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

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

在PROTEUS繪制好原理圖后,調入已編譯好的目標代碼文件:*.HEX,可以在PROTEUS的原理圖中看到模擬的實物運行狀態和過程。 PROTEUS 是單片機課堂教學的先進助手。

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

它的元器件、連接線路等卻和傳統的單片機實驗硬件高度對應。這在相當程度上替代了傳統的單片機實驗教學的功能,例:元器件選擇、電路連接、電路檢測、電路修改、軟件調試、運行結果等。

課程設計、畢業設計是學生走向就業的重要實踐環節。由于PROTEUS提供了實驗室無法相比的大量的元器件庫,提供了修改電路設計的靈活性、提供了實驗室在數量、質量上難以相比的虛擬儀器、儀表,因而也提供了培養學生實踐精神、創造精神的平臺。         

4.2仿真

4.3原理圖



4.4 元件清單



總結

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

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

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

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

致  謝

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

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

在此向所有畢業設計的過程中給予我幫助的老師和同學最誠摯的謝意。


源程序:


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

  45. /*在這個程序中,液晶寫入有關函數會在DS1302的函數中調用,所以液晶程序要放在前面*/

  46. void write_1602com(uchar com)//****液晶寫入指令函數****
  47. {
  48.         rs=0;//數據/指令選擇置為指令
  49.         rw=0; //讀寫選擇置為寫
  50.         P0=com;//送入數據
  51.         delay(1);
  52.         en=1;//拉高使能端,為制造有效的下降沿做準備
  53.         delay(1);
  54.         en=0;//en由高變低,產生下降沿,液晶執行命令
  55. }
  56. void write_1602dat(uchar dat)//***液晶寫入數據函數****
  57. {
  58.         rs=1;//數據/指令選擇置為數據
  59.         rw=0; //讀寫選擇置為寫
  60.         P0=dat;//送入數據
  61.         delay(1);
  62.         en=1; //en置高電平,為制造下降沿做準備
  63.         delay(1);
  64.         en=0; //en由高變低,產生下降沿,液晶執行命令
  65. }
  66. void lcd_init()//***液晶初始化函數****
  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);//循環左移
  76.                 delay(700);
  77.         }
  78.         write_1602com(0x01);
  79.         delay(10);
  80.         write_1602com(0x38);//設置液晶工作模式,意思:16*2行顯示,5*7點陣,8位數據
  81.         write_1602com(0x0c);//開顯示不顯示光標
  82.         write_1602com(0x06);//整屏不移動,光標自動右移
  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有關子函數********************/
  103. void write_byte(uchar dat)//寫一個字節
  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()//讀一個字節
  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芯片寫函數,指定寫入地址,數據
  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讀數據函數,指定讀取數據來源地址
  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碼轉十進制函數,輸入BCD,返回十進制
  151. {
  152.          uchar Decimal;
  153.          Decimal=bcd>>4;
  154.          return(Decimal=Decimal*10+(bcd&=0x0F));
  155. }
  156. //--------------------------------------
  157. void ds1302_init() //1302芯片初始化子函數(2010-01-07,12:00:00,week4)
  158. {
  159.         RST=0;
  160.         SCLK=0;
  161.         write_1302(0x8e,0x00); //允許寫,禁止寫保護
  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.         //寫入初始年份數據10
  171.         write_1302(0x8e,0x80); //打開寫保護
  172. }
  173. //------------------------------------
  174. //溫度顯示子函數
  175. void write_temp(uchar add,uchar dat)//向LCD寫溫度數據,并指定顯示位置
  176. {
  177.         uchar gw,sw,bw;
  178.         if(dat>=0&&dat<=128)
  179.         {
  180.                 gw=dat%10;//取得個位數字
  181.                 sw=dat%100/10;//取得十位數字
  182.                 bw=dat/100        ;//取得百位數字        
  183.         }
  184.         else
  185.         {
  186.                 dat=256-dat;
  187.                 gw=dat%10;//取得個位數字
  188.                 sw=dat%100/10;//取得十位數字
  189.                 bw=-3;                 //0x30-3表示為負號
  190.         }
  191.         write_1602com(er+add);//er是頭文件規定的值0x80+0x40
  192.         write_1602dat(0x30+bw);//數字+30得到該數字的LCD1602顯示碼
  193.         write_1602dat(0x30+sw);//數字+30得到該數字的LCD1602顯示碼
  194.         write_1602dat(0x30+gw);//數字+30得到該數字的LCD1602顯示碼
  195.     write_1602dat(0xdf);//顯示溫度的小圓圈符號,0xdf是液晶屏字符庫的該符號地址碼
  196.           write_1602dat(0x43);        //顯示"C"符號,0x43是液晶屏字符庫里大寫C的地址碼               
  197. }
  198. //------------------------------------
  199. //時分秒顯示子函數
  200. void write_sfm(uchar add,uchar dat)//向LCD寫時分秒,有顯示位置加、現示數據,兩個參數
  201. {
  202.         uchar gw,sw;
  203.         gw=dat%10;//取得個位數字
  204.         sw=dat/10;//取得十位數字
  205.         write_1602com(er+add);//er是頭文件規定的值0x80+0x40
  206.         write_1602dat(0x30+sw);//數字+30得到該數字的LCD1602顯示碼
  207.         write_1602dat(0x30+gw);//數字+30得到該數字的LCD1602顯示碼                                
  208. }
  209. //-------------------------------------
  210. //年月日顯示子函數
  211. void write_nyr(uchar add,uchar dat)//向LCD寫年月日,有顯示位置加數、顯示數據,兩個參數
  212. {
  213.         uchar gw,sw;
  214.         gw=dat%10;//取得個位數字
  215.         sw=dat/10;//取得十位數字
  216.         write_1602com(yh+add);//設定顯示位置為第一個位置+add
  217.         write_1602dat(0x30+sw);//數字+30得到該數字的LCD1602顯示碼
  218.         write_1602dat(0x30+gw);//數字+30得到該數字的LCD1602顯示碼        
  219. }
  220. //-------------------------------------------
  221. void write_week(uchar week)//寫星期函數
  222. {
  223.         write_1602com(yh+0x0c);//星期字符的顯示位置
  224.         switch(week)
  225.         {
  226.                 case 1:        write_1602dat('M');//星期數為1時,顯示
  227.                                    write_1602dat('O');
  228.                                    write_1602dat('N');
  229.                                    break;
  230.            
  231.                 case 2:        write_1602dat('T');//星期數據為2時顯示
  232.                                    write_1602dat('U');
  233.                                    write_1602dat('E');
  234.                                    break;
  235.                
  236.                 case 3:        write_1602dat('W');//星期數據為3時顯示
  237.                                    write_1602dat('E');
  238.                                    write_1602dat('D');
  239.                                    break;
  240.                
  241.                 case 4:        write_1602dat('T');//星期數據為4是顯示
  242.                                    write_1602dat('H');
  243.                                    write_1602dat('U');
  244.                                    break;
  245.                
  246.                 case 5:        write_1602dat('F');//星期數據為5時顯示
  247.                                    write_1602dat('R');
  248.                                    write_1602dat('I');
  249.                                    break;
  250.                
  251.                 case 6:        write_1602dat('S');//星期數據為6時顯示
  252.                                    write_1602dat('T');
  253.                                    write_1602dat('A');
  254.                                    break;
  255.                
  256.                 case 7:        write_1602dat('S');//星期數據為7時顯示
  257.                                    write_1602dat('U');
  258.                                    write_1602dat('N');
  259.                                    break;
  260.         }
  261. }
  262. //****************鍵盤掃描有關函數**********************
  263. void keyscan()
  264. {
  265.         if(key1==0)//---------------key1為功能鍵(設置鍵)--------------------
  266.         {
  267.                 delay(9);//延時,用于消抖動
  268.                 if(key1==0)//延時后再次確認按鍵按下
  269.                 {
  270.                     buzzer=0;//蜂鳴器短響一次
  271.                     delay(20);
  272.                     buzzer=1;
  273.                         while(!key1);
  274.                         key1n++;
  275.                         if(key1n==12)
  276.                                 key1n=1;//設置按鍵共有秒、分、時、星期、日、月、年、返回,8個功能循環
  277.                         switch(key1n)
  278.                         {               
  279.                                 case 1: TR0=0;//關閉定時器
  280.                                                 //TR1=0;
  281.                                                 write_1602com(er+0x09);//設置按鍵按動一次,秒位置顯示光標
  282.                                                    write_1602com(0x0f);//設置光標為閃爍
  283.                                                    temp=(miao)/10*16+(miao)%10;//秒數據寫入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位置顯示光標                                                
  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次,設置光標不閃爍
  323.                                                 TR0=1;//打開定時器
  324.                                          temp=(miao)/10*16+(miao)%10;
  325.                                                    write_1302(0x8e,0x00);
  326.                                                    write_1302(0x80,0x00|temp);//miao數據寫入DS1302
  327.                                                    write_1302(0x8e,0x80);
  328.                                     break;                                                                                                                                                
  329.                         }
  330.                 }
  331.         }
  332.         //------------------------------加鍵key2----------------------------               
  333.         if(key1n!=0)//當key1按下以下。再按以下鍵才有效(按鍵次數不等于零)
  334.         {
  335.                 if(key2==0)  //上調鍵
  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++;//設置鍵按動1次,調秒
  347.                                                         if(miao==60)
  348.                                                                 miao=0;//秒超過59,再加1,就歸零
  349.                                                         write_sfm(0x08,miao);//令LCD在正確位置顯示"加"設定好的秒數
  350.                                                         temp=(miao)/10*16+(miao)%10;//十進制轉換成DS1302要求的DCB碼
  351.                                                            write_1302(0x8e,0x00); //允許寫,禁止寫保護
  352.                                                            write_1302(0x80,temp); //向DS1302內寫秒寄存器80H寫入調整后的秒數據BCD碼
  353.                                                            write_1302(0x8e,0x80); //打開寫保護
  354.                                                         write_1602com(er+0x09);//因為設置液晶的模式是寫入數據后,光標自動右移,所以要指定返回
  355.                                                         //write_1602com(0x0b);
  356.                                                         break;
  357.                                         case 2:        fen++;
  358.                                                         if(fen==60)
  359.                                                                 fen=0;
  360.                                                         write_sfm(0x05,fen);//令LCD在正確位置顯示"加"設定好的分數據
  361.                                                         temp=(fen)/10*16+(fen)%10;//十進制轉換成DS1302要求的DCB碼
  362.                                                            write_1302(0x8e,0x00);//允許寫,禁止寫保護
  363.                                                            write_1302(0x82,temp);//向DS1302內寫分寄存器82H寫入調整后的分數據BCD碼
  364.                                                            write_1302(0x8e,0x80);//打開寫保護
  365.                                                         write_1602com(er+6);//因為設置液晶的模式是寫入數據后,指針自動加一,在這里是寫回原來的位置
  366.                                                         break;
  367.                                         case 3:        shi++;
  368.                                                         if(shi==24)
  369.                                                                 shi=0;
  370.                                                         write_sfm(2,shi);//令LCD在正確的位置顯示"加"設定好的小時數據
  371.                                                         temp=(shi)/10*16+(shi)%10;//十進制轉換成DS1302要求的DCB碼
  372.                                                            write_1302(0x8e,0x00);//允許寫,禁止寫保護
  373.                                                            write_1302(0x84,temp);//向DS1302內寫小時寄存器84H寫入調整后的小時數據BCD碼
  374.                                                            write_1302(0x8e,0x80);//打開寫保護
  375.                                                         write_1602com(er+3);//因為設置液晶的模式是寫入數據后,指針自動加一,所以需要光標回位
  376.                                                         break;
  377.                                         case 4:        week++;
  378.                                                         if(week==8)
  379.                                                                 week=1;
  380.                                             write_1602com(yh+0x0C);//指定'加'后的周數據顯示位置
  381.                                                         write_week(week);//指定周數據顯示內容
  382.                                             temp=(week)/10*16+(week)%10;//十進制轉換成DS1302要求的DCB碼
  383.                                                            write_1302(0x8e,0x00);//允許寫,禁止寫保護
  384.                                                            write_1302(0x8a,temp);//向DS1302內寫周寄存器8aH寫入調整后的周數據BCD碼
  385.                                                            write_1302(0x8e,0x80);//打開寫保護
  386.                                                         write_1602com(yh+0x0e);//因為設置液晶的模式是寫入數據后,指針自動加一,所以需要光標回位
  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在正確的位置顯示"加"設定好的日期數據
  423.                                                         temp=(ri)/10*16+(ri)%10;//十進制轉換成DS1302要求的DCB碼
  424.                                                            write_1302(0x8e,0x00);//允許寫,禁止寫保護
  425.                                                            write_1302(0x86,temp);//向DS1302內寫日期寄存器86H寫入調整后的日期數據BCD碼
  426.                                                            write_1302(0x8e,0x80);//打開寫保護
  427.                                                         write_1602com(yh+10);//因為設置液晶的模式是寫入數據后,指針自動加一,所以需要光標回位
  428.                                                         break;
  429.                                         case 6:        yue++;
  430.                                                         if(yue==13)
  431.                                                                 yue=1;
  432.                                                         write_nyr(6,yue);//令LCD在正確的位置顯示"加"設定好的月份數據
  433.                                                         temp=(yue)/10*16+(yue)%10;//十進制轉換成DS1302要求的DCB碼
  434.                                                            write_1302(0x8e,0x00);//允許寫,禁止寫保護
  435.                                                            write_1302(0x88,temp);//向DS1302內寫月份寄存器88H寫入調整后的月份數據BCD碼
  436.                                                            write_1302(0x8e,0x80);//打開寫保護
  437.                                                         write_1602com(yh+7);//因為設置液晶的模式是寫入數據后,指針自動加一,所以需要光標回位
  438.                                                         break;
  439.                                         case 7:        nian++;
  440.                                                          if(nian==100)
  441.                                                                 nian=0;
  442.                                                         write_nyr(3,nian);//令LCD在正確的位置顯示"加"設定好的年份數據
  443.                                             temp=(nian)/10*16+(nian)%10;//十進制轉換成DS1302要求的DCB碼
  444.                                                            write_1302(0x8e,0x00);//允許寫,禁止寫保護
  445.                                                            write_1302(0x8c,temp);//向DS1302內寫年份寄存器8cH寫入調整后的年份數據BCD碼
  446.                                                            write_1302(0x8e,0x80);//打開寫保護
  447.                                                         write_1602com(yh+4);//因為設置液晶的模式是寫入數據后,指針自動加一,所以需要光標回位
  448.                                                         break;
  449.                                         case 8:        write_1602com(er+9); //設置鬧鐘的秒定時
  450.                                                 miao1++;
  451.                                                         if(miao1==60)
  452.                                                            miao1=0;
  453.                                                         write_sfm(0x08,miao1);//令LCD在正確位置顯示"加"設定好秒的數據
  454.                                                         write_1602com(er+9);//因為設置液晶的模式是寫入數據后,指針自動加一,在這里是寫回原來的位置
  455.                                                         break;
  456.                                         case 9:        write_1602com(er+6); //設置鬧鐘的分鐘定時
  457.                                                 fen1++;
  458.                                                 if(fen1==60)
  459.                                                                 fen1=0;
  460.                                                         write_sfm(0x05,fen1);//令LCD在正確位置顯示"加"設定好的分數據
  461.                                                         write_1602com(er+6);//因為設置液晶的模式是寫入數據后,指針自動加一,在這里是寫回原來的位置
  462.                                                         break;
  463.                                         case 10:write_1602com(er+3); //設置鬧鐘的小時定時
  464.                                                 shi1++;
  465.                                                 if(shi1==24)
  466.                                                                 shi1=0;
  467.                                                         write_sfm(0x02,shi1);//令LCD在正確的位置顯示"加"設定好的小時數據
  468.                                                         write_1602com(er+3);//因為設置液晶的模式是寫入數據后,指針自動加一,所以需要光標回位
  469.                                                         break;
  470.                                 }
  471.                         }
  472.                 }
  473.                 //------------------減鍵key3,各句功能參照'加鍵'注釋---------------
  474.                 if(key3==0)
  475.                 {
  476.                         delay(10);//調延時,消抖動
  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;//秒數據減到-1時自動變成59
  488.                                                         write_sfm(0x08,miao);//在LCD的正確位置顯示改變后新的秒數
  489.                                             temp=(miao)/10*16+(miao)%10;//十進制轉換成DS1302要求的DCB碼
  490.                                                            write_1302(0x8e,0x00); //允許寫,禁止寫保護
  491.                                                            write_1302(0x80,temp); //向DS1302內寫秒寄存器80H寫入調整后的秒數據BCD碼
  492.                                                            write_1302(0x8e,0x80); //打開寫保護
  493.                                                         write_1602com(er+0x09);//因為設置液晶的模式是寫入數據后,指針自動加一,在這里是寫回原來的位置
  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;//十進制轉換成DS1302要求的DCB碼
  501.                                                            write_1302(0x8e,0x00);//允許寫,禁止寫保護
  502.                                                            write_1302(0x82,temp);//向DS1302內寫分寄存器82H寫入調整后的分數據BCD碼
  503.                                                            write_1302(0x8e,0x80);//打開寫保護
  504.                                                         write_1602com(er+6);//因為設置液晶的模式是寫入數據后,指針自動加一,在這里是寫回原來的位置
  505.                                                         break;




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



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏15 分享淘帖 頂4 踩
回復

使用道具 舉報

沙發
ID:240024 發表于 2017-10-16 19:49 | 只看該作者
好東西~~學習!
回復

使用道具 舉報

板凳
ID:250467 發表于 2017-11-17 16:56 | 只看該作者
謝謝!
回復

使用道具 舉報

地板
ID:230826 發表于 2017-11-17 18:11 | 只看該作者
LCD1602的主要技術參數:
1、顯示容量:16×2個字符
2、芯片工作電壓:4.5—5.5V
3、工作電流:2.0mA(5.0V)?????
回復

使用道具 舉報

5#
ID:303018 發表于 2018-4-7 09:41 | 只看該作者
changle11 發表于 2017-11-17 18:11
LCD1602的主要技術參數:
1、顯示容量:16×2個字符
2、芯片工作電壓:4.5—5.5V

非常感謝,厲害!
回復

使用道具 舉報

6#
ID:358267 發表于 2018-6-25 10:34 | 只看該作者
大佬太強了
回復

使用道具 舉報

7#
ID:359074 發表于 2018-7-4 21:49 | 只看該作者
非常感謝,正在做這個
回復

使用道具 舉報

8#
ID:370060 發表于 2018-7-13 08:38 | 只看該作者
謝謝分享
回復

使用道具 舉報

9#
ID:370060 發表于 2018-7-16 09:09 | 只看該作者
謝謝分享 ,絕世好貼
回復

使用道具 舉報

10#
ID:452252 發表于 2018-12-23 11:08 | 只看該作者
想問一下為什么把代碼下到單片機里了,LCD不顯示東西呀
回復

使用道具 舉報

11#
ID:463517 發表于 2019-1-7 10:31 | 只看該作者
為啥我的原理圖下載好后,打不開呀。我的dxp是可以正常使用的
回復

使用道具 舉報

12#
ID:470570 發表于 2019-6-26 18:14 | 只看該作者
網上好多程序燒進去后都不能用,不知道這個咋樣
回復

使用道具 舉報

13#
ID:443000 發表于 2019-12-3 13:05 | 只看該作者
你好,請問有實物嘛
回復

使用道具 舉報

14#
ID:788783 發表于 2020-6-24 15:52 | 只看該作者
謝謝分享,火鉗劉銘
回復

使用道具 舉報

15#
ID:764569 發表于 2020-11-17 19:21 | 只看該作者
沒成功
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天天欧美 | 日韩欧美在线免费 | 日本精品在线观看 | 国产精品一二区 | 成年人国产在线观看 | 欧美精品在线一区二区三区 | av色在线 | 亚洲黄色一级 | 国产午夜精品一区二区三区嫩草 | 成人av观看 | 91国产精品在线 | 二区三区视频 | 自拍 亚洲 欧美 老师 丝袜 | 成年免费大片黄在线观看岛国 | 日韩中文字幕在线观看 | 国产精彩视频在线观看 | 中文字幕在线视频网站 | 999热精品 | 国产精品久久久久久久久图文区 | 色嗨嗨 | 91久久精品视频 | 精品欧美乱码久久久久久 | 一二区视频 | 毛片一区二区三区 | 999国产精品视频免费 | 日韩高清国产一区在线 | 国产成人精品一区二区三区在线观看 | 久久99久久98精品免观看软件 | 野狼在线社区2017入口 | 久久国产精品视频 | 日韩三级免费观看 | 精品欧美一区二区三区久久久 | 精品一二三区在线观看 | 激情久久av一区av二区av三区 | 国产成人99久久亚洲综合精品 | 国产视频在线观看一区二区三区 | 日日操夜夜操天天操 | 超级乱淫av片免费播放 | 欧美jizzhd精品欧美巨大免费 | 99久久久无码国产精品 | 日韩欧美大片在线观看 |