DS1302数码管电子闹钟程序
ds1302时钟芯片汇编控制程序

OUTBIT1:MOV C,T_IO
RRC A
SETB T_CLK
CLR T_CLK
DJNZ R4,OUTBIT1
RET
;---------- ----------END DS0302--------------------------------
SETB T_CLK
CLR T_RST
mov R0,#SECOND
MOV R7,#3 ;秒/时/分;-----R7
MOV R1,#80H ;秒写地址;-----R1
S1302:
CLR T_RST
CLR T_CLK
SETB T_RST
MOV B,R1 ;写秒/时/分地址;---R1
LCALL WRITEBYTE
ds1302时钟芯片ds1302时钟电路ds1302时钟不走ds1302芯片功能ds1302ds1302lcd1602时钟ds1302芯片ds1302中文资料ds1302工作原理ds1302程序
DS1302初始化及读写操作汇编程序
;************ DS1302初始化子程序************************************
MOV R0,#SECOND ;------R0
MOV R7,#03H ;-----R7
MOV R2,#81H ;-----R2
G13021:CLR T_RST
CLR T_CLK
SETB T_RST
MOV B,R2
LCALL WRITEBYTE ;写操作时,将一字节的内容由B写至DS1302中
LCALL READBYTE ;读操作时,将一字节的内容读至A中
INBIT1:MOV A,B
可用按键修改时间的DS1302时钟显示程序

write_data(table1[num]);
}
/**************************显示欢迎界面函数*************************************/
void displaystar(void)
delay(500);大约延时500ms
**************************************************************/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay20ms(void) //3*i*j+2*i=3*100*60+2*100=20000μs=20ms;
{
uchar i;
write_com(0x80);
for(i=0;i<16;i++)
write_data(table2[i]);
write_com(0x80+0x40);
for(i=0;i<16;i++)
write_data(table3[i]);
}
/***************************显示时间、日期子函数*********************************/
if(s1num!=0&&s4num==0)//按键1按下*次且s4再次之前未曾按过(按键按下时,时间修改函数)
51单片机ds1302实时时钟程序

51单⽚机ds1302实时时钟程序#ifndef __DS1302_H_#define __DS1302_H_//---包含头⽂件---//#include#include//---重定义关键词---//#ifndefuchar#define uchar unsigned char#endif#ifndefuint#define uint unsigned int#endif//---定义ds1302使⽤的IO⼝---//sbit DSIO=P3^4;sbit RST=P3^5;sbit SCLK=P3^6;//---定义全局函数---//void Ds1302Write(ucharaddr, uchardat); uchar Ds1302Read(ucharaddr);void Ds1302Init();void Ds1302ReadTime();//---加⼊全局变量--//extern uchar TIME[7]; //加⼊全局变量#endif #include"ds1302.h"//---DS1302写⼊和读取时分秒的地址命令---////---秒分时⽇⽉周年最低位读写位;-------//uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};//---DS1302时钟初始化2013年1⽉1⽇星期⼆12点00分00秒。
---////---存储顺序是秒分时⽇⽉周年,存储格式是⽤BCD码---//uchar TIME[7] = {0, 0, 0x12, 0x01, 0x01, 0x02, 0x13};/************************************************************************ * 函数名: Ds1302Write* 函数功能: 向DS1302命令(地址+数据)* 输⼊: addr,dat* 输出: ⽆************************************************************************* void Ds1302Write(ucharaddr, uchardat){uchar n;RST = 0;_nop_();SCLK = 0;//先将SCLK置低电平。
ds1302时钟程序详解-ds1302程序流程图(C程序)

ds1302时钟程序详解,ds1302程序流程图(C程序)ds1302时钟程序详解DS1302 的控制字如图2所示。
控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。
2.3 数据输入输出(I/O)在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。
同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。
2.4 DS1302的寄存器DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见表1。
此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。
时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。
DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。
ds1302程序流程图3.2 DS1302实时时间流程图4示出DS1302的实时时间流程。
根据此流程框图,不难采集实时时间。
下面结合流程图对DS1302的基本操作进行编程:根据本人在调试中遇到的问题,特作如下说明: DS1302 与微处理器进行数据交换时,首先由微处理器向电路发送命令字节,命令字节最高位MSB(D7)必须为逻辑1,如果D7=0,则禁止写DS1302,即写保护;D6=0,指定时钟数据,D6=1,指定RAM数据;D5~D1指定输入或输出的特定寄存器;最低位LSB(D 0)为逻辑0,指定写操作(输入),D0=1,指定读操作(输出)。
DS1302 12864lcd单片机智能闹钟日期温度程序

/****************************************************************************/ //头文件#include <AT89X52.h>#include <string.h>/*****************************************************************************/ //灯与蜂鸣器定义sbit led_b = P2^7;sbit led_r = P1^4;sbit led_g1 = P1^3;sbit led_g2 = P1^2;sbit led_g3 = P1^0;sbit led_g4 = P1^1;sbit beep = P3^1;/*****************************************************************************/ //温度传感器定义sbit DQ = P3 ^ 0;//ds18B20/*****************************************************************************/ //键盘引脚定义sbit KEY_1 = P2^3; //左上sbit KEY_2 = P2^4; //左下sbit KEY_3 = P2^6; //右上sbit KEY_4 = P2^5; //右下sbit KEY_I = P3^2; //常0/****************************************************************************/ //引脚定义sbit SID = P2^1; //数据sbit SCLK = P2^2; //时钟/*****************************************************************************/ //定义DS1302时钟接口sbit clock_clk = P3 ^ 5;//ds1302_clk(时钟线)sbit clock_dat = P3 ^ 4;//ds1302_dat(数据线)sbit clock_Rst = P3 ^ 3;//ds1302_Rst(复位线)/*****************************************************************************/ //定义累加器A中的各位sbit a0 = ACC ^ 0;sbit a1 = ACC ^ 1;sbit a2 = ACC ^ 2;sbit a3 = ACC ^ 3;sbit a4 = ACC ^ 4;sbit a5 = ACC ^ 5;sbit a6 = ACC ^ 6;sbit a7 = ACC ^ 7;/****************************************************************************/ //定义全局变量unsigned char yy,mo,dd,xq,hh,mm,ss;//定义时间映射全局变量(专用寄存器)bit w = 0; //调时标志位static unsigned char menu = 0;//定义静态小时更新用数据变量static unsigned char keys = 0;//定义静态小时更新用数据变量static unsigned char timecount = 0;//定义静态软件计数器变量/****************************************************************************/ void DelayM(unsigned int a){//延时函数1MS/次unsigned char i;while( --a != 0){for(i = 0; i < 125; i++); //一个; 表示空语句,CPU空转。
ds1302时钟程序详解,ds1302程序流程图

