实时时钟模DS1302程序列子
DS1302时钟程序

#define ds1302_charge_add 0x8e //控制数据地址
unsigned char sec,min,hr;
sbit DS1302_CLK=P1^5; //实时时钟时钟线引脚
sbit DS1302_IO=P1^6; //实时时钟数据线引脚
case 1:P2_1=0;P0=led_code[led_reg[1]]; break;
case 2:P2_2=0;P0=led_code[led_reg[2]]; break;
case 3:P2_3=0;P0=led_code[led_reg[3]]; break;
case 4:P2_4=0;P0=led_code[led_reg[4]]; break;
else temp&=0x7F;
DS1302_CLK=1;
DS1302_CLK=0;
}
DS1302_CLK=1;
DS1302_RST=0; //停止DS1302总线
return temp;
}
void T_display() //时钟显示
DS1302_CLK=1;
DS1302_CLK=0;
addr=addr>>1;
}
for(i=0;i<8;i++) //输出数据:temp
{
temp=temp>>1;
if(DS1302_IO)temp|=0x80;
}
}
void main() //主程序
{
ds1302_init();
delay(5);
实时时钟芯片DS1302设计程序

IO EQU P1.0SCLK EQU P1.1RST EQU P1.2RW BIT P1.6RS BIT P1.7E BIT P1.5KEY0 BIT P3.2KEY1 BIT P3.3KEY2 BIT P3.5KEY3 BIT P3.7ORG 0000HAJMP MAINORG 000BHAJMP T0INTORG 0100HMAIN: ACALL LCDINIT ;对LCD进行初始化LOP5:MOV 30H,#8 ;以下为将DS1302的数据存到单片机的40H到46H中MOV R0,#40HMOV R7,#7MOV R6,#81HLOP:CLR P1.2CLR P1.1SETB P1.2MOV B,R6ACALL WRITEACALL READMOV @R0,AINC R0INC R6INC R6DJNZ R7,LOP ;读出DS1302中的数据存到单片机中MOV 30H, 40H ;秒MOV 31H, 41H ;分MOV 32H, #00H ;时缓存MOV 33H, 42H ;时MOV R4, #00H ;控制显示模式MOV R3, #00H ;记录控制信号MOV TMOD, #01HMOV TL0, #0E0HMOV TH0, #0B1HMOV IE, #10000010BMOV R2, #32HSETB TR0MOV A, #83H ;DDRAM的地址进行设置,选择从哪里开始显示ACALL WRCMOV A, #54H ;T的ASCII码ACALL WRDMOV A, #49H ;I的ASCII码ACALL WRDMOV A, #4DH ;M的ASCII码ACALL WRDMOV A, #45H ;E的ASCII码ACALL WRDMOV A, #3AH ;:的ASCII码ACALL WRDMOV A,#0C3H ;对DDRAM地址进行设置CALL WRCMOV A,#58H ;X的ASCII码CALL WRDMOV A,#51H ;Q的ASCII码CALL WRDDEC 45HMOV A,45H ;显示星期ANL A,#0FHADD A,#30HACALL WRDMOV A,#3AH ;:的ASCII码CALL WRDMOV A,#10H ; 的ASCII码CALL WRDMOV A,46H ;显示年ANL A,#0F0HSWAP AADD A,#30HACALL WRDMOV A,46HANL A,#0FHADD A,#30HACALL WRDMOV A,#0CAH ;对DDRAM地址进行设置CALL WRCMOV A,#2DH ;-的ASCII码CALL WRDMOV A,44H ;显示月ANL A,#0F0HSWAP AADD A,#30HACALL WRDMOV A,44HANL A,#0FHADD A,#30HACALL WRDMOV A,#0CDH ;对DDRAM地址进行设置CALL WRCMOV A,#2DH ;-的ASCII码CALL WRDMOV A,43H ;显示日ANL A,#0F0HSWAP AADD A,#30HACALL WRDMOV A,43HANL A,#0FHADD A,#30HACALL WRDDONE: ACALL DISPLAYMOV A,#097H ;DDRAM的地址进行设置,选择从哪里开始显示CALL WRCMOV A,#31H ;1CALL WRDMOV A,#31H ;1CALL WRDMOV A,#30H ;0CALL WRDMOV A,#32H ;2CALL WRDMOV A,#3AH ;:CALL WRDMOV A,#48H ;H的ASCII码CALL WRDMOV A,#41H ;A的ASCII码CALL WRDMOV A,#4EH ;N的ASCII码CALL WRDMOV A,#10H ; 的ASCII码CALL WRDMOV A,#58H ;X的ASCII码CALL WRDMOV A,#49H ; I 的ASCII码CALL WRDMOV A,#41H ; A 的ASCII码CALL WRDMOV A,#4FH ;O的ASCII码CALL WRDMOV A,#10H ; 的ASCII码CALL WRDMOV A,#4EH ;N的ASCII码CALL WRDMOV A,#41H ; A 的ASCII码CALL WRDMOV A,#4EH ;N的ASCII码CALL WRDACALL KEYAJMP DONELCDINIT:MOV A, #01HACALL WRCMOV A, #38HACALL WRCMOV A, #0CHACALL WRCMOV A, #06HACALL WRCRET ;对液晶显示器初始功能设置DISPLAY:MOV R0, #32HMOV R1, #70HMOV R5, #03HMOV A, 33HCJNE A, #12H, LP2LP2: JC LP1MOV A, #9AHCLR CSUBB A, #12HADD A, 33HDA ALP1: MOV 32H, A ;调整显示模式LP3: MOV A, @R0SWAP AANL A, #0FHMOV @R1, AINC R1MOV A, @R0ANL A, #0FHMOV @R1, AINC R1DEC R0MOV @R1, #0AH ;:ASCII码减30H INC R1DJNZ R5, LP3MOV A, #88H ;第二行首地址ACALL WRCMOV R0, #70HLP4: MOV A, @R0ADD A, #30HACALL WRDINC R0RET ;显示时间KEY: JB KEY0, KK1ACALL DELAYJB KEY0, KK1JNB KEY0, $INC R4CJNE R4, #02H, KOENDMOV R4, #00H KOEND: RETKK1:JB KEY1, KK2ACALL DELAYJB KEY1, KK2JNB KEY1, $CLR TR0INC R3CJNE R3, #04H, K1ENDMOV R3, #00HSETB TR0K1END: RETKK2: JB KEY2, KK3ACALL DELAYJB KEY2, KK3JNB KEY2, $MOV A, R3RL AMOV DPTR, #KJMP2JMP @A+DPTRKJMP2: AJMP K2ENDAJMP SINCAJMP MINCAJMP HINCSINC: MOV A, 30HADD A, #01HDA AMOV 30H, ACJNE A, #60H, K2ENDMOV 30H, #00HAJMP K2ENDMINC: MOV A, 31HADD A, #01HDA AMOV 31H, ACJNE A, #60H, K2ENDMOV 31H, #00HAJMP K2ENDHINC: MOV A, 33HADD A, #01HDA AMOV 33H, ACJNE A, #24H, K2ENDMOV 33H, #00HK2END: RET ;增1程序KK3: JB KEY3, K3ENDACALL DELAYJB KEY3, K3ENDJNB KEY3, $MOV A, R3RL AMOV DPTR, #KJMP3JMP @A+DPTRKJMP3: AJMP K3ENDAJMP SDECAJMP MDECAJMP HDECSDEC: MOV A, #9AHCLR CSUBB A, #01HADD A, 30HDA AMOV 30H, ACJNE A, #99H, K3ENDMOV 30H, #59HAJMP K3ENDMDEC: MOV A, #9AHCLR CSUBB A, #01HADD A, 31HDA AMOV 31H, ACJNE A, #99H, K3ENDMOV 31H, #59HAJMP K3ENDHDEC: MOV A, #9AHCLR CSUBB A, #01HADD A, 33HDA AMOV 33H, ACJNE A, #99H, K3ENDMOV 33H, #59HAJMP K3ENDK3END: RET ;减1程序T0INT: PUSH ACCPUSH PSWMOV TL0, #0E0HMOV TH0, #0B1HDJNZ R2, NEXTMOV R2, #32HMOV A, 30HADD A, #01HDA AMOV 30H, ACJNE A, #60H, NEXTMOV 30H, #00HS1: MOV A, 31HADD A, #01HDA AMOV 31H, ACJNE A, #60H, NEXTMOV 31H, #00HS2: MOV A, 32HADD A, #01HDA AMOV 33H, AMOV A, 33HCJNE A, #24H, NEXTMOV 33H, #00HNEXT: POP P SWPOP A CCRETI ;定时器计时WRITE: ;以下全为子程序MOV 30H,#8LOP1:MOV A,BRRC AMOV B,AMOV P1.0,CSETB P1.1CLR P1.1DJNZ 30H,LOP1RET ;写入命令子程序DS1302READ:MOV 30H,#8LOP2:MOV C,P1.0RRC ASETB P1.1CLR P1.1DJNZ 30H,LOP2RET ;读出数据子程序DS1302WRC: CLR RSCLR RWSETB EMOV P2, ACLR EACALL DELAYRET ;写入LCD命令的程序WRD: SETB RSCLR RWSETB EMOV P2, ACLR EACALL DELAYRET ;写入LCD要显示的数据的DELAY: MOV R7, #35HLP5: MOV R6, #3FHDJNZ R6, $DJNZ R7, LP5RET ;延时END ACALL DELAYRET ;写入LCD要显示的数据的DELAY: MOV R7, #35HLP5: MOV R6, #3FHDJNZ R6, $DJNZ R7, LP5RET ;延时 END。
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置低电平。
IO口实时时钟芯片DS1302的应用实例

6.5
DS1302的读写时序
不仅要向寄存器写入控制字。还需要读取相应寄存器 的数据。要想与DS1302通信,首先要先了解DS1302的控
日历、 时钟寄存器及其控制字对照表 7 6 5 4 A3 0 0 0 0 0 0 0 0 1 1 3 A2 0 0 0 0 1 1 1 1 0 1 2 A1 0 0 1 1 0 0 1 1 0 1 1 A0 0 1 0 1 0 1 0 1 0 1 0 RD/W 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0 1/0
//秒 //分 //时 //日 //月 //星期 //年
time1[4]=d&0x0f; time1[5]=(d>>4)&0x0f; } void set_time(void) { v_W1302(0x8e,0x00); v_W1302(0x80,0x80); v_W1302(0x82,min); v_W1302(0x84,hou); v_W1302(0x86,day); v_W1302(0x88,mon); v_W1302(0x8c,yea); v_W1302(0x80,0x00); v_W1302(0x8e,0x80); } 以上函数为DS1302.H文件,在主函数中要调用该函数
源,外接32.768kHz晶振。RST是复位/片选线,通过把
RST输入驱动置高电平来启动所有的数据传送。RST输入
有两种功能:首先,RST接通控制逻辑,允许地址/命令序 列送入移位寄存器;其次,RST提供终止单字节或多字节 数据的传送手段。 当RST为高电平时,所有的数据传送被初始化,允许 对DS1302进行操作。如果在传送过程中RST置为低电平, 则会终止此次数据传送,I/O引脚变为高阻态。上电运
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的51单片机简易实时时钟-1602显示-源程序

