📄 ds1302时钟芯片程序1.c
字号:
#include "c8051F020.h"
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit T_CLK = P0^1; /*实时时钟时钟线引脚 */
sbit T_IO = P0^0; /*实时时钟数据线引脚 */
sbit T_RST = P1^7; /*实时时钟复位线引脚 */
#define uint unsigned int
#define uchar unsigned char
//#define SCLK 1000
uchar bdata ADD; //定义成可位操作字节
sbit ADD0=ADD^0;
sbit ADD7=ADD^7;
void SYDS1302_SCLK_Init (void);
void PORT_Init (void);
void delay2us(void);
void PORT_Init(void)
{
XBR0 = 0x00; // Enable SMBus, SPI0, and UART0
XBR2 = 0x40;
P0 =0xff;
P1 =0xff;
P1MDOUT =0x00;
P0MDOUT =0x00;
}
void SCLK_Init (void)
{
OSCICN = 0x04; //interal 12MHZ
}
void delay2us(void)
{ uchar T=2;
while(T)
{ _nop_();_nop_();_nop_();_nop_();_nop_();
T--;
}
}
/********************************************************************
*
* 名称: v_RTInputByte
* 说明:
* 功能: 往DS1302写入1Byte数据
* 调用:
* 输入: ucDa 写入的数据
* 返回值: 无
***********************************************************************/
void v_RTInputByte(uchar ucDa)
{
uchar i;
ADD = ucDa;
for(i=8; i>0; i--)
{
T_IO = ADD0; /*相当于汇编中的 RRC */
//delay2us();
T_CLK = 0;
T_CLK = 1;
ADD = ADD >> 1;
}
}
/********************************************************************
*
* 名称: uchar uc_RTOutputByte
* 说明:
* 功能: 从DS1302读取1Byte数据
* 调用:
* 输入:
* 返回值: ACC
***********************************************************************/
uchar uc_RTOutputByte(void)
{
uchar i;
T_CLK = 0;
for(i=8; i>0; i--)
{
ADD = ADD >>1; /*相当于汇编中的 RRC */
ADD7 = T_IO;
// delay2us();
T_CLK = 1;
T_CLK = 0;
//ADD7 = T_IO;
}
return(ADD);
}
/********************************************************************
*
* 名称: v_W1302
* 说明: 先写地址,后写命令/数据
* 功能: 往DS1302写入数据
* 调用: v_RTInputByte()
* 输入: ucAddr: DS1302地址, ucDa: 要写的数据
* 返回值: 无
***********************************************************************/
void v_W1302(uchar ucAddr, uchar ucDa)
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_RTInputByte(ucAddr); /* 地址,命令 */
v_RTInputByte(ucDa); /* 写1Byte数据*/
T_CLK = 1;
T_RST =0;
}
/********************************************************************
*
* 名称: uc_R1302
* 说明: 先写地址,后读命令/数据
* 功能: 读取DS1302某地址的数据
* 调用: v_RTInputByte() , uc_RTOutputByte()
* 输入: ucAddr: DS1302地址
* 返回值: ucDa :读取的数据
***********************************************************************/
uchar uc_R1302(uchar ucAddr)
{
uchar 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);
}
/********************************************************************
/********************************************************************
*
* 名称: v_Set1302
* 说明:
* 功能: 设置初始时间
* 调用: v_W1302()
* 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
void v_Set1302(uchar *pSecDa)
{
uchar i;
uchar ucAddr = 0x80;
v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
for(i =7;i>0;i--)
{
v_W1302(ucAddr,*pSecDa); /* 秒 分 时 日 月 星期 年 */
pSecDa++;
ucAddr +=2;
}
v_W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
}
/********************************************************************
*
* 名称: v_Get1302
* 说明:
* 功能: 读取DS1302当前时间
* 调用: uc_R1302()
* 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
void v_Get1302(uchar *ucCurtime)
{
uchar i;
uchar ucAddr = 0x81;
for (i=0;i<7;i++)
{
*ucCurtime = uc_R1302(ucAddr);/*格式为: 秒 分 时 日 月
星期 年 */
ucCurtime++;
ucAddr += 2;
}
}
main()
{ uchar m,n,miao,fen;
uchar bdata Date[3];
uchar DaTime[7]={0x47,0x11,0x12,0x02,0x12,0x04,0x04};//second is 0x50
uchar DaTime1[7]={0x00,0x00,0x00,0x00,0x00,0x00,0x00};
miao=DaTime[5];
WDTCN = 0xde;
WDTCN = 0xad; //关看门狗
SCLK_Init ();
// PORT_Init(); //关看门狗
//SCLK_Init (); //初始化时钟
// Timer0_Init(); //初始化定时器
PORT_Init (); //初始化DS1302_IO口
// SPI0_Init (); //初始化SPI
// EA=1;
v_Set1302(DaTime);
/* v_W1302(0x8e,0x01);
v_W1302(0x80,0x3);
v_W1302(0x8e,0x80);
m =uc_R1302(0x81);
v_W1302(0x8e,0x00);
v_W1302(0x86,0x17);
v_W1302(0x8e,0x80);
n= uc_R1302(0x87);*/
while(1)
{
v_Get1302(DaTime1);
}
/*v_W1302(0x8E,0x00);//控制命令,WP=0写操作
v_W1302(0x90,0x06); //禁止充电
v_W1302(0x8C,0x05); //初始化年,并启动时钟 05年
v_W1302(0x8A,0x02); //初始化周,并启动时钟 周2
v_W1302(0x88,0x07); //初始化月,并启动时钟 7月
v_W1302(0x86,0x27); //初始化日,并启动时钟 27号
v_W1302(0x84,0x02); //初始化时,并启动时钟 2点
v_W1302(0x82,0x55); //初始化分,并启动时钟 55分
v_W1302(0x80,0x50); //初始化秒,并启动时钟 50秒
*/
while(1)
{ //v_Set1302(DaTime);
v_Get1302(DaTime1); //开中断
// Date[2]=uc_R1302(0x87);
//Date[2]=dat;
//Date[0]=Date[2]&0x0f;
//Date[1]=Date[2]&0xf0;
/*DS1302RD(0x85);
Hor[0]=dat&0x0f;
Hor[1]=dat&0xf0;
DS1302RD(0x83);
Min[0]=dat&0x0f;
Min[1]=dat&0xf0;
*/
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -