找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機(jī)LCD1602顯示電子時(shí)鐘設(shè)計(jì),含匯編程序,原理圖、仿真結(jié)果、實(shí)物圖、論文

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:329602 發(fā)表于 2018-5-14 15:21 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
這是我做的使用LCD1602顯示的電子時(shí)鐘的設(shè)計(jì),從編程到制作實(shí)物花了不少的時(shí)間。程序使用純匯編語言編寫,在proteus中仿真驗(yàn)證,并完成了實(shí)物的制作,調(diào)試完全通過,功能包括時(shí)間、日期,鬧鈴,整點(diǎn)提示等功能,使用LCD1602顯示清晰。

題    目: 基于52單片機(jī)電子時(shí)鐘的設(shè)計(jì)
學(xué)    院:     物理與機(jī)電工程學(xué)院         
專    業(yè):     電子信息科學(xué)與技術(shù)      
作者姓名:                        
指導(dǎo)教師:  ***    職稱:  講師   

基于52單片機(jī)電子時(shí)鐘的設(shè)計(jì)

摘要
本次設(shè)計(jì)的多功能時(shí)鐘系統(tǒng)采用STC89C52單片機(jī)為核心器件,利用其定時(shí)器/計(jì)數(shù)器定時(shí)和記數(shù)的原理,結(jié)合液晶顯示電路、時(shí)鐘芯片DS1302電路、電源電路以及按鍵電路來設(shè)計(jì)計(jì)時(shí)器。將軟硬件有機(jī)地結(jié)合起來,使得系統(tǒng)能夠?qū)崿F(xiàn)液晶顯示,顯示有年、月、日、時(shí)、分、秒以及星期,還可以設(shè)置鬧鐘和整點(diǎn)報(bào)時(shí)。其中軟件系統(tǒng)采用單片機(jī)匯編語言編寫程序,包括顯示程序、鬧鐘程序、中斷、延時(shí)程序,按鍵消抖程序等,并在keil中調(diào)試運(yùn)行,硬件系統(tǒng)利用PROTEUS強(qiáng)大的功能來實(shí)現(xiàn),簡單且易于觀察,在仿真中就可以觀察到實(shí)際的工作狀態(tài)。

1 設(shè)計(jì)任務(wù)及要求分析

1.1 設(shè)計(jì)任務(wù):基于單片機(jī)的電子時(shí)鐘設(shè)計(jì)

1.2 要求:

1.2.1 用LCD液晶作為顯示設(shè)備

1.2.2 可以分別設(shè)定小時(shí)、分鐘和秒,復(fù)位后時(shí)間為 00 00 00

1.2.3 能實(shí)現(xiàn)日期的設(shè)置年、月、日

1.3 擴(kuò)展要求:如鬧鐘功能、顯示星期、整點(diǎn)音樂報(bào)時(shí)等

2 系統(tǒng)方案

2.1 系統(tǒng)整體方案的論證

電路原理設(shè)計(jì)是基于小系統(tǒng)板包括電源電路、復(fù)位電路、按鍵電路、DS1302時(shí)鐘電路、液晶顯示驅(qū)動(dòng)電路、輸出控制電路。電源部分是用電池來提供的3v-5v,晶體振蕩器采用的是12MHz的石英晶體振蕩器。

整個(gè)系統(tǒng)用單片機(jī)為中央控制器,由單片機(jī)執(zhí)行采集時(shí)鐘芯片的時(shí)間信號(hào)并通過顯示模塊來輸出信號(hào)及相關(guān)的控制功能。時(shí)鐘芯片產(chǎn)生時(shí)鐘信號(hào),利用單片機(jī)的I/O口傳給單片機(jī);并通過I/O口實(shí)現(xiàn)LCD的顯示。系統(tǒng)設(shè)有4個(gè)獨(dú)立式按鍵可以對(duì)時(shí)間年、月、日和星期進(jìn)行調(diào)整,還可以設(shè)置鬧鐘。具體如圖2.1所示:         

圖2.1  系統(tǒng)整體框圖


3 硬件設(shè)計(jì)與實(shí)現(xiàn)

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

STC89C52是一款非常適合單片機(jī)初學(xué)者學(xué)習(xí)的單片機(jī),它完全兼容傳統(tǒng)的8051,8031的指令系統(tǒng),他的運(yùn)行速度要比8051快最高支持達(dá)33MHz的晶體震蕩器,在此系統(tǒng)中使用12MHz的晶振。

AT89S52是一種低功耗、高性能CMOS8位微控制器,具有8K在系統(tǒng)可編程Flash存儲(chǔ)器。使用Atmel公司高密度非易失性存儲(chǔ)器技術(shù)制造,與工業(yè)80C51 產(chǎn)品指令和引腳完全兼容。片上Flash允許程序存儲(chǔ)器在系統(tǒng)可編程,亦適于常規(guī)編程器。在單芯片上,擁有靈巧的8 位CPU 和在系統(tǒng)可編程Flash,使得STC89C52為眾多嵌入式控制應(yīng)用系統(tǒng)提供高靈活、超有效的解決方案。STC89C52具有以下標(biāo)準(zhǔn)功能:8k字節(jié)Flash,256字節(jié)RAM,32 位I/O 口線,看門狗定時(shí)器,2 個(gè)數(shù)據(jù)指針,三個(gè)16位定時(shí)器/計(jì)數(shù)器。一個(gè)6向量2級(jí)中斷結(jié)構(gòu),全雙工串行口及時(shí)鐘電路。另外,STC89C52 可降至0Hz 靜態(tài)邏輯操作,支持2種軟件可選擇節(jié)電模式?臻e模式下,CPU停止工作,允許RAM、定時(shí)器/計(jì)數(shù)器、串口、中斷繼續(xù)工作。掉電保護(hù)方式下,RAM內(nèi)容被保存,振蕩器被凍結(jié),單片機(jī)一切工作停止,直到下一個(gè)中斷或硬件復(fù)位為止。

3.2振蕩電路的工作原理

STC89C52單片機(jī)內(nèi)部有一個(gè)高增益反相放大器,用于構(gòu)成振蕩器,但要形成時(shí)鐘,外部還需附加電路。XTAL1引腳為反相放大器和時(shí)鐘發(fā)生電路的輸入端,XTAL2引腳為反相放大器的輸出端。振蕩電路如圖3.1所示:

