时钟芯片DS1302 8位数码管显示

合集下载

ds1302数码管显示应用

ds1302数码管显示应用
buff=ReadByte(Read_Min); //分
scanbuff[2]=buff/16;//十位
scanbuff[3]=buff%16;//个位
buff=ReadByte(Read_Sec); //秒
scanbuff[4]=buff/16;//十位
scanbuff[5]=buff%16;//个位
void WriteDS1302(void);//向DS1302写入时间。
void ReadDS1302(void);//读取DS1302中的年,月,日,星期几,小时,分钟和秒.
void SendCmd(unsigned char cmd);//传送地址
void delayus(unsigned char tt);
}
//读取地址RCmd的时间/数据
unsigned char ReadByte(unsigned char RCmd)
{
unsigned char valu=0x00,temp;
CE=0;//初使化
SCLK=0;//初使化,并为rise edge做准备
CE=1;//初使化,传输开始。The SCLK must be low when CE is driven to high level.
#defineRead_Mon0x89
#defineRead_Day0x8b
#defineRead_Yea0x8d
#define CLK_BurstW0xbf//时钟突发模式写
#define CLK_BurstR0xbf//时钟突发模式读
#define Write_RAM_Begin0xc0//RAM第一个字节写指令
sbit _74hc154_D = P1^3;

ds1302数码管显示

ds1302数码管显示

DS1302应用刚学单片机,好多好奇,所以想做个简单的时钟。

下面是PROTEUS仿真电路和电路图,简单易懂。

文笔不好,说了多余。

下面是程序。

#include<reg52.h>#include<intrins.h>#include<ds1302.h>#define uint unsigned int#define uchar unsigned char#define BCDTUAN(str) (str/10*16+str%10) //定义宏,将要写入DS1302的时间转化为BCD码#define Write_Sec 0x80#define Write_Min 0x82#define Write_Hou 0x84#define Write_Dat 0x86#define Write_Mon 0x88#define Write_day 0x8a#define Write_Yea 0x8c#define Write_WP 0x8e //写保护位#define Write_TCR 0x90#define Read_Sec 0x81#define Read_Min 0x83#define Read_Hou 0x85#define Read_Dat0x87#define Read_Mon 0x89#define Read_Day 0x8b#define Read_Yea 0x8d#define CLK_BurstW 0xbf //时钟突发模式写#define CLK_BurstR 0xbf //时钟突发模式读#define Write_RAM_Begin 0xc0 //RAM第一个字节写指令#define Read_RAM_Begin 0xc1 //RAM第一个字节读指令#define RAM_BurstW 0xfe //突发模式写RAM#define RAM_BurstR 0xff //突发模式读RAMsbit _74hc154_A = P1^0;sbit _74hc154_B = P1^1;sbit _74hc154_C = P1^2;sbit _74hc154_D = P1^3;sbit CE =P1^6;sbit SCLK=P1^5;sbit IO =P1^4;uchar code scan[][4]={{0,0,0,0},{0,0,0,1},{0,0,1,0},{0,0,1,1},{0,1,0,0},{0,1,0,1},{0,1,1,0},{0,1,1,1},{1,0,0,0},{1,0,0,1},{1,0,1,0},{1,0,1,1},{1,1,0,0},{1,1,0,1},{1,1,1,0},{1,1,1,1}};uchar scanbuff[]={0,0,0,0,0,0,0,0,0,0,0,0};uchar code dispdate[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};void WriteDS1302(void); //向DS1302写入时间。

ds1302数字时钟芯片

ds1302数字时钟芯片

《DS1302数字时钟芯片》1. 内置电池备份功能,确保时间信息在断电情况下依然准确无误;2. 精度高,每月误差不超过±30秒;3. 支持秒、分、时、日、月、周、年的计时,满足日常生活和工作需求;4. 通过串行通信接口与单片机或其他设备进行数据交换,操作简单;5. 超低功耗设计,节能环保。

下面,让我们详细了解DS1302数字时钟芯片的内部结构、工作原理及实际应用。

《DS1302数字时钟芯片》二、内部结构与关键特性1. 时钟模块:包含了时钟振荡器、分频器以及时钟计数器。

振荡器采用32.768kHz的晶振,保证了时间的精确度。

分频器将振荡器输出的频率分频至1Hz,供时钟计数器使用。

2. RAM存储器:DS1302内置31字节静态RAM,可用于存储临时数据或用户自定义信息,方便在不干扰时钟运行的情况下进行数据保存。

3. 电源管理模块:DS1302具备掉电保护功能,当外部电源断电时,内置的锂电池可以自动为芯片供电,确保时钟正常运行。

4. 串行接口:采用三线接口(时钟线、数据线、复位线),简化了与外部设备的连接,便于实现数据的同步传输。

三、工作原理1. 初始化:通过复位线将DS1302复位,使其进入待命状态,准备接收命令。

2. 命令发送:单片机或其他控制器通过串行接口向DS1302发送命令,包括读/写时钟数据、RAM数据等。

3. 数据交换:在命令发送后,DS1302根据命令类型进行数据读出或写入操作。

数据传输过程中,时钟线控制数据同步,数据线传输数据位。

4. 数据处理:单片机接收到DS1302的数据后,可进行时间显示、闹钟设置等操作。

四、实际应用1. 智能家居:作为时间基准,用于家庭安防、照明、温控等系统的定时控制。

2. 儿童手表:为孩子提供准确的时间显示,便于家长监控和管理孩子的作息。

3. 工业自动化:在生产线控制、设备维护等领域,实现精确的时间记录和任务调度。

4. 环境监测:结合其他传感器,实现对环境数据的实时采集和记录,为环境保护提供数据支持。

ds1302芯片

ds1302芯片

ds1302芯片DS1302芯片是一种实时时钟(RTC)芯片,由Maxim集成电路公司生产。

它是一款非常强大和广泛应用的芯片,具有可靠的性能和低功耗。

本文将对DS1302芯片进行详细介绍。

首先,DS1302芯片主要用于系统中对时间进行实时监控和记录。

它可以精确地记录年、月、日、小时、分钟和秒,并且可以显示星期几。

可以使用8位的数据总线进行通信,方便地与其他设备进行连接。

其次,DS1302芯片具有非常低的功耗。

在正常工作模式下,它只需要2.0V至5.5V的供电电压,并且可以使用电池备份供电,以防止停电时数据丢失。

在备份供电模式下,芯片的功耗非常低,仅为0.2μA。

此外,DS1302芯片具有时钟校正功能。

它可以通过外部的32.768kHz晶体振荡器来校准内部时钟,以确保精准的时间记录。

这样可以减少时间误差,使得芯片的性能更加可靠。

同时,DS1302芯片还具有多种功能。

它支持两种不同的数据格式:BCD(二进制编码十进制)和二进制。

可以根据系统的需求选择不同的格式。

此外,芯片还具有写保护功能,可以防止未经授权的数据修改。

此外,DS1302芯片还具有温度传感器。

它可以测量环境温度,并将结果以数字形式传回主控制器。

这对于需要监控环境温度的应用非常有用。

最后,DS1302芯片可广泛应用于各种电子设备中。

例如,它可以用于电子钟、计时器、温控系统、数据记录器等。

其性能可靠,并具有广泛的兼容性。

总之,DS1302芯片是一款非常强大和广泛应用的实时时钟芯片。

它具有高度精确的时间记录功能、低功耗、时钟校正功能、多种数据格式支持、写保护功能和温度传感器等特点。

通过DS1302芯片,可以为各种电子设备提供准确、可靠的时间显示和记录功能。

DS1302时钟芯片

DS1302时钟芯片

第十四讲时钟芯片DS1302DS1302 是DALLAS 公司推出的涓流充电时钟芯片,内含有一种实时时钟/日历和31 字节静态RAM ,通过简朴的串行接口与单片机进行通信。

实时时钟/日历电路提供秒、分、时、日、周、月、年的信息,每月的天数和闰年的天数可自动调节。

时钟操作可通过AM/PM 批示决定采用24 或12 小时格式。

DS1302 与单片机之间能简朴地采用同时串行的方式进行通信,仅需用到三个口线:(1)RES 复位(2)I/O数据线(3)SCLK串行时钟。

时钟/RAM 的读/写数据以一种字节或多达31个字节的字符组方式通信。

DS1302 工作时功耗很低保持数据和时钟信息时功率不大于1mW。

DS1302由DS1202改善而来增加了下列的特性:双电源管脚用于主电源和备份电源供应,Vcc1为可编程涓流充电电源,附加七个字节存储器。

它广泛应用于电话、传真、便携式仪器以及电池供电的仪器仪表等产品领域下面。

将重要的性能指标作一综合:★ 实时时钟含有能计算2100 年之前的秒、分、时、日、星期、月、年的能力,尚有闰年调节的能力★ 31 8位暂存数据存储RAM★ 串行I/O口方式使得管脚数量最少★ 宽范畴工作电压2.0 5.5V★ 工作电流2.0V时,不大于300nA★ 读/写时钟或RAM 数据时有两种传送方式单字节传送和多字节传送字符组方式★ 8 脚DIP封装或可选的8脚SOIC封装根据表面装配★ 简朴3线接口★ 与TTL兼容Vcc=5V★ 可选工业级温度范畴-40---+85★ 双电源管用于主电源和备份电源供应以上是DS1302的某些全方面的预览,下列为DS1302管脚图:1)VCC2:主用电源引脚2)X1、X2:DS1302外部晶振引脚3)GND:地4)RST:复位引脚5)I/O:串行数据引脚,数据输出或者输入都从这个引脚6)SCLK:串行时钟引脚7)VCC1:备用电源1)VCC 为主电源接5V,CX10 为滤波电容2)2、外接32.768K 的晶振3)3、 5、6、7 脚分别与控制器相联,注意外部4.7K 上拉电阻4)4、备用电源脚,注意是3.3V,DS1302 规定备用电源电压稍微低于主用电源下面讲讲DS1302 的具体操作。

