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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機LCD1602顯示電子時鐘設計,含匯編程序,原理圖、仿真結果、實物圖、論文

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

題    目: 基于52單片機電子時鐘的設計
學    院:     物理與機電工程學院         
專    業:     電子信息科學與技術      
作者姓名:                        
指導教師:  ***    職稱:  講師   

基于52單片機電子時鐘的設計

摘要
本次設計的多功能時鐘系統采用STC89C52單片機為核心器件,利用其定時器/計數器定時和記數的原理,結合液晶顯示電路、時鐘芯片DS1302電路、電源電路以及按鍵電路來設計計時器。將軟硬件有機地結合起來,使得系統能夠實現液晶顯示,顯示有年、月、日、時、分、秒以及星期,還可以設置鬧鐘和整點報時。其中軟件系統采用單片機匯編語言編寫程序,包括顯示程序、鬧鐘程序、中斷、延時程序,按鍵消抖程序等,并在keil中調試運行,硬件系統利用PROTEUS強大的功能來實現,簡單且易于觀察,在仿真中就可以觀察到實際的工作狀態。

1 設計任務及要求分析

1.1 設計任務:基于單片機的電子時鐘設計

1.2 要求:

1.2.1 用LCD液晶作為顯示設備

1.2.2 可以分別設定小時、分鐘和秒,復位后時間為 00 00 00

1.2.3 能實現日期的設置年、月、日

1.3 擴展要求:如鬧鐘功能、顯示星期、整點音樂報時等

2 系統方案

2.1 系統整體方案的論證

電路原理設計是基于小系統板包括電源電路、復位電路、按鍵電路、DS1302時鐘電路、液晶顯示驅動電路、輸出控制電路。電源部分是用電池來提供的3v-5v,晶體振蕩器采用的是12MHz的石英晶體振蕩器。

整個系統用單片機為中央控制器,由單片機執行采集時鐘芯片的時間信號并通過顯示模塊來輸出信號及相關的控制功能。時鐘芯片產生時鐘信號,利用單片機的I/O口傳給單片機;并通過I/O口實現LCD的顯示。系統設有4個獨立式按鍵可以對時間年、月、日和星期進行調整,還可以設置鬧鐘。具體如圖2.1所示:         

圖2.1  系統整體框圖


3 硬件設計與實現

3.1單片機最小系統  

STC89C52是一款非常適合單片機初學者學習的單片機,它完全兼容傳統的8051,8031的指令系統,他的運行速度要比8051快最高支持達33MHz的晶體震蕩器,在此系統中使用12MHz的晶振。

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

3.2振蕩電路的工作原理

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

3.1  振蕩電路

3.2時鐘電路的工作原理

片內時鐘發生器實質是個2分頻的觸發其輸入來自振蕩器的fosc,輸出為2相時鐘信號,即節拍信號P1、P2,器頻率為fosc\2。2個節拍為1個狀態時鐘S。狀態時鐘再3分頻后為ALE信號,其頻率為fosc\6,狀態時鐘6分頻后為機器周期信號,器頻率為fosc\12。特殊功能寄存器PCON的PD位可以控制振蕩器的工作,當PD=0時,振蕩器停止工作,單片機進入低功耗工作狀態,復位后,PD=0,振蕩器正常工作。時鐘電路如圖3.2所示:

3.2時鐘電路

3.3單片機最小系統電路圖

3.3單片機最小系統電路圖

3.4 時鐘芯片

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





圖3.4時鐘引腳圖


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

寄存器名

讀寫地址

取值范圍

位定義

寫操作

讀操作

D7

D6

D5

D4

D3

D2

D1

D0

秒寄存器

80H

81H

00-59

CH

秒十位

秒個位

分寄存器

82H

83H

00-59

0

分時位

分個位

時寄存器

84H

85H

01-12或00-23

12/24

0

AM/PM

十位

小時個位

日期寄存器

86H

87H

01-28-31

0

0

十位

日個位

星期寄存器

8AH

8BH

01-07

0

0

0

0

星期位

月寄存器

88H

89H

01-12

0

0

0

十位

月個位

年寄存器

8CH

8DH

00-99

年十位

年個位

控制寄存器

控制寄存器

8EH

8EH

8FH

8FH


WP

WP

0

0

0

0

0

0

0

0



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

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

3.5 液晶顯示電路

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

圖3.5 液晶顯示器實圖

圖3.6 液晶顯示電路圖


引腳號

引腳名稱

引腳功能含義

