不用1302的时钟和用1302的时钟液晶显示c源程序

合集下载

ds1302时钟芯片汇编控制程序

ds1302时钟芯片汇编控制程序
MOV R4,#8 ;----R4
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时钟芯片介绍

ds1302时钟芯片介绍

ds1302时钟芯片介绍
DS1302是由美国公司Maxim Integrated(原先Dallas Semiconductor)生产的一种时钟芯片。

它是用于计时和日期记录的低功耗时钟芯片,可以广泛应用于计算机、家用电器、电子设备和工业控制等领域。

DS1302采用SPI接口与微控制器进行通信,采用电池供电,具有低功耗特性。

它内部包含了时钟计数器、时钟发生器、RAM和控制逻辑等核心部件。

DS1302具有精确的时钟计数器,可以提供准确的时间和日期记录。

它采用32.768kHz的晶体振荡器作为时钟源,可以提供精确至秒级别的计时功能。

同时,它还具有256字节的RAM 用于存储用户数据和设置参数。

DS1302支持BCD码和二进制码两种时间格式,并可以进行自动切换。

除此之外,它还具有闹钟功能,可以设置多个闹钟,同时支持中断输出,可通过外部中断引脚触发。

DS1302有一套完善的控制指令集,通过SPI接口与微控制器进行通信。

微控制器可以通过发送指令来读取和写入时钟和RAM中的数据。

此外,它还具有写保护功能,可以设置只读或只写模式,保护计时和日期数据的安全性。

DS1302具有多种封装形式,如DIP、SOIC和TSSOP等,方便不同应用场景的安装和布局。

此外,它还具有宽工作温度范围和抗辐射等特性,适应各种恶劣环境下的工作。

总结起来,DS1302是一种集计时、日期记录和闹钟功能于一体的低功耗时钟芯片。

它准确可靠、功能丰富、易于使用,可广泛应用于各种电子设备和工业控制系统中。

以DS1302实时时钟芯片和液晶显示屏CD1602为基础设计的电子钟

以DS1302实时时钟芯片和液晶显示屏CD1602为基础设计的电子钟

实验目的:1、能够以DS1302实时时钟芯片和液晶显示屏CD1602为基础设计一款电子钟2、熟悉DS1302芯片的工作过程3、熟悉CD1602芯片的工作过程4、可以进行必要的扩展,如用第三DS18B20新品进行温度采集和显示5、熟悉掌握51的c程序的编写6、掌握用Proteus进行系统设计仿真验证实验仪器、仪表目录1、DS1302实时时钟芯片1片2、LCD1602液晶显示屏1个,3、80C52芯片1片5、DS18B20芯片一片6、晶振、电容、电阻、开关各若干等7、proteus仿真软件8、Keil C51、PC机实验设计任务以DS1302实时时钟芯片和液晶显示屏LCD1602为基础设计一个电子钟,要求:时间和日期可调整,按键采用3个按键;至少在Proteus上调试通过。

扩展:闹钟和重要日期提醒功能(增加蜂鸣器),闹铃音乐功能实验步骤1、打开Keil软件,新建一个工程文件,选择好芯片,并记得在“Options for Target 1”的Output 选项中,将Create HEX Fil选项勾起来。

2、将编写的程序保存成“.C”的形式3、编译保存好的C文件,并根据提示修改程序中的错误,直到编译成功为止4、打开proteus软件,画出实验电路图5、在89C52中,载入原来已生成的HEX文档6、按下运行键,对Proteus进行软件仿真,观察运行结果原理、结果及分析一、设计方案原理与设计特点分析电子钟总的设计模块:各个模块电路原理分析:1、DS1302时钟采集模块:1.1电路原理图:1.2 DS1302分析:首先DS1302是DALLAS公司推出的涓流充电时钟芯片。

内含有一个实时时钟/日历和31字节静态RAM通过简单的串行接口与单片机进行通信实时时钟/日历电路提供秒分时日日期月年的信息每月的天数和闰年的天数可自动调整时钟操作。

DS1302芯片广脚介绍:X1、X2为32.768KHz晶振管脚。

GND 为地。

DS1302数码管电子闹钟程序

DS1302数码管电子闹钟程序

/*****************************************************///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); }。

实时时钟电路DS1302芯片的原理及应用

实时时钟电路DS1302芯片的原理及应用

实时时钟电路DS1302芯片的原理及应用DS1302是一种实时时钟(RTC)电路芯片,由Dallas Semiconductor (现被Maxim Integrated收购)设计和制造。

它提供了一个准确的时间和日期计时功能,适用于许多应用,例如电子设备、仪器仪表、通讯设备和计算机系统等。

DS1302芯片的原理如下:1.时钟发生器:DS1302芯片内部集成了一个时钟发生器电路,它使用外部XTAL晶体和一个频率分频器来产生准确的时钟信号。

晶体的频率通常为32.768kHz,这是由于此频率具有较好的稳定性。

2.电源管理:DS1302芯片可以使用3V到5.5V的电源供电。