3.1  振蕩電路

3.2時(shí)鐘電路的工作原理

片內(nèi)時(shí)鐘發(fā)生器實(shí)質(zhì)是個(gè)2分頻的觸發(fā)其輸入來自振蕩器的fosc,輸出為2相時(shí)鐘信號(hào),即節(jié)拍信號(hào)P1、P2,器頻率為fosc\2。2個(gè)節(jié)拍為1個(gè)狀態(tài)時(shí)鐘S。狀態(tài)時(shí)鐘再3分頻后為ALE信號(hào),其頻率為fosc\6,狀態(tài)時(shí)鐘6分頻后為機(jī)器周期信號(hào),器頻率為fosc\12。特殊功能寄存器PCON的PD位可以控制振蕩器的工作,當(dāng)PD=0時(shí),振蕩器停止工作,單片機(jī)進(jìn)入低功耗工作狀態(tài),復(fù)位后,PD=0,振蕩器正常工作。時(shí)鐘電路如圖3.2所示:

3.2時(shí)鐘電路

3.3單片機(jī)最小系統(tǒng)電路圖

3.3單片機(jī)最小系統(tǒng)電路圖

3.4 時(shí)鐘芯片

   (1)DS1302是一種可編程的實(shí)時(shí)時(shí)鐘芯片,具有計(jì)算2100年前的時(shí)間的能力,包括時(shí)鐘/日歷寄存器和31字節(jié)(8位)的數(shù)據(jù)暫存寄存器,數(shù)據(jù)通信權(quán)通過一條串行輸出口。時(shí)鐘/日歷提供包括秒、分、時(shí)、日期、月份和年份信息。閏年可自行調(diào)整,以串行方式向單片機(jī)傳送單字節(jié)或多字節(jié)的秒、分、時(shí)、日、月、年等實(shí)時(shí)時(shí)間數(shù)據(jù);只通過三根線進(jìn)行數(shù)據(jù)的控制和傳遞:RST、I/O、SCLK;其在電路的功能是還具有在出現(xiàn)主電源斷電時(shí)備用電源可繼續(xù)保持時(shí)鐘的連續(xù)運(yùn)行。時(shí)鐘引腳圖如圖3.4所示:





圖3.4時(shí)鐘引腳圖


(2)DS1302芯片內(nèi)部寄存器讀寫地址及位定義格式如表3-1:

寄存器名

讀寫地址

取值范圍

位定義

寫操作

讀操作

D7

D6

D5

D4

D3

D2

D1

D0

秒寄存器

80H

81H

00-59

CH

秒十位

秒個(gè)位

分寄存器

82H

83H

00-59

0

分時(shí)位

分個(gè)位

時(shí)寄存器

84H

85H

01-12或00-23

12/24

0

AM/PM

十位

小時(shí)個(gè)位

日期寄存器

86H

87H

01-28-31

0

0

十位

日個(gè)位

星期寄存器

8AH

8BH

01-07

0

0

0

0

星期位

月寄存器

88H

89H

01-12

0

0

0

十位

月個(gè)位

年寄存器

8CH

8DH

00-99

年十位

年個(gè)位

控制寄存器

控制寄存器

8EH

8EH

8FH

8FH


WP

WP

0

0

0

0

0

0

0

0



表3-1  DS1302芯片內(nèi)部寄存器讀寫地址及位定義

如果單片機(jī)要對(duì)DS1302內(nèi)部寄存器進(jìn)行讀寫操作,必須先將與寄存器對(duì)應(yīng)的位操作地址傳送給DS1302,然后再進(jìn)行讀寫數(shù)據(jù)的操作。控制寄存器是用來決定能否對(duì)DS1302進(jìn)行讀寫操作,當(dāng)控制字的最高位WP=0時(shí),允許進(jìn)行讀寫操作;當(dāng)WP=1時(shí),禁止讀寫操作。所以單片機(jī)對(duì)DS1302進(jìn)行讀寫操作時(shí),必須先將控制字00H寫入到DS1302的控制寄存器中。

3.5 液晶顯示電路

LCD顯示器能顯示數(shù)碼管不能顯示的其他字符、文字和圖形,是十分重要的顯示終端,LCD1602是字符點(diǎn)陣液晶顯示模塊。利用LCD1602,所用的時(shí)間年、月、日、星期可同時(shí)可見,一目了然,采用雙行顯示,讓電子鐘能夠更直觀的顯示。其實(shí)圖如圖3.5、顯示電路圖如圖3.6、引腳功能如表3-2所示:

圖3.5 液晶顯示器實(shí)圖

圖3.6 液晶顯示電路圖


引腳號(hào)

引腳名稱

引腳功能含義

1

Vss

地管腳(GND)

2

Vdd

+5V電源引腳(Vcc)

3

Vo

液晶顯示驅(qū)動(dòng)電源(0~5V),可接電位器

4

RS

數(shù)據(jù)和指令選擇控制端,RS=0:命令/狀態(tài)RS=1:數(shù)據(jù)

5

R/W

讀寫控制線,R/W=0:寫操作,R/W=1:讀操作

6

E

數(shù)據(jù)讀寫操作控制位,E線向LCD模塊發(fā)送一個(gè)脈沖,LCD模塊與單片機(jī)之間將進(jìn)行一次數(shù)據(jù)轉(zhuǎn)換

7~14

DB0~DB7

數(shù)據(jù)線,可以用8位連接,也可以用高四位連接,節(jié)約資源

15

A

背光控制正電源

16

K

背光控制地

表3-2  LCD液晶顯示器引腳功能

3.6 輸出控制電路

在P2.0端口接一個(gè)蜂鳴器,用于整點(diǎn)報(bào)時(shí)和響鬧鈴。具體如圖3.7所示:

圖3.7輸出控制電路圖

3.7按鍵電路

本次設(shè)計(jì)采用按鍵電平復(fù)位,按鍵電平復(fù)位相當(dāng)于按復(fù)位鍵后,復(fù)位端通過電阻與Vcc電源接通,按鍵電路圖如圖3.8所示:

圖3.8按鍵電路圖