课程设计——DS1302数码管显示数字钟的设计1

课程设计——DS1302数码管显示数字钟的设计1

××大学××学院××系课程设计报告××大学××学院××系××课程设计DS1302数码管显示数字钟的设计学生姓名学号所在系专业名称班级指导教师成绩××大学××学院二〇一二年六月摘要:本课程设计要求基于STC89C52单片机实现用8位数码管进行时钟显示。

采用STC89C52单片机和DS1302实时时钟芯片,使用5V电源供电。

时钟可以通过按键切换,数码管显示时、分、秒以及年、月、日,并且可以实现时钟的校准功能。

包括时钟芯片驱动程序,数码管显示及驱动程序。

关键字:单片机,DS1302,时钟电路,数码管显示Abstract: This course is designed 8 digital tube clock display requirements based STC89C52 microcontroller. Using STC89C52 microcontroller and DS1302 real time clock chip, using a 5V power supply. Design of the clock by means of the key switches, digital tube display hours, minutes, seconds, and the year, month, day, and can achieve clock calibration function. Including the driver of the clock chip, digital display and driver.Key words: single chip macrocomputer;DS1302;clock circuit;digital tube display目录1. 总体设计方案 (1)1.1 电子钟功能介绍1.1.1 基本功能介绍 (1)1.1.2 扩展功能介绍 (1)1.2 总体设计方案 (1)1.2.1 计时方案 (1)1.2.2 按键方案 (1)1.2.3 显示方案 (2)2. 单元模块设计 (2)2.1 硬件总电路设计 (2)2.2 显示模块电路设计 (2)2.3 按键调时电路设计 (3)2.4 时钟芯片通信电路 (3)3. 软件模块设计 (4)3.1 主程序设计 (4)3.2 时钟芯片 (5)3.2.1 DS1302内部结构 (5)3.2.2 DS1302的读时序 (6)3.2.3 DS1302的写时序 (6)3.3 键盘调时 (7)4. 设计总结 (8)5. 参考文献 (8)6. 附录 (9)前言数字钟是采用数字电路实现对时、分、秒及数字显示的计时装置,广泛用于个人家庭、车站、办公室等公共场所,成为人们日常生活中的必需品。

基于单片机及DS1302的LED电子钟设计——软件部分

基于单片机及DS1302的LED电子钟设计——软件部分

基于单片机及DS1302的LED电子钟设计——软件部分摘要现代社会的快节奏生活要求人们对时间的掌握越来越精确,随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在逐步地深入,电子钟也逐渐取代传统钟表被广泛应用于生活和工作中。

电子时钟主要是利用电子技术将时钟电子化、数字化,拥有时间精确、体积小、界面友好、可扩展性能强等特点。

本设计以AT89C52芯片作为核心,8位LED数码管显示和DS1302时钟芯片主要组成来实现电子钟的基本功能,并分析了相应软件的设计要点,包括软件设计流程、仿真与调试。

关键词电子钟;单片机;DS1302ABSTRACT Nowadays people need more accurate time to keep up with the high pace of life. With computers in the infiltration and the development of large-scale integrated circuits,SCM application is steadily deepening, while electronic clock is widely used in our life and work taking place of traditional one. the electronic clock mainly uses the electronic technology to make the clock computerized and digitized, with features of accurate time、small size、a friendly user interface and strong expansibility.This design mainly consists of the core chip of AT89S52, 8 light emitting diodes and the clock chip DS1302 to achieve the basic function of the electronic clock, and also analyses the key designing of the corresponding software including software design flow, emulation and debuggingKEY WORDS Electronic clock; Single Chip Microcomputer; DS1302目录1.前言 (1)2.系统核心芯片介绍 (2)2.1 单片机AT89S2简介 (2)2.1.1 芯片主要性能 (2)2.1.2 芯片引脚功能 (2)2.2 时钟芯片DS1302简介 (5)2.2.1 主要功能 (5)2.2.2 内部结构及引脚功能 (5)2.2.3 工作原理 (6)2.2.4 控制字节及寄存器 (7)2.2.5 数据的传送 (8)3.电子钟软件设计 (9)3.1 系统结构图及总流程图 (9)3.2 主程序模块 (10)3.2.1 初始化模块 (10)3.2.2 DS1302读写模块 (12)3.2.3 显示模块 (14)3.2.4 蜂鸣模块 (15)3.2.5 主程序流程图 (16)3.3 中断调整模块 (17)3.3.1 时间中断模块 (17)3.3.2 闹钟调整模块 (20)4.调试结果分析及解决方案 (21)5.总结 ................................................................................................. 错误!未定义书签。

基于单片机及时钟芯片DS1302的电子时钟设计

基于单片机及时钟芯片DS1302的电子时钟设计

目录摘要一、引言 (1)二、硬件电路设计 (2)2.1 主要芯片 (2)2.1.1 微处理器 (2)2.1.2 DS1302简介 (4)2.1.3 DS1302引脚说明 (5)2.1.4 74ls245简介及引脚说明 (5)2.2 时钟硬件电路设计 (6)2.2.1 时钟电路设计 (7)2.2.2 整点报时功能 (8)2.2.3 硬件原理图 (9)三、proteus和keil软件仿真及调试 (9)3.1 电路的仿真 (9)3.2 软件调试 (9)四、C语言程序 (10)五、参考文献 (13)电子时钟主要是利用电子技术将时钟电子化、数字化,拥有时钟精确、体积小、界面友好、可扩展性能强等特点,被广泛应用于生活和工作当中。

另外,在生活和工农业生产中,也常常需要温度,这就需要电子时钟具有多功能性。

本文对当前电子钟开发手段进行了比较和分析,最终确定了采用单片机技术实现多功能电子时钟。

本设计应用AT89C52芯片作为核心,6位LED数码管显示,使用DS1302实时时钟日历芯片完成时钟/日历的基本功能。

这种实现方法的优点是电路简单,性能可靠,实时性好,时间精确,操作简单,编程容易。

本设计主要为实现一款可正常显示时钟/日历、带有定时闹铃的多功能电子时钟。

该电子时钟可以应用于一般的生活和工作中,也可通过改装,提高性能,增加新功能,从而给人们的生活和工作带来更多的方便。

关键词:电子钟;多功能;AT89C52;时钟芯片一、引言时间是人类生活必不可少的重要元素,如果没有时间的概念,社会将不会有所发展和进步。

从古代的水漏、十二天干地支,到后来的机械钟表以及当今的石英钟,都充分显现出了时间的重要,同时也代表着科技的进步。

