找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 29467|回复: 14
收起左侧

单片机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黑下载附件…………
复制代码
0.png
所有资料51hei提供下载:

电子时钟资料.rar (555.89 KB, 下载次数: 520)

回复

使用道具 举报

ID:298105 发表于 2018-7-4 14:05 | 显示全部楼层
谢谢分享,我也分享一个赚积分下载
回复

使用道具 举报

ID:561084 发表于 2019-6-12 17:20 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:397878 发表于 2019-12-30 19:35 | 显示全部楼层
谢谢分享,虽然是汇编,还是有学习价值
回复

使用道具 举报

ID:1072416 发表于 2023-4-18 11:13 | 显示全部楼层
真的很有用!!!感谢!!!学到很多!!
回复

使用道具 举报

ID:1084325 发表于 2023-6-15 16:33 | 显示全部楼层

谢谢分享,我也分享一个赚积分下载
回复

使用道具 举报

ID:1084325 发表于 2023-6-15 16:35 | 显示全部楼层
真的很有用!!!感谢!!!学到很多!!
回复

使用道具 举报

ID:1079270 发表于 2023-6-16 09:04 | 显示全部楼层
除了代码看不懂,其他的很有价值
回复

使用道具 举报

ID:1107165 发表于 2023-12-30 10:44 来自手机 | 显示全部楼层
功能完美
回复

使用道具 举报

ID:1113925 发表于 2024-3-25 09:44 | 显示全部楼层
本帖最后由 QIANDUPDUO 于 2024-4-7 11:06 编辑

谢谢分享,学到很多,下载了代码学习,请问如果将蜂鸣器换成继电器控制电铃的话,蜂鸣器设置那部分代码需要修改吗,因为初学,不太懂
回复

使用道具 举报

ID:1113925 发表于 2024-3-25 09:47 | 显示全部楼层
初始化程序中有定义led灯接口,但是为什么原理图中没有画呢
回复

使用道具 举报

ID:1113925 发表于 2024-3-25 15:30 | 显示全部楼层
QIANDUPDUO 发表于 2024-3-25 09:44
初始化程序中有定义led灯指示接口,但是原理图中为什么没有画呢

芯片不是使用STC89C52吗,为什么原理图中画的却是AT89C51
回复

使用道具 举报

ID:1113925 发表于 2024-3-30 17:33 | 显示全部楼层
awe123 发表于 2023-6-15 16:35
真的很有用!!!感谢!!!学到很多!!

内容里面说是用STC89C52来做,但是原理图里面画的却是AT89C51,这是为什么呢,
回复

使用道具 举报

ID:1113925 发表于 2024-3-30 18:18 | 显示全部楼层
QIANDUPDUO 发表于 2024-3-25 15:30
芯片不是使用STC89C52吗,为什么原理图中画的却是AT89C51

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

使用道具 举报

ID:1115196 发表于 2024-4-2 19:47 | 显示全部楼层
有用 !!!学到好多
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表