它内部具有电源管理电路,可以自动切换到低功耗模式以延长电池寿命。

3.时间计数器:DS1302芯片内部包含一个时间计数器,用于计算并保存当前时间、日期和星期。

它采用24小时制,并提供了BCD编码的小时、分钟、秒、日、月和年信息。

4.控制和数据接口:DS1302芯片使用串行接口与外部器件进行通信,如微控制器或外部检测电路。

控制和数据信息通过三根线SCLK(串行时钟)、I/O(串行数据输入/输出)和CE(片选)进行传输。

5.电源备份:为了确保即使在电源中断的情况下仍能保持时间数据,DS1302芯片通过附带的外部电池来提供电源备份功能。

当主电源中断时,芯片会自动切换到电池供电模式,并将时间数据存储在内部RAM中。

DS1302芯片的应用包括但不限于以下几个方面:1.时钟和日历显示:DS1302芯片可以直接连接到LCD显示屏、LED显示器或数码管等设备,用于显示当前时间和日期。

2.定时控制:DS1302芯片可以用作定时器或闹钟,在特定的时间触发一些事件。

例如,可以使用它作为控制家庭设备的定时开关。

3.数据记录:由于DS1302芯片具有时间计数功能,它可以用于记录事件的时间戳,如数据采集、操作记录或系统状态记录。

4.电源失效保护:DS1302芯片的电源备份功能可确保即使在电源中断的情况下,时间数据也能被保存,以避免系统重新启动后时间重置的问题。

实时时钟电路DS1302芯片的原理及应用

实时时钟电路DS1302芯片的原理及应用

实时时钟电路DS1302芯片的原理及应用DS1302芯片是一种低功耗的实时时钟(RTC)电路。

它包含了一个真正的时钟/日历芯片和31个静态RAM存储单元,用于存储时钟和日期信息。

DS1302芯片的工作电压范围为2.0V至5.5V,并且具有极低的功耗,非常适合于移动电子设备和电池供电的应用。

DS1302芯片的原理如下:1.时钟发生器:DS1302芯片内部具有一个实时时钟发生器,它通过晶振和电容电路生成稳定的振荡信号,用于计时。

2.时钟/计时电路:DS1302芯片内部的时钟/计时电路可以精确地计算并保持当前的时间和日期。

它具有秒、分钟、小时、日期、月份、星期和年份等不同的计时单元。

3.RAM存储单元:DS1302芯片包含31个静态RAM存储单元,用于存储时钟和日期信息。

这些存储单元可以通过SPI接口进行读写操作,并且在断电情况下也能够保持数据。

4.控制接口:DS1302芯片通过3线接口与微控制器通信,包括一个时钟线、一个数据线和一个使能线。

这种接口使得与微控制器的通信非常简单,并且能够高效地读写时钟和日期信息以及控制芯片的其他功能。

DS1302芯片的应用如下:1.实时时钟:DS1302芯片可以用作电子设备中的实时时钟。

例如,它可以用于计算机、嵌入式系统、电子游戏等设备中,以提供准确的时间和日期信息。

2.定时器:DS1302芯片的计时功能可以用于设计各种定时器应用。

例如,它可以用于计时器、倒计时器、定时开关等应用中,以实现定时功能。

3.时钟显示:DS1302芯片可以与显示模块结合使用,用于显示当前的时间和日期。

例如,它可以用于数字钟、计时器、时钟频率计等应用中。

4.能量管理:由于DS1302芯片具有低功耗特性,因此它可以用于电池供电的设备中,以实现节能的能量管理策略。

例如,它可以用于手持设备、无线传感器网络等应用中,以延长电池寿命。

综上所述,DS1302芯片是一种低功耗的实时时钟电路,具有精确计时、可靠存储和简单接口等优点,适用于计时、显示和能量管理等各种应用中。

ds1302时钟程序详解,ds1302程序流程图

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,指定读操作(输出)。

时钟芯片DS1302 的程序(C51程序)

时钟芯片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实时时钟---液晶显示

