今天给各位分享ds1302c语言的知识,其中也会对ds1302 iic进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
1、麻烦老师们大侠们注释一下下面这段51c语言,ds1302时间读取代码。越详细越好,感激不尽啊~2、将DS1302时钟芯片的时期显示在LCD上的代码 要是C语言的 单片机用51的,急急急!!!3、c语言编的DS1302怎么读出和写入数据
麻烦老师们大侠们注释一下下面这段51c语言,ds1302时间读取代码。越详细越好,感激不尽啊~
你是在学习吗? 这段代码很简单啊,看不懂证明你还差得很远。基础很重要,要会二进制数学,要有一定的英语基础,能看懂芯片手册,要会C语言,如果会汇编就更好了。
大概给你说一下吧,上半段是读时分秒的,从寄存器读出来以后,根据寄存器的定义进行了处理,把每个数字都分成了两部分存储,下半段类似,是读年月日的。
和0x70相与并右移,意思是只要第6、5、4位,和0x0f相与,意思是只要第3、2、1、0位。
看不到Time数组的定义和用法,所以这里只能猜,与操作和右移操作是为了将数字在什么地方显示出来,比如数码管之类的。
将DS1302时钟芯片的时期显示在LCD上的代码 要是C语言的 单片机用51的,急急急!!!
#include reg52.hsbit T_CLK = P2^4; /*实时时钟时钟线引脚 */
sbit T_IO = P2^3; /*实时时钟数据线引脚 */
sbit T_RST = P2^2; /*实时时钟复位线引脚 */
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
sbit rs=P2^0;
sbit rw=P2^1;
sbit e=P2^7;
sbit setd=P3^2;
sbit sett=P3^3;
sbit add=P2^5;
sbit enter=P2^6;
sbit speaker=P3^7;
unsigned char code tab[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
void v_RTInputByte(unsigned char ucDa)
{
unsigned char i;
ACC = ucDa;
for(i=8; i0; i–)
{
T_IO = ACC0; /*相当于汇编中的 RRC */
T_CLK = 1;
T_CLK = 0;
ACC = ACC 1;
}
}
unsigned char uc_RTOutputByte(void)
{
unsigned char i;
for(i=8; i0; i–)
{
ACC = ACC 1; /*相当于汇编中的 RRC */
ACC7 = T_IO;
T_CLK = 1;
T_CLK = 0;
}
return(ACC);
}
void v_W1302(unsigned char ucAddr, unsigned char ucDa)
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_RTInputByte(ucAddr); /* 地址,命令 */
v_RTInputByte(ucDa); /* 写1Byte数据*/
T_CLK = 1;
T_RST =0;
}
unsigned char uc_R1302(unsigned char ucAddr)
{
unsigned char 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);
}
void v_BurstW1302T(unsigned char *pSecDa)
{
unsigned char i;
v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_RTInputByte(0xbe); /* 0xbe:时钟多字节写命令 */
for (i=8;i0;i–) /*8Byte = 7Byte 时钟数据 + 1Byte 控制*/
{
v_RTInputByte(*pSecDa);/* 写1Byte数据*/
pSecDa++;
}
T_CLK = 1;
T_RST =0;
}
void v_BurstR1302T(unsigned char *pSecDa)
{
unsigned char i;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_RTInputByte(0xbf); /* 0xbf:时钟多字节读命令 */
for (i=8; i0; i–)
{
*pSecDa = uc_RTOutputByte(); /* 读1Byte数据 */
pSecDa++;
}
T_CLK = 1;
T_RST =0;
}
void v_BurstW1302R(unsigned char *pReDa)
{
unsigned char i;
v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_RTInputByte(0xfe); /* 0xbe:时钟多字节写命令 */
for (i=31;i0;i–) /*31Byte 寄存器数据 */
{
v_RTInputByte(*pReDa); /* 写1Byte数据*/
pReDa++;
}
T_CLK = 1;
T_RST =0;
}
void v_BurstR1302R(unsigned char *pReDa)
{
unsigned char i;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_RTInputByte(0xff); /* 0xbf:时钟多字节读命令 */
for (i=31; i0; i–) /*31Byte 寄存器数据 */
{
*pReDa = uc_RTOutputByte(); /* 读1Byte数据 */
pReDa++;
}
T_CLK = 1;
T_RST =0;
}
void v_setd1302(unsigned char *pSecDa)
{
unsigned char i;
unsigned char ucAddr = 0x80;
v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
for(i =7;i0;i–)
{
v_W1302(ucAddr,*pSecDa); /* 秒 分 时 日 月 星期 年 */pSecDa++;
ucAddr +=2;
}
v_W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
}
void delay()
{ unsigned char x,y ;
for(y=0;y0xff;y++)
for(x=0;x2;x++)
{;}
}/*****************************************/ void wc51r(unsigned char j)//写命令
{
e=0;rs=0;rw=0;
e=1;
P1=j;
e=0;
delay();
}void init()//初始化
{
wc51r(0x01);
wc51r(0x38);
wc51r(0x38);
wc51r(0x0e);
wc51r(0x06);
wc51r(0x0c);
}
void wc51ddr(unsigned char j)//写数据
{
e=0;rs=1;rw=0;
e=1;
P1=j;
e=0;
delay();
}void write1602(unsigned char add,unsigned char da)//写入显示数据
{wc51r(add);wc51ddr(da);}
void main(void)
{
unsigned char ucCurtime[7];
unsigned char i,yearh,yearl,monh,monl,dah,dal,hoh,hol,mih,mil,seh,sel;
unsigned char ucAddr;
unsigned int c;EA=1;init();
write1602(0x85,0x35);
for(c=0;c30000;c++);
write1602(0x86,0x32);
for(c=0;c30000;c++);
write1602(0x87,0x4D);
for(c=0;c30000;c++);
write1602(0x88,0x43);
for(c=0;c30000;c++);
write1602(0x89,0x55);
for(c=0;c30000;c++);
/*write1602(0xC2,0x51);
write1602(0xC3,0x51);
write1602(0xC4,0x3A);
write1602(0xC5,0x35);
write1602(0xC6,0x39);
write1602(0xC7,0x37);
write1602(0xC8,0x33);
write1602(0xC9,0x38);
write1602(0xCA,0x35);
write1602(0xCB,0x33);
write1602(0xCC,0x36);
write1602(0xCD,0x39);
for(c=0;c50000;c++);
init();//LCD初始化 */ TMOD=0X20;
TH1=0XF3;
TL1=0XF3;
SCON=0X50;
PCON=0X00;
IT0=1;
EX0=1;
IT1=1;
EX1=1;
TR1=1;
// EA=1;
ES=1;
while(1)
{ucAddr = 0x81;brfor (i=0;i7;i++)br{brucCurtime[i] = uc_R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */brucAddr += 2;br}
yearh=ucCurtime[6]/16;
yearl=ucCurtime[6]%16;
monh=ucCurtime[4]/16;
monl=ucCurtime[4]%16;
dah=ucCurtime[3]/16;
dal=ucCurtime[3]%16;hoh=ucCurtime[2]/16;
hol=ucCurtime[2]%16;
mih=ucCurtime[1]/16;
mil=ucCurtime[1]%16;
seh=ucCurtime[0]/16;
sel=ucCurtime[0]%16;//EA=1;write1602(0x80,0x44);
write1602(0x81,0x61);
write1602(0x82,0x74);
write1602(0x83,0x65);
write1602(0x84,0x3a);//显示date:write1602(0x85,tab[yearh]);
write1602(0x86,tab[yearl]);
write1602(0x87,0x2d);//显示年
write1602(0x88,tab[monh]);
write1602(0x89,tab[monl]);
write1602(0x8a,0x2d);//显示月
write1602(0x8b,tab[dah]);
write1602(0x8c,tab[dal]);write1602(0xc0,0x54);
write1602(0xc1,0x69);
write1602(0xc2,0x6d);
write1602(0xc3,0x65);
write1602(0xc4,0x3a);//显示time:write1602(0xc5,tab[hoh]);
write1602(0xc6,tab[hol]);
write1602(0xc7,0x3a);//显示小时
write1602(0xc8,tab[mih]);
write1602(0xc9,tab[mil]);
write1602(0xca,0x3a);//显示小时
write1602(0xcb,tab[seh]);
write1602(0xcc,tab[sel]);EA=0;
/*if((ucCurtime[1]==0)(ucCurtime[0]==0|ucCurtime[0]==1|ucCurtime[0]==2))//3秒整点报时
speaker=0;
else speaker=1; **/}
}/******************************************/
serint() interrupt 4
{// EA=0;
static unsigned char k;
unsigned char temp,year,month,date,hour,min,sec,week;
unsigned char stemp[7]={0};
RI=1;
temp=SBUF;
RI=0;
k++;
switch (k)
{ case 1:sec=temp;
break;
case 2:min=temp;
break;
case 3:hour=temp;
break;
case 4:date=temp;
break;
case 5:month=temp;
break;
case 6:week=temp;
break;
case 7:year=temp; k=0;
break;
stemp[0]=(sec/10)*16+sec%10;
stemp[1]=(min/10)*16+min%10;
stemp[2]=(hour/10)*16+hour%10;
stemp[3]=(date/10)*16+date%10;
stemp[4]=(month/10)*16+month%10;
stemp[5]=(week/10)*16+week%10;
stemp[6]=(year/10)*16+year%10;
v_setd1302(stemp);//设定值
}
}
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,#08H
WRI_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,#08H
WRI_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,#08H
READ_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,#08H
READ_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
ds1302c语言的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于ds1302 iic、ds1302c语言的信息别忘了在本站进行查找喔。