4 軟件設(shè)計(jì)與實(shí)現(xiàn)

4.1軟件總體設(shè)計(jì)方案

4.1.1 軟件設(shè)計(jì)目標(biāo)

軟件部分總體上是模塊化的設(shè)計(jì)思想,通過子程序調(diào)用設(shè)計(jì)方式 ,將所有的模塊綜合到一起,使程序可讀性較高。

4.1.2 總體架構(gòu)說明

該時(shí)鐘程序設(shè)計(jì)思路如下:

  (1)在程序頭將設(shè)計(jì)中的一些固定空間進(jìn)行分配并注釋。

  (2)初始化程序,如設(shè)定時(shí)鐘初始顯示“2016年6月30日,星期四,00:00”以便一開始就能進(jìn)入整點(diǎn)報(bào)時(shí)狀態(tài),顯示該功能;設(shè)定使用定時(shí)器1;將一些未到時(shí)鐘設(shè)計(jì)功能的功能端口關(guān)閉等。

  (3)開始主程序進(jìn)行程序掃描,先掃描拆字子程序,將分配好的時(shí)分秒等高地位的數(shù)字調(diào)入到顯示子程序中!@示子程序通過分配的空間對(duì)應(yīng)口將拆字子程序的內(nèi)容在液晶顯示器上顯示相應(yīng)的時(shí)分秒,再調(diào)用走時(shí)程序使時(shí)鐘進(jìn)行讀秒等工作。→進(jìn)入按鍵掃描,判斷按鍵是否有變動(dòng),若有就根據(jù)設(shè)計(jì)程序?qū)ο鄳?yīng)的按鍵按入次數(shù)而進(jìn)行實(shí)現(xiàn)相應(yīng)的功能。如進(jìn)入時(shí)間調(diào)整、鬧鐘設(shè)置、鬧鐘開啟與否等。→進(jìn)入鬧鐘的判斷,在時(shí)分上與設(shè)置的鬧鈴時(shí)間吻合的話就做相對(duì)應(yīng)的判斷,再依據(jù)是否有開啟鬧鐘而進(jìn)行響鈴與否,如果有響鈴則設(shè)置其一直響鈴知道有人為按取消按鍵取消鬧鈴。→進(jìn)入整點(diǎn)報(bào)時(shí)掃描,判斷是否在時(shí)分上都進(jìn)入了整點(diǎn),如果是就報(bào)時(shí),然后就退出整點(diǎn)報(bào)時(shí),等到下一個(gè)整點(diǎn)的到來!詈蠓祷刂鞒绦蝾^重新依次掃描。顯示過程設(shè)有消隱,按鍵設(shè)有去抖。

  (4)子程序部分。在主程序的調(diào)用下依據(jù)不同的子程序工能而編寫子程序,有多級(jí)嵌套。這些子程序包括拆字子程序、延時(shí)子程序、走時(shí)間子程序、整點(diǎn)報(bào)時(shí)子程序、按鍵處理子程序、調(diào)時(shí)間子程序、鬧鐘設(shè)置子程序、鬧鐘子程序、鬧鐘開啟子程序。主流程圖如圖4.1所示:


子程序詳解表如表4-1所示:

子程序名稱

功能

改變

Sub1

鬧鐘

Pf

Sub2

報(bào)時(shí)一聲

Pf、th1、jiepai

zhengshi

判斷當(dāng)前時(shí)間是否是整時(shí)

shengshu 、cxbs

baoshi

執(zhí)行報(bào)時(shí)功能

Shengshu、cxbs

bijiao

判斷是否到鬧鐘時(shí)間

TR0

opr00

設(shè)置當(dāng)前時(shí)間狀態(tài)

IsSheZhi、r1、KeyCode

opr01

進(jìn)入設(shè)置鬧鐘時(shí)間狀態(tài)

IsSheZhi、r1、KeyCode

opr02

把所設(shè)置的時(shí)間作為當(dāng)前時(shí)間

KeyCode、sec、min、hour、day、month、IsSheZhi

opr03

把所設(shè)置的時(shí)間作為鬧鐘時(shí)間

KeyCode、IsSheZhi

write

DS18b20寫

DQ、r4、r7

read

DS18b20讀

DQ、r0、r4、r5、r7

set1302

ds1302初始化

Rst、Sclk、r0、r1、r6

get1302

讀出秒,分,時(shí),日,月,星期,年讀出秒,分,時(shí),日,月,星期,年

Rst、Sclk、r0、r1、r6

clockrd

ds1302讀子程序

Sclk 、r7

Ds1302R

ds1302寫數(shù)據(jù)子程序

Sclk 、r7

chaizi

時(shí)鐘拆字

DspBuf、b、r0

Initdisplay

初始狀態(tài)顯示

Dptr

dispGD

固定字符顯示


word

字‘年’,‘月’,‘日’ ‘°c’


LcdDspBuf

寫入顯示數(shù)字

R0、R2

LcdWrDat

寫入數(shù)據(jù)

LCDRS、LCDRW、LcdE

LcdWrCmd

寫入命令

LCDRS、LCDRW、LcdE

lcd_init

LCD初始化


delay

延時(shí)

r6、r7

anjian1

執(zhí)行按鍵1的功能

KeyCode、IsSheZhi

anjian2

執(zhí)行按鍵2的功能

KeyCode、IsSheZhi

anjian3

執(zhí)行按鍵3的功能

KeyCode、QH

anjian4

執(zhí)行按鍵4的功能

KeyCode、bs

www

www

www

掃描當(dāng)前時(shí)間編輯位


wwwa

掃描鬧鐘時(shí)間編輯位


yan500ms

延時(shí)500ms


hex2bcd

拆字子程序


display_nz

顯示鬧鐘時(shí)間



表4-1  子程序詳解表

4.2按鍵模塊設(shè)計(jì)

設(shè)計(jì)系統(tǒng)中的按鍵模塊僅占用四個(gè)I/O口,從89s52芯片p1.0、p1.1、p1.2、p1.3四個(gè)引腳接入進(jìn)行控制。當(dāng)沒有按鍵按下時(shí),均為高電平,有按鍵按下時(shí)相應(yīng)I/O口為低電平,但并沒有立即執(zhí)行相應(yīng)的程序,延時(shí)5ms后若再為低電平,等I/O口恢復(fù)高電平,即按鍵松開時(shí),才執(zhí)行相應(yīng)的程序,此時(shí)按鍵才起作用。這樣該按鍵模塊具有去抖動(dòng),且按鍵按下一次僅作用一次,起到精確判斷的作用。