DS1302实时时钟---液晶显示
while(ms--)
{
for(i = 0;i
//向DS1302写入一字节,根据时序图写函数
//上升沿锁存数据,先发送最低位
void Write_A_Byte_TO_DS1302(uchar x)
{
uchar i;
for(i = 0;i >= 1;
}
}
//从DS1302读取一字节,看时序图写函数
//下降沿锁存数据,先发送最低位
DelayMS(1);
Write_LCD_Command(0x06);
///DS1302中的数据是BCD码存放的,所以将寄存器中的数据转换成十六
进制返回
uchar Get_A_Byte_FROM_DS1302()
{
uchar i,b = 0x00;
for(i = 0;i
//从指定地址读取一个数据
uchar Read_Data(uchar addr)
{
uchar dat;
{
LCD_Busy_Wait();
RS = 0;RW = 0;EN = 0;datport = cmd;EN = 1;DelayMS(1);EN = 0;
}
//初始
Write_LCD_Command(0x38);
DelayMS(1);
Write_LCD_Command(0x01);
EN = 0;DelayMS(1);
return state; //返回状态值
}
*/
//LCD忙检测
void LCD_Busy_Wait()
{
// // while((Read_LCD_State()&amp;0x80) == 0x80); //忙,则等待

基于单片机的电子钟设计

基于单片机的电子钟设计

基于单片机的电子钟设计摘要:电子钟是一种普遍使用的时钟类型。

通过单片机,可以实现数字时钟的各种功能,例如:时间显示、闹钟功能、温度显示等。

本文介绍了基于单片机的电子钟设计方案,其中包括硬件系统的设计和程序代码的实现。

该电子钟的基本功能包括:时钟模式、闹钟模式、温度显示和日期显示。

设计方案使用的单片机是AT89C52,时钟模块为DS1302。

实验结果表明,该电子钟系统具有稳定性高、精度高、实用性强等特点。

关键词:单片机、电子钟、DS13021. 概述电子钟是目前流行的现代时钟类型之一。

通过单片机,可以实现数字时钟的各种功能,例如:时间显示、闹钟功能、温度显示等。

作为一种普遍应用于家庭以及公共场所的计时工具,电子钟能够提高人们的时效性、管理效率。

本文将介绍基于单片机的电子钟设计方案,其中包括硬件系统的设计和程序代码的实现。

该电子钟的基本功能包括:时钟模式、闹钟模式、温度显示和日期显示。

设计方案使用的单片机是AT89C52,时钟模块为DS1302。

实验结果表明,该电子钟系统具有稳定性高、精度高、实用性强等特点。

2. 硬件设计2.1 系统原理系统的核心是AT89C52单片机,其包括了8051架构下所有标准的特殊功能寄存器以及升级的功能模块。

DS1302是常用的实时时钟模块,它包含一个时钟/日历的B类时钟芯片、一个31个字节的静态RAM 以及一个摆振电路。

通过与AT89C52的串行通信接口,可以实现时钟芯片与单片机的通信。

2.2 电路设计电路设计包括AT89C52单片机、DS1302时钟芯片、4个7段数码管以及相关的外围元件。

其中,输入电源电压为5V直流电压,4个7段数码管均采用共阴极的连接方式。

2.3 电路说明(1) 时钟模块DS1302DS1302是一种时钟模块,其具有许多特性,例如:硬件控制时间的计数、在停电情况下,仍能保持时间记录、考虑到掉电情况、在无外部纪念日的情况下,为计时器提供64字节的RAM等特点。

DS1302时钟芯片C51驱动程序

DS1302时钟芯片C51驱动程序

DS1302时钟芯片C51驱动程序/**********************************************程序名称:DS1302时钟芯片C51驱动程序简要说明:read_clockS函数为读取时钟数据调用Set_time即可调整时间并写入DS1302sel为调整标志,可通过外部按键来更改其值来源:整理杜洋程序文档所得**********************************************///定义头文件#include/************************************************************** ****///定义DS1302时钟接口sbit clock_clk = P1 ^ 0; //ds1302_clk(时钟线)sbit clock_dat = P1 ^ 1; //ds1302_dat(数据线)sbit clock_Rst = P1 ^ 2; //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; //定义时间映射全局变量/************************************************************** ****///声明unsigned char clock_in(void);void clock_out(unsigned char dd);void Init_1302(void);unsigned char read_clock(unsigned char ord);void read_clockS(void);void Set_time(unsigned char sel);void write_clock(unsigned char ord, unsigned char dd);/************************************************************** ****///常用时钟数据读取void read_clockS(void){ss = read_clock(0x81); //读取秒数据mm = read_clock(0x83); //读取分钟数据hh = read_clock(0x85); //小时dd = read_clock(0x87); //日mo = read_clock(0x89); //月xq = read_clock(0x8b); //星期yy = read_clock(0x8d); //年}/************************************************************** ****///调时用加1或减1程序void Set_time(unsigned char sel){//根据选择调整的相应项目加1或减1并写入DS1302,sel为调整项标志,通过外部程序来影响它signed char address,item;signed char max,mini;if(sel==6) {address=0x80; max=0;mini=0;} //秒7if(sel==5) {address=0x82; max=59;mini=0;} //分钟6if(sel==4) {address=0x84; max=23;mini=0;} //小时5if(sel==3) {address=0x8a; max=7;mini=1;} //星期4if(sel==2) {address=0x86; max=31;mini=1;} //日3if(sel==1) {address=0x88; max=12;mini=1;} //月2if(sel==0) {address=0x8c; max=99; mini=0;} //年1//读取1302某地址上的数值转换成10进制赋给itemitem=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;if(ADD_KEY == 0){item++;} //增加键(ADD_KEY)按下,数加1if(DEC_KEY == 0){item--;} //减少键(DEC_KEY)按下,数减 1 if(item>max) item=mini; //查看数值有效范围if(itemwrite_clock(0x8e,0x00); //允许写操作write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302write_clock(0x8e,0x80); //写保护,禁止写操作}/************************************************************** ****///设置1302的初始时间void Init_1302(void)//(2009年1月1日00时00分00秒星期一){write_clock(0x8e,0x00); //允许写操作write_clock(0x8c,0x09); //年write_clock(0x8a,0x01); //星期write_clock(0x88,0x01); //月write_clock(0x86,0x01); //日write_clock(0x84,0x00); //小时write_clock(0x82,0x00); //分钟write_clock(0x80,0x00); //秒write_clock(0x90,0xa5); //充电write_clock(0x8e,0x80); //禁止写操作}/************************************************************** ****///DS1302写数据(底层协议)void write_clock(unsigned char ord, unsigned char dd){clock_clk=0;clock_Rst=0;clock_Rst=1;clock_out(ord);clock_out(dd);clock_Rst=0;clock_clk=1;}/************************************************************** ****///1302驱动程序(底层协议)void clock_out(unsigned char dd){ACC=dd;clock_dat=a0; clock_clk=1; clock_clk=0;clock_dat=a1; clock_clk=1; clock_clk=0;clock_dat=a2; clock_clk=1; clock_clk=0;clock_dat=a3; clock_clk=1; clock_clk=0;clock_dat=a4; clock_clk=1; clock_clk=0;clock_dat=a5; clock_clk=1; clock_clk=0;clock_dat=a6; clock_clk=1; clock_clk=0;clock_dat=a7; clock_clk=1; clock_clk=0;}/************************************************************** ****///DS1302写入字节(底层协议)unsigned char clock_in(void){clock_dat=1;a0=clock_dat;clock_clk=1; clock_clk=0; a1=clock_dat;clock_clk=1; clock_clk=0; a2=clock_dat;clock_clk=1; clock_clk=0; a3=clock_dat;clock_clk=1; clock_clk=0; a4=clock_dat;clock_clk=1; clock_clk=0; a5=clock_dat;clock_clk=1; clock_clk=0; a6=clock_dat;clock_clk=1; clock_clk=0; a7=clock_dat;return(ACC);}/************************************************************** ****///DS1302读数据(底层协议)unsigned char read_clock(unsigned char ord){unsigned char dd=0;clock_clk=0;clock_Rst=0;clock_Rst=1;clock_out(ord);dd=clock_in();clock_Rst=0;clock_clk=1;return(dd);}/************************************************************** ****/。

DS1302时钟芯片C51源代码源程序

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时钟 数码管显示

DS1302时钟  数码管显示

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();
fen=0x00;
write_1302(write_fen,fen); //写入 1302
read_sf();
//读出时间,然后显示
}
}
if(s2==0)
{
delay(10);
if(s2==0)
{
while(!s2)
display(shi,fen,miao); //加上这句,按键按下就不会闪
fen--;
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); //保护启动
W=0x02; D=dd[shi%10]; delay(5); D=0XFF; } else
//位选 //段选
//消隐 //小数点闪烁
//消隐
{ W=0x02; D=d[shi%10]; delay(5); D=0XFF;

DS1302 时钟芯片 C程序

DS1302 时钟芯片 C程序
/*DS1302操作的引脚定义*/
sbit ds_sclk=P1^6;//串行时钟,输入,控制数据的输入输出
sbit ds_io =P3^5;//三线接口时的双向数据线
sbit ds_ce =P1^7;//输入信号,在读写数据期间,必须为高。该引脚有两个功能:
//第一,CE开始控制字访问移位寄存器的控制逻辑:其次,CE提供结束单字节或多字节数据传输的方法。
年份寄存器 8CH 8DH 00-99
更新时间:2012年07月17日
更新版本:无
更新日志:
2012年07月17日 文件大小:256字节
2012年07月17日 开始优化代码 将相同的代码写成函数以便调用
2012年07月17日 文件大小:276字节
2012年07月17日 除了突发功能没有编写其他的均已写出
/*DS1302年份寄存器地址*/
#define Read_years 0x8d //读取的年地址
#define Write_years 0x8c //写入的年地址
/*DS1302写保护寄存器地址*/
#define Read_wp 0x8f //读取的写保护地址
20ndef __DS_1302_H__
#define __DS_1302_H__
#include<stc89.h> //包含单片机寄存器的头文件
#define uchar unsigned char
#define uint unsigned int
ds1302_write(Write_years ,Decimal_bcd(12));//写入时间年
ds1302_write(Write_charging,ds_cr6 ); //写入是否涓流充电 不充电

(完整版)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芯片C语言程序

DS1302芯片C语言程序

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include <intrins.h>sbit SCK=P3^6; //时钟sbit SDA=P3^4; //数据sbit RST = P3^5;// DS1302复位sbit LS138A=P2^2;sbit LS138B=P2^3;sbit LS138C=P2^4;bit ReadRTC_Flag;//定义读DS1302标志unsigned char l_tmpdate[7]={0,0,12,15,5,3,8};//秒分时日月周年08-05-15 12:00:00unsigned char l_tmpdisplay[8];code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日月周年最低位读写位code unsigned char read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};code unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//共阴数码管0-9 '-' '熄灭‘表/******************************************************************//* 函数声明*//******************************************************************/void Write_Ds1302_byte(unsigned char temp);void Write_Ds1302( unsigned char address,unsigned char dat );unsigned char Read_Ds1302 ( unsigned char address );void Read_RTC(void);//read RTCvoid Set_RTC(void); //set RTCvoid InitTIMER0(void);//inital timer0/******************************************************************//* 主函数*//******************************************************************/void main(void){InitTIMER0(); //初始化定时器0Set_RTC(); //写入时钟值,如果使用备用电池时候,不需要没每次上电写入,此程序应该屏蔽while(1){if(ReadRTC_Flag){ReadRTC_Flag=0;Read_RTC();l_tmpdisplay[0]=l_tmpdate[2]/16; //数据的转换,因我们采用数码管0~9的显示,将数据分开l_tmpdisplay[1]=l_tmpdate[2]&0x0f;l_tmpdisplay[2]=10; //加入"-"l_tmpdisplay[3]=l_tmpdate[1]/16;l_tmpdisplay[4]=l_tmpdate[1]&0x0f;l_tmpdisplay[5]=10;l_tmpdisplay[6]=l_tmpdate[0]/16;l_tmpdisplay[7]=l_tmpdate[0]&0x0f;}}}/******************************************************************//* 定时器0初始化*//******************************************************************/void InitTIMER0(void){TMOD|=0x01;//定时器设置16位TH0=0xef;//初始化值TL0=0xf0;ET0=1;TR0=1;EA=1;}/******************************************************************//* 写一个字节*//******************************************************************/void Write_Ds1302_Byte(unsigned char temp){unsigned char i;for (i=0;i<8;i++) //循环8次写入数据{SCK=0;SDA=temp&0x01; //每次传输低字节temp>>=1; //右移一位SCK=1;}}/******************************************************************/ /* 写入DS1302 */ /******************************************************************/ void Write_Ds1302( unsigned char address,unsigned char dat ){RST=0;_nop_();SCK=0;_nop_();RST=1;_nop_(); //启动Write_Ds1302_Byte(address); //发送地址Write_Ds1302_Byte(dat); //发送数据RST=0; //恢复}/******************************************************************/ /* 读出DS1302数据*/ /******************************************************************/ unsigned char Read_Ds1302 ( unsigned char address ){unsigned char i,temp=0x00;RST=0;_nop_();_nop_();SCK=0;_nop_();_nop_();RST=1;_nop_();_nop_();Write_Ds1302_Byte(address);for (i=0;i<8;i++) //循环8次读取数据{if(SDA)temp|=0x80; //每次传输低字节SCK=0;temp>>=1; //右移一位_nop_();_nop_();_nop_();SCK=1;}RST=0;_nop_(); //以下为DS1302复位的稳定时间_nop_();RST=0;SCK=0;_nop_();_nop_();_nop_();_nop_();SCK=1;_nop_();_nop_();SDA=0;_nop_();_nop_();SDA=1;_nop_();_nop_();return (temp); //返回}/******************************************************************/ /* 读时钟数据*/ /******************************************************************/ void Read_RTC(void) //读取日历{unsigned char i,*p;p=read_rtc_address; //地址传递for(i=0;i<7;i++) //分7次读取秒分时日月周年{l_tmpdate[i]=Read_Ds1302(*p);p++;}}/******************************************************************/ /* 设定时钟数据*/ /******************************************************************/ void Set_RTC(void) //设定日历{unsigned char i,*p,tmp;for(i=0;i<7;i++){ //BCD处理tmp=l_tmpdate[i]/10;l_tmpdate[i]=l_tmpdate[i]%10;l_tmpdate[i]=l_tmpdate[i]+tmp*16;}Write_Ds1302(0x8E,0X00);p=write_rtc_address; //传地址for(i=0;i<7;i++) //7次写入秒分时日月周年{Write_Ds1302(*p,l_tmpdate[i]);p++;}Write_Ds1302(0x8E,0x80);}/******************************************************************/ /* 定时器中断函数*/ /******************************************************************/ void tim(void) interrupt 1 using 1//中断,用于数码管扫描{static unsigned char i,num;TH0=0xf5;TL0=0xe0;P0=table[l_tmpdisplay[i]]; //查表法得到要显示数字的数码段switch(i){case 0:LS138A=0; LS138B=0; LS138C=0; break;case 1:LS138A=1; LS138B=0; LS138C=0; break;case 2:LS138A=0; LS138B=1; LS138C=0; break;case 3:LS138A=1; LS138B=1; LS138C=0; break;case 4:LS138A=0; LS138B=0; LS138C=1; break;case 5:LS138A=1; LS138B=0; LS138C=1; break;case 6:LS138A=0; LS138B=1; LS138C=1; break;case 7:LS138A=1; LS138B=1; LS138C=1; break;}i++;if(i==8){i=0;num++;if(10==num) //隔段时间读取1302的数据。

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

没用1302的时钟,只显示时分秒,年月日星期,有蜂鸣器#include<reg52.h>#define uint unsigned int#define uchar unsigned charint num,shi,fen,miao,nian,yue,ri,zhou;uchar K5num,K8num;uchar code shu[]={"0123456789"};uchar code str1[]={" - - "};uchar code str2[]={" : : "};//uchar code shu1[]={"Welcome To Lcd!"};//欢迎界面显示内容//uchar code shu2[]={"Happy Every Day!"};uchar code xingqi[]={"MONTUEWEDTHUFRISATSUN"};//************lcd1602声明************sbit RS=P2^0;sbit RW=P2^1;sbit E =P2^2;sbit BF=P0^7;//************按键声明****************sbit K5=P1^4;sbit K6=P1^5;sbit K7=P1^6;sbit K8=P1^7;sbit BEEP=P3^6;//****************延时1ms函数***************void delay1(){uchar i,j;for(i=5;i>0;i--)for(j=91;j>0;j--);}//*****************延时n 毫秒函数***************void delay(uint x)//注意取值范围,不能用uchar{for(;x>0;x--)delay1();}void beep()//蜂鸣器函数{uchar i;for(i=0;i<30;i++){BEEP=0;delay(1);BEEP=1;delay(1);}}//****************忙碌测试****************bit busy(){bit x;RS=0;RW=1;E=1; //读状态x=BF;delay(10);E=0;return x;//返回液晶是否忙碌}//******************写指令函数**************** void xiezl(uchar zl){while(busy()==1);RS=0;RW=0;E=0; //拉低为写入做准备delay1();P0=zl;delay1();E=1; //写入delay1();E=0;}//******************写数据函数***************** void xiesj(uchar sj){while(busy()==1);RS=1;RW=0;E=0; //为写入数据做准备P0=sj;delay1();E=1; //写入delay1();E=0;}//*****************1602初始化******************* void csh1602(){xiezl(0x38);//8位,两行,5x7delay(5);xiezl(0x0c);//显示开,无光标,不闪烁delay(5);xiezl(0x06);//写入数据光标右移屏不动delay(5);xiezl(0x01);//清屏delay(5);TMOD=0x01;TH0=(65536-45872)/256;//赋初值TL0=(65536-45872)%256;EA=1;ET0=1;TR0=1; //开启定时器0}//************************显示函数************************** void display_kj()//显示框架 - - ::{uchar i;xiezl(0x80);for(i=0;i<10;i++)xiesj(str1[i]);xiezl(0x80+0x40);for(i=0;i<8;i++)xiesj(str2[i]);}void display(uchar add,uchar date)//显示日期时间{uchar shi,ge;shi=date/10;ge=date%10;xiezl(0x80+add);xiesj(shu[shi]);xiesj(shu[ge]);//delay(2);}void display_year(uint date)//显示年{uchar qian,bai,shi,ge;qian=date/1000;bai=(date%1000)/100;shi=(date%100)/10;ge=date%10;xiezl(0x80);xiesj(shu[qian]);xiesj(shu[bai]);xiesj(shu[shi]);xiesj(shu[ge]);//delay(2);}void display_week(uchar x)//显示周{uchar i;x=(x-1)*3;xiezl(0x8d);for(i=0;i<3;i++){xiesj(xingqi[x]);x++;}}/**********欢迎界面*************void display_star(){uchar i;xiezl(0x80);for(i=0;i<15;i++)xiesj(shu1[i]);delay(1);xiezl(0x80+0x40);for(i=0;i<16;i++)xiesj(shu2[i]);} *///*******************键盘扫描函数******************** void key(){if(K5==0){delay(15);if(K5==0){while(!K5);beep();K5num++;if(K5num==1){TR0=0;xiezl(0x80+0x47);//光标跳到秒的位置xiezl(0x0f);}if(K5num==2)xiezl(0x80+0x44);//光标跳到分的位置if(K5num==3)xiezl(0x80+0x41);//光标跳到小时的位置if(K5num==4)xiezl(0x80+0x03);//光标跳到年的位置if(K5num==5)xiezl(0x80+0x06);//光标跳到月的位置if(K5num==6)xiezl(0x80+0x09);//光标跳到日的位置if(K5num==7)xiezl(0x80+0x0f);//光标跳到周的位置if(K5num==8){K5num=0;xiezl(0x0c);TR0=1;}}}if(K5num!=0){if(K6==0){delay(10);if(K6==0){while(!K6);beep();if(K5num==1)//加秒{miao++;if(miao==60)miao=0;display(0x46,miao);xiezl(0x80+0x47);}if(K5num==2) //加分{fen++;if(fen==60)fen=0;display(0x43,fen);xiezl(0x80+0x44);}if(K5num==3)//加小时{shi++;if(shi==24)shi=0;display(0x40,shi);xiezl(0x80+0x41);}if(K5num==4) //加年{nian++;display_year(nian);xiezl(0x80+0x03);}if(K5num==5) //加月{yue++;if(yue==13)yue=1;display(0x05,yue);xiezl(0x80+0x06);}if(K5num==6)//加日{ri++;if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12) {if(ri==32)ri=1;}if(yue==4||yue==6||yue==9||yue==11){if(ri==31)ri=1;}if(yue==2){if((nian%4==0)&&(nian%100!=0)||(nian%400==0)){if(ri>30)ri=29;if(ri==30)ri=1;}else{if(ri>29)ri=28;if(ri==29)ri=1;}}display(0x08,ri);xiezl(0x80+0x09);}if(K5num==7)//加周{zhou++;if(zhou==8)zhou=1;display_week(zhou);xiezl(0x80+0x0f);}}}if(K7==0){delay(10);if(K7==0){while(!K7);beep();if(K5num==1) //减秒{miao--;if(miao==-1)miao=59;display(0x46,miao);xiezl(0x80+0x47);}if(K5num==2)//减分{fen--;if(fen==-1)fen=59;display(0x43,fen);xiezl(0x80+0x44);}if(K5num==3) //减小时{shi--;if(shi==-1)shi=23;display(0x40,shi);xiezl(0x80+0x41);}if(K5num==4) //减年{nian--;display_year(nian);xiezl(0x80+0x03);}if(K5num==5) //减月{yue--;if(yue==0)yue=12;display(0x05,yue);xiezl(0x80+0x06);}if(K5num==6) //减日{ri--;if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12) {if(ri==0)ri=31;}if(yue==4||yue==6||yue==9||yue==11){if(ri==0)ri=30;}if(yue==2){if((nian%4==0)&&(nian%100!=0)||(nian%400==0)){if(ri==0)ri=29;}else{if(ri==0)ri=28;}}display(0x08,ri);xiezl(0x80+0x09);}if(K5num==7)//减周{zhou--;if(zhou==0)zhou=7;display_week(zhou);xiezl(0x80+0x0f);}}}}}//*******************主函数*******************void main(){// xiezl(0x01);// display_star();// delay(3000);csh1602();display_kj();shi=8;fen=59;miao=55;ri=5;zhou=7;yue=8;nian=2012;display(0x08,ri); //显示display(0x05,yue);display_year(nian);display_week(zhou);display(0x46,miao);display(0x43,fen);display(0x40,shi);while(1){key();if(K5num==0){if(num==20){num=0;miao++;if(miao==60){miao=0;fen++;if(fen==60){fen=0;shi++;if(shi==24){shi=0;ri++;zhou++;if(zhou==8)zhou=1;if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12){if(ri==32){ri=1;yue++;}if(yue==13){yue=1;nian++;display_year(nian);}display(0x05,yue);}if(yue==4||yue==6||yue==9||yue==11){if(ri==31){ri=1;yue++;}if(yue==13){yue=1;nian++;display_year(nian);}display(0x05,yue);}if(yue==2){if((nian%4==0)&&(nian%100!=0)||(nian%400==0)){if(ri==30){ri=1;yue++;}if(yue==13){yue=1;nian++;display_year(nian);}display(0x05,yue);}else{if(ri==29){ri=1;yue++;}if(yue==13){yue=1;nian++;display_year(nian);}display(0x05,yue);}}display(0x08,ri);display_week(zhou);}display(0x40,shi);}display(0x43,fen);}display(0x46,miao);}}}}void t0() interrupt 1{TH0=(65536-45872)/256;TL0=(65536-45872)%256;num++;}用1302的时钟,但不可调,按键扫描函数可参考上面的程序添加互补#include<reg52.h>#define uint unsigned int#define uchar unsigned charuchar code shu[]={"0123456789"};//**********1302申明**********sbit SCLK=P1^0;sbit DATA=P1^1;sbit CE=P1^2;void delayus(uchar n);//延时n微秒void delayms(uchar n);//延时n毫秒void write1302(uchar dat);//写指令void write_set1302(uchar add,uchar dat);//根据命令字写数据uchar read1302();//读数据uchar read_set1302(uchar add);//根据命令字读数据void csh1302();//1302初始化//************lcd1602申明************sbit RS=P2^0;sbit RW=P2^1;sbit E =P2^2;sbit BF=P0^7;bit busy_text();//忙碌检测void xiezl(uchar zl);//写指令void xiedz(uchar dz);//写地址void xiesj(uchar sj);//写数据void csh1602();//1602初始化void display_second(uchar x);//显示秒void display_minute(uchar x);//显示分void display_hour(uchar x);//显示时void display_day(uchar x);//显示日void display_month(uchar x);//显示月void display_year(uchar x);//显示年//************主函数************void main(){uchar second,minute,hour,day,month,year;uchar read_value;csh1602();//1602初始化delayms(10);delayms(5);xiedz(0x00);xiesj('D');xiesj('a');xiesj('t');xiesj('e');xiesj(':');xiedz(0x40);xiesj('T');xiesj('i');xiesj('m');xiesj('e');xiesj(':');xiedz(0x07);xiesj('-');xiedz(0x0a);xiesj('-');xiedz(0x47);xiesj(':');xiedz(0x4a);xiesj(':');csh1302();while(1){read_value=read_set1302(0x81);second=((read_value&0x70)>>4)*10+(read_value&0x0f);display_second(second);read_value=read_set1302(0x83);minute=((read_value&0x70)>>4)*10+(read_value&0x0f);display_minute(minute);read_value=read_set1302(0x85);hour=((read_value&0x70)>>4)*10+(read_value&0x0f);display_hour(hour);read_value=read_set1302(0x87);day=((read_value&0x70)>>4)*10+(read_value&0x0f);display_day(day);read_value=read_set1302(0x89);month=((read_value&0x70)>>4)*10+(read_value&0x0f);display_month(month);read_value=read_set1302(0x8d);year=((read_value&0xf0)>>4)*10+(read_value&0x0f);display_year(year);}}//***********DSC1302***********//***********n微秒延时函数************void delayus(uchar n){uchar i;for(i=0;i<n;i++);//n us}//***********n毫秒延时函数************void delayms(uchar n){uchar i;for(;n>0;n--)for(i=115;i>0;i--); //1ms}//***********写单字节指令函数************void write1302(uchar dat){uchar i;SCLK=0;delayus(2);for(i=0;i<8;i++){DATA=dat&0x01;delayus(2);SCLK=1;delayus(2);SCLK=0;dat=dat>>1;}}//**********根据命令字写数据函数*********** void write_set1302(uchar add,uchar dat) {CE=0;SCLK=0;//delayus(2);CE=1;delayus(2);write1302(add);write1302(dat);SCLK=1;CE=0;}//***********读数据函数***********uchar read1302(void){uchar i,x;delayus(2);for(i=0;i<8;i++){x=x>>1;if(DATA==1)x=x|0x80;SCLK=1;delayus(2);SCLK=0;delayus(2);}return x;}//************根据命令字读数据************ uchar read_set1302(uchar add){uchar x;CE=0;//禁止传输数据SCLK=0;//保证传输数据前SCLK为低电平CE=1;//允许传输数据write1302(add);//命令字x=read1302();SCLK=1;//上升沿return x;}//***********1302初始化************void csh1302(void){uchar flag;flag=read_set1302(0x81);if(flag&0x80){write_set1302(0x8E,0x00);write_set1302(0x80,((35/10)<<4|(35%10)));write_set1302(0x82,((54/10)<<4|(54%10)));write_set1302(0x84,((18/10)<<4|(18%10)));write_set1302(0x86,((14/10)<<4|(14%10)));write_set1302(0x88,((7/10)<<4|(7%10)));write_set1302(0x8c,((12/10)<<4|(12%10)));write_set1302(0x90,0xa5);write_set1302(0x8E,0x80);}}//************lcd1602************//***********忙碌检测函数************bit busy_text(void){bit result;RS=0;RW=1;E=1;delayus(10);result=BF;E=0;return result;}//***********写指令函数***********void xiezl(uchar zl){while(busy_text()==1);RS=0;RW=0;E=0;delayus(2);P0=zl;delayus(4);delayus(4);E=0;}//***********写地址函数***********void xiedz(uchar dz){xiezl(dz|0x80);}//**********写数据函数************void xiesj(uchar sj){while(busy_text()==1);RS=1;RW=0;E=0;P0=sj;delayus(4);E=1;delayus(4);E=0;}//**********lcd初始化************void csh1602(void){delayms(15);xiezl(0x38);//数据总线为8位,显示两行delayms(5);xiezl(0x38);delayms(5);xiezl(0x38);delayms(5);//写三次xiezl(0x0c);//无光标不闪烁,显示开delayms(5);xiezl(0x06);//写入数据屏不动,光标右移delayms(5);xiezl(0x01);//清屏delayms(5);}//**********1302数据显示到1602********** //**********显示秒***********void display_second(uchar x){uchar i,j;j=x%10;xiedz(0x4b);xiesj(shu[i]);xiesj(shu[j]);delayms(50);}//**********显示分*********** void display_minute(uchar x) {uchar i,j;i=x/10;j=x%10;xiedz(0x48);xiesj(shu[i]);xiesj(shu[j]);delayms(50);}//**********显示时*********** void display_hour(uchar x) {uchar i,j;i=x/10;j=x%10;xiedz(0x45);xiesj(shu[i]);xiesj(shu[j]);delayms(50);}//**********显示日*********** void display_day(uchar x) {uchar i,j;i=x/10;j=x%10;xiedz(0x0b);xiesj(shu[i]);xiesj(shu[j]);delayms(50);}//**********显示月*********** void display_month(uchar x) {uchar i,j;j=x%10;xiedz(0x08);xiesj(shu[i]);xiesj(shu[j]);delayms(50);}//**********显示年***********void display_year(uchar x){uchar i,j;i=x/10;j=x%10;xiedz(0x05);xiesj(shu[i]);xiesj(shu[j]);delayms(50);}本人入门的小练习,仅供参考单片机新手交流,QQ:865628361。

相关文档
最新文档