==================主程序================= #include <reg51.h>。
#include "ds1302.h"#include "LCD1602.h"void change();uchar times[9];uchar date[9];main(){LCD_init();//LCD初始化init_1302(time_1302);gotoxy(1,1);LCD_display("Time:");gotoxy(1,2);LCD_display("Date:");times[8]='\0';//date[8]='\0';while(1){get_1302(time_1302);change();gotoxy(7,1);LCD_display(times);gotoxy(7,2);LCD_display(date);}}/*=========================== 转换子程序===========================*/void change(){// 时间的转换times[0]=time_1302[2]/10+'0';times[1]=time_1302[2]%10+'0';times[2]=':';times[3]=time_1302[1]/10+'0';times[4]=time_1302[1]%10+'0';times[5]=':';times[6]=time_1302[0]/10+'0';times[7]=time_1302[0]%10+'0';// 日期的转换date[0]=time_1302[6]/10+'0';date[1]=time_1302[6]%10+'0';date[2]='-';date[3]=time_1302[4]/10+'0';date[4]=time_1302[4]%10+'0';date[5]='-';date[6]=time_1302[3]/10+'0';date[7]=time_1302[3]%10+'0';}======================================================DS1302驱动程序=============#define uchar unsigned charuchar time_1302[7]={0x00,0x00,0x00,0x03,0x07,0x03,0x08};//设置时间初始值数组// 秒分时号月份星期年sbit T_IO=P1^0; //与硬件相关的连线clk为DS1302的时钟信号线sbit T_CLK=P1^1; //DAT为DS1302的I/O数据线sbit T_RST=P1^2; //RST为DS1302的RST信号线uchar bdata datbyte;sbit datbyte0=datbyte^0;sbit datbyte7=datbyte^7;void get_1302(uchar time[]);void write_ds1302(uchar dat);uchar r_1302(uchar add);void w_1302(uchar add,uchar dat);uchar read_ds1302(void);void init_1302(uchar *time);/*==========================================D S 1 3 0 2 初始化===========================================*/void init_1302(uchar *time){uchar i, add;//uchar time_bcd[7];add=0x80;//0写入,1读出w_1302(0x8e,0x00);for(i=0;i<7;i++){w_1302(add,*time);add+=2;time++;}w_1302(0x8e,0x80);}//===========================// 读取当前时间//===========================void get_1302(uchar time[]){uchar i;uchar add=0x81;w_1302(0x8e,0x00);for(i=0;i<7;i++){time[i]=r_1302(add);add+=2;}w_1302(0x8e,0x80);}/*================================= DS1302写入一个字节(上升沿有效)=================================*/void write_ds1302(uchar dat){uchar i;datbyte=dat;for(i=0;i<8;i++){T_IO=datbyte0;T_CLK=1;T_CLK=0;datbyte=datbyte>>1;}}/*======================================= DS1302读取一个字节(下降沿有效)=======================================*/uchar read_ds1302(void){uchar i;for(i=0;i<8;i++){datbyte=datbyte>>1;datbyte7=T_IO;T_CLK=1;T_CLK=0;}return(datbyte);}/*========================================= 指定位置读取数据=========================================*/uchar r_1302(uchar add){uchar temp,dat1,dat2;T_RST=0;T_CLK=0;T_RST=1;write_ds1302(add);temp=read_ds1302();T_CLK=1;T_RST=0;dat1=temp/16;dat2=temp%16;temp=dat1*10+dat2;return(temp);}/*========================================== 指定位置写入数据==========================================*/void w_1302(uchar add,uchar dat){T_RST=0;T_CLK=0;T_RST=1;write_ds1302(add);write_ds1302(dat/10<<4|dat%10);T_CLK=1;T_RST=0;}=========================================== =============LCD1602驱动程序================#define LCD_DB P0//定义LCD的数据端口sbit LCD_RS=P2^0;sbit LCD_RW=P2^1;sbit LCD_E=P2^2;#define uchar unsigned char#define uint unsigned int//===========延时子函数======================== void delay_lcd(uint x){uint i,j;for(i=x;i>0;i--)for(j=0;j<2;j++);}//==================写指令函数================= void LCD_write_command(uchar command){LCD_DB=command;LCD_RS=0;//指令LCD_RW=0;//写入LCD_E=1;LCD_E=0;delay_lcd(1);//等待执行完毕。
实时时钟DS1302读写程序