4.2.1 按鍵1的說明

按鍵1有四種功能,分別為下面4個(gè)子程序:

(1)子程序0的功能為:進(jìn)入設(shè)置當(dāng)前時(shí)間狀態(tài),且令keycode=2;

(2)子程序1的功能為:進(jìn)入設(shè)置鬧鐘時(shí)間狀態(tài),且令keycode=3;

(3)子程序2的功能為:把所設(shè)置的時(shí)間作為當(dāng)前時(shí)間,且令keycode=0;

(4)子程序3的功能為:把所設(shè)置的時(shí)間作為鬧鐘時(shí)間,且令keycode=0;

每次按下按鍵1,按鍵1程序根據(jù)的KeyCode內(nèi)容轉(zhuǎn)入各對(duì)應(yīng)的子程序中(因?yàn)楫?dāng)KeyCode值不同時(shí),經(jīng)過計(jì)算得到dptr的值不同,然后經(jīng)過jmp @a+dptr指令就可跳轉(zhuǎn)到不同的子程序中,具體程序說明),從而實(shí)現(xiàn)不同的功能。

從各按鍵的功能可知,每次按下按鍵1,都會(huì)改變KeyCode內(nèi)容,使按鍵1的功能發(fā)生改變。

4.2.2  按鍵2的說明  

按鍵2有兩種不同的功能:對(duì)應(yīng)于設(shè)置狀態(tài)為加1;對(duì)應(yīng)于非設(shè)置狀態(tài)為切換屏幕。所以按鍵2程序開頭就先判斷鬧鐘是否處于設(shè)置狀態(tài)。

當(dāng)鬧鐘處于非設(shè)置狀態(tài)時(shí),keycode等于0或1;處于設(shè)置狀態(tài)時(shí),keycode等于2或3;所以可用如下語段判斷鬧鐘是否處于設(shè)置狀態(tài):

當(dāng)鬧鐘處于設(shè)置狀態(tài),keycode值大于2,c等于0

當(dāng)鬧鐘處于非設(shè)置狀態(tài),keycode值小于2,c等于1

4.2.3 其他按鍵的說明

     剩下3、4按鍵都于按鍵2類似,先判斷是否處于設(shè)置狀態(tài),然后轉(zhuǎn)入不同的語句,不再說明。

4.2.4 報(bào)時(shí)功能的說明

當(dāng)報(bào)時(shí)功能開啟,即bs=0時(shí),LCD上會(huì)出現(xiàn)相應(yīng)的標(biāo)示符號(hào),此時(shí)主程序?qū)呙鑪hengshi子程序。

     zhengshi子程序能判斷當(dāng)前時(shí)間是否為整點(diǎn),若為整點(diǎn)將使cxbs=0,且把hour由BCD碼化為二進(jìn)制存儲(chǔ)在字節(jié)shengshu(為報(bào)時(shí)聲數(shù),將在baoshi子程序中使用)中,之后主程序?qū)呙鑒aoshi子程序,即開始報(bào)時(shí)。

    chuzhi=0, 由baoshi子程序可知,鬧鐘從0秒開始報(bào)時(shí),當(dāng)報(bào)時(shí)完畢將自動(dòng)令cxbs=1。

4.2.5 鬧鐘功能的說明:

當(dāng)鬧鐘功能開啟,即bj=0時(shí),LCD上會(huì)出現(xiàn)相應(yīng)的標(biāo)示符號(hào)此時(shí),主程序?qū)呙鑪hengshi子程序。zhengshi子程序?qū)Ξ?dāng)前時(shí)間和鬧鐘時(shí)間進(jìn)行比較,當(dāng)它們的分、時(shí)全相等時(shí)開啟中斷sub1,否則關(guān)閉中斷sub1。這樣就可實(shí)現(xiàn)鬧鐘鬧鈴一分鐘后自動(dòng)停止鳴叫的要求。

4.2.6 加1、移位功能的說明

將年份前兩位與年(year)、月(month)、星期(week)、日(day)、時(shí)(hour)、分(min)、秒(sec)拆字后分別存儲(chǔ)在DspBuf-2、DspBuf-1、DspBuf+0、DspBuf+1、DspBuf+2、DspBuf+3等13個(gè)字節(jié)中。而把它們的每一為在LCD上的顯示位置地址放在如下表中:

tab4:db 80h,81h,82h,83h,85h,86h,88h,89h,8eh,0c2h,0c3h,0c5h,0c6h,0c8h,0c9h;

    當(dāng)前時(shí)間各編輯位在LCD上的位置表。然后執(zhí)行mov r1,#DspBuf+12; inc @r1就可實(shí)現(xiàn)對(duì)秒個(gè)位加1。執(zhí)行:dec r1和子程序www就可實(shí)現(xiàn)移位功能.

4.3 時(shí)鐘模塊設(shè)計(jì)

單片機(jī)要先從DS1302芯片中讀取時(shí)鐘數(shù)據(jù),然后通過LCD顯示出來。在讀取DS1302的時(shí)間和日期之前,先要對(duì)DS1302進(jìn)行賦初始時(shí)間并開啟時(shí)鐘。時(shí)鐘被啟動(dòng)后若未接收到新的賦時(shí)間指令,其內(nèi)部的時(shí)鐘將一直不停的運(yùn)行,以保證時(shí)間的實(shí)時(shí)性和準(zhǔn)確性;期間單片機(jī)可隨時(shí)讀取DS1302內(nèi)部時(shí)間和日期寄存器中的數(shù)值。

4.4 液晶顯示模塊設(shè)計(jì)

