蓝桥杯之DS1302

声明:代码确实写的不好,用的都是最笨的方法实现功能,不喜勿喷

DS1302时钟芯片有困难的地方就在读写的时序上面,说到底还是时序图怎样读懂的问题。

这个芯片还有一点要注意的就是数据的格式问题:

数据分高四位和低四位,地址分为写地址和读地址

因为数据分高四位和低四位所以我们在写数据的时候要将高位移位进入高四位地址,数据的读取时要将高四位的数在转化为数据的高位。如果不明白的话,看一下代码就明白了。

下面看一下代码:

#include "ds1302.h"
uchar shijian[7];
uchar code ds[]={50,59,23,10,10,1,16};
//DS1302初始化
void DS13Init()
{
	uchar i;
	uchar add=0x80;
	write_DS(0x8e,0x00);//关闭写保护
	for(i=0;i<7;i++)
	{
		write_DS(add,ds[i]);
		add=add+2;
	}
	write_DS(0x8e,0x80);//开启写保护
}
//向DS1302写地址和数据
void write_DS(uchar add,uchar dat)
{
	uchar num;
	CE=0;
	SCLK=0;
	CE=1;
	writebyte(add);
	num=(dat/10<<4)|(dat%10);//将数据的高位移入寄存器的高四位,低位移入寄存器的低四位(数据的格式转换)
	writebyte(num);
	CE=0;
}
//将数据存储到指定数组中 
void Read_Time()
{
	uchar i;
	uchar add=0x81;
	write_DS(0x8e,0x00);//关闭写保护
	for(i=0;i<7;i++)
	{
		shijian[i]=read(add);
		add=add+2;
	}
	write_DS(0x8e,0x80);//开启写保护
}
//读取DS1302指定地址中的数据
uchar read(uchar add)
{
	uchar i,temp;
	uchar dat_low,dat_high;
	CE=0;
	SCLK=0;
	CE=1;
	writebyte(add);
	for(i=0;i<8;i++)
	{
		SCLK=0;
		temp>>=1;
		if(IO)
		{
			temp|=0x80;
		}
		SCLK=1;
	}
	IO=0;//数据位要从零开始
	dat_high=temp/16;//将读取的数据进行数据的转换,将寄存器的高四位转化为十进制的十位
	dat_low=temp%16;//将读取的数据进行数据的转换,将寄存器的低四位转化为十进制的个位
	temp=dat_high*10+dat_low;
	return temp;
}

//向DS1302写数据
void writebyte(uchar dat)
{
	uchar i;
	for(i=0;i<8;i++)
	{
		SCLK=0;
		IO=dat&0x01;
		SCLK=1;
		dat>>=1;		
	}
}

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值