1

Vss

地管腳(GND)

2

Vdd

+5V電源引腳(Vcc)

3

Vo

液晶顯示驅動電源(0~5V),可接電位器

4

RS

數據和指令選擇控制端,RS=0:命令/狀態RS=1:數據

5

R/W

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

6

E

數據讀寫操作控制位,E線向LCD模塊發送一個脈沖,LCD模塊與單片機之間將進行一次數據轉換

7~14

DB0~DB7

數據線,可以用8位連接,也可以用高四位連接,節約資源

15

A

背光控制正電源

16

K

背光控制地

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

3.6 輸出控制電路

在P2.0端口接一個蜂鳴器,用于整點報時和響鬧鈴。具體如圖3.7所示:

圖3.7輸出控制電路圖

3.7按鍵電路

本次設計采用按鍵電平復位,按鍵電平復位相當于按復位鍵后,復位端通過電阻與Vcc電源接通,按鍵電路圖如圖3.8所示:

圖3.8按鍵電路圖


4 軟件設計與實現

4.1軟件總體設計方案

4.1.1 軟件設計目標

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

4.1.2 總體架構說明

該時鐘程序設計思路如下:

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

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

  (3)開始主程序進行程序掃描,先掃描拆字子程序,將分配好的時分秒等高地位的數字調入到顯示子程序中。→顯示子程序通過分配的空間對應口將拆字子程序的內容在液晶顯示器上顯示相應的時分秒,再調用走時程序使時鐘進行讀秒等工作。→進入按鍵掃描,判斷按鍵是否有變動,若有就根據設計程序對相應的按鍵按入次數而進行實現相應的功能。如進入時間調整、鬧鐘設置、鬧鐘開啟與否等。→進入鬧鐘的判斷,在時分上與設置的鬧鈴時間吻合的話就做相對應的判斷,再依據是否有開啟鬧鐘而進行響鈴與否,如果有響鈴則設置其一直響鈴知道有人為按取消按鍵取消鬧鈴。→進入整點報時掃描,判斷是否在時分上都進入了整點,如果是就報時,然后就退出整點報時,等到下一個整點的到來。→最后返回主程序頭重新依次掃描。顯示過程設有消隱,按鍵設有去抖。

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


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

子程序名稱

功能

改變

Sub1

鬧鐘

Pf

Sub2

報時一聲

Pf、th1、jiepai

zhengshi

判斷當前時間是否是整時

shengshu 、cxbs

baoshi

執行報時功能

Shengshu、cxbs

bijiao

判斷是否到鬧鐘時間

TR0

opr00

設置當前時間狀態

IsSheZhi、r1、KeyCode

opr01

進入設置鬧鐘時間狀態

IsSheZhi、r1、KeyCode

opr02

把所設置的時間作為當前時間

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

opr03

把所設置的時間作為鬧鐘時間

KeyCode、IsSheZhi

write

DS18b20寫

DQ、r4、r7

read

DS18b20讀

DQ、r0、r4、r5、r7

set1302

ds1302初始化

Rst、Sclk、r0、r1、r6

get1302

讀出秒,分,時,日,月,星期,年讀出秒,分,時,日,月,星期,年

Rst、Sclk、r0、r1、r6

clockrd

ds1302讀子程序

Sclk 、r7

Ds1302R

ds1302寫數據子程序

Sclk 、r7

chaizi

時鐘拆字

DspBuf、b、r0

Initdisplay

初始狀態顯示

Dptr

dispGD

固定字符顯示


word

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


LcdDspBuf

寫入顯示數字

R0、R2

LcdWrDat

寫入數據

LCDRS、LCDRW、LcdE

LcdWrCmd

寫入命令

LCDRS、LCDRW、LcdE

lcd_init

LCD初始化


delay

延時

r6、r7

anjian1

執行按鍵1的功能

KeyCode、IsSheZhi

anjian2

執行按鍵2的功能

KeyCode、IsSheZhi

anjian3

執行按鍵3的功能

KeyCode、QH

anjian4

執行按鍵4的功能

KeyCode、bs

www

www

www

掃描當前時間編輯位


wwwa

掃描鬧鐘時間編輯位


yan500ms

延時500ms


hex2bcd

拆字子程序


display_nz

顯示鬧鐘時間



表4-1  子程序詳解表

4.2按鍵模塊設計

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

4.2.1 按鍵1的說明

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

(1)子程序0的功能為:進入設置當前時間狀態,且令keycode=2;