ds1302时钟程序详解,ds1302程序流程图(C程序)ds1302时钟程序详解DS1302 的控制字如图2所示。
控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。
数据输入输出(I/O)在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。
同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。
DS1302的寄存器DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见表1。
此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。
时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。
DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。
ds1302程序流程图DS1302实时时间流程图4示出DS1302的实时时间流程。
根据此流程框图,不难采集实时时间。
下面结合流程图对DS1302的基本操作进行编程:根据本人在调试中遇到的问题,特作如下说明:DS1302 与微处理器进行数据交换时,首先由微处理器向电路发送命令字节,命令字节最高位MSB(D7)必须为逻辑1,如果D7=0,则禁止写DS1302,即写保护;D6=0,指定时钟数据,D6=1,指定RAM数据;D5~D1指定输入或输出的特定寄存器;最低位L SB(D0)为逻辑0,指定写操作(输入), D0=1,指定读操作(输出)。
电子时钟设计DS13021602可调闹钟程序清单

电子技术实验报告基于51单片机的电子时钟设计学院:电气工程学院专业:电子信息工程班级:学生姓名:学号:指导教师:2012年6月1 日摘要随着单片机技术的飞速发展,在其推动下,现代的电子产品几乎渗透到了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高。
时间就是金钱、时间就是生命、时间就是胜利……,准确的掌握时间和分配时间对人们来说至关重要,时钟是我们生活中必不可少的工具。
电子钟的设计方法有很多种,但是基于单片机并通过LCD显示的电子时钟具有编程灵活、精确度高、便于携带、显示直观等特点。
利用STC89C52单片机对DS1302时钟芯片进行读写操作并通过1602字符液晶显示实时时钟信息,这样便构成了一个单片机电子时钟。
关键词:单片机,电子时钟,STC89C52,蜂鸣器ABSTRACTWith the rapid development of microcomputer technology in its promotion, modern electronics into almost all areas of society, a strong impetus to the development of social productive forces and social improvement in the level of information, but also to further improve the performance of modern electronic products.Time is a money, time is life, time is victory…Accurate grasp of time and allocation of time is crucial to people, The clock is necessary in our life tools . Clock Design There are many ways, however, produced by single chip electronic clock is more flexible programming, and easy expansion of electronic capabilities, high accuracy, easy to carry, display visual and so on.In this paper, through the use of STC89C52 microcontroller by DS1302 clock chips for reading and writing operation and through 1602 character liquid crystal display real-time clock information so that forming a single chip electronic clock.Key Words: Microcontroller,STC89C52,Electronic clock,buzzer目录绪论---------------------------------------------------------------1概述---------------------------------------------1研究目的-----------------------------------------1第1章设计要求与方案论证--------------------------------21.1 设计要求-------------------------------------21.2 系统基本方案选择和论证-----------------------21.2.1 单片机芯片的选择方案和论证---------------------21.2.2 显示模块选择方案和论证—————————————---21.2.3 时钟芯片的选择方案和论证-----------------------21.3 电路设计最终方案决定----------------------------------3第2章主要元件介绍-----------------------------------------32.1 STC89C52以及最小系统介绍--------------------32.1.1 STC89C52主要功能及PDIP封装----------------------42.1.2 STC89C52引脚介绍-----------------------------------42.1.3 STC89C52最小系统-----------------------------------42.2 DS1302时钟芯片以及集成时钟模块介绍----------52.2.1 DS1302概述------------------------------------------62.2.2 DS1302引脚介绍-------------------------------------62.2.3 DS1302使用方法-------------------------------------62.2.4 时钟集成模块内部原理图以及实物图--------------82.3 1602字符液晶以及显示模块介绍-----------------92.3.1 1602液晶概述-----------------------------------------92.3.2 1602引脚介绍---------------------------------------102.3.3 1602字符液晶使用方法------------------------------112.3.4 LCD显示模块原理图-----------------------------13第3章系统硬件设计—————————————143.1 电路设计框图--------------------------------143.2 系统硬件概述--------------------------------14第4章系统的软件设计-------------------------------------154.1 程序流程框图--------------------------------15第5章系统测试与总结----------------------------175.1 系统测试------------------------------------175.2 总结----------------------------------------17致谢--------------------------------------------------------------18参考文献-------------------------------------18源程序清单-----------------------------------18附录-----------------------------------------35绪论概述时间,对人们来说是非常宝贵的,准确的掌握时间和分配时间对人们来说至关重要。
用ds1302制作一个精密的电子时钟

uchar add=0x80; EA=0; s_write(0x8e,0x00); for(i=7;i>பைடு நூலகம்;i--) { s_write(add,*pClock); pClock++; add+=2; } s_write(0x8e,0x80); EA=1; }
sbit sf=P1;
sbit sup=P1;
void delay(uint a);
void keyscan();
void main() //main 函数
{ s_write(0x8e,0x80); init(); P0=0xff; while(1) { keyscan(); if(flag==0){ rw_ds1302(); } } }
void rw_ds1302() //读写 ds1302 { EA=0; sec=s_read(0x81); write_time(8,sec); write_com(0x80+0x40+9); min=s_read(0x83); write_time(5,min); write_com(0x80+0x40+6); hour=s_read(0x85); write_time(2,hour); write_com(0x80+0x40+3); week=s_read(0x8b);
ds1302_ce=0; ds1302_sclk=0; ds1302_ce=1; write_byte(add); temp=read_byte(); ds1302_sclk=1; ds1302_ce=0; temp=BCD2DEC(temp); return(temp); } void set_ds1302(uchar *pClock) //设置 ds1302 的时间 { uchar i;
DS1302时钟程序(完整版),液晶显示

#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar table0[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; //液晶显示数字0——9代码sbit SCLK=P1^0;sbit DATA=P1^1;sbit CE=P1^2;sbit RS=P2^0;sbit RW=P2^1;sbit EN=P2^2;sbit FB=P0^7;sbit start=P1^4;sbit stop=P1^5;uchar i;/*******************延时n微秒函数*****************/void delaynus(uchar n) //n us延时函数{// uchar i;for(i=n;i>0;i--);}/*******************写数据函数*****************/void write1302(uchar add,uchar dat){CE=0;SCLK=0;CE=1;for(i=0;i<8;i++) //写入地址{DATA=add&0x01;SCLK=1;SCLK=0;add>>=1;}for(i=0;i<8;i++) //写入数据{DATA=dat&0x01;SCLK=1;SCLK=0;dat>>=1;}SCLK=1;CE=0;}/*******************读数据函数*****************/uchar read1302(uchar add){uchar dat;CE=0;SCLK=0;CE=1;for(i=8;i>0;i--) //写入地址{DATA=add&0x01;SCLK=1;SCLK=0;add>>=1;}for(i=8;i>0;i--) //读出数据/********************为神马???**************************/{dat>>=1;if(DATA==1)dat=dat|0x80;SCLK=1;SCLK=0;}SCLK=1;CE=0;return dat;}/*******************DS1302初始化函数*****************/void init1302(){uchar flag;flag=read1302(0x81);if(flag&0x80){write1302(0x8e,0x00);write1302(0x80,0x00);write1302(0x82,(((1/10)<<4)|(1%10)));write1302(0x84,(((20/10)<<4)|(20%10)));write1302(0x86,(((19/10)<<4)|(19%10)));write1302(0x88,(((7/10)<<4)|(7%10)));write1302(0x8a,((2/10)<<4)|(2%10));write1302(0x8c,(((11/10)<<4)|(11%10)));write1302(0x90,0xa5); //充电。
时钟芯片DS1302 的程序(C51程序)

