1.c语言编的DS1302怎么读出和写入数据这是汇编版的dS1302驱动程序 , 你可以参考一下 。
PUBLIC D1302_INIT,SET1302,GET1302,WRITE,READ CODE_DS1302 SEGMENT CODE T_CLK BIT P1.0 T_IO BIT P1.1 T_RST BIT P1.2 SECOND EQU 30H MINUTE EQU 31H HOUR EQU 32H DAY EQU 33H MONTH EQU 34H WEEK EQU 35H YEAR EQU 36H RSEG CODE_DS1302 ;使用当前段 ;以下是DS1302初始化子程序D1302_INIT: CLR T_RST ;DS1302复位 CLR T_CLK NOP NOP SETB T_RST MOV R1,#80H MOV R0,#00H LCALL WRITE MOV R1,#90H MOV R0,#0ABH LCALL WRITE RET ;以下是 读 日期时间数据子程序GET1302: MOV R1,#81H LCALL READ MOV SECOND,R0 MOV R1,#83H LCALL READ MOV MINUTE,R0 MOV R1,#85H LCALL READ MOV HOUR,R0 MOV R1,#87H LCALL READ MOV DAY,R0 MOV R1,#89H LCALL READ MOV MONTH,R0 MOV R1,#8BH LCALL READ MOV WEEK,R0 MOV R1,#8DH LCALL READ MOV YEAR,R0 RET ;以下是时钟日历写操作子程序(单片机向DS1302写入初始时间)SET1302: MOV R1,#80H ;写 秒 LCALL WRITE MOV SECOND,R0 MOV R1,#82H ;写 分 LCALL WRITE MOV MINUTE,R0 MOV R1,#84H ;写 时 LCALL WRITE MOV HOUR,R0 MOV R1,#86H ;写 天 LCALL WRITE MOV DAY,R0 MOV R1,#88H ;写 月 LCALL WRITE MOV MONTH,R0 MOV R1,#8AH ;写 周 LCALL WRITE MOV WEEK,R0 MOV R1,#8CH ;写 年 LCALL WRITE MOV YEAR,R0 RET ;以下是 写 一个字节地址和数据的子程序WRITE: CLR T_CLK NOP NOP SETB T_RST NOP MOV A,R1 MOV R2,#08HWRI_01: RRC A NOP NOP CLR T_CLK NOP NOP MOV T_IO,C NOP NOP SETB T_CLK NOP NOP DJNZ R2,WRI_01 CLR T_CLK NOP NOP MOV A,R0 MOV R2,#08HWRI_02: RRC A NOP CLR T_CLK NOP NOP MOV T_IO,C NOP NOP SETB T_CLK NOP NOP DJNZ R2,WRI_02 CLR T_CLK NOP NOP CLR T_RST NOP NOP RET ;以下是从DS1302读取一字节地址中数据子程序READ: CLR T_CLK NOP NOP SETB T_RST NOP NOP MOV A,R1 MOV R2,#08HREAD_01: RRC A NOP MOV T_IO,C NOP NOP SETB T_CLK NOP NOP CLR T_CLK NOP NOP DJNZ R2,READ_01 NOP NOP SETB T_IO CLR A CLR C MOV R2,#08HREAD_02: CLR T_CLK NOP NOP MOV C,T_IO NOP NOP RRC A NOP NOP SETB T_CLK NOP NOP DJNZ R2,READ_02 MOV R0,A CLR T_RST RET END 。
2.如何读出DS1302里面的时钟数据一个例子 重点看DS1302_Read() #include #include #define uchar unsigned char #define uint unsigned int #define SECOND 0x81 #define MINUTE 0x83 #define HOUR 0x85 sbit rs=P2^0; sbit rw=P2^1; sbit ep=P2^2; sbit DS1302_SCLK = P1^0; sbit DS1302_IO= P1^1; sbit DS1302_RST = P1^2; sbit M=P3^2; sbit U=P3^3; sbit D=P3^4; unsigned char sel=0; uchar code DIS1[]={“abcdef"}; uchar code DIS2[]={"abcdef"}; /////////////////////////延时//////////////////////////////// void delay(uint ms) { unsigned int a,b; for(a=0;a>1; } } //////////////////////////////////////////////////////////// uchar DS1302_Read() { uchar TempDat=0,i; for(i=0;i<8;i++) { TempDat>>=1; if(DS1302_IO) TempDat=TempDat|0x80; DS1302_SCLK=1; DS1302_SCLK=0; } return TempDat; } //////////////////////////////////////////////////////////// void WDS1302(uchar ucAddr, uchar ucDat) { DS1302_RST = 0; DS1302_SCLK = 0; DS1302_RST = 1; DS1302_Write(ucAddr); DS1302_Write(ucDat); DS1302_SCLK = 1; DS1302_RST = 0; } //////////////////////////////////////////////////////////// uchar RDS1302(uchar ucAddr) { uchar ucDat; DS1302_RST = 0; DS1302_SCLK = 0; DS1302_RST = 1; DS1302_Write(ucAddr); ucDat=DS1302_Read(); DS1302_SCLK = 1; DS1302_RST = 0; return ucDat; } ////////////////////////////////////////////////////////// void init_1302() { WDS1302(0x8e,0x00);//开保护寄存器 WDS1302(0x80,0x55);//秒 WDS1302(0x82,0x59);//分 WDS1302(0x84,0x23);//时 WDS1302(0x8A,0x07);//星期 WDS1302(0x86,0x02);//日 WDS1302(0x88,0x08);//月 WDS1302(0x8C,0x09);//年 WDS1302(0x90,0xab);//卷电流充电 WDS1302(0x8e,0x80);//关保护寄存器 } ////////////////////////////////////////////////////////// /************************1602驱动************************/ ////////////////////////////////////////////////////////// bit lcd_bz() { bit result; rs = 0; rw = 1; ep = 1; _nop_(); _nop_(); _nop_(); _nop_(); result = (bit)(P0 & 0x80); ep = 0; return result; } //////////////////////////////////////////////////////// void lcd_wcmd(unsigned char cmd) { while(lcd_bz()); rs = 0; rw = 0; ep = 0; _nop_(); _nop_(); P0 = cmd; _nop_(); _nop_(); _nop_(); _nop_(); ep = 1; _nop_(); _nop_(); _nop_(); _nop_(); ep= 0; } ///////////////////////////////////////////////////////// void lcd_pos(unsigned char pos) { lcd_wcmd(pos | 0x80); } ///////////////////////////////////////////////////////// void lcd_wdat(unsigned char dat) { while(lcd_bz()); rs = 1; rw = 0; ep = 0; P0 = dat; _nop_(); _nop_(); _nop_(); _nop_(); ep = 1; _nop_(); _nop_(); _nop_(); _nop_(); ep = 0; } ////////////////////////////////////////////////////////// void lcd_init() { lcd_wcmd(0x38); delay(1); lcd_wcmd(0x0c); delay(1); lcd_wcmd(0x06); delay(1); lcd_wcmd(0x01); delay(1); } ///////////////////////////////////////////////////////// /*********************调时函数*************************/ ///////////////////////////////////////////////////////// void set_time() { signed char address,item; signed char max,mini; if(M==0) { sel++; delay(300); if(sel==6) sel=0; if(sel==2) {address=0x82; max=59;mini=0; } if(sel==1) {address=0x84; max=23;mini=0; } if(sel==3) {address=0x8c; max=99;mini=9;} if(sel==4) {address=0x88; max=12;mini=1; } if(sel==5) {address=0x86; max=31;mini=1; } M=1; } item=((RDS1302(address+1))/16)*10 + (RDS1302(address+1))%16; if(U == 0) { delay(200); U=1; item++; } if(D == 0) { delay(200); D=1; item--; } if(item>max) item=mini; if(item