致力于计时器的研究和充分发挥时钟的作用,将有着重要的意义。

1.1 多功能电子时钟研究的背景和意义20世纪末,电子技术获得了飞速的发展。

在其推动下,现代电子产品几乎渗透到了社会的各个领域,有力的推动和提高了社会生产力的发展与信息化程度,同时也使现代电子产品性能进一步提升,产品更新换代的节奏也越来越快。

DS1302汇编数码管显示8位

DS1302汇编数码管显示8位

/*****************************************电路P1口接74HC573锁存4位数码管位远,P0接4位数码管段选。

P2.5,p2.6,p2.7接DS1302. *****************************************/ORG 0000HAJMP STARTORG 000BHAJMP TIM0SCLK EQU P2^7IO EQU P2^6RST EQU P2^5ALL_FLAG EQU 31H ;标志位SEC EQU 32H ;秒MIN EQU 33H ;分HOUR EQU 34H ;时DAY EQU 35H ;日MON EQU 36H ;月WEEK EQU 37H ;星期YEAR EQU 38H ;年DS_DAT EQU 39HDS_ADD EQU 3AHDS_DATA EQU 3BHS1 EQU r7ORG 70HSTART:MOV TMOD ,#00000001BMOV TH0 ,#HIGH(65536-1000);HIGH和LOW写反了会错MOV TL0 ,#LOW(65536-1000)SETB EASETB ET0SETB TR0LCALL DS_INITLOOP2:CALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYCALL DELAYLCALL DS_R_TIMEsjmp LOOP2DELAY:MOV R1,#10 ;1ms延时子程序D0: MOV R2,#248DJNZ R2,$DJNZ R1,D0RET/***************************************** DS1302写字节函数*****************************************/ DS_W_BYTE:MOV R0,#08MOV A,DS_DATDS_W1:RRC AMOV IO,CNOPSETB SCLKnopCLR SCLKDJNZ R0,DS_W1RET/***************************************** DS1302读字节函数*****************************************/ DS_R_BYTE:SETB IOMOV A,#00HMOV R0,#08DS_R1:MOV C,IORRC ASETB SCLKNOPCLR SCLKNOPDJNZ R0,DS_R1MOV DS_DA T,ARET/***************************************** DS1302读数据函数入口地址存至DS_ADD;读取到的数据存入DS_DA T *****************************************/ DS_R_DAT:CLR RSTNOPCLR SCLKNOPSETB RSTNOPMOV DS_DA T,DS_ADDLCALL DS_W_BYTELCALL DS_R_BYTESETB SCLKCLR RSTNOPNOPSETB SCLKNOPNOPCLR IONOPNOPsetb IONOPNOPRET/***************************************** DS1302写数据函数入口地址DS_ADD,入口数据DS_DA TA*****************************************/ DS_W_DAT:CLR RSTNOPCLR SCLKNOPSETB RSTNOPMOV DS_DA T,DS_ADDLCALL DS_W_BYTEMOV DS_DA T,DS_DATALCALL DS_W_BYTEMOV DS_DA T,ASETB SCLKCLR RSTNOPNOPSETB SCLKNOPNOP ;加了延时CLR IONOPNOPsetb IONOPNOPRET/*****************************************DS1302读时间函数入口地址DS_ADD,*****************************************/DS_R_TIME:MOV DS_ADD,#81HLCALL DS_R_DATMOV SEC,DS_DATMOV DS_ADD,#83HLCALL DS_R_DATMOV MIN,DS_DATMOV DS_ADD,#85HLCALL DS_R_DATMOV HOUR,DS_DATMOV DS_ADD,#87HLCALL DS_R_DATMOV DAY,DS_DATMOV DS_ADD,#89HLCALL DS_R_DATMOV MON,DS_DATMOV DS_ADD,#8BHLCALL DS_R_DATMOV WEEK,DS_DATMOV DS_ADD,#8DHLCALL DS_R_DATMOV YEAR,DS_DATRET/*****************************************DS1302写时间函数入口地址DS_ADD,入口数据*****************************************/DS_W_TIME:CLR RSTCLR SCLKMOV DS_ADD,#8EH ;语序写MOV DS_DATA,#00HLCALL DS_W_DA TMOV DS_ADD,#80HMOV DS_DATA,SECLCALL DS_W_DA TMOV DS_ADD,#82HMOV DS_DATA,MINLCALL DS_W_DA TMOV DS_ADD,#84HMOV DS_DATA,HOURLCALL DS_W_DA TMOV DS_ADD,#86HMOV DS_DATA,DAYLCALL DS_W_DA TMOV DS_ADD,#88HMOV DS_DATA,MONLCALL DS_W_DA TMOV DS_ADD,#8AHMOV DS_DATA,WEEKLCALL DS_W_DA TMOV DS_ADD,#8CHMOV DS_DATA,YEARLCALL DS_W_DA TMOV DS_ADD,#8EH ;写保护MOV DS_DATA,#80HLCALL DS_W_DA TRET/*****************************************DS1302初始化*****************************************/DS_INIT:CLR RSTCLR SCLKMOV DS_ADD,#8EH ;允许写MOV DS_DATA,#00HLCALL DS_W_DA TMOV DS_ADD,#90HMOV DS_DATA,0xa5LCALL DS_W_DA TMOV DS_ADD,#80HMOV DS_DATA,#00HLCALL DS_W_DA TMOV DS_ADD,#82HMOV DS_DATA,#00HLCALL DS_W_DATMOV DS_ADD,#84HMOV DS_DATA,#23HLCALL DS_W_DA TMOV DS_ADD,#86HMOV DS_DATA,#16HLCALL DS_W_DA TMOV DS_ADD,#88HMOV DS_DATA,#12HLCALL DS_W_DA TMOV DS_ADD,#8aHMOV DS_DATA,#02HLCALL DS_W_DA TMOV DS_ADD,#8cHMOV DS_DATA,#14HLCALL DS_W_DA TMOV DS_ADD,#8EH ;写保护MOV DS_DATA,#80HLCALL DS_W_DA TRETTIM0:PUSH ACCPUSH PSWPUSH DPHPUSH DPLPUSH BMOV TH0 ,#HIGH(65536-1000) MOV TL0 ,#LOW(65536-1000) MOV A ,SECMOV B,#16DIV ABMOV 50H ,BMOV 51H, AMOV A,MINMOV B,#16DIV ABMOV 52H,BMOV 53h,AMOV A,HOURMOV B ,#16DIV ABMOV 54H,BMOV 55H,AINC S1MOV DPTR,#TABMOV P1,#0HCJNE S1,#1H,Z1NOPNOPMOV A ,50HMOVC A,@A+DPTRMOV P0,ASETB P1.0SJMP LOOPZ1:CJNE S1,#02H,Z2MOV A,51H MOVC A,@A+DPTRMOV P0,ASETB P1.1SJMP LOOPZ2:CJNE S1,#03H,Z3MOV P0,#0BFH SETB P1.2SJMP LOOPZ3:CJNE S1,#04H,Z4MOV A,52H MOVC A,@A+DPTRMOV P0,ASETB P1.3SJMP LOOPZ4:CJNE S1,#05H,Z5MOV A,53H MOVC A,@A+DPTRMOV P0,ASETB P1.4SJMP LOOPZ5:CJNE S1,#06H,Z6MOV P0,#0BFHSETB P1.5SJMP LOOPZ6:CJNE S1,#07H,Z7MOV A,54HMOVC A,@A+DPTRMOV P0,ASETB P1.6SJMP LOOPZ7:CJNE S1,#08H,Z8MOV A,55HMOVC A,@A+DPTRMOV P0,ASETB P1.7MOV S1,#0HSJMP LOOPZ8:LJMP 00HLOOP:POP BPOP DPLPOP DPHPOP PSWPOP ACCRETITAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFHEND。

DS1302中文资料

DS1302中文资料

DS1302中文资料DS1302是一款低功耗的串行实时时钟芯片,广泛用于各种电子设备中,例如电子表、温度计、计时器等。

该芯片具有高准确度、稳定性和低功耗的特点,功能强大,使用简便。

以下是DS1302芯片的详细中文资料及使用说明。