本設(shè)計(jì)液晶時(shí)鐘顯示系統(tǒng)設(shè)計(jì)上由液晶顯示器顯示、時(shí)鐘芯片DS1302提供時(shí)間,可為使用者提供完整的時(shí)間信息。由于LED數(shù)碼管只能顯示數(shù)字而無法顯示其他中英文字符,并對(duì)成本及功能考慮,因此從設(shè)計(jì)的成本及功能的角度考慮,采用LCD一1602顯示模塊,它可以顯示年、月、日、星期等中文字目。LCD一1602驅(qū)動(dòng)電路簡單,可以由單片機(jī)直接輸出命令驅(qū)動(dòng)。

5 實(shí)物調(diào)試及測試

5.1 實(shí)物圖

圖5.1 實(shí)物圖

5.2 實(shí)物調(diào)試

  • 按下K1鍵進(jìn)入調(diào)節(jié)功能選擇狀態(tài)

圖5.2 K1鍵功能圖

  • 按下2鍵有加1和顯示調(diào)節(jié)鬧鐘界面的功能
  • 按下K3鍵進(jìn)入光標(biāo)移動(dòng)功能,選擇調(diào)節(jié)年、月、日和時(shí)間等
  • 按下K4顯示出整點(diǎn)報(bào)時(shí)圖標(biāo)

圖5.3 K4鍵功能圖


5.3 測試結(jié)果及分析

引腳

測試結(jié)果

結(jié)論

40(VCC)

電壓值5.09V

良好

31(EA*)

電壓值5.09V

良好

30(ALE)

波形為方波

良好

表5-1 測試結(jié)果分析表

5.4仿真結(jié)果圖如下所示

圖5.4 K4仿真結(jié)果

6 不足與展望

6.1 設(shè)計(jì)不足之處

  • 沒有停止鬧鐘的硬件功能
  • 沒有實(shí)現(xiàn)按鍵減1,只能加1調(diào)節(jié)時(shí)鐘
  • 沒有實(shí)現(xiàn)音樂整點(diǎn)報(bào)時(shí)
  • 沒有安裝三極管,蜂鳴器聲音很小

6.2 設(shè)計(jì)的展望

  • 可以增加一個(gè)溫度傳感器以測量和顯示溫度

(2)實(shí)現(xiàn)陰歷和陽歷的轉(zhuǎn)化

7設(shè)計(jì)心得

本文的電子鐘系統(tǒng)是以單片機(jī)(STC89C52)為核心,時(shí)鐘芯片DS1302、LED1602顯示等部分組成。具體應(yīng)用Keil2軟件調(diào)試程序以及Proteus軟件進(jìn)行基于單片機(jī)的電子鐘設(shè)計(jì)與仿真。實(shí)現(xiàn)了硬件軟化的目的。

經(jīng)過一段時(shí)間的課程設(shè)計(jì),我們發(fā)現(xiàn)對(duì)于書上很多知識(shí)還不能靈活運(yùn)用,有很多知識(shí)還要我們?nèi)W(xué)習(xí)。此次電子時(shí)鐘的設(shè)計(jì)給我們奠定了一個(gè)實(shí)踐的基礎(chǔ),很是受益匪淺。讓我們認(rèn)識(shí)到學(xué)習(xí)不但要立足于書本,而且要注重實(shí)踐,要以解決理論和實(shí)際教學(xué)中的實(shí)際問題為目的。通過自己的手來解決問題比用腦子解決問題更加深刻。學(xué)習(xí)就應(yīng)該采取理論與實(shí)踐結(jié)合的方式,這種做法既有助于完成理論知識(shí)的鞏固,而且可以加強(qiáng)我們的動(dòng)手和解決實(shí)際問題的能力。