时钟芯片DS1302 的程序(C51程序)模块名称:DS1302.c功能:实时时钟模块时钟芯片型号:DS1302 程序设计:zhaojunjie********************************************************************* /#includesbit T_CLK = P2^7; /*实时时钟时钟线引脚 */ sbit T_IO = P1^4; /*实时时钟数据线引脚 */ sbit T_RST = P1^5; /*实时时钟复位线引脚 */sbit ACC0 = ACC^0;sbit ACC7 = ACC^7;void RTInputByte(uchar); /* 输入 1Byte */uchar RTOutputByte(void); /* 输出?1Byte */void W1302(uchar, uchar);uchar R1302(uchar);void Set1302(uchar *); /* 设置时间 */void Bcd2asc(uchar,uchar *);void Get1302(uchar curtime[]); /* 读取1302当前时间 *//********************************************************************函数名:RTInputByte()功能:实时时钟写入一字节说明:往DS1302写入1Byte数据 (内部函数)入口参数:d 写入的数据返回值:无设计:zhaojunjie********************************************************************* **/void RTInputByte(uchar d){uchar i;ACC = d;for(i=8; i>0; i--){T_IO = ACC0; /*相当于汇编中的 RRC */T_CLK = 1;T_CLK = 0;ACC = ACC >> 1;}}/********************************************************************函数名:RTOutputByte()功能:实时时钟读取一字节说明:从DS1302读取1Byte数据 (内部函数)入口参数:无返回值:ACC设计:zhaojunjie********************************************************************* **/uchar RTOutputByte(void){uchar i;for(i=8; i>0; i--){ACC = ACC >>1; /*相当于汇编中的 RRC */ACC7 = T_IO;T_CLK = 1;T_CLK = 0;}return(ACC);}/********************************************************************函数名:W1302()功能:往DS1302写入数据说明:先写地址,后写命令/数据 (内部函数)调用:RTInputByte() , RTOutputByte()入口参数:ucAddr: DS1302地址, ucData: 要写的数据返回值:无设计:zhaojunjie********************************************************************* **/void W1302(uchar ucAddr, uchar ucDa){T_RST = 0;T_CLK = 0;T_RST = 1;RTInputByte(ucAddr); /* 地址,命令 */RTInputByte(ucDa); /* 写1Byte数据*/T_CLK = 1;T_RST = 0;}/********************************************************************函数名:R1302()功能:读取DS1302某地址的数据说明:先写地址,后读命令/数据 (内部函数)调用:RTInputByte() , RTOutputByte()入口参数:ucAddr: DS1302地址返回值:ucData :读取的数据设计:zhaojunjie********************************************************************* **/uchar R1302(uchar ucAddr){uchar ucData;T_RST = 0;T_CLK = 0;T_RST = 1;RTInputByte(ucAddr); /* 地址,命令 */ucData = RTOutputByte(); /* 读1Byte数据 */T_CLK = 1;T_RST = 0;return(ucData);}/********************************************************************函数名:BurstW1302T()功能:往DS1302写入时钟数据(多字节方式)说明:先写地址,后写命令/数据调用:RTInputByte()入口参数:pWClock: 时钟数据地址格式为: 秒分时日月星期年控制8Byte (BCD码)1B 1B 1B 1B 1B 1B 1B 1B返回值:无设计:zhaojunjie********************************************************************* **/void BurstW1302T(uchar *pWClock){uchar i;W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/T_RST = 0;T_CLK = 0;T_RST = 1;RTInputByte(0xbe); /* 0xbe:时钟多字节写命令 */for (i = 8; i>0; i--) /*8Byte = 7Byte 时钟数据 + 1Byte 控制*/{RTInputByte(*pWClock); /* 写1Byte数据*/pWClock++;}T_CLK = 1;T_RST = 0;}/********************************************************************函数名:BurstR1302T()功能:读取DS1302时钟数据说明:先写地址/命令,后读数据(时钟多字节方式)调用:RTInputByte() , RTOutputByte()入口参数:pRClock: 读取时钟数据地址格式为: 秒分时日月星期年7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B返回值:无设计:zhaojunjie********************************************************************* **/void BurstR1302T(uchar *pRClock){uchar i;T_RST = 0;T_CLK = 0;T_RST = 1;RTInputByte(0xbf); /* 0xbf:时钟多字节读命令 */for (i=8; i>0; i--){*pRClock = RTOutputByte(); /* 读1Byte数据 */pRClock++;}T_CLK = 1;}/********************************************************************函数名:BurstW1302R()功能:往DS1302寄存器数写入数据(多字节方式)说明:先写地址,后写数据(寄存器多字节方式)调用:RTInputByte()入口参数:pWReg: 寄存器数据地址返回值:无设计:zhaojunjie********************************************************************* **/void BurstW1302R(uchar *pWReg){uchar i;W1302(0x8e,0x00); /* 控制命令,WP=0,写操作*/T_RST = 0;T_CLK = 0;T_RST = 1;RTInputByte(0xfe); /* 0xbe:时钟多字节写命令*/for (i=31; i>0; i--) /* 31Byte 寄存器数据 */{RTInputByte(*pWReg); /* 写1Byte数据*/pWReg++;}T_CLK = 1;T_RST = 0;}/********************************************************************函数名:BurstR1302R()功能:读取DS1302寄存器数据说明:先写地址,后读命令/数据(寄存器多字节方式)调用:RTInputByte() , RTOutputByte()入口参数:pRReg: 寄存器数据地址返回值:无设计:zhaojunjie********************************************************************* **/void BurstR1302R(uchar *pRReg){uchar i;T_CLK = 0;T_RST = 1;RTInputByte(0xff); /* 0xff:时钟多字节读命令 */for (i=31; i>0; i--) /*31Byte 寄存器数据 */{*pRReg = RTOutputByte(); /* 读1Byte数据 */pRReg++;}T_CLK = 1;T_RST = 0;}/********************************************************************函数名:Set1302()功能:设置初始时间说明:先写地址,后读命令/数据(寄存器多字节方式)调用:W1302()入口参数:pClock: 设置时钟数据地址格式为: 秒分时日月星期年7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B返回值:无设计:zhaojunjie********************************************************************* **/void Set1302(uchar *pClock){uchar i;uchar ucAddr = 0x80;W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/for(i =7; i>0; i--){W1302(ucAddr,*pClock); /* 秒分时日月星期年*/pClock++;ucAddr +=2;}W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/}/********************************************************************函数名:Get1302()功能:读取DS1302当前时间说明:调用:R1302()入口参数:ucCurtime: 保存当前时间地址。
ds1302实时时钟程序