1.特性:-时钟/日历功能:提供秒、分、时、日期、月份和年份的精确计时和日期记录功能。

-31个可编程的时间/日期寄存器:用于存储时钟和日期信息。

-控制根据电源情况自动选择电池或外部电源。

-8字节RAM用于存储额外的用户信息。

-提供电池低电压检测功能。

-通过3线串行接口与微控制器通讯。

-工作电流小于1.5μA。

2.引脚功能:-VCC:电源正极,3.3V至5V的电源供应。

-GND:地。

-RST:复位引脚,用于启动或复位芯片。

-CLK:时钟引脚,与外部晶振连接。

-DAT:数据引脚,与外部时钟连接。

-VBAT:备用电池引脚,用于提供备用电源。

3.时钟和日历操作:-初始化时钟芯片:首先将RST引脚置为高电平,然后将时钟和日期信息写入相应寄存器。

-读取时钟和日期信息:向相应寄存器发送读取指令,然后从DAT引脚读取数据。

-设置闹钟:将闹钟时间和日期写入相应寄存器,设置闹钟标志位。

-清除闹钟标志位:将闹钟标志位清零,重置闹钟状态。

-自动切换电源:设置使能位,将芯片自动切换为外部电源或电池供电。

4.通信协议:-DS1302使用3线串行接口与微控制器通讯,包括时钟(CLK)、数据(DAT)和复位(RST)引脚。

-通信数据以字节为单位,高位在前,低位在后。

-时钟和数据引脚都是双向引脚,需要使用上拉电阻来保证电平的稳定。

-通信基于时钟的脉冲信号,每个时钟周期有四个时钟脉冲。

5.典型应用:-电子表:DS1302提供精确的时钟和日期计时功能,可用于制作各种类型的电子表。

-温度计:结合温度传感器,可以通过DS1302记录和显示温度信息。

-计时器:通过设置定时器和闹钟功能,可以实现计时和提醒功能。

6.注意事项:-正确连接电源和地引脚,确保电源电压在允许范围内。

数码管显示DS1302

数码管显示DS1302

/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit beep=P3^5;sbit ds1302_RST=P2^5;sbit ds1302_IO=P2^6;sbit ds1302_SCLK=P2^7;sbit ACC0=ACC^0;sbit ACC7=ACC^7;void init();void delay_50us(uint t);void display();uchar read_Byte();void write_Byte(uchar tdata);void write_data_ds1302(uchar taddr,uchar tdata);uchar read_data_ds1302(uchar taddr);void set_ds1302(uchar *P1302);void get_ds1302() ;void init_ds1302();uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};uchar initial_time[]={0x00,0x00,0x12};// 秒分时日月周年uchar data now_time[3];/******************************************//* 主函数*//******************************************/void main(){init();init_ds1302();set_ds1302(initial_time);while(1){get_ds1302();display();}}/******************************************/ /* 延时子程序*/ /******************************************/ void delay_50us(uint t){uchar j;for(;t>0;t--)for(j=19;j>0;j--);}/******************************************/ /* 初始化子程序*/ /******************************************/ void init(){P0=0xff;P2=0xff;P1=0x00;}/******************************************/ /* 数码管显示子程序*/ /******************************************/ void display(){uchar i;P1=0x01;i=now_time[0]%16; //显示秒个P0=table[i];delay_50us(20);P1=0x02;i=now_time[0]/16; //显示秒十P0=table[i];delay_50us(20);P1=0x04;P0=table[10];//显示"-"delay_50us(20);P1=0x08;i=now_time[1]%16; //显示分个P0=table[i];delay_50us(20);P1=0x10;i=now_time[1]/16; //显示分十P0=table[i];delay_50us(20);P1=0x20;P0=table[10]; //显示"-"delay_50us(20);P1=0x40;i=now_time[2]%16; //显示时个P0=table[i];delay_50us(20);P1=0x80;i=now_time[2]/16; //显示时十P0=table[i];delay_50us(10);}/*ds1302模块部分*//******************************************//* 读数据*//******************************************/uchar read_Byte(){uchar i;for(i=8;i>0;i--){ACC=ACC>>1;ACC7=ds1302_IO;//由于ds1302读数据的时候,第一个数据读取在发一个Byte命令后,在第八位的下降沿ds1302_SCLK=1;ds1302_SCLK=0;//产生下降沿输出一位数据}return(ACC);}/******************************************//* 写字节*//******************************************/void write_Byte(uchar tdata){uchar i;ACC=tdata;for(i=8;i>0;i--){ds1302_IO=ACC0;ds1302_SCLK=1;ds1302_SCLK=0;//产生上升沿输入数据ACC=ACC>>1;}}/******************************************//* 写数据*//******************************************/void write_data_ds1302(uchar taddr,uchar tdata){ds1302_RST=0;ds1302_SCLK=0;ds1302_RST=1;write_Byte(taddr);write_Byte(tdata);ds1302_RST=0;ds1302_SCLK=1;}/******************************************//* 读数据*//******************************************/uchar read_data_ds1302(uchar taddr){uchar tdata;ds1302_RST=0;ds1302_SCLK=0;ds1302_RST=1;write_Byte(taddr);tdata=read_Byte();ds1302_RST=0;ds1302_SCLK=1;return(tdata);}/******************************************//* 设置初始时间*//******************************************/void set_ds1302(uchar *P1302){uchar i;uchar taddr = 0x80;write_data_ds1302(0x8e,0x00); /* 控制命令,WP=0,写操作*/ for(i =3; i>0; i--){write_data_ds1302(taddr,*P1302); /* 秒分时日月星期年*/P1302++;taddr+=2;}write_data_ds1302(0x8e,0x80); /* 控制命令,WP=1,写保护*/}/*********************************************************************函数名:get_ds1302()*功能描述:设置初始时间*函数说明:先写地址,后读命令/数据*调用函数:*全局变量:*输入:now_time[];*返回:***********************************************************************/void get_ds1302(){uchar k;uchar taddr = 0x81;for (k=0; k<3.; k++){now_time[k] = read_data_ds1302(taddr);/*格式为: 秒分时日月星期年*/taddr+= 2;}}/******************************************//* 1302初始化*//******************************************/void init_ds1302(){ds1302_RST=0;ds1302_SCLK=0;write_data_ds1302(0x8e,0x00);write_data_ds1302(0x90,0xa5);//打开充电二级管一个二级管串联一个2K电阻}。

DS1302中文手册

DS1302中文手册

DS1302中文手册一、简介DS1302是一种实时时钟芯片,主要用于计算机系统、通信设备、智能家居等领域。

本手册旨在提供DS1302的详细说明和操作方法,帮助用户正确使用该芯片。

二、芯片特性1. 基本特性:- 日期格式:年-月-日- 时间格式:时:分:秒- 温度测量范围:-55℃至+125℃- 时钟频率:32768Hz2. 时钟控制:- 时钟源选择:外部或内部- 时钟暂停功能- 时钟调制功能三、引脚定义DS1302具有8个引脚,分别为:1. X1:外部时钟输入端2. X2:外部时钟输出端3. Vcc:供电正极4. GND:地5. SDA:串行数据输入/输出端6. SCLK:串行数据时钟输入端7. RST:复位控制端8. BAT:电池输入端四、工作原理DS1302基于Bipolar CMOS技术,通过外部提供的时钟信号进行时间计数和存储。

芯片内部包含时钟控制电路、RAM存储器、温度计和时钟计数器等功能模块,通过串行通信协议与外部设备进行数据传输。

五、使用方法1. 芯片初始化:- 将X1和X2连接外部时钟源- Vcc与电源正极相连- GND与地相连2. 设定时间:- 通过串行数据输入将年、月、日、时、分、秒信息写入相应寄存器- 通过串行数据输入将温度信息写入相应寄存器(可选)3. 读取时间:- 通过串行数据输出获取年、月、日、时、分、秒信息- 通过串行数据输出获取温度信息(可选)4. 设置时钟暂停:- 通过串行数据输入将时钟控制字节写入相应寄存器控制位,实现时钟暂停功能5. 时钟调制:- 通过串行数据输入将时钟调制字节写入相应寄存器控制位,实现时钟调制功能六、注意事项1. 确保正确接线,避免短路或浮空引脚2. 使用合适的外部时钟源,确保时钟的准确性3. 避免频繁的读写操作,以延长芯片的使用寿命4. 根据实际需求进行合理设置,避免不必要的功能开启5. 定期校准芯片时间,确保准确性七、总结本手册介绍了DS1302的特性、引脚定义、工作原理以及使用方法,并提供了一些注意事项供用户参考。