單片機(jī)源程序如下:



  1. ;初始化      

  2.         P_Lcd equ P0            ;液晶lcd數(shù)據(jù)總線
  3.         pq equ p1               ;按鍵接口
  4.         pf bit p2.0             ;蜂鳴器接口
  5.         led bit p2.1            ;led燈指示接口
  6.         lcdrs bit p2.5          ;lcdrs=1選擇數(shù)據(jù)寄存器,lcdrs=0選擇指令寄存器
  7.         lcdrw bit p2.6                ;lcdrw=1進(jìn)行讀操作,lcdrw=0進(jìn)行寫操作
  8.         lcde bit p2.7                ;lcdep由1-->0 時(shí),液晶模塊執(zhí)行命令
  9.         sclk bit p3.5           ;時(shí)鐘芯片時(shí)鐘線引腳
  10.         io bit p3.6             ;時(shí)鐘芯片數(shù)據(jù)傳輸線引腳
  11.         rst bit p3.7            ;時(shí)鐘芯片復(fù)位線引腳
  12.         IsSheZhi bit 30h        ;設(shè)置狀態(tài)標(biāo)示位
  13.         BJ bit 31h              ;比較標(biāo)示位
  14.         QH bit 32h              ;切換標(biāo)示位
  15.         bs bit 33h              ;報(bào)時(shí)功能標(biāo)示位
  16.         cxbs bit 34h            ;執(zhí)行報(bào)時(shí)標(biāo)志位
  17.         sec equ 50h
  18.         min equ 51h
  19.         hour equ 52h
  20.         day equ 53h
  21.         week equ 54h
  22.         month equ 55h
  23.         year equ 56h
  24.         KeyCode equ 57h         ;按鍵1功能子程序序號(hào)存儲(chǔ)地址
  25.         jiepai equ 58h          ;存放報(bào)時(shí)聲音的節(jié)拍常數(shù)
  26.         chuzhi equ 59h          ;報(bào)時(shí)開始秒時(shí)間常數(shù)
  27.         shengshu equ 5ah        ;存放報(bào)時(shí)聲數(shù)
  28.         DspBuf equ 60h          ;當(dāng)前時(shí)間拆字后存儲(chǔ)首地址
  29.         dspba  equ 70h          ;鬧鐘時(shí)間首地址
  30. org 0h
  31.         ljmp main
  32.         org 00bh
  33.         ljmp sub1
  34. org 01bh
  35.         ljmp sub2
  36.         org 30h

  37. ;主程序      

  38. main:
  39.         clr IsSheZhi
  40.         clr QH
  41.         setb BJ
  42.         setb bs
  43.         setb cxbs
  44.         mov  KeyCode,#00h
  45.         mov sp ,#30h
  46.         mov year,#16h            ;為當(dāng)前時(shí)間賦初值
  47.         mov month,#06h
  48.         mov week,#4h
  49.         mov day,#30h
  50.         mov hour,#00h
  51.         mov min,#00h
  52.         mov sec,#00h
  53.         mov DspBuf-1,#0h
  54.         mov DspBuf-2,#02h
  55.         mov jiepai,#80h          ;設(shè)置節(jié)拍常數(shù)
  56.         mov chuzhi,#00h          ;設(shè)置1秒時(shí)開始報(bào)時(shí)
  57.         mov dspba+0,#00h         ;為鬧鐘時(shí)間賦初值
  58.         mov dspba+1,#09h
  59.         mov dspba+2,#0h
  60.         mov dspba+3,#0h
  61.         mov TH0,#0ffh
  62.         mov TL0,#0ffh
  63.         mov TH1,#0ffh
  64.         mov TL1,#0ffh
  65.         mov IE,#8aH
  66.         mov TMOD,#11h
  67.         setb pf
  68.         acall lcd_init          ;調(diào)LCM的初始化程序
  69.         lcall word              ;把自創(chuàng)字符寫入CGRAM的子程序
  70.         lcall set1302           ;DS1302初始化
  71. mainloop:
  72.         jb IsSheZhi, SheZhi     ;判斷是否處于設(shè)置狀態(tài),處于設(shè)置狀態(tài)則跳轉(zhuǎn)
  73.         lcall get1302           ;調(diào)讀時(shí)間子程序
  74.         lcall chaizi
  75.         lcall display           ;調(diào)顯示子程序,顯示當(dāng)前時(shí)間與溫度
  76. SheZhi:        
  77.         jb BJ,xq                ;判斷鬧鐘功能是否開啟,未開啟則跳轉(zhuǎn)
  78.         lcall bijiao            ;調(diào)比較子程序,比較當(dāng)前時(shí)間與鬧鐘時(shí)間
  79. xq:  
  80.         lcall  anjian           ;按鍵掃描
  81.         jb bs,bs_1
  82.         lcall zhengshi          ;判斷當(dāng)前時(shí)間是否是整時(shí),即能否報(bào)時(shí)
  83. bs_1:   
  84.         jb cxbs,cx_1
  85.         lcall baoshi            ;執(zhí)行報(bào)時(shí)功能
  86. cx_1:   
  87.         sjmp mainloop

  88. ;液晶顯示初始化設(shè)定            

  89. lcd_init:
  90.         mov a,#01h                ;清除LCD的顯示內(nèi)容(清屏)
  91.         acall LcdWrCmd
  92.         mov a,#10                ;10ms延時(shí)
  93.         acall delay
  94.         mov a,#38h              ;顯示模式設(shè)置(使用8位數(shù)據(jù),顯示兩行,使用5*7的字型)
  95.         acall LcdWrCmd
  96.         mov a,#10
  97.         acall delay
  98.         mov a,#0ch                ;顯示開及光標(biāo)設(shè)置(顯示器開,光標(biāo)關(guān),字符不閃爍)
  99.         acall LcdWrCmd
  100.         mov a,#10
  101.         acall delay
  102.         mov a,#06h                ;顯示光標(biāo)移動(dòng)設(shè)置(字符不動(dòng),光標(biāo)自動(dòng)右移)
  103.         acall LcdWrCmd
  104.         mov a,#10
  105.         acall delay
  106.         ret

  107. ;LCM命令嵌入        

  108. LcdWrCmd:
  109.         clr        LCDRW
  110.         clr        LCDRS
  111.         mov        P_Lcd, A
  112.         mov a,#6
  113.         acall delay
  114.         setb        LcdE
  115.         clr        LcdE
  116.         ret

  117. ;LCM數(shù)據(jù)輸入      

  118. LcdWrDat:
  119.         setb        LCDRS
  120.         clr        LCDRW
  121.         mov        P_Lcd, A
  122.         mov a,#6
  123.         acall delay
  124.         setb        LcdE
  125.         clr        LcdE
  126.         ret

  127. ;延時(shí)子程序         

  128. delay:
  129.         mov r7,a           ;設(shè)置a為自定義變量,可省去其他延時(shí)程序的編寫
  130.         d2:        mov r6,#250           ;設(shè)置1ms延時(shí)
  131. d1:
  132.         nop
  133.         nop
  134.         djnz r6,d1
  135.         djnz r7,d2
  136.         ret

  137. ;ds1302初始化程序set1302        

  138. set1302:
  139.         mov a,#8eh               ;寫ds1302控制寄存器地址
  140.         mov b,#00h           ;允許寫操作,將WP位設(shè)置為低電平
  141.         lcall clockwr
  142.         mov a,#8ch           ;寫年初值
  143.         mov b,year
  144.         lcall clockwr
  145.         mov a,#88h           ;寫月初值
  146.         mov b,month
  147.         lcall clockwr
  148.         mov a,#8ah           ;寫星期初值
  149.         mov b,week
  150.         lcall clockwr
  151.         mov a,#86h           ;寫日期初值
  152.         mov b,day
  153.         lcall clockwr
  154.         mov a,#84h           ;寫時(shí)初值
  155.         mov b,hour
  156.         lcall clockwr
  157.         mov a,#82h           ;寫分初值        
  158.         mov b,min
  159.         lcall clockwr
  160.         mov a,#80h           ;寫秒初值
  161.         mov b,sec
  162.         lcall clockwr
  163.         ret

  164. ;讀時(shí)間子程序get1302     

  165.         get1302:mov a,#81h           ;讀秒
  166.         lcall clockrd
  167.         mov sec,a
  168.         mov a,#83h           ;讀分
  169.         lcall clockrd
  170.         mov min,a
  171.         mov a,#85h           ;讀時(shí)
  172.         lcall clockrd
  173.         mov hour,a
  174.         mov a,#87h           ;讀日
  175.         lcall clockrd
  176.         mov day,a
  177.         mov a,#8bh           ;讀星期
  178.         lcall clockrd
  179.         mov week,a
  180.         mov a,#89h           ;讀月
  181.         lcall clockrd
  182.         mov month,a
  183.         mov a,#8dh           ;讀年
  184.         lcall clockrd
  185.         mov year,a
  186.         ret

  187. ;ds1302讀子程序     
  188.         clockrd:clr rst    ;rst先設(shè)置低電平,再設(shè)置高電平,起到去亂碼作用
  189.         clr sclk           ;sclk置為低電平
  190.         setb rst           ;rst置為高電平,選通DS1302
  191.         mov r7,#8          ;串行移位傳送次數(shù)
  192. rds1:        
  193.         rrc a
  194.         mov io,c           ;輸出一位寄存器讀地址
  195.         setb sclk          ;發(fā)串行脈沖
  196.         nop
  197.         nop
  198.         clr sclk           ;sclk置為低電平
  199.         djnz r7,rds1
  200.         nop                ;延時(shí),防后面串行讀數(shù)據(jù)丟失
  201.         nop
  202.         setb io            ;8位地址輸出完畢,IO設(shè)置為輸入端口
  203.         mov r7,#8
  204. rds2:  
  205.         mov c,io           ;讀入一位數(shù)據(jù)
  206.         rrc a
  207.         setb sclk          ;發(fā)串行脈沖
  208.         nop
  209.         nop
  210.         clr sclk
  211.         djnz r7,rds2
  212.         clr rst
  213.         setb sclk
  214.         ret

  215. ;ds1302寫數(shù)據(jù)子程序         

  216. clockwr:
  217.         push acc           ;設(shè)置堆棧,入棧
  218.         push b
  219.         clr rst
  220.         clr sclk
  221.         setb rst           ;選通DS1302
  222.         mov r7,#8
  223. wrs1:   
  224.         rrc a
  225.         mov io,c           ;輸出一位寄存器寫地址
  226.         clr sclk           ;發(fā)串行輸出脈沖
  227.         setb sclk
  228.         djnz r7,wrs1
  229.         nop
  230.         mov a,b            ;將待寫入數(shù)據(jù)送A
  231.         mov r7,#8
  232. wrs2:   
  233.         rrc a
  234.         mov io,c           ;經(jīng)IO輸出一位數(shù)據(jù)
  235.         clr sclk
  236.         setb sclk
  237.         djnz r7,wrs2
  238.         pop b              ;出棧
  239.         pop acc
  240.         ret

  241. ;顯示設(shè)置—— 分配時(shí)間顯示空間   

  242. chaizi:
  243.         mov a,year          ;拆年
  244.         mov r0,#60h
  245.         acall hex2bcd
  246.         mov a,month            ;拆月
  247.         mov r0,#62h
  248.         acall hex2bcd
  249.         mov a,day            ;拆日期
  250.         mov r0,#64h
  251.         lcall  hex2bcd
  252.         mov a,week;
  253.         mov 66h,a
  254.         mov a,hour            ;拆時(shí)
  255.         mov r0,#67h
  256.         lcall  hex2bcd
  257.         mov a,min
  258.         mov r0,#69h            ;拆分
  259.         lcall  hex2bcd
  260.         mov a,sec
  261.         mov r0,#6bh            ;拆秒
  262.         acall hex2bcd
  263.         ret

  264. ;顯示設(shè)置—— 采用除法指令實(shí)現(xiàn)的拆字子程序

  265. hex2bcd:
  266.         mov b,a
  267.         anl a,#0f0h
  268.         swap a
  269.         mov @r0,a
  270.         mov a,b
  271.         anl a,#0fh
  272.         inc r0
  273.         mov @r0,a
  274.         ret

  275. ;顯示設(shè)置——連續(xù)顯示相鄰的兩字節(jié)

  276. LcdDspBuf:
  277.         mov A, @R0
  278.         orl a,#30h
  279.         acall LcdWrDat
  280.         inc R0
  281.         djnz R2, LcdDspBuf
  282.         ret

  283. ;顯示設(shè)置——自創(chuàng)字符寫入CGRAM的子程序

  284. word:         
  285.         mov a,#40h
  286.         lcall LcdWrCmd
  287.         mov r5,#40
  288.         mov dptr,#tab1
  289.         mov r4,#0
  290. nextt:         
  291.         mov a,r4
  292.         movc a,@a+dptr
  293.         lcall LcdWrDat
  294.         inc r4
  295.         djnz r5,nextt
  296.         ret
  297. tab1:        
  298.         db 08h,0fh,12h,0fh,0ah,1fh,02h,00h;年
  299.         db 0fh,09h,0fh,09h,0fh,09h,13h,00h;月
  300.         db 0fh,09h,09h,0fh,09h,09h,0fh,00h;日
  301.         db 06h,0fh,1fh,0fh,07h,1bh,19h,00h;顯示鬧鐘功能開啟標(biāo)示符號(hào)
  302.         db 15h,15h,04h,11h,1bh,1fh,0eh,00h;顯示報(bào)時(shí)功能開啟標(biāo)示符號(hào)

  303. ;進(jìn)入鬧鐘功能設(shè)置顯示   

  304. display_nz:
  305.         mov a,#0c2h
  306.         acall LcdWrCmd     ;確定鬧鐘時(shí)間的首地址
  307.         mov R0, #dspba+0
  308.         mov R2, #2
  309.         acall LcdDspBuf           ;顯示時(shí)
  310.         mov a,#3ah         ;顯示分隔符號(hào)
  311.         acall        LcdWrDat
  312.         mov R0, #dspba+2
  313.         mov R2, #2
  314.         acall LcdDspBuf           ;顯示時(shí)
  315.         jb BJ,XT           ;判斷鬧鐘功能是否開啟
  316.         mov a,#0c0h
  317.         acall LcdWrCmd
  318.         mov  a,#03h           ;顯示鬧鐘功能開啟標(biāo)示符號(hào)
  319.         acall        LcdWrDat
  320. XT:    ret

  321. ;正常顯示設(shè)置     

  322. display:
  323.         mov a,#80h
  324.         acall LcdWrCmd           ;指明顯示的首地址
  325.         mov R0, #DspBuf-2
  326.         mov R2, #2
  327.         acall LcdDspBuf           ;顯示年份前兩位
  328.         mov R0, #DspBuf+0
  329.         mov R2, #2
  330.         acall LcdDspBuf           ;顯示年后兩位
  331.         mov  a,#00h           ;顯示漢字年
  332.         acall        LcdWrDat
  333.         mov R0, #DspBuf+2
  334.         mov R2, #2
  335.         acall LcdDspBuf           ;顯示月份
  336.         mov  a,#01h           ;顯示漢月字年
  337.         acall        LcdWrDat
  338.         mov R0, #DspBuf+4
  339.         mov R2, #2
  340.         acall LcdDspBuf           ;顯示日期
  341.         mov  a,#02h           ;顯示漢日字年
  342.         acall        LcdWrDat
  343.         mov a,#8ch           ;w指明星期的首地址
  344.         acall LcdWrCmd
  345.         mov a,#57h
  346.         acall        LcdWrDat   ;顯示w
  347.         mov a,#3ah         ;顯示分隔符號(hào)
  348.         acall        LcdWrDat
  349.         mov  a,66h         ;顯示星期值
  350.         orl a,#30h
  351.         acall        LcdWrDat
  352.         jb bs,XtT           ;判斷報(bào)時(shí)功能是否開啟
  353.         mov  a,#04h           ;顯示報(bào)時(shí)功能開啟標(biāo)示符號(hào)
  354.         acall        LcdWrDat
  355. XtT:        
  356.         mov a,#0c2h
  357.         acall LcdWrCmd           ;確定地址
  358.         mov R0, #DspBuf+7
  359.         mov R2, #2
  360.         acall LcdDspBuf           ;顯示時(shí)
  361.         mov a,#3ah         ;顯示分隔符號(hào)
  362.         acall        LcdWrDat
  363.         mov R0, #DspBuf+9
  364.         mov R2, #2
  365. ……………………

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

