2019-03-24 17:44发布
ienglgge 发表于 2016-2-14 22:40 不知道主函数里是怎么执行的。执行初始化之前,应该有判断吧。直接初始化,就会覆盖之前的数据啊。
最多设置5个标签!
- #include"ds1302.h"
- /***********************************************************************
- 以下是DS1302芯片的操作程序
- ************************************************************************/
- //extern uchar inittime[7]={0x50,0x59,0x23,0x24,0x07,0x05,0x09}; //初始化后设置为:09年7月24日星期5 23点59分50秒
- /*****************************************************
- 函数功能:延时若干微秒
- 入口参数:n
- ***************************************************/
- void delaynus(unsigned char n)
- {
- unsigned char i;
- for(i=0;i<n;i++)
- ;
- }
- /*****************************************************
- 函数功能:向1302写一个字节数据
- 入口参数:x
- ***************************************************/
- void Write1302(unsigned char dat)
- {
- unsigned char i;
- SCLK=0; //拉低SCLK,为脉冲上升沿写入数据做好准备
- delaynus(2); //稍微等待,使硬件做好准备
- for(i=0;i<8;i++) //连续写8个二进制位数据
- {
- DATA=dat&0x01; //取出dat的第0位数据写入1302
- delaynus(2); //稍微等待,使硬件做好准备
- SCLK=1; //上升沿写入数据
- delaynus(2); //稍微等待,使硬件做好准备
- SCLK=0; //重新拉低SCLK,形成脉冲
- dat>>=1; //将dat的各数据位右移1位,准备写入下一个数据位
- }
-
- }
- /*****************************************************
- 函数功能:根据命令字,向1302写一个字节数据
- 入口参数:Cmd,储存命令字;dat,储存待写的数据
- ***************************************************/
- void WriteSet1302(unsigned char Cmd,unsigned char dat)
- {
-
- RST=0; //禁止数据传递
- SCLK=0; //确保写数居前SCLK被拉低
- RST=1; //启动数据传输
- delaynus(2); //稍微等待,使硬件做好准备
- Write1302(Cmd); //写入命令字
- Write1302(dat); //写数据
- SCLK=1; //将时钟电平置于已知状态
- RST=0; //禁止数据传递
- }
- /*****************************************************
- 函数功能:从1302读一个字节数据
- 入口参数:x
- ***************************************************/
- unsigned char Read1302(void)
- {
- unsigned char i,dat;
- delaynus(2); //稍微等待,使硬件做好准备
- for(i=0;i<8;i++) //连续读8个二进制位数据
- {
- dat>>=1; //将dat的各数据位右移1位,因为先读出的是字节的最低位
- if(DATA==1) //如果读出的数据是1
- dat|=0x80; //将1取出,写在dat的最高位
- SCLK=1; //将SCLK置于高电平,为下降沿读出
- delaynus(2); //稍微等待
- SCLK=0; //拉低SCLK,形成脉冲下降沿
- delaynus(2); //稍微等待
- }
- return dat; //将读出的数据返回
- }
- /*****************************************************
- 函数功能:根据命令字,从1302读取一个字节数据
- 入口参数:Cmd
- ***************************************************/
- unsigned char ReadSet1302(unsigned char Cmd)
- {
- unsigned char dat;
- RST=0; //拉低RST
- SCLK=0; //确保写数居前SCLK被拉低
- RST=1; //启动数据传输
- Write1302(Cmd); //写入命令字
- dat=Read1302(); //读出数据
- SCLK=1; //将时钟电平置于已知状态
- RST=0; //禁止数据传递
- return dat; //将读出的数据返回
- }
- /********************************************************************
- 函 数 名:Set1302()
- 功 能:设置初始时间
- 说 明:先写地址,后读命令/数据(寄存器多字节方式)
- 调 用:W1302()
- 入口参数:pClock: 设置时钟数据地址 格式为: 秒 分 时 日 月 星期 年
- 7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B
- 返 回 值:无
- ***********************************************************************/
- void Set1302(uchar *pClock)
- {
- uchar i;
- uchar ucAddr = 0x80;
- WriteSet1302(0x8e,0x00); /* 控制命令,WP=0,写操作*/
- for(i =7; i>0; i--)
- {
- WriteSet1302(ucAddr,*pClock); /* 秒 分 时 日 月 星期 年 */
- pClock++;
- ucAddr +=2;
- }
- WriteSet1302(0x8e,0x80); /* 控制命令,WP=1,写保护*/
- }
- /*****************************************************
- 函数功能: 1302进行初始化设置
- ***************************************************/
- void Init_DS1302(void)
- {
- WriteSet1302(0x8E,0x00); //根据写状态寄存器命令字,写入不保护指令
- WriteSet1302(0x80,((0/10)<<4|(0%10))); //根据写秒寄存器命令字,写入秒的初始值
- WriteSet1302(0x82,((0/10)<<4|(0%10))); //根据写分寄存器命令字,写入分的初始值
- WriteSet1302(0x84,((12/10)<<4|(12%10))); //根据写小时寄存器命令字,写入小时的初始值
- WriteSet1302(0x86,((16/10)<<4|(16%10))); //根据写日寄存器命令字,写入日的初始值
- WriteSet1302(0x88,((11/10)<<4|(11%10))); //根据写月寄存器命令字,写入月的初始值
- WriteSet1302(0x8a,((7/10)<<4|(7%10))); //根据写周寄存器命令字,写入周的初始值
- WriteSet1302(0x8c,((8/10)<<4|(8%10))); //根据写年寄存器命令字,写入年的初始值
- }
复制代码断电之后直接上电,怎么个判断法呢
一周热门 更多>