DS1302八位数码管C语言可调时钟日历

DS1302八位数码管C语言可调时钟日历
if(++count1==10)
{count1=0;
dao10MS=1;
}
if(!(count%25)) set = !set;
if(count==500)
keyLast=keyTemp;
}
else
{
s_keyState=KEY_STATE_INIT;
}
break;
case KEY_STATE_LONG:
if(keyTemp==KEY_NULL)
{
s_keyState=KEY_STATE_INIT;
keyRetu=(keyLast|KEY_PRESS);
bit set;
bit dao1S=0;
bit dao2MS=0;
bit dao10MS;
bit ss,mm,ff,yue,tian,xq;
sbit key1=P3^0;
sbit key2=P3^1;
sbit key3=P3^2;
sbit key4=P3^3;
sbit key5=P3^4;
int main_flag=0,exit_flag,up_flag,down_flag;
}
uchar asctobcd(uchar cha)
{
return ((cha/10)*16+(cha%10));
}
void timer() interrupt 1
{ static count=0;
static count1=0;
TH0=0XF8;
TL0=0XCC;
dao2MS=1;
count++;
在任意数码管闪烁时,长按K3,该闪烁位值连续增1,长按K4,该闪烁位值连续减1

DS1302时钟数码管显示

DS1302时钟数码管显示

DS1302时钟数码管显示DS1302时钟芯片,大家都知道是什么来的。

不懂的百度下就知道了。

这个只是读取出时间,其它功能没有写出来,用了四位共阳数码管显示。

具体电路和仿真可以到中国电子DIY之家论坛搜索/*********************************** DS1302简单时间显示** 数码管显示************************************/#include#define uchar unsigned char#define uint unsigned int#define W P2 //位选#define D P0 //段选sbit IO=P1^0; //数据口sbit SCLK=P1^1; //控制数据时钟sbit RST=P1^2; //使能端、复位端/************按键引脚定义***********/sbit s1=P1^5; //按键加sbit s2=P1^6; //按键减sbit s3=P1^7; //按键选择char knum=0,snum,fnum;/***********写时分秒地址************/#define write_shi 0x84#define write_fen 0x82#define write_miao 0x80/***********读时分秒地址************/#define read_shi 0x85#define read_fen 0x83#define read_miao 0x81char shi,fen,miao; //读出数据存储变量uchard[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90}; //不带小数点uchardd[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //带小数点void delay(uint z) //延时函数,z的取值为这个函数的延时ms数,如delay(200);大约延时200ms.{ //delay(500);大约延时500ms.uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}uchar read_1302(uchar add) //读函数{uchar i,date;RST=0; //禁止读写数据for(i=0;i<8;i++){RST=1;SCLK=0;IO=add&0x01;add>>=1;SCLK=1;}for(i=0;i<8;i++){if(IO)date=date|0x80;elsedate=date|0x00;SCLK=1;date>>=1;SCLK=0;}RST=0;date=date/16*10+date%16; //进制转换16转10进制IO=0; //数据读完后,IO口必须为0,不然小时一直显示85 return date;}void write_1302(uchar add,uchar dat) //写函数{uchar i;RST=0; //禁止读写数据// SCLK=0;for(i=0;i<8;i++) //写地址{RST=1; //允许读写数据SCLK=0;IO=add&0x01;add>>=1;SCLK=1;}for(i=0;i<8;i++) //写数据{RST=1; //允许读写数据SCLK=0;IO=dat&0x01;dat>>=1;SCLK=1;}RST=0;}void init_1302() //初始化函数设置时间{write_1302(0x8e,0x00); //保护取消,可以进行读写操作write_1302(write_miao,0x56);write_1302(write_fen,0x49);write_1302(write_shi,0x14);write_1302(0x8e,0x80); //保护启动,不能进行读写操作}void display(uchar shi,uchar fen,uchar miao) //显示函数{if(knum==0){snum=30;fnum=30;}if(knum==1){fnum++;snum=30;}if(knum==2){snum++;fnum=30;}if(snum>=30){W=0x01; //位选D=d[shi/10]; //段选delay(5);D=0XFF; //消隐if(miao%2==0) //小数点闪烁{W=0x02;D=dd[shi%10];delay(5);D=0XFF; //消隐}else{W=0x02;D=d[shi%10];delay(5);D=0XFF; //消?}if(snum==60)snum=0;}if(fnum>=30){W=0x04;D=d[fen/10];delay(5);D=0XFF; //消隐W=0x08;D=d[fen%10];delay(5);D=0XFF; //消隐if(fnum==60)fnum=0;}}void read_sf(){shi=read_1302(read_shi);fen=read_1302(read_fen);miao=read_1302(read_miao);display(shi,fen,miao);}void keyscan() //按键扫描函数{if(s3==0) //选择按键按下{delay(10);if(s3==0){while(!s3)display(shi,fen,miao); //加上这句,按键按下就不会闪knum++; if(knum==1) //分闪烁{write_1302(0x8e,0x00); //保护取消write_1302(write_miao,0x80);}if(knum==3) //时钟启动{knum=0;write_1302(write_miao,0x00);write_1302(0x8e,0x80); //保护启动}}}if(knum==1) //分钟调节{if(s1==0) //加{delay(10);if(s1==0){while(!s1)display(shi,fen,miao); //加上这句,按键按下就不会闪fen++; fen=fen/10*16+fen%10; //转为16进制if(fen==0x60)fen=0x00;write_1302(write_fen,fen); //写入1302read_sf(); //读出时间,然后显示}}if(s2==0){delay(10);if(s2==0){while(!s2)display(shi,fen,miao); //加上这句,按键按下就不会闪fen--; fen=fen/10*16+fen%10; //转为16进制if(fen==-1)fen=0x59;write_1302(write_fen,fen);read_sf();}}}if(knum==2){if(s1==0){delay(10);if(s1==0){while(!s1)display(shi,fen,miao); //加上这句,按键按下就不会闪shi++; shi=shi/10*16+shi%10; //转为16进制if(shi==0x24)shi=0x00;write_1302(write_shi,shi);read_sf();}}if(s2==0){delay(10);if(s2==0){while(!s2)display(shi,fen,miao); //加上这句,按键按下就不会闪shi--;shi=shi/10*16+shi%10; //转为16进制if(shi==-1)shi=0x23;write_1302(write_shi,shi);read_sf();}}}}void main(){// init_1302();while(1){read_sf();keyscan();}}。

(完整版)DS1302数码管显示程序

(完整版)DS1302数码管显示程序
clock_s2=clock_s2&0xff;
clock_s1<<=4;
clock_s1=clock_s1|clock_s2;// 10to16
clock_f1=mie/10;
clock_f2=mie%10;
clock_f1=clock_f1&0xff; //全1出1与运算
clock_f2=clock_f2&0xff;
delay(1);P0=0X00;}
if(cant1==5)
cant1=0;
P2=2;
P0=ledmap[10];//显示"-"数组里的0x40
delay(1);
P0=0X00;
if(cant2<=3)
{
P2=3;
P0=ledmap[clock_fs];//分十位
delay(1);
P0=0X00;
P2=4;
if(mie>=60)
{
mie=0;
}
delayAJ(10);
}//以上时钟+设定
}
}
if(down==0)
{
delayAJ(5);//消抖
if(down==0)
{
delayAJ(5);
if(b==1)
{
hour--;
if(hour<0)
{
hour=23;
}
delayAJ(10);
}
if(b==2)
delayAJ(5);
}
while(!set)
{
delayAJ(5);
}
}
if(b!=0)//时分设定
{
if(up==0)

DS1302的工作原理

DS1302的工作原理

DS1302的工作原理DS1302工作时为了对任何数据传送进行初始化,需要将复位脚(RST)置为高电平且将8位地址和命令信息装入移位寄存器。

数据在时钟(SCLK)的上升沿串行输入,前8位指定访问地址,命令字装入移位寄存器后,在之后的时钟周期,读操作时输出数据,写操作时输出数据。

时钟脉冲的个数在单字节方式下为8+8(8位地址+8位数据),在多字节方式下为8加最多可达248的数据。

DS1302的寄存器和控制命令对DS1302的操作就是对其内部寄存器的操作,DS1302内部共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。

此外,DS 1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。

时钟突发寄存器可一次性顺序读写除充电寄存器以外的寄存器。

日历、时间寄存器及控制字如表1所示:7 6 5 4 3 2 1 0寄存器名称1 RAM/CK A4 A3 A2 A1 A0 RD/W秒寄存器 1 0 0 0 0 0 0分寄存器 1 0 0 0 0 0 1小时寄存器 1 0 0 0 0 1 0日寄存器 1 0 0 0 0 1 1月寄存器 1 0 0 0 1 0 0星期寄存器 1 0 0 0 1 0 1年寄存器 1 0 0 0 1 1 0写保护寄存器 1 0 0 0 1 1 1慢充电寄存器 1 0 0 1 0 0 0时钟突发寄存器 1 0 1 1 1 1 1表1:日历、时钟寄存器与控制字对照表最后一位RD/W为“0”时表示进行写操作,为“1”时表示读操作。

DS1302内部寄存器列表如表2所示:命令字取值范围各位内容寄存器名称写读7 6 5 4 3 2 1 0 秒寄存器80H 81H 00-59 CH 10SEC SEC分寄存器82H 83H 00-59 0 10MIN MIN小时寄存器84H 85H 01-12或00-23 12/24 0 A HR HR日期寄存器86H 87H 01-28,29,30,31 0 0 10DATE DATE月份寄存器88H 89H 01-12 0 0 0 10M MONTH周寄存器8AH 8BH 01-07 0 0 0 0 0 DAY年份寄存器8CH 8DH 00-99 10YEAR YEAR表2:DS14302内部主要寄存器分布表DS1302内部的RAM分为两类,一类是单个RAM单元,共31个,每个单元为一个8位的字节,其命令控制字为COH~FDH,其中奇数为读操作,偶数为写操作;再一类为突发方式下的RAM,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

时钟芯片DS1302 8位数码管显示[日期:2011-03-19 ] [来源:本站编辑作者:佚名] [字体:大中小] (投递新闻);8位数码管显示;P0 为段码口、P2 为位码口;时钟芯片:DS1302;--------------------------------------DS1302 端口位定义:IO_DA TA→P1.1 ; 数据传送总线SCLK →P1.0 ; 时钟控制总线RST →P1.2 ; 复位总线;---------------------------------------24C04 端口位定义:SDA→P3.6 ;24C01的串行数据线SCLK →P3.7 ;24C01的串行时钟线;---------------------------------------K1 →P1.4 ;独立键K2 →P1.5K3 →P1.6K4 →P1.7;---------------------------------------BEEP →P3.3 ;蜂鸣器;---------------------------------------使用8位数码管显示:段码→P0位码→P2;---------------------------------------开机显示:08-48-58 ;实时时间的显示,时、分、秒K1: →切换显示内容键,每按一下可切换显示内容,最后返回实时时间的显示。

05-03-06 ;显示年、月、日;--------------------------------------------------------------------K2: →时间与日期设定键,K3: →选择键(位移键)每按一下可切换设定内容,最后返回实际时间的显示。

在设定过程中,被选中的设定位闪动。

选择顺序:时→分→日→月→年→返回K1: →UP 键K2: →DOWN 键;--------------------------------------------------------------------K4: →报警时间设定键。

K3: →设定内容选择键,最后返回实际时间的显示。

在设定过程中,被选中的设定位闪动。

1-07-30 ;07:30 为报警启动时间, 1 为允许报警,0 为禁止报警K1: →UP 键K2: →DOWN 键;--------------------------------------------------------------------K3: →止闹开关在报警期间内,可以控制报警开与关,其它时间无效。

报警方式:采用继电器吸合的方式来控制被控对象。

;************** DS1302 端口位定义**************IO_DA TA BIT P1.1 ; 数据传送总线SCLK BIT P1.0 ; 时钟控制总线RST BIT P1.2 ; 复位总线K1 EQU P1.4 ;独立键K2 EQU P1.5K3 EQU P1.6K4 EQU P1.7BEEP EQU P3.3 ;蜂鸣器RELAY EQU P3.5 ;继电器T_CONU EQU 22H ;中断计数TIME_L EQU 23H ;定时初值TIME_H EQU 24HTIME_DA TA EQU 50H ;显示时间单元首地址DA TE_DA TA EQU 60H ;显示日期单元首地址DS_DA TA EQU 58H ;显示定时时间单元首地址;------------------------------------------------ORG 0000HAJMP MAINORG 000BHAJMP INT_T0ORG 0100H;------------------------------------------------MAIN:MOV TMOD,#01H ;T0,方式1MOV TIME_L,#00H ;50MS定时值MOV TIME_H,#4CHMOV T_CONU,#00H ;中断次数MOV IE,#82H ;EA=1,ET0=1MOV A,#00HMOV R0,#40H ;从40H单元开始MOV R1,#40H ;清64个单元M_CLEAR: MOV @R0,AINC R0DJNZ R1,M_CLEARMOV 7FH,#0AH ;送熄灭符SETB BEEPLCALL TIME_DELAY;调显示延时LCALL PROSET ;DS1302初始化MAIN1:LCALL GET_TIME ;从DS1302读数据程序LCALL CHULI ;实时时间数据处理MOV R0,#TIME_DA TA;显示时、分、秒LCALL DISPMOV R0,#TIME_DA TALCALL TIME_DISPLAYLCALL SET_KEY;键功能程序LCALL COMP ;实时时间与定时时间比较JB K1,MAIN1CALL BEEP_BLMAIN2:LCALL CHULI ;日期数据处理MOV R0,#DA TE_DA TALCALL DISP;显示年、月、日MOV R0,#DA TE_DA TALCALL TIME_DISPLAYJB K1,MAIN2CALL BEEP_BLMAIN3:LCALL DS_CHULI ;定时时间数据处理MOV R0,#DS_DA TALCALL DS_SP ;显示定时时间MOV R0,#DS_DA TALCALL DS_DISPLAYJB K1,MAIN3CALL BEEP_BLAJMP MAIN1;--------------------------------------------;中断服务子程序;300MS对闪动标记取反一次;--------------------------------------------INT_T0:PUSH ACCPUSH PSWMOV TL0,TIME_LMOV TH0,TIME_HINC T_CONUMOV A,T_CONUCJNE A,#06H,INT_ENDMOV T_CONU,#00HCPL 0AHINT_END:POP PSWPOP ACCRETI;--------------------------------------------;DS1302 初始化子程序; (R0)=数据(R1)=地址;--------------------------------------------PROSET:CLR RST ;DS1302复位CLR SCLKNOPNOPSETB RST;MOV R1,#80H ;写秒寄存器;MOV R0,#00H ;启动振荡器;LCALL WRITE;MOV R1,#82H ;写分寄存器;MOV R0,#58H;LCALL WRITE;MOV R1,#84H ;写时寄存器;MOV R0,#80H;LCALL WRITEMOV R1,#90H ;写充电寄存器MOV R0,#0ABHLCALL WRITERET;=============================================== ;读时间、日期数据子程序;存放单元40H - 46H;=============================================== GET_TIME:MOV R1,#81H ;读秒LCALL READMOV 40H,R0MOV R1,#83H ;读分LCALL READMOV 41H,R0MOV R1,#85H ;读时LCALL READMOV 42H,R0MOV R1,#87H ;读出日期LCALL READMOV 43H,R0MOV R1,#89H ;读出月份LCALL READMOV 44H,R0MOV R1,#8BH ;读出星期LCALL READMOV 46H,R0MOV R1,#8DH ;读出年LCALL READMOV 45H,R0RET;================================================ ;写DS1302 子程序;================================================ WRITE:CLR SCLKNOPSETB RSTNOPMOV A,R1MOV R2,#08HWRI_01:RRC A;传输地址到DS1302NOPNOPCLR SCLKNOPNOPMOV IO_DA TA,CNOPNOPSETB SCLKNOPNOPDJNZ R2,WRI_01CLR SCLKNOPNOPMOV A,R0MOV R2,#08HWRI_02:RRC A;传输数据到DS1302NOPCLR SCLKNOPNOPMOV IO_DA TA,CNOPNOPSETB SCLKNOPNOPDJNZ R2,WRI_02CLR SCLKNOPNOPCLR RSTNOPNOP;================================================= ;读DS1302 子程序;================================================= READ:CLR SCLKNOPNOPSETB RSTNOPNOPMOV A,R1MOV R2,#08HREAD_01:RRC ANOP ;先传输地址到DS1302MOV IO_DA TA,CNOPNOPSETB SCLKNOPNOPCLR SCLKNOPNOPDJNZ R2,READ_01NOPNOPSETB IO_DA TACLR ACLR CMOV R2,#08HREAD_02:CLR SCLKNOPNOPMOV C,IO_DA TANOPNOPRRC A;再从DS1302接收数据NOPNOPSETB SCLKNOPNOPDJNZ R2,READ_02MOV R0,ACLR RSTRET;============================================== ;实时时间、日期数据处理子程序;============================================== CHULI:MOV A,40H ;处理秒数据ANL A,#0FHMOV 50H,AMOV 70H,AMOV A,40HANL A,#11110000BSW AP AMOV 51H,AMOV 71H,A;---------------------------------------------MOV A,41H ;处理分数据ANL A,#0FHMOV 52H,AMOV 72H,AMOV A,41HANL A,#11110000BSW AP AMOV 53H,AMOV 73H,A;---------------------------------------------MOV A,42H ;处理时数据ANL A,#0FHMOV 54H,AMOV 74H,AMOV A,42HANL A,#11110000BSW AP AMOV 55H,AMOV 75H,A;----------------------------------------------MOV A,43H ;处理日数据ANL A,#0FHMOV 60H,AMOV 76H,AMOV A,43HANL A,#11110000BSW AP AMOV 61H,AMOV 77H,A;---------------------------------------------MOV A,44H ;处理月数据ANL A,#0FHMOV 62H,AMOV 78H,AMOV A,44HANL A,#11110000BSW AP AMOV 63H,AMOV 79H,A;---------------------------------------------MOV A,45H ;处理年数据ANL A,#0FHMOV 64H,AMOV 7AH,AMOV A,45HANL A,#11110000BSW AP AMOV 65H,AMOV 7BH,A;----------------------------------------------MOV A,46H ;处理周数据MOV 66H,AMOV 7CH,ARET;=============================================;实时时间、日期查表取数子程序;=============================================DISP: ;MOV R0,#TIME_DA TAMOV R3,#06HDISP1: MOV A,@R0MOV DPTR,#TAB_NUMOVC A,@A+DPTRMOV @R0,AINC R0DJNZ R3,DISP1RET;==================================================== ;时间、日期显示子程序;====================================================TIME_DISPLAY:;MOV R0,#TIME_DA TA;取得显示单元首地址MOV R1,#07FH ;从第一个数码管开始MOV R2,#08H ;共8个数码管DISLP: MOV P0,@R0 ;获得当前单元数据MOV A,R1MOV P2,A;数码显示JB ACC.5,DISLP1 ;第三位数码管显示-MOV P0,#0f7HJMP DISLP3DISLP1: JB ACC.2,DISLP2 ;第六位数码管显示-MOV P0,#0f7HJMP DISLP3DISLP2: INC R0DISLP3: MOV A,R1 ;为下一个数准备RR A;下一个单元MOV R1,A;保存LCALL DELAY;为了保证数码管亮度,延时DJNZ R2,DISLP ;重复显示,直到全部数据刷新过RET ;返回DELAY:MOV R4,#0AHL15: MOV R5,#64HL16: DJNZ R5,L16DJNZ R4,L15RET;******************************************************SET_KEY:SETB K1 ;增加键SETB K2 ;减少键SETB K3 ;选择键SETB K4 ;定时设定功能键NOPJB K4,KEY01LCALL BEEP_BLJMP DS_KEY;进入定时值设定子程序KEY01: JB K2,KEY02LCALL BEEP_BLJMP SET_TIME ;进入时间设定子程序KEY02: JB K3,KEY03LCALL BEEP_BLCPL 20H.0 ;止闹标记取反KEY03: RET;-----------------------------------------------------DS_KEY:CALL DS_DELAYJNB K4,$LCALL DSSETCALL DS_DELAYRET;============================================== ;实时时间设定子程序;K1为加键、K2为减键、K3为选择键;============================================== SET_TIME:MOV R1,#8EH ;写保护寄存器MOV R0,#00H ;允许写入LCALL WRITEMOV R1,#80H ;写秒寄存器MOV R0,#80H ;停止振荡器工作LCALL WRITESETB TR0K001: CALL TIME_DELAY;校时JNB K3,K001 ;K3为位移键K010:CALL CHULIJNB 0AH,KH01MOV 54H,7FH ;送入熄灭符MOV 55H,7FHJMP KH02KH01: MOV 54H,74H ;送实时值MOV 55H,75H ;送实时值KH02: MOV R0,#TIME_DA TACALL DISPMOV R0,#TIME_DA TACALL TIME_DISPLAYJNB K1,K011AJNB K2,K011BJNB K3,K002JMP K010K011A:MOV A,42HADD A,#01HDA AMOV 42H,AXRL A,#24HJNZ K012AMOV 42H,#00HK012A: MOV R1,#84H ;写时寄存器MOV R0,42HLCALL WRITECALL TIME_DELAYJMP K010K011B:MOV A,42HXRL A,#00HJZ K012BSETB C ;求补运算CLR AADDC A,#99H ;加99SUBB A,#01H ;减去减数ADD A,42H ;加被减数DA A;十进制调整MOV 42H,A;XRL A,#00HJNZ K012CK012B: MOV 42H,#23HK012C: MOV R1,#84H ;写时寄存器MOV R0,42HLCALL WRITECALL TIME_DELAYJMP K010;-------------------------------------------------K002: CALL TIME_DELAY;校分JNB K3,K002 ;K3为位移键K020: CALL CHULIJNB 0AH,KM01MOV 52H,7FH ;送入熄灭符MOV 53H,7FHJMP KM02KM01: MOV 52H,72H ;送实时值MOV 53H,73H ;送实时值KM02: MOV R0,#TIME_DA TACALL DISPMOV R0,#TIME_DA TACALL TIME_DISPLAYJNB K1,K021AJNB K2,K021BJNB K3,K003JMP K020K021A:MOV A,41HADD A,#01HDA AMOV 41H,AXRL A,#60HJNZ K022AMOV 41H,#00HK022A: MOV R1,#82H ;写分寄存器MOV R0,41HLCALL WRITECALL TIME_DELAYJMP K020;---------------------------------------------------K021B:MOV A,41HXRL A,#00HJZ K022BSETB C ;求补运算CLR AADDC A,#99H ;加99SUBB A,#01H ;减去减数ADD A,41H ;加被减数DA A;十进制调整MOV 41H,A;XRL A,#00HJNZ K022CK022B: MOV 41H,#59HK022C: MOV R1,#82H ;写分寄存器MOV R0,41HLCALL WRITECALL TIME_DELAYJMP K020;---------------------------------------------------K003: CALL DA TE_DELAY;校日JNB K3,K003 ;K3为位移键K030: CALL CHULIJNB 0AH,KR01MOV 60H,7FH ;送入熄灭符MOV 61H,7FHJMP KR02KR01: MOV 60H,76H ;送实时值MOV 61H,77H ;送实时值KR02: MOV R0,#DA TE_DA TACALL DISPMOV R0,#DA TE_DA TACALL TIME_DISPLAYJNB K1,K031AJNB K2,K031BJNB K3,K004JMP K030K031A:MOV A,43HADD A,#01HDA AMOV 43H,AXRL A,#32HJNZ K032AMOV 43H,#00HK032A: MOV R1,#86H ;写日寄存器MOV R0,43HLCALL WRITECALL DA TE_DELAYJMP K030K031B:MOV A,43HXRL A,#00HJZ K032BSETB C ;求补运算CLR AADDC A,#99H ;加99SUBB A,#01H ;减去减数ADD A,43H ;加被减数DA A;十进制调整MOV 43H,AXRL A,#00HJNZ K032CK032B: MOV 43H,#31HK032C: MOV R1,#86H ;写日寄存器MOV R0,43HLCALL WRITECALL DA TE_DELAYJMP K030;------------------------------------------------K004: CALL DA TE_DELAY;校月JNB K3,K004 ;K3为位移键K040: CALL CHULIJNB 0AH,KC01MOV 62H,7FH ;送入熄灭符MOV 63H,7FHJMP KC02KC01: MOV 62H,78H ;送实时值MOV 63H,79H ;送实时值KC02: MOV R0,#DA TE_DA TACALL DISPMOV R0,#DA TE_DA TACALL TIME_DISPLAYJNB K1,K041AJNB K2,K041BJNB K3,K005JMP K040K041A:MOV A,44HADD A,#01HDA AMOV 44H,AXRL A,#13HJNZ K042AMOV 44H,#00HK042A: MOV R1,#88H ;写月寄存器MOV R0,44HLCALL WRITECALL DA TE_DELAYJMP K040K041B:MOV A,44HXRL A,#00HJZ K042BSETB C ;求补运算CLR AADDC A,#99H ;加99SUBB A,#01H ;减去减数ADD A,44H ;加被减数DA A;十进制调整MOV 44H,A;XRL A,#00HJNZ K042CK042B: MOV 44H,#12HK042C: MOV R1,#88H ;写月寄存器MOV R0,44HLCALL WRITECALL DA TE_DELAYJMP K040;-----------------------------------------------K005: CALL DA TE_DELAY;校年JNB K3,K005 ;K3为位移键K050: CALL CHULIJNB 0AH,KY01MOV 64H,7FH ;送入熄灭符MOV 65H,7FHJMP KY02KY01: MOV 64H,7AH ;送实时值MOV 65H,7BH ;送实时值KY02: MOV R0,#DA TE_DA TACALL DISPMOV R0,#DA TE_DA TACALL TIME_DISPLAYJNB K1,K051AJNB K2,K051BJNB K3,K008JMP K050K051A:MOV A,45HADD A,#01HDA AMOV 45H,AXRL A,#9AHJNZ K052AMOV 45H,#00HK052A: MOV R1,#8CH ;写年寄存器MOV R0,45HLCALL WRITECALL DA TE_DELAYJMP K050K051B:MOV A,45HXRL A,#00HJZ K052BSETB C ;求补运算CLR AADDC A,#99H ;加99SUBB A,#01H ;减去减数ADD A,45H ;加被减数DA A;十进制调整MOV 45H,A;XRL A,#00HJNZ K052CK052B: MOV 45H,#99HK052C: MOV R1,#8CH ;写年寄存器MOV R0,45HLCALL WRITECALL DA TE_DELAYJMP K050;-------------------------------------------------K008: JNB K3,K008MOV R1,#80H ;写秒寄存器MOV R0,#00H ;启动振荡器工作LCALL WRITEMOV R1,#8EH ;写保护寄存器MOV R0,#80H ;禁止写入LCALL WRITECALL DA TE_DELAYCLR 0AHCLR TR0CALL BEEP_BLRET;=================================================== ;定时时间设定子程序;K1为加键、K2为减键、K3为选择键;=================================================== DSSET:SETB TR0DS01: LCALL DS_DELAY;定时分设定JNB K4,$DS010: CALL DS_CHULIJNB 0AH,DS01_1MOV 58H,7FH ;送入熄灭符MOV 59H,7FHJMP DS01_2DS01_1: MOV 58H,70H ;送实时值MOV 59H,71H ;送实时值DS01_2: MOV R0,#58HLCALL DS_SPMOV R0,#58HLCALL DS_DISPLAYJNB K1,DS01A;加键JNB K2,DS01B ;减键JNB K3,DS02JMP DS010DS01A: ;加MOV A,48HADD A,#01HDA AMOV 48H,AXRL A,#60HJNZ DS011MOV 48H,#00HDS011: LCALL DS_DELAYJMP DS010DS01B: MOV A,48H ;判48H是否为0XRL A,#00HJZ DS012SETB C ;减CLR A;求补运算ADDC A,#99H ;加99SUBB A,#01H ;减去减数ADD A,48H ;加被减数DA A;十进制调整MOV 48H,A;XRL A,#00HJNZ DS013DS012: MOV 48H,#59HDS013: CALL DS_DELAYJMP DS010;----------------------------------------------DS02: LCALL DS_DELAY;定时时设定JNB K3,$DS020:CALL DS_CHULIJNB 0AH,DS02_1MOV 5AH,7FH ;送入熄灭符MOV 5BH,7FHJMP DS02_2DS02_1: MOV 5AH,72H ;送实时值MOV 5BH,73H ;送实时值DS02_2: MOV R0,#58HLCALL DS_SPMOV R0,#58HLCALL DS_DISPLAYJNB K1,DS02AJNB K2,DS02BJNB K3,DS03JMP DS020DS02A: MOV A,49H ;加ADD A,#01HDA AMOV 49H,AXRL A,#24HJNZ DS021MOV 49H,#00HDS021: LCALL DS_DELAYJMP DS020DS02B: MOV A,49H ;判49H是否为0 XRL A,#00HJZ DS022SETB C ;减CLR A;求补运算ADDC A,#99H ;加99SUBB A,#01H ;减去减数ADD A,49H ;加被减数DA A;十进制调整MOV 49H,A;XRL A,#00HJNZ DS023DS022: MOV 49H,#23HDS023: CALL DS_DELAYJMP DS020;-------------------------------------------DS03: CALL DS_DELAYJNB K3,$DS030: CALL DS_CHULIJNB 0AH,DS03_1MOV 5CH,7FH ;送入熄灭符JMP DS03_2DS03_1: MOV 5CH,74H ;送实时值DS03_2: MOV R0,#58HLCALL DS_SPMOV R0,#58HLCALL DS_DISPLAYJNB K3,DS04JNB K1,DS03AJMP DS030DS03A: CPL 20H.1 ;报警标记取反JNB 20H.1,DS031MOV 4AH,#01H ;报警标记=1,允许报警AJMP DS032DS031: MOV 4AH,#00H ;报警标记=0,禁止报警DS032: LCALL DS_DELAYJMP DS030;--------------------------------------------DS04: CLR TR0CLR 0AHCALL BEEP_BLLCALL DS_DELAYRET;=============================================;定时时间数据处理子程序;=============================================DS_CHULI:MOV A,48H ;处理分数据ANL A,#0FHMOV 58H,AMOV 70H,AMOV A,48HANL A,#0F0HSW AP AMOV 59H,AMOV 71H,AMOV A,49H ;处理时数据ANL A,#0FHMOV 5AH,AMOV 72H,AMOV A,49HANL A,#0F0HSW AP AMOV 5BH,AMOV 73H,AMOV A,4AH ;处理定时标记ANL A,#01HMOV 5CH,AMOV 74H,ARET;================================================== ;定时时间查表取数子程序;================================================== DS_SP: ;MOV R0,#58HMOV R3,#05HDS_SP1: MOV A,@R0MOV DPTR,#TAB_NUMOVC A,@A+DPTRMOV @R0,AINC R0DJNZ R3,DS_SP1RET;================================================== ;定时时间显示子程序;================================================== DS_DISPLA Y:;MOV R0,#58H ;取得设定显示单元首地址MOV R1,#07FH ;从第一个数码管开始MOV R2,#07H ;共7个数码管DSPLAY: MOV P0,@R0 ;获得当前单元数据MOV A,R1MOV P2,A;数码显示JB ACC.5,DSLP1 ;第三位数码管显示“-”MOV P0,#0f7HJMP DSLP3DSLP1: JB ACC.2,DSLP2 ;第六位数码管显示“-”MOV P0,#0f7HJMP DSLP3DSLP2: INC R0DSLP3: MOV A,R1 ;为下一个数准备RR A;下一个单元MOV R1,A;保存LCALL DELAYDJNZ R2,DSPLAY;重复显示,直到全部数据刷新过RET ;返回;====================================================;实时时间与设定时间比较子程序;20H.0 止闹标记,=0,允许,=1,禁止。

相关文档
最新文档