所有資料51hei提供下載:

電子時(shí)鐘資料.rar (555.89 KB, 下載次數(shù): 550)





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

使用道具 舉報(bào)

沙發(fā)
ID:298105 發(fā)表于 2018-7-4 14:05 | 只看該作者
謝謝分享,我也分享一個(gè)賺積分下載
回復(fù)

使用道具 舉報(bào)

板凳
ID:561084 發(fā)表于 2019-6-12 17:20 | 只看該作者
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

地板
ID:397878 發(fā)表于 2019-12-30 19:35 | 只看該作者
謝謝分享,雖然是匯編,還是有學(xué)習(xí)價(jià)值
回復(fù)

使用道具 舉報(bào)

5#
ID:1072416 發(fā)表于 2023-4-18 11:13 | 只看該作者
真的很有用!!!感謝。!學(xué)到很多!
回復(fù)

使用道具 舉報(bào)

6#
ID:1084325 發(fā)表于 2023-6-15 16:33 | 只看該作者

謝謝分享,我也分享一個(gè)賺積分下載
回復(fù)

使用道具 舉報(bào)

7#
ID:1084325 發(fā)表于 2023-6-15 16:35 | 只看該作者
真的很有用。!感謝。。W(xué)到很多!
回復(fù)

使用道具 舉報(bào)