/* 时间:4月19日功能:使用ds1302实时时钟芯片,用共阴数码管显示时,分,秒*/#include<reg51.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charsbit io=P3^4;sbit cs=P3^5;sbit clk=P3^6;uchar code table1[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x80};uchar code table2[]={ //译码器与单片机的接线引脚P2.4 P2.3 P2.20xe3,0xe7,0xeb,0xef,0xf3,0xf7,0xfb,0xff};uchar time[7]={14,2,3,25,23,59,50}; //初始化实时时钟时间uchar register_wr[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};uchar register_re[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81}; uchar temp1[7];uchar shi,ge;void delay_ms(uchar t);void delay(); //大约10usvoid spi_writebyte(uchar dat);uchar spi_readbyte();void ds1302_spiwrite(uchar add,uchar dat);uchar ds1302_spiread(uchar add);void ds1302_init();void ds1302_run(); //ds1302全运行过程void display(); //共阴数码管显示过程void main(){ds1302_init();while(1){ds1302_run();display();}}void delay_ms(uchar t){uchar x,y;for(x=t;x>0;x--)for(y=110;y>0;y--);}void ds1302_run(){ //ds1302全运行过程uchar i;for(i=0;i<7;i++){ds1302_spiwrite(0x8e,0x80);//写保护,不让写temp1[i]=ds1302_spiread(register_re[i]); //将十六进制数转换成相同数字的十进制shi=temp1[i]/16;ge=temp1[i]%16;time[i]=shi*10+ge;}}void display(){P0=table1[time[4]/10]; P2=table2[0];delay_ms(1);P0=table1[time[4]%10]; P2=table2[1];delay_ms(1);P0=table1[16];P2=table2[2];delay_ms(1);P0=table1[time[5]/10]; P2=table2[3];delay_ms(1);P0=table1[time[5]%10]; P2=table2[4];delay_ms(1);P0=table1[16];P2=table2[5];delay_ms(1);P0=table1[time[6]/10];P2=table2[6];delay_ms(1);P0=table1[time[6]%10];P2=table2[7];delay_ms(1);}void ds1302_init(){uchar i;ds1302_spiwrite(0x8e,0x00); //wp是写允许位。
ds1302定时钟程序