(2)子程序1的功能為:進入設置鬧鐘時間狀態,且令keycode=3;

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

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

每次按下按鍵1,按鍵1程序根據的KeyCode內容轉入各對應的子程序中(因為當KeyCode值不同時,經過計算得到dptr的值不同,然后經過jmp @a+dptr指令就可跳轉到不同的子程序中,具體程序說明),從而實現不同的功能。

從各按鍵的功能可知,每次按下按鍵1,都會改變KeyCode內容,使按鍵1的功能發生改變。

4.2.2  按鍵2的說明  

按鍵2有兩種不同的功能:對應于設置狀態為加1;對應于非設置狀態為切換屏幕。所以按鍵2程序開頭就先判斷鬧鐘是否處于設置狀態。

當鬧鐘處于非設置狀態時,keycode等于0或1;處于設置狀態時,keycode等于2或3;所以可用如下語段判斷鬧鐘是否處于設置狀態:

當鬧鐘處于設置狀態,keycode值大于2,c等于0

當鬧鐘處于非設置狀態,keycode值小于2,c等于1

4.2.3 其他按鍵的說明

     剩下3、4按鍵都于按鍵2類似,先判斷是否處于設置狀態,然后轉入不同的語句,不再說明。

4.2.4 報時功能的說明

當報時功能開啟,即bs=0時,LCD上會出現相應的標示符號,此時主程序將掃描zhengshi子程序。

     zhengshi子程序能判斷當前時間是否為整點,若為整點將使cxbs=0,且把hour由BCD碼化為二進制存儲在字節shengshu(為報時聲數,將在baoshi子程序中使用)中,之后主程序將掃描baoshi子程序,即開始報時。

    chuzhi=0, 由baoshi子程序可知,鬧鐘從0秒開始報時,當報時完畢將自動令cxbs=1。

4.2.5 鬧鐘功能的說明:

當鬧鐘功能開啟,即bj=0時,LCD上會出現相應的標示符號此時,主程序將掃描zhengshi子程序。zhengshi子程序對當前時間和鬧鐘時間進行比較,當它們的分、時全相等時開啟中斷sub1,否則關閉中斷sub1。這樣就可實現鬧鐘鬧鈴一分鐘后自動停止鳴叫的要求。

4.2.6 加1、移位功能的說明

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

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

    當前時間各編輯位在LCD上的位置表。然后執行mov r1,#DspBuf+12; inc @r1就可實現對秒個位加1。執行:dec r1和子程序www就可實現移位功能.

4.3 時鐘模塊設計

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

4.4 液晶顯示模塊設計

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

5 實物調試及測試

5.1 實物圖

圖5.1 實物圖

5.2 實物調試

  • 按下K1鍵進入調節功能選擇狀態

圖5.2 K1鍵功能圖

  • 按下2鍵有加1和顯示調節鬧鐘界面的功能
  • 按下K3鍵進入光標移動功能,選擇調節年、月、日和時間等
  • 按下K4顯示出整點報時圖標

圖5.3 K4鍵功能圖


5.3 測試結果及分析

引腳

測試結果

結論

40(VCC)

電壓值5.09V

良好

31(EA*)

電壓值5.09V

良好

30(ALE)

波形為方波

良好

表5-1 測試結果分析表

5.4仿真結果圖如下所示

圖5.4 K4仿真結果

6 不足與展望

6.1 設計不足之處

  • 沒有停止鬧鐘的硬件功能
  • 沒有實現按鍵減1,只能加1調節時鐘
  • 沒有實現音樂整點報時
  • 沒有安裝三極管,蜂鳴器聲音很小

6.2 設計的展望

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

(2)實現陰歷和陽歷的轉化

7設計心得

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

經過一段時間的課程設計,我們發現對于書上很多知識還不能靈活運用,有很多知識還要我們去學習。此次電子時鐘的設計給我們奠定了一個實踐的基礎,很是受益匪淺。讓我們認識到學習不但要立足于書本,而且要注重實踐,要以解決理論和實際教學中的實際問題為目的。通過自己的手來解決問題比用腦子解決問題更加深刻。學習就應該采取理論與實踐結合的方式,這種做法既有助于完成理論知識的鞏固,而且可以加強我們的動手和解決實際問題的能力。