8#
ID:1079270 發(fā)表于 2023-6-16 09:04 | 只看該作者
除了代碼看不懂,其他的很有價(jià)值
回復(fù)

使用道具 舉報(bào)

9#
ID:1107165 發(fā)表于 2023-12-30 10:44 來自手機(jī) | 只看該作者
功能完美
回復(fù)

使用道具 舉報(bào)

10#
ID:1113925 發(fā)表于 2024-3-25 09:44 | 只看該作者
本帖最后由 QIANDUPDUO 于 2024-4-7 11:06 編輯

謝謝分享,學(xué)到很多,下載了代碼學(xué)習(xí),請(qǐng)問如果將蜂鳴器換成繼電器控制電鈴的話,蜂鳴器設(shè)置那部分代碼需要修改嗎,因?yàn)槌鯇W(xué),不太懂
回復(fù)

使用道具 舉報(bào)

11#
ID:1113925 發(fā)表于 2024-3-25 09:47 | 只看該作者
初始化程序中有定義led燈接口,但是為什么原理圖中沒有畫呢
回復(fù)

使用道具 舉報(bào)

12#
ID:1113925 發(fā)表于 2024-3-25 15:30 | 只看該作者
QIANDUPDUO 發(fā)表于 2024-3-25 09:44
初始化程序中有定義led燈指示接口,但是原理圖中為什么沒有畫呢

芯片不是使用STC89C52嗎,為什么原理圖中畫的卻是AT89C51
回復(fù)

使用道具 舉報(bào)

13#
ID:1113925 發(fā)表于 2024-3-30 17:33 | 只看該作者
awe123 發(fā)表于 2023-6-15 16:35
真的很有用。!感謝!!學(xué)到很多!!

內(nèi)容里面說是用STC89C52來做,但是原理圖里面畫的卻是AT89C51,這是為什么呢,
回復(fù)

使用道具 舉報(bào)

14#
ID:1113925 發(fā)表于 2024-3-30 18:18 | 只看該作者
QIANDUPDUO 發(fā)表于 2024-3-25 15:30
芯片不是使用STC89C52嗎,為什么原理圖中畫的卻是AT89C51

看到有說是keil中找不到STC系列。  可以用AT89C52代替STC89C52
回復(fù)

使用道具 舉報(bào)

15#
ID:1115196 發(fā)表于 2024-4-2 19:47 | 只看該作者
有用 。!學(xué)到好多
回復(fù)

使用道具 舉報(bào)

16#
ID:1137830 發(fā)表于 2024-11-29 13:58 | 只看該作者
感謝分享,51因你出彩
回復(fù)

使用道具 舉報(bào)

17#
ID:1140022 發(fā)表于 2024-12-16 20:06 | 只看該作者
感謝分享,51因你出彩
回復(fù)

使用道具 舉報(bào)

18#
ID:1140183 發(fā)表于 2024-12-18 15:25 | 只看該作者
QIANDUPDUO 發(fā)表于 2024-3-30 18:18
看到有說是keil中找不到STC系列。  可以用AT89C52代替STC89C52

都可以我試過,AT89C51和STC89C516RD+也是一樣的
回復(fù)

使用道具 舉報(bào)

19#
ID:1141948 發(fā)表于 2024-12-30 11:05 | 只看該作者
你好那個(gè)2016年6月30日怎么改成2025年1月1日
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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