dat|=0x80;
SCK=1;
}
RST=0;
dat=(dat/16*10)+(dat&0x0f);
return(dat);
}
void read_time() //读取DS1302的时间和日期
{
ctime.second=read(0x81);
di();
if(mod==4) //退出调节功能,返回正常显示
{
set_time();
mod=0;
}
}
}
if(key2==0) //调节加1,因为涉及到时分秒,年月日周和闹钟的调节,所以写的比较复杂,应该有更精简的代码。
{
{
uchar i,dat;
RST=0;
SCK=0;
RST=1;
for(i=0;i<8;i++)
{
SCK=0;
SDA=(bit)(addr&0x01);
addr>>=1;
SCK=1;
}
for(i=0;i<8;i++)
{
SCK=0;
dat>>=1;
disbuf[4]=0x40;
disbuf[5]=0x40;
disbuf[6]=0x40;
disbuf[7]=0x40;
break;
case 3:
disbuf[0]=table[asec%10];
disbuf[1]=table[asec/10];
sbit key1=P1^0; //按键定义,key1切换键,key2加,key3减,key4闹钟,年月日周
利用单片机及DS1302制作电子时钟

单片机原理及应用——基于Proteus仿真设计报告课程名:利用单片机及DS1302制作电子时钟专业:班级:学号:姓名:设计时间:一、简介这是一种“基于单片机和DS1302的电子时钟”(简称“电子时钟”)。
单片机为控制核心,DS1302为应用广泛且走时准确的时钟芯片。
二、功能与操作1.功能(1)时钟功能:动态显示时、分、秒。
(2)调时功能:可依据标准时钟调校时间。
(3)因DS1302接有辅助纽扣电池,即使电源断电也能准确计时数年。
2.操作(1)上电后时钟开始计时并显示。
(2)调时。
按下“调时”按键,则进入调校时间状态,可依次调校时、分、秒。
三、技术要点1.时钟芯片DS1302的应用(1)DS1302的简介DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM 的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。
采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。
DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。
DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。
(2)DS1302的电路图2.应用中的几个小问题(1)子程序必须满足三线通信的时序要求。
单片机晶振频率不同,相应的子程序中的延时也要调整。
否则,运行结果可能出现错误。
(2)注意LED数码管动态扫描显示程序的设计及单片机晶振频率的选择。
否则,会因LED数码管数量多而导致显示闪烁或不正确。
所以在程序设计中,应使动态扫描频率大于视觉暂留频率,要考虑避免出现串显现象。
四、元件清单五、原理图六、程序SCLK EQU P3.2IO EQU P3.3RST EQU P3.4JIA1 EQU P3.6 ;"加一"口TSH EQU P3.7 ;"调时间"口HOUR DATA 62HMINTUE DATA 61HSECOND DATA 60HDS1302_ADDR DATA 32HDS1302_DATA DATA 31HORG 0HMOV SP,#70HLCALL DELY1MOV DS1302_ADDR,#8EH ;允许写1302MOV DS1302_DATA,#00HLCALL WRITEMOV DS1302_ADDR,#81H ;从1302读秒LCALL READANL A,#7FH ;启动1302振荡器MOV DS1302_ADDR,#80HMOV DS1302_DATA,ALCALL WRITEMOV 20H,#0 ;调整时标识单元MOV 21H,#0FH ;调整时工作单元MAIN1: JB TSH,MAIN2F ;按调时键往下执行MOV DS1302_ADDR,#81H ;从1302读秒LCALL READORL A,#80H ;停1302振荡器MOV DS1302_ADDR,#81HMOV DS1302_DATA,ALCALL WRITESSS: LCALL DISP ;显示JNB TSH,SSS ;等待调键盘弹起MOV 20H,#8 ;设置调"时"标志SSS3: JNB TSH,FFF ;按调时键转调"分"LCALL DISP ;显示JB JIA1,SSS3 ;按"加一"键往下执行SSS2: LCALL DISP ;显示JNB JIA1,SSS2 ;等待"加一"键弹起MOV R7,HOURMOV HOUR,ACJNE A,#24H,SSS1 ;不等于24时转MOV HOUR,#0 ;等于24时归零SSS1: MOV DS1302_ADDR,#84H ;将"时"写入1302 MOV DS1302_DATA,HOURLCALL WRITEMOV R0,HOUR ;"时"分离LCALL DIVIDEMOV 44H,R1MOV 45H,R2SJMP SSSMAIN2F: LJMP MAIN2FFF: NOP ;调"分"LCALL DISP ;显示JNB TSH,FFF ;等待调时键弹起MOV 20H,#4 ;置调"分"标志FFF3: JNB TSH,MMM ;安调时键转调"秒"LCALL DISP ;显示JB JIA1,FFF3 ;若按"加一"键往下执行FFF2: LCALL DISP ;显示JNB JIA1,FFF2 ;等待"加一"键弹起MOV R7,MINTUELCALL JIAYI ;"分"加一MOV MINTUE,ACJNE A,#60H,FFF1 ;不等于60转MOV MINTUE,#0 ;等于60则归零FFF1: MOV DS1302_ADDR,#82H ;将"分"写入1302 MOV DS1302_DATA,MINTUELCALL WRITEMOV R0,MINTUELCALL DIVIDE ;"分"分离MOV 42H,R1MOV 43H,R2SJMP FFF3MMM: LCALL DISP ;显示JNB TSH,MMM ;若按调时键则转调"秒"MOV 20H,#2 ;置调"秒"标志MMM3: JNB TSH,MAIN3 ;按调时键退出调时LCALL DISP ;显示JB JIA1,MMM3 ;按"加一"键往下执行MMM2: LCALL DISP ;显示JNB JIA1,MMM2 ;等待"加一"键弹起MOV R7,SECONDMOV SECOND,ACJNE A,#60H,MMM1 ;不等于60转MOV SECOND,#0MMM1: ORL SECOND,#80HMOV DS1302_ADDR,#80H ;写"秒"MOV DS1302_DATA,SECONDLCALL WRITEANL SECOND,#7FHMOV R0,SECONDLCALL DIVIDE ;"秒"分离MOV 40H,R1MOV 41H,R2SJMP MMM3MAIN3: LCALL DISP ;显示JNB TSH,MAIN3 ;等待调时键弹起MOV 20H,#0MOV 21H,#0FHMOV DS1302_ADDR,#81H ;读"秒"LCALL READANL A,#7FH ;启动1302振荡器MOV DS1302_ADDR,#80HMOV DS1302_DATA,ALCALL WRITELJMP MAIN1MAIN2: MOV P1,#0 ;读时分秒并显示MOV DS1302_ADDR,#85H ;读"时"LCALL READMOV HOUR,DS1302_DATAMOV DS1302_ADDR,#83H ;读"分"LCALL READMOV MINTUE,DS1302_DATAMOV DS1302_ADDR,#81H ;读"秒"LCALL READMOV SECOND,DS1302_DATAMOV R0,HOUR ;"时"分离LCALL DIVIDEMOV 44H,R1MOV 45H,R2MOV R0,MINTUE ;"分"分离LCALL DIVIDEMOV 42H,R1MOV 43H,R2MOV R0,SECOND ;"秒"分离LCALL DIVIDEMOV 40H,R1MOV 41H,R2LCALL DISPLJMP MAIN1DISP: NOPMOV P1,40H ;显示"秒"低位JNB 01H,MIAOLMOV A,21HRL AMOV 21H,ACJNE A,#78H,MIAO1MIAO1: JC MIAOLCLR P2.4CLR P2.5SJMP FENMIAOL: SETB P2.5LCALL DELY1CLR P2.5LCALL DELY2MOV P1,41H ;显示"秒"高位SETB P2.4LCALL DELY1CLR P2.4LCALL DELY2FEN: MOV P1,42H ;显示"分"低位JNB 02H,FENLMOV A,21HRL AMOV 21H,ACJNE A,#78H,FEN1FEN1: JC FENLCLR P2.2CLR P2.3SJMP SHIFENL: SETB P2.3LCALL DELY1CLR P2.3LCALL DELY2MOV P1,43H ;显示"分"高位SETB P2.2LCALL DELY1CLR P2.2LCALL DELY2SHI: MOV P1,44H ;显示"时"地位JNB 03H,SHILMOV A,21HRL AMOV 21H,ACJNE A,#78H,SHI1SHI1: JC SHILSJMP SHI2SHIL: SETB P2.1LCALL DELY1CLR P2.1LCALL DELY2MOV P1,45H ;显示"时"高位SETB P2.0LCALL DELY1CLR P2.0LCALL DELY2SJMP SFMSHI2: CLR P2.0CLR P2.1SFM: RETDELY1: MOV R7,#5 ;晶振12MHz,延时2.58ms DELY11: MOV R6,#0DJNZ R6,$DJNZ R7,DELY11RETDELY2: MOV R7,#1 ;晶振12MHz,延时0.52ms DELY21: MOV R6,#0DJNZ R6,$DJNZ R7,DELY21RETDELY3: MOV R7,#40 ;晶振12MHz,延时8x2.58ms DELY31: MOV R6,#0DJNZ R6,$DJNZ R7,DELY31RETJIAYI: MOV A,R7ADD A,#1DA ARETDIVIDE: MOV A,R0 ;分离子程序ANL A,#0FHMOV R1,AMOV A,R0SWAP AANL A,#0FHMOV R2,ARET;以下为DS1302在单片机晶振频率为4MHz时的串行通信子程序WRITE: CLR SCLK ;1302写子程序SETB RSTMOV A,DS1302_ADDRMOV R4,#8WRITE1: RRC ACLR SCLKMOV IO,CSETB SCLKDJNZ R4,WRITE1CLR SCLKMOV A,DS1302_DATAMOV R4,#8WRITE2: RRC ACLR SCLKMOV IO,CSETB SCLKDJNZ R4,WRITE2CLR RSTRETREAD: CLR SCLK ;1302读子程序SETB RSTMOV A,DS1302_ADDRMOV R4,#8READ1: RRC ANOPMOV IO,CSETB SCLKCLR SCLKDJNZ R4,READ1MOV R4,#8READ2: CLR SCLKMOV C,IORRC ASETB SCLKDJNZ R4,READ2MOV DS1302_DATA,ACLR RSTRETEND七、总结通过这次设计与仿真,让我对PROTEUS仿真有了一定的了解,其中也碰见了许多不会用的,后来经过网上查阅懂得了怎么使用,如,画总线工具在什么地方,怎么使用这个东西来画总线,怎么画网络标号。
DS1302时钟程序详解

DS1302 时钟程序详解ds1302 时钟程序详解:DS1302 的控制字如图2 所示。
控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302 中,位6 如果为0,则表示存取日历时钟数据,为1 表示存取RAM 数据;位5 至位1 指示操作单元的地址;最低有效位(位0)如为0 表示要进行写操作,为1 表示进行读操作,控制字节总是从最低位开始输出。
2.3 数据输入输出(I/O)在控制指令字输入后的下一个SCLK 时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0 开始。
同样,在紧跟8 位的控制指令字后的下一个SCLK 脉冲的下降沿读出DS1302 的数据,读出数据时从低位0 位到高位7。
2.4 DS1302 的寄存器DS1302 有12 个寄存器,其中有7 个寄存器与日历、时钟相关,存放的数据位为BCD 码形式,其日历、时间寄存器及其控制字见表1。
此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM 相关的寄存器等。
时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。
DS1302 与RAM 相关的寄存器分为两类:一类是单个RAM 单元,共31 个,每个单元组态为一个8 位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM 寄存器,此方式下可一次性读写所有的RAM 的31 个字节,命令控制字为FEH(写)、FFH(读)。
ds1302 程序流程图3.2 DS1302 实时时间流程图4 示出DS1302 的实时时间流程。
根据此流程框图,不难采集实时时间。
下面结合流程图对DS1302 的基本操作进行编程:根据本人在调试中遇到的问题,特作如下说明:DS1302 与微处理器进行数据交换时,首先由微处理器向电路发送命令字节,命令字节最高位MSB(D7)必须为逻辑1,如果D7=0,则禁止写DS1302,即写保护;D6=0,指定时钟数据,D6=1,指定RAM 数据;D5~D1 指定输入或输出的特定寄存器; 最低位LSB(D0)为逻辑0,指定写操作(输入),D0=1,指定读操作(输出)。
DS1302时钟芯片C51源代码源程序

DS1302时钟芯片C51源代码源程序DS1302--- 51C语言代码,头文件与对应C代码已分离开,直接可用(自己写,绝对可用。
)其中星期几能直接由日期按公式推算出来,time.week=(time.year/100)/4-2*(time.year/100)+(time.year%100)+(time.year%100)/4+26*(tim e.month+1)/10 +time.day-1;(详情请搜:蔡乐公式)///////////////////////////////////////////////////////////////DS1302头文件:#ifndef _ds1302_h_#define _ds1302_h_#define uchar unsigned char#define uint unsigned int#define ulong unsigned long#define u32 unsigned long intsbit sdinn = P2^6;sbit sclkk = P2^5;sbit cee = P2^7;#define second_w 0x80#define second_r 0x81#define minute_w 0x82#define minute_r 0x83#define hour_w 0x84#define hour_r 0x85#define day_w 0x86#define day_r 0x87#define month_w 0x88#define month_r 0x89#define year_w 0x8c#define year_r 0x8d#define week_w 0x8a#define week_r 0x8b#define protect_w 0xc0#define protect_r 0xc1#define clock_base_w 0xc2#define clock_base_r 0xc3#define clock_state_w 0xcc#define clock_state_r 0xcd#define D_protect 0x77typedef struct{uint year;uint month;uint day;uint hour;uint minute;uint second;uint week;} Time_info;void DS1302_Writebyte(uchar dat);void time_write2DS1302(Time_info Time);void time_read_from_DS1302(Time_info *Time);uchar DS1302_Readbyte();void DS1302Write(uchar cmd, uchar dat);uchar DS1302Read(uchar cmd);void Init_DS1302(void);void display_date(unsigned char X,unsigned char Y,Time_info Read_T); void writeDate2DS1302(Time_info Time);void time_HMS2DS1302(Time_info Time);void Alarm_respond();void sendtime2computer();#endif///////////////////////////////////////////////////////////DS1302-C代码:#include "option.h"xdata uchar trans_buf;extern xdata uchar Date_Index;extern xdata uchar Time_Index;extern xdata uchar Write_date_buff[15];extern xdata uchar Alarm_buff[7];extern xdata uchar Alarm_arrive;extern xdata uchar arriveminute;extern xdata uchar Alarm_state;extern xdata Time_info Read_Time;xdata uchar tiao_buff[30];xdata uint hour,minute,second;xdata uchar old_second=250;void delay(unsigned long int i){while(i--);}void time_write2DS1302(Time_info Time)DS1302Write(0x8e,0x00);//写保护关trans_buf = ((Time.year%100/10)<<4)+((Time.year%10)&0X0F); // 写入年DS1302Write(year_w, trans_buf);trans_buf = (((Time.month%100/10)<<4)&0x10) + ((Time.month%10)&0X0F); //写入月DS1302Write(month_w, trans_buf);trans_buf = (((Time.day%100/10)<<4)&0x30) + ((Time.day%10)&0X0F);//写入日DS1302Write(day_w, trans_buf);trans_buf = (((Time.hour%100/10)<<4)&0x30)+((Time.hour%10)&0X0F);//写入时DS1302Write(hour_w, trans_buf);trans_buf = (((Time.minute%100/10)<<4)&0x70) + ((Time.minute%10)&0X0F); //写入分DS1302Write(minute_w, trans_buf);trans_buf = (((Time.second%100/10)<<4)&0x70) + ((Time.second%10)&0X0F); //写入秒DS1302Write(second_w, trans_buf);trans_buf = Time.week%7; //写入星期DS1302Write(week_w, trans_buf);DS1302Write(0x8e,0x80); //开写保护}void writeDate2DS1302(Time_info Time){DS1302Write(0x8e,0x00);//写保护关trans_buf = ((Time.year%100/10)<<4)+((Time.year%10)&0X0F); // 写入年DS1302Write(year_w, trans_buf);trans_buf = (((Time.month%100/10)<<4)&0x10) +((Time.month%10)&0X0F); //写入月DS1302Write(month_w, trans_buf);trans_buf = (((Time.day%100/10)<<4)&0x30) + ((Time.day%10)&0X0F);//写入日DS1302Write(day_w, trans_buf);Time.week = (int)(Time.year/100)/4-(int)2*(Time.year/100)+(int)(Time.year%100)+(int)(Time.year%100)/4+(int)26*(Time.mo nth+1)/10+(int)Time.day-1;// printf("--week:%5d--",Time.week);Time.week %= 7;if(Time.week == 0) Time.week = 7;trans_buf = Time.week; //写入星期DS1302Write(week_w, trans_buf);DS1302Write(0x8e,0x80); //开写保护}void time_HMS2DS1302(Time_info Time){DS1302Write(0x8e,0x00);//写保护关trans_buf = (((Time.hour%100/10)<<4)&0x30)+((Time.hour%10)&0X0F);//写入时DS1302Write(hour_w, trans_buf);trans_buf = (((Time.minute%100/10)<<4)&0x70) + ((Time.minute%10)&0X0F); //写入分DS1302Write(minute_w, trans_buf);trans_buf = (((Time.second%100/10)<<4)&0x70) + ((Time.second%10)&0X0F); //写入秒DS1302Write(second_w, trans_buf);DS1302Write(0x8e,0x80); //开写保护}void time_read_from_DS1302(Time_info *Time){Time->year = DS1302Read(year_r);Time->month = DS1302Read(month_r);Time->day = DS1302Read(day_r);Time->hour = DS1302Read(hour_r);Time->minute = DS1302Read(minute_r);Time->second = DS1302Read(second_r);Time->week = DS1302Read(week_r);Time->year = 2000+((Time->year>>4)*10)+(Time->year&0x0f);Time->month = ((Time->month>>4)*10) + (Time->month&0x0f);Time->day = (Time->day>>4)*10 + (Time->day&0x0f);Time->hour = (Time->hour>>4)*10 + (Time->hour&0x0f);Time->minute = ((Time->minute>>4)*10) + (Time->minute&0x0f);Time->second = (Time->second>>4)*10 + (Time->second&0x0f); }void DS1302_Writebyte(uchar dat){uchar i;sclkk = 0;delay(300);for(i = 0; i < 8; i++){sdinn = dat & 0x01;delay(90);sclkk = 1;delay(180);sclkk = 0;dat >>= 1;}}uchar DS1302_Readbyte(){uchar i, dat = 0;delay(90);for(i = 0; i < 8; i++){dat >>=1;if(sdinn)dat |= 0x80;sclkk = 1;delay(60);sclkk = 0;delay(60);}sdinn = 0;return dat;}void DS1302Write(uchar cmd, uchar dat) {cee = 0;sclkk = 0;cee = 1;DS1302_Writebyte(cmd);DS1302_Writebyte(dat);sclkk = 1;cee = 0;}uchar DS1302Read(uchar cmd) {uchar dat = 0;cee = 0;sclkk = 0;cee = 1;DS1302_Writebyte(cmd);dat = DS1302_Readbyte();sclkk = 1;cee = 0;return dat;}void Init_DS1302(void){Time_info time;uchar init_state;DS1302Write(0x8e,0x00);//写保护关init_state = DS1302Read(protect_r); DS1302Write(0x8e,0x80); //开写保护if(init_state != D_protect){time.year = 2014;time.month = 12;time.day = 5;time.hour = 18;time.minute = 57;time.second = 50; //日期换算为星期[c/4]-2c+y+[y/4]+[26(m+1)/10]+d-1time.week = (time.year/100)/4-2*(time.year/100)+(time.year %100)+(time.year%100)/4+26*(time.month+1)/10+time.da y-1;time.week %= 7;if(time.week == 0) time.week = 7;time_write2DS1302(time);DS1302Write(0x8e,0x00);//写保护关DS1302Write(protect_w,D_protect); //初始化一次标示DS1302Write(0x8e,0x80); //开写保护}DS1302Write(0x8e,0x00);//写保护关Alarm_buff[0] = DS1302Read(clock_base_r+0);Alarm_buff[1] = DS1302Read(clock_base_r+2);Alarm_buff[2] = DS1302Read(clock_base_r+4);Alarm_buff[3] = DS1302Read(clock_base_r+6);Alarm_buff[4] = DS1302Read(clock_base_r+8);Alarm_buff[5] = DS1302Read(clock_base_r+10);Alarm_state = DS1302Read(clock_state_r);DS1302Write(0x8e,0x80); //开写保护}void display_date(unsigned char X,unsigned char Y,Time_info Read_T) {xdata char dis_info[12];sprintf(dis_info, "%04d/%02d/%02d", (int)Read_T.year, (int) Read_T.month, (int)Read_T.day);LCD_write_english_string(X,Y,dis_info);sprintf(dis_info, "%02d/%02d/%02d", (int)Read_T.hour, (int) Read_T.minute, (int)Read_T.second);LCD_write_english_string(X+6,Y+1,dis_info);sprintf(dis_info, "Week:%d", (int)Read_T.week);LCD_write_english_string(X+12,Y+2,dis_info);}void Alarm_respond(){hour = (uint)Alarm_buff[0]*10+Alarm_buff[1];minute = (uint)Alarm_buff[2]*10+Alarm_buff[3];second = (uint)Alarm_buff[4]*10+Alarm_buff[5];if(Alarm_state==1){time_read_from_DS1302(&Read_Time);if((old_second < Read_Time.second)||(Read_Time.second==0)){if(arriveminute!=Read_Time.minute) Alarm_arrive = 0;if((Read_Time.hour == hour)&&(Read_Time.minute== minute)&&(Read_Time.second == second)){Alarm_arrive = 1;arriveminute = Read_Time.minute;}}old_second = Read_Time.second;}}void sendtime2computer(){time_read_from_DS1302(&Read_Time);printf("time%04d/%02d/%02d/%02d:%02d:%02d", Read_Time.year, Read_Time.month, Read_Time.day, Read_Time.hour, Read_Time.minute,Read_Time.second);printf("%d--\n",Read_Time.week);}。
DS1302时钟C语言编程完整实例

1 DS1302 简介:DS1302是美国D ALLAS 公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态R AM,采用S PI 三线接口与C PU 进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和R AM数据。
实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。
工作电压宽达2.5~5.5V。
采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力。
DS1302的外部引脚分配如图1所示及内部结构如图2所示。
DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录,因此广泛应用于测量系统中。
图1 DS1302的外部引脚分配图2 DS1302的内部结构各引脚的功能为:V cc1:主电源;Vcc2:备份电源。
当V cc2>Vcc1+0.2V 时,由Vcc2向D S1302供电,当V cc2< Vcc1时,由V cc1向D S1302供电。
SCLK:串行时钟,输入,控制数据的输入与输出;I/O:三线接口时的双向数据线;CE:输入信号,在读、写数据期间,必须为高。
该引脚有两个功能:第一,CE 开始控制字访问移位寄存器的控制逻辑;其次,CE 提供结束单字节或多字节数据传输的方法。
DS1302有下列几组寄存器:① D S1302有关日历、时间的寄存器共有12个,其中有7个寄存器 (读时81h ~8Dh ,写时80h ~8Ch ),存放的数据格式为 BCD 码形式, 如图3所示。
图 3 DS1302有关日历、时间的寄存器 小时寄存器(85h 、84h )的位7用于定义 D S1302是运行于12小时 模式还是24小时模式。
当为高时,选择12小时模式。
在12小时模式时,位5是 ,当为1时,表示 PM 。
在24小时模式时,位5是第二个10小时 位。
秒寄存器(81h 、80h )的位7定义为时钟暂停标志(CH )。
DS1302时钟程序

//DS1302时钟程序#include <stc89c52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int/******************************************************************** ///少占鱼制作河北正定欢迎您长沙航空职业技术学院//2010 年QQ:411656434//版权所有:#define LCD1602_RS P2_5 //定义引脚#define LCD1602_RW P2_6#define LCD1602_E P2_7#define LCD1602_IO P0#define Busy 0x80 //用于检测LCD1602状态字中的Busy标识const uchar num[]=" 3456789+";uchar code a[] = {" E N v"};void WriteData(uchar DAT);void WriteCommand(uchar command,BuysC);uchar ReadData(void);void Readbusy(void);void LCD1602_Init(void);void DisplayOneChar(uchar X, uchar Y, uchar DData);void Displaystring(uchar X, uchar Y, uchar *DData);void Delay5Ms(void);void Delay400Ms(void);void delayms(uint);void delays(uint m) ;void delayus(uchar x) ;sbit DS1302_CLK =P2^0;// P1^0;sbit DS1302_IO =P2^1;// P1^1;sbit DS1302_RST =P2^2;// P1^2;uchar shuju;unsigned char time[]={0x11,0x03,0x28,0x01,0x12,0x39,0x00};// 初始化时间年月日星期时分秒uchar Display_Buffer[12]={"12:25:00"};//时、分、秒的格式uchar riqi[12]={"11-03-28"};//年、月、日的格式uchar xingqi[5]="week";//星期unsigned char second,minute,hour,week,day,month,year;/******************1602函数********************************//******************************************************************** /void delays(uint m){uint i,j;for(i=0;i<m;i++){for(j=0;j<1000;j++){;}}}void Delay(void){unsigned char i;unsigned int j;for(i=0;i<200;i++)for(j=300;j>0;j--);}/******************************************************************** *********函数功能:向DS1302送一字节数据子程序入口参数:出口参数:********************************************************************* ********/void InputByte(unsigned char BYTE){char i;for(i=8;i>0;i--){ //前面在read_ds1302()函数里已经把CLK清0了DS1302_CLK=0;//这里再清0一次,看着清楚。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*****************************************************///DS1302+数码管+3个独立按键//// 精确定时/////*****************************************************/ /****************************************************************/// 利用ds1302精确定时,同时按键可调时间。
//// 每操作一次时钟,都会有蜂鸣器响大约200ms,以提示操作。
///***************************************************************/#include<reg52.h>#include"ds1302.h"uchar code tab[]={ 0x3F,/*0*/0x06,/*1*/0x5B,/*2*/0x4F,/*3*/0x66,/*4*/0x6D,/*5*/0x7D,/*6*/0x07,/*7*/0x7F,/*8*/0x6F,/*9*/} ;//共阴码char clock1[3]={0};int i,j=0,flag1=0;void delay(uint xms){uint x,y;for(x=xms;x>0;x--)for(y=110;y>0;y--);}void init()//初始化{//RST=0;//SCLK=0;//write_1302(0x80,0x00);//写控制字,允许写//write_1302(0x90,0x00);//禁止涡流充电TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;}void display(uchar miaog,uchar miaos,uchar feng,uchar fens,uchar shig,uchar shis)//数码管动态显示{P2=0x7f;P0=tab[miaog];delay(5);P2=0xbf;P0=tab[miaos];delay(5);P2=0xdf;P0=0xc0;delay(5);P2=0xef;P0=tab[feng];delay(5);P2=0xf7;P0=tab[fens];delay(5);P2=0xfb;P0=0xc0;delay(5);P2=0xfd;P0=tab[shig];delay(5);P2=0xfe;P0=tab[shis];delay(5);}write_sfm(uchar miao,uchar fen,uchar shi) //写入到数码管{uchar miaog,miaos,feng,fens,shig,shis;miaog=miao%10;miaos=miao/10;feng=fen%10;fens=fen/10;shig=shi%10;shis=shi/10;display(miaog,miaos,feng,fens,shig,shis);}void didi() //发声程序{buzzer=0;delay(50);buzzer=1;}void keyscan()//按键扫描程序{uchar temp;if(key1==0) //功能键{if(key1==0){while(!key1);key1n=key1n++;if(key1n==5)key1n=1;switch(key1n){case 1://didi();temp=(miao)/10*16+(miao)%10;//将秒转化成bcd码,没这句秒就变化,不知为什么write_1302 (0x8e,0x00); //禁止写保护write_1302 (0x80,0x80|temp); //时钟暂停write_1302 (0x8e,0x80); //允许写保护break;case 2 ://didi();break;case 3 ://didi();break;case 4 ://didi();temp=miao/10*16+miao%10;write_1302 (0x8e,0x00); //禁止写保护write_1302 (0x80,0x00|temp);//时钟开始write_1302 (0x8e,0x80); //允许写保护break;}}}if(key4==0) //闹钟键{if(key4==0){while(!key4);keyn++;if(keyn==4)keyn=0;while(keyn){EA=0; //闹钟键if(key4==0)if(key4==0){while(!key4);keyn++;if(keyn==4)keyn=0;}write_sfm(clock1[2],clock1[1],clock1[0]);if(keyn==1) //时修改{if(key3==0) //减键{//delay(3);if(key3==0){while(!key3);clock1[0]--;if(clock1[0]<0)clock1[0]=24;}}if(key2==0) //加键{//delay(3);if(key2==0){while(!key2);clock1[0]++;if(clock1[0]>24)clock1[0]=0;}}}if(keyn==2) //分修改{if(key3==0) //减键{//delay(3);if(key3==0){while(!key3);clock1[1]--;if(clock1[1]<0)clock1[1]=59;}}if(key2==0) //加键{//delay(3);if(key2==0){while(!key2);clock1[1]++;if(clock1[1]>59)clock1[1]=0;}}}if(keyn==3) //秒修改{if(key3==0) //减键{//delay(3);if(key3==0){while(!key3);clock1[2]--;if(clock1[2]<0)clock1[2]=59;}}if(key2==0) //加键{//delay(3);if(key2==0){while(!key2);clock1[2]++;if(clock1[2]>59)clock1[2]=0;}}}}} EA=1;}if(key1n!=0) //当按下功能键key1,按以下才有用{if(key2==0) //加键{delay(3);if(key2==0){while(!key2);switch(key1n){case 1 : //didi(); //秒temp=(miao+1)/10*16+(miao+1)%10;if(miao==59)temp=0;write_1302 (0x8e,0x00); //禁止写保护write_1302 (0x80,0x80|temp);write_1302 (0x8e,0x80); //允许写保护break;case 2 : // didi(); //分temp=(fen+1)/10*16+(fen+1)%10;if(fen==59)temp=0;write_1302 (0x8e,0x00); //禁止写保护write_1302 (0x82,temp);write_1302 (0x8e,0x80); //允许写保护break;case 3 :// didi();temp=(shi+1)/10*16+(shi+1)%10; //时if(shi==23)temp=0;write_1302 (0x8e,0x00); //禁止写保护write_1302 (0x84,temp);write_1302 (0x8e,0x80); //允许写保护break;}}}if(key3==0) //减键{delay(3);if(key3==0){while(!key3);switch(key1n){case 1 ://didi();temp=(miao-1)/10*16+(miao-1)%10; //秒if(miao==0)temp=89;write_1302 (0x8e,0x00); //禁止写保护write_1302 (0x80,0x80|temp);write_1302 (0x8e,0x80); //允许写保护break;case 2 ://didi();temp=(fen-1)/10*16+(fen-1)%10; //分if(fen==0)temp=89;write_1302 (0x8e,0x00); //禁止写保护write_1302 (0x82,temp);write_1302 (0x8e,0x80); //允许写保护break;case 3 ://didi();temp=(shi-1)/10*16+(shi-1)%10; //时if(shi==0)temp=35;write_1302 (0x8e,0x00); //禁止写保护write_1302 (0x84,temp);write_1302 (0x8e,0x80); //允许写保护break;}}}}//write_1302(0x80,miao|0x80);//miao++;/* if(key2==0){if(key2==0){while(!key2);write_1302(0x80,miao|0x00);//打开1302振荡器}}*/}void main(){init();//buzzer=0;//miao=20;//fen=10;//shi=23;while(1){miao = BCD_Decimal(read_1302(0x81));fen = BCD_Decimal(read_1302(0x83));shi = BCD_Decimal(read_1302(0x85));keyscan();if((miao==clock1[2])&&(fen==clock1[1])&&(shi==clock1[0])) {flag1=1;for(i=0;i<10;i++)didi();}if(j==100) for(i=0;i<10;i++) didi();if(j==200) {for(i=0;i<10;i++)didi();flag1=0;j=0;}}}void tiemr0() interrupt 1{if(flag1) j++;TH0=(65536-50000)/256;TL0=(65536-50000)%256;write_sfm(miao,fen,shi); }。