实时时钟DS1302读写程序(C51)//打开DS1302void TimeSpiOpen(void){TIMECLK = 0;TIMERST = 0;//禁止DS1302TIMEIO = 1;//释放数据总线TIMERST = 1;//使能DS1302}//关闭DS1302void TimeSpiClose(void){TIMERST = 0;//禁止DS1302TIMEIO = 1;//释放数据总线TIMECLK = 1;}//读写DS1302unsigned char TimeSpiReadWrite(unsigned char val) {unsigned char i;ACC = val;//取8位数据for (i = 8;i > 0; i--){TIMECLK = 0;//时钟下降沿输入数据(DS1302读)_nop_();//延时CY = TIMEIO;//接收串行数据到CY_rrca_();//右移一位数据到CY(先存后取)TIMEIO = CY;//发送串行数据TIMECLK = 1;//时钟上升沿打入数据(DS1302写)TIMEIO = 1;//释放数据总线}val = ACC;return val;}//读DS1302字节unsigned char TimeByteRead(unsigned char address) {TimeSpiOpen();//打开DS1302TimeSpiReadWrite(address);//写入DS1302命令address = TimeSpiReadWrite(0xff);//读入DS1302数据 TimeSpiClose();//关闭DS1302return address;//返回数据}//读DS1302RAM字节unsigned char TimeRamByteRead(unsigned char address){TimeSpiOpen();//打开DS1302TimeSpiReadWrite((address << 1) | 0xc1);//写入DS1302命令address = TimeSpiReadWrite(0xff);//读入DS1302数据TimeSpiClose();//关闭DS1302return address;//返回数据}//写DS1302字节void TimeByteWrite(unsigned char address, unsigned char val){TimeSpiOpen();//打开DS1302TimeSpiReadWrite(address);//写地址TimeSpiReadWrite(val);//写数据TimeSpiClose();//关闭DS1302}//写DS1302字节void TimeRamByteWrite(unsigned char address, unsigned char val) {TimeSpiOpen();//打开DS1302TimeSpiReadWrite((address << 1) | 0xc0);//写地址TimeSpiReadWrite(val);//写数据TimeSpiClose();//关闭DS1302}//使能DS1302写保护void TimeWriteEnable(void){TimeByteWrite(timewriteregall, timewriteseg);//使能DS1302写保护}//开放DS1302写保护void TimeWrieDisbale(void){TimeByteWrite(timewriteregall, 0);//开放DS1302写保护}//DS1302工作开始void TimeWorkStart(void){unsigned char val;val = TimeByteRead(timereadseg);//读秒数据val &= 0x7f;//打开晶振TimeWrieDisbale();//开放DS1302写保护TimeByteWrite(timewriteseg, val);//打开晶振TimeByteWrite(tricklewrite, 0xa5);//打开充电二极管 TimeWriteEnable();//使能DS1302写保护}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实时时钟模DS1302程序列子//****************************************************************************// /* 实时时钟模块时钟芯片型号:DS1302 *//*//*********************************************************************/sbit T_CLK = P2^7; /*实时时钟时钟线引脚*/sbit T_IO = P1^4; /*实时时钟数据线引脚*/sbit T_RST = P1^5; /*实时时钟复位线引脚*//********************************************************************** 名称: v_RTInputByte* 说明:* 功能: 往DS1302写入1Byte数据* 调用:* 输入: ucDa 写入的数据* 返回值: 无***********************************************************************/void v_RTInputByte(uchar ucDa){uchar i;ACC = ucDa;for(i=8; i>0; i--){T_IO = ACC0; /*相当于汇编中的RRC */T_CLK = 1;T_CLK = 0;ACC = ACC >> 1;}}/********************************************************************** 名称: uchar uc_RTOutputByte* 说明:* 功能: 从DS1302读取1Byte数据* 调用:* 输入:* 返回值: ACC***********************************************************************/uchar uc_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);}/********************************************************************** 名称: v_W1302* 说明: 先写地址,后写命令/数据* 功能: 往DS1302写入数据* 调用: v_RTInputByte()* 输入: ucAddr: DS1302地址, ucDa: 要写的数据* 返回值: 无***********************************************************************/ void v_W1302(uchar ucAddr, uchar ucDa){T_RST = 0;T_CLK = 0;T_RST = 1;v_RTInputByte(ucAddr); /* 地址,命令*/v_RTInputByte(ucDa); /* 写1Byte数据*/T_CLK = 1;T_RST =0;}/********************************************************************** 名称: uc_R1302* 说明: 先写地址,后读命令/数据* 功能: 读取DS1302某地址的数据* 调用: v_RTInputByte() , uc_RTOutputByte()* 输入: ucAddr: DS1302地址* 返回值: ucDa :读取的数据***********************************************************************/ uchar uc_R1302(uchar ucAddr){uchar ucDa;T_RST = 0;T_CLK = 0;T_RST = 1;v_RTInputByte(ucAddr); /* 地址,命令*/ucDa = uc_RTOutputByte(); /* 读1Byte数据*/T_CLK = 1;T_RST =0;return(ucDa);}/********************************************************************** 名称: v_BurstW1302T* 说明: 先写地址,后写数据(时钟多字节方式)* 功能: 往DS1302写入时钟数据(多字节方式)* 调用: v_RTInputByte()* 输入: pSecDa: 时钟数据地址格式为: 秒分时日月星期年控制* 8Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B 1B* 返回值: 无***********************************************************************/ void v_BurstW1302T(uchar *pSecDa){uchar i;v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/T_RST = 0;T_CLK = 0;T_RST = 1;v_RTInputByte(0xbe); /* 0xbe:时钟多字节写命令*/for (i=8;i>0;i--) /*8Byte = 7Byte 时钟数据+ 1Byte 控制*/{v_RTInputByte(*pSecDa);/* 写1Byte数据*/pSecDa++;}T_CLK = 1;T_RST =0;}/********************************************************************** 名称: v_BurstR1302T* 说明: 先写地址,后读命令/数据(时钟多字节方式)* 功能: 读取DS1302时钟数据* 调用: v_RTInputByte() , uc_RTOutputByte()* 输入: pSecDa: 时钟数据地址格式为: 秒分时日月星期年* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B* 返回值: ucDa :读取的数据***********************************************************************/ void v_BurstR1302T(uchar *pSecDa){uchar i;T_RST = 0;T_CLK = 0;T_RST = 1;v_RTInputByte(0xbf); /* 0xbf:时钟多字节读命令*/for (i=8; i>0; i--){*pSecDa = uc_RTOutputByte(); /* 读1Byte数据*/pSecDa++;}T_CLK = 1;T_RST =0;}/********************************************************************** 名称: v_BurstW1302R* 说明: 先写地址,后写数据(寄存器多字节方式)* 功能: 往DS1302寄存器数写入数据(多字节方式)* 调用: v_RTInputByte()* 输入: pReDa: 寄存器数据地址* 返回值: 无***********************************************************************/ void v_BurstW1302R(uchar *pReDa){uchar i;v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/T_RST = 0;T_CLK = 0;T_RST = 1;v_RTInputByte(0xfe); /* 0xbe:时钟多字节写命令*/for (i=31;i>0;i--) /*31Byte 寄存器数据*/{v_RTInputByte(*pReDa); /* 写1Byte数据*/pReDa++;}T_CLK = 1;T_RST =0;}/********************************************************************** 名称: uc_BurstR1302R* 说明: 先写地址,后读命令/数据(寄存器多字节方式)* 功能: 读取DS1302寄存器数据* 调用: v_RTInputByte() , uc_RTOutputByte()* 输入: pReDa: 寄存器数据地址* 返回值: 无***********************************************************************/ void v_BurstR1302R(uchar *pReDa){uchar i;T_RST = 0;T_CLK = 0;T_RST = 1;v_RTInputByte(0xff); /* 0xbf:时钟多字节读命令*/for (i=31; i>0; i--) /*31Byte 寄存器数据*/{*pReDa = uc_RTOutputByte(); /* 读1Byte数据*/pReDa++;}T_CLK = 1;T_RST =0;}/********************************************************************** 名称: v_Set1302* 说明:* 功能: 设置初始时间* 调用: v_W1302()* 输入: pSecDa: 初始时间地址。
初始时间格式为: 秒分时日月星期年* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B* 返回值: 无***********************************************************************/ void v_Set1302(uchar *pSecDa){uchar i;uchar ucAddr = 0x80;v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/for(i =7;i>0;i--){v_W1302(ucAddr,*pSecDa); /* 秒分时日月星期年*/pSecDa++;ucAddr +=2;}v_W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/}/********************************************************************** 名称: v_Get1302* 说明:* 功能: 读取DS1302当前时间* 调用: uc_R1302()* 输入: ucCurtime: 保存当前时间地址。