📄 ds1302读写驱动程序.txt
字号:
用【 小 | 中 | 大 】字体浏览
硬件:那位师兄拉小弟一把,ds1302写不进拉 [弄月书生] [26次] 01-11-23 上午 11:22:17
org 00h
ajmp main
res bit p1.1
sdata bit p1.6
sclk bit p1.7
main:
clr res
clr sclk
nop
nop
nop
mov a,#8eh
setb res
acall out
mov a,#00
acall out
clr res
nop
mov a,#0cch
setb res
acall out
mov a,#0aah
acall out
clr res
nop
nop
mov a,#0cdh
setb res
acall out
acall in
clr res
mov r5,a
clr c
subb a,#0aah
jnz ww1
mov p1,#00
ww1:ajmp $
out:
mov r3,#8h
wa1:
rrc a
mov sdata,c
setb sclk
nop
clr sclk
djnz r3,wa1
ret
in:
mov r3,#8h
wa2:
setb sclk
nop
mov c,sdata
clr sclk
rrc a
djnz r3,wa2
ret
end
look here! [lezi] [32次] 01-11-23 上午 11:27:19
/*DS1302读写驱动程序*/
#include <absacc.h>
#include <stdio.h>
#include <AT89X52.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
uchar idata bufT[10];
#define I_O P3_0
#define SCLK P3_1
#define RSTL P1_3=0
#define RSTH P1_3=1
Rst1302();
void EndWrCLK(void);
void WriteYMD_DS1302(void);
void WriteHMS_DS1302(void);
void DisWrite1302(void);
void EnWrite1302(void);
void ReadTime_DS1302(void);
void SendCom1(uchar Cmd) /* 向DS1302发一个命令:Cmd */
{
uchar data i,k;
for(i=0;i<8;i++){
k=Cmd%2;
if(k==0x1)
I_O=1;
else
I_O=0;
SCLK=1;
SCLK=0;
Cmd=Cmd/2;
}
}
void RxComT(uchar DataNum) /* 从DS1302接收数据在buf[]中,uchar1=要接收的字节数*/
{
uchar data uc3,uc2,uco;
for(uc3=0;uc3<DataNum;uc3++){
uc2=0;
for(uco=0;uco<8;uco++){
SCLK=0;
uc2=uc2/2;
if(I_O==1)
uc2=uc2+0x80;
else
_nop_();
SCLK=1;
}
bufT[uc3]=uc2;
}
}
Rst1302()
{
SCLK=0;
RSTL;
RSTH;
}
void EndWrCLK(void)
{
RSTL;
SCLK=1;
}
void WriteYMD_DS1302(void) /* 写buf[]到DS1302的时钟寄存器 */
{
uchar i,j;
EnWrite1302();
i=0;
for (j=0;j<2;j++){
SCLK=0;RSTH;
SendCom1(0x86+i);
SendCom1(bufT[j]);
EndWrCLK();
i+=2;
}
i=0x8c;
SCLK=0;
RSTH;
SendCom1(i);
SendCom1(bufT[j]);
EndWrCLK();
DisWrite1302();
}
void WriteHMS_DS1302(void) /*写1302时间*/
{
uchar i,j;
EnWrite1302();
i=0;
for (j=0;j<3;j++){
SCLK=0;RSTH;
SendCom1(0x80+i);
SendCom1(bufT[j]);
EndWrCLK();
i+=2;
}
DisWrite1302();
}
void DisWrite1302(void) /* DS1302的写保护 */
{
Rst1302();
SendCom1(0x8e);
SendCom1(0x80);
EndWrCLK();
}
void EnWrite1302(void) /* DS1302的写许可 */
{
Rst1302();
SendCom1(0x8e);
SendCom1(0);
EndWrCLK();
}
void ReadTime_DS1302(void) /* 从DS1302读: 秒,分,HOUR,天,月,(星期),年=bufT[] */
{
uchar i;
for(i=0;i<8;i++) bufT[i]=0xff;
Rst1302();
SendCom1(0xbf); /* 时钟突发摸式读 */
RxComT(7);
EndWrCLK();
}
main()
{
uchar i;
ReadTime_DS1302();
bufT[0]&=0x7f;
WriteHMS_DS1302();
_nop_();
}
谢谢,我试试 [弄月书生] [1次] 01-11-23 下午 05:19:23
谢谢,我试试 [弄月书生] [0次] 01-11-23 下午 05:19:26
点击这里回复这篇贴子>>
_____________________________________________________________________________
Copyright?,C51BBS论坛 2000-2002
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -