51单片机 DS1302时钟程序求助 15

/**函数名:DS1302_WriteData*描述:向DS1302中的寄存器写入数据*输入:uint8_tcmd控制字uint8_tdat数据*输出:无*调用:内部调用... /*
* 函数名 : DS1302_WriteData
* 描述 : 向DS1302中的寄存器写入数据
* 输入 : uint8_t cmd 控制字
uint8_t dat 数据
* 输出 : 无
* 调用 : 内部调用
*/
void DS1302_WriteData(uchar cmd , uchar dat)
{
uchar j,k=1;
RST=0;
SCLK=0;
RST=1;
for(j=0;j<=7;j++) //写控制字
{
if(cmd&k)
DATA=1;
else
DATA=0;
SCLK=1;
k<<=1;
SCLK=0; //写完控制字,SCLK为低
}
k=1;
for(j=0;j<=7;j++) //写数据
{
if(dat&k)
DATA=1;
else
DATA=0;
SCLK=1; //写数据为下降沿写入,所以SCLK先拉高,然后再拉低,制造下降沿
k<<=1;
SCLK=0;
}
SCLK=1;
RST=0;
}
/*
* 函数名 : DS1302_ReadData
* 描述 : 从DS1302中的寄存器读出数据
* 输入 : uint8_t cmd 控制字
* 输出 : 读出寄存器的数据
* 调用 : 内部调用
*/
uchar DS1302_ReadData(uchar cmd)
{
uchar i,k=1;
RST=0;
SCLK=0;
RST=1;
for(i=0;i<8;i++) //写控制字
{
if(cmd&k)
DATA=1;
else
DATA=0;
SCLK=1;
k<<=1;
if(i!=7)
SCLK=0; //写完控制字,SCLK为低
}
k=0;
for(i=0;i<8;i++) //读数据
{
k>>=1;
SCLK=0; //读数据为上升沿读出,所以SCLK先拉低,然后再拉高,制造上升沿
if(DATA) //所以在写完控制字的最后一位跟读出数据的第一位是在同个周期内完成
k|=0x80;
SCLK=1;
}
RST=0;
return(k);
}
哪位大侠能详细分析下DS1302_WriteData(uchar cmd , uchar dat)
和 uchar DS1302_ReadData(uchar cmd)这两个程序,谢谢
展开
 我来答
yylrhyyl
2014-02-27 · TA获得超过1878个赞
知道大有可为答主
回答量:2013
采纳率:80%
帮助的人:617万
展开全部
void DS1302_WriteData(uchar cmd , uchar dat)//写数据指令,参数是命令和数据
{
uchar j,k=1;
RST=0;
SCLK=0;
RST=1;
for(j=0;j<=7;j++) //写控制字
{
if(cmd&k) //取cmd的第j位,并写到数据线上
DATA=1;
else
DATA=0;
SCLK=1; // 时钟高
k<<=1;// 取第J位
SCLK=0; //SCLK低
}
k=1;// 从低位开始
for(j=0;j<=7;j++) //写数据
{
if(dat&k)
DATA=1;
else
DATA=0;
SCLK=1;
k<<=1;
SCLK=0;
}
SCLK=1;
RST=0;
}
更多追问追答
追问
谢谢,那uchar DS1302_ReadData(uchar cmd) 这个函数怎么解释呢?为什么写控制字的时候会这样写 if(i!=7)   ?
追答
uchar DS1302_ReadData(uchar cmd)和写命令差不多,
if(i!=7) ?当发完8微数据后,时钟不再下降
GUEL86
2014-02-27 · TA获得超过5856个赞
知道大有可为答主
回答量:5538
采纳率:86%
帮助的人:2732万
展开全部

参考一下这个仿真实例,试试。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式