單片機源程序如下:



  1. ;初始化      

  2.         P_Lcd equ P0            ;液晶lcd數據總線
  3.         pq equ p1               ;按鍵接口
  4.         pf bit p2.0             ;蜂鳴器接口
  5.         led bit p2.1            ;led燈指示接口
  6.         lcdrs bit p2.5          ;lcdrs=1選擇數據寄存器,lcdrs=0選擇指令寄存器
  7.         lcdrw bit p2.6                ;lcdrw=1進行讀操作,lcdrw=0進行寫操作
  8.         lcde bit p2.7                ;lcdep由1-->0 時,液晶模塊執行命令
  9.         sclk bit p3.5           ;時鐘芯片時鐘線引腳
  10.         io bit p3.6             ;時鐘芯片數據傳輸線引腳
  11.         rst bit p3.7            ;時鐘芯片復位線引腳
  12.         IsSheZhi bit 30h        ;設置狀態標示位
  13.         BJ bit 31h              ;比較標示位
  14.         QH bit 32h              ;切換標示位
  15.         bs bit 33h              ;報時功能標示位
  16.         cxbs bit 34h            ;執行報時標志位
  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功能子程序序號存儲地址
  25.         jiepai equ 58h          ;存放報時聲音的節拍常數
  26.         chuzhi equ 59h          ;報時開始秒時間常數
  27.         shengshu equ 5ah        ;存放報時聲數
  28.         DspBuf equ 60h          ;當前時間拆字后存儲首地址
  29.         dspba  equ 70h          ;鬧鐘時間首地址
  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            ;為當前時間賦初值
  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          ;設置節拍常數
  56.         mov chuzhi,#00h          ;設置1秒時開始報時
  57.         mov dspba+0,#00h         ;為鬧鐘時間賦初值
  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          ;調LCM的初始化程序
  69.         lcall word              ;把自創字符寫入CGRAM的子程序
  70.         lcall set1302           ;DS1302初始化
  71. mainloop:
  72.         jb IsSheZhi, SheZhi     ;判斷是否處于設置狀態,處于設置狀態則跳轉
  73.         lcall get1302           ;調讀時間子程序
  74.         lcall chaizi
  75.         lcall display           ;調顯示子程序,顯示當前時間與溫度
  76. SheZhi:        
  77.         jb BJ,xq                ;判斷鬧鐘功能是否開啟,未開啟則跳轉
  78.         lcall bijiao            ;調比較子程序,比較當前時間與鬧鐘時間
  79. xq:  
  80.         lcall  anjian           ;按鍵掃描
  81.         jb bs,bs_1
  82.         lcall zhengshi          ;判斷當前時間是否是整時,即能否報時
  83. bs_1:   
  84.         jb cxbs,cx_1
  85.         lcall baoshi            ;執行報時功能
  86. cx_1:   
  87.         sjmp mainloop

  88. ;液晶顯示初始化設定            

  89. lcd_init:
  90.         mov a,#01h                ;清除LCD的顯示內容(清屏)
  91.         acall LcdWrCmd
  92.         mov a,#10                ;10ms延時
  93.         acall delay
  94.         mov a,#38h              ;顯示模式設置(使用8位數據,顯示兩行,使用5*7的字型)
  95.         acall LcdWrCmd
  96.         mov a,#10
  97.         acall delay
  98.         mov a,#0ch                ;顯示開及光標設置(顯示器開,光標關,字符不閃爍)
  99.         acall LcdWrCmd
  100.         mov a,#10
  101.         acall delay
  102.         mov a,#06h                ;顯示光標移動設置(字符不動,光標自動右移)
  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數據輸入      

  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. ;延時子程序         

  128. delay:
  129.         mov r7,a           ;設置a為自定義變量,可省去其他延時程序的編寫
  130.         d2:        mov r6,#250           ;設置1ms延時
  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位設置為低電平
  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           ;寫時初值
  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. ;讀時間子程序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           ;讀時
  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先設置低電平,再設置高電平,起到去亂碼作用
  189.         clr sclk           ;sclk置為低電平
  190.         setb rst           ;rst置為高電平,選通DS1302
  191.         mov r7,#8          ;串行移位傳送次數
  192. rds1:        
  193.         rrc a
  194.         mov io,c           ;輸出一位寄存器讀地址
  195.         setb sclk          ;發串行脈沖
  196.         nop
  197.         nop
  198.         clr sclk           ;sclk置為低電平
  199.         djnz r7,rds1
  200.         nop                ;延時,防后面串行讀數據丟失
  201.         nop
  202.         setb io            ;8位地址輸出完畢,IO設置為輸入端口
  203.         mov r7,#8
  204. rds2:  
  205.         mov c,io           ;讀入一位數據
  206.         rrc a
  207.         setb sclk          ;發串行脈沖
  208.         nop
  209.         nop
  210.         clr sclk
  211.         djnz r7,rds2
  212.         clr rst
  213.         setb sclk
  214.         ret

  215. ;ds1302寫數據子程序         

  216. clockwr:
  217.         push acc           ;設置堆棧,入棧
  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           ;發串行輸出脈沖
  227.         setb sclk
  228.         djnz r7,wrs1
  229.         nop
  230.         mov a,b            ;將待寫入數據送A
  231.         mov r7,#8
  232. wrs2:   
  233.         rrc a
  234.         mov io,c           ;經IO輸出一位數據
  235.         clr sclk
  236.         setb sclk
  237.         djnz r7,wrs2
  238.         pop b              ;出棧
  239.         pop acc
  240.         ret

  241. ;顯示設置—— 分配時間顯示空間   

  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            ;拆時
  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. ;顯示設置—— 采用除法指令實現的拆字子程序

  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. ;顯示設置——連續顯示相鄰的兩字節

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

  283. ;顯示設置——自創字符寫入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;顯示鬧鐘功能開啟標示符號
  302.         db 15h,15h,04h,11h,1bh,1fh,0eh,00h;顯示報時功能開啟標示符號

  303. ;進入鬧鐘功能設置顯示   

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

  321. ;正常顯示設置     

  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         ;顯示分隔符號
  348.         acall        LcdWrDat
  349.         mov  a,66h         ;顯示星期值
  350.         orl a,#30h
  351.         acall        LcdWrDat
  352.         jb bs,XtT           ;判斷報時功能是否開啟
  353.         mov  a,#04h           ;顯示報時功能開啟標示符號
  354.         acall        LcdWrDat
  355. XtT:        
  356.         mov a,#0c2h
  357.         acall LcdWrCmd           ;確定地址
  358.         mov R0, #DspBuf+7
  359.         mov R2, #2
  360.         acall LcdDspBuf           ;顯示時
  361.         mov a,#3ah         ;顯示分隔符號
  362.         acall        LcdWrDat
  363.         mov R0, #DspBuf+9
  364.         mov R2, #2
  365. ……………………

  366. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:

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





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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

地板
ID:397878 發表于 2019-12-30 19:35 | 只看該作者
謝謝分享,雖然是匯編,還是有學習價值
回復

使用道具 舉報

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

使用道具 舉報

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

謝謝分享,我也分享一個賺積分下載
回復

使用道具 舉報

7#
ID:1084325 發表于 2023-6-15 16:35 | 只看該作者
真的很有用!!!感謝!!!學到很多!!
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

謝謝分享,學到很多,下載了代碼學習,請問如果將蜂鳴器換成繼電器控制電鈴的話,蜂鳴器設置那部分代碼需要修改嗎,因為初學,不太懂
回復

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

內容里面說是用STC89C52來做,但是原理圖里面畫的卻是AT89C51,這是為什么呢,
回復

使用道具 舉報

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

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

使用道具 舉報

15#
ID:1115196 發表于 2024-4-2 19:47 | 只看該作者
有用 !!!學到好多
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品麻豆剧传媒av国产九九九 | 日日夜夜精品免费视频 | 黄色a视频 | 乳色吐息在线观看 | 久久综合久色欧美综合狠狠 | 国产在线精品一区 | 国产韩国精品一区二区三区 | 精品久久久久香蕉网 | 亚洲一区日韩 | av在线免费观看网站 | 成人网在线 | 亚洲福利 | 午夜精品一区二区三区在线观看 | 国产成人在线一区二区 | 欧美a级网站 | 欧美三区视频 | 亚洲国产免费 | 精品国产第一区二区三区 | 黄色网一级片 | 99视频入口| 精品九九在线 | 国产欧美在线一区二区 | 97起碰| 在线免费观看a级片 | 99国产精品99久久久久久粉嫩 | 欧美精品中文字幕久久二区 | 国产成人精品999在线观看 | 免费成人高清 | 三极网站 | 亚洲欧美视频 | 日韩精品一区二区三区中文字幕 | 观看av| 妹子干综合 | 鸳鸯谱在线观看高清 | 国产精品a一区二区三区网址 | 国产欧美三区 | 久久久久久免费毛片精品 | 亚洲天堂久久新 | 青青草原综合久久大伊人精品 | 黄网站涩免费蜜桃网站 | 在线黄av |