📄 ds1302.c
字号:
#include <pic.h>
#define uchar unsigned char
#define uint unsigned int
//*******************************端口定义*******************************/
#define T_RST RB1
#define T_IO RB2
#define T_CLK RA1
//********************************变量定义*******************************/
uchar DisCash[7]={0x00,0x39,0x08,0x15,0x06,0x05,0x08}; //初始时间缓冲区
int abc[]={1,2,3,5,4,};
uchar second0,second1,minute0,minute1,hour0,hour1,date0;
uchar date1,day,month0,month1,year0,year1;
/////////////////////////函数申明/////////////////////////
void delayus(uchar); //功能:延时10us ,,3*x+9=?
void v_RTInputByte(uchar) ; //功能:写入1Byte数据
uchar uc_RTOutputByte() ; //功能:读取1Byte数据
void v_W1302(uchar ucAddr, uchar ucDa); //功能:先写地址,后写命令/数据
uchar uc_R1302(uchar ucAddr); //功能:先写地址,后读命令/数据
void v_BurstW1302T(uchar *pSecDa); //功能:先写地址,后写数据(时钟多字节方式)
//void v_BurstR1302T(uchar *pSecDa); //功能:先写地址,后读命令/数据(时钟多字节方式)
void v_BurstW1302R(uchar *pReDa); //功能:先写地址,后写数据(寄存器多字节方式RAM)
//void v_BurstR1302R(uchar *pReDa); //功能:先写地址,后读命令/数据(寄存器多字节方式RAM)
void v_Set1302(uchar *pSecDa) ; //功能:设置初始时间
void read_sec(); //功能:读秒REG
void read_min(); //功能:读分REG
void read_hour(); //功能:读时REG
void read_data(); //功能:读日REG
void read_day(); //功能:读周REG
void read_month(); //功能:读月REG
void read_year(); //功能:读年REG
void key_to(); //功能:按键处理
void initial(); //功能:端口定义
//********************************************延时程序********************************************************************/
void delayms(uchar x,uchar y) //延时ms级的程序,延时时间为:(3*y+4)*x+10=?
{
uchar z;
do{
z=y;
// do{;}while(--z);
while(--z); //此句与上一句等效!
}while(--x);
asm("nop");
}
void delayus(uchar x) //延时us级的程序,延时时间为:3*x+9=?
{
uchar d;
d=x;
while(--d){;}
asm("nop");
}
//********************************************************************
//* 功能: 往DS1302写入1Byte数据
//***********************************************************************/
void v_RTInputByte(uchar ucDa)
{
uchar i,temp; //先低位后高位
TRISB2=0;
TRISB1=0;
TRISA1=0;
temp = ucDa;
T_CLK=0;
for(i=8; i>0; i--)
{
if(temp&0x01)
{
T_IO = 1; //先发第0位
}
else
{
T_IO = 0;
}
T_CLK=1; //要在调用此函数前先DS1302_CLK = 0
delayus(50);
T_CLK=0; //上升沿
delayus(50);
temp = temp>>1; //移第1位至第0位,发送
}
}
//********************************************************************
//* 功能: 从DS1302读取1Byte数据
//***********************************************************************/
uchar uc_RTOutputByte()
{
uchar i,temp;
TRISB2=1;
TRISB1=0;
TRISA1=0;
T_CLK = 0;
for(i=8; i>0; i--)
{ //因为temp=0,先移位再接收和后接再接收可以
temp = (temp >>1); //先移位再接收//移第7位到第6位//移位后,空位补0
//所以说最先接收的是第0位,暂放第7位
if(T_IO)
{
temp=(temp|0x80);
}
else
{
temp=(temp&0x7f);
}
T_CLK = 1; //要产生上升沿
delayus(50);
T_CLK = 0; //在输出读命令字的8个slk周期后,
delayus(50);
} //数据开始输出,从0位开始,在每个时钟下降沿输出??????????/
return(temp); //书上例程:时钟上升沿,发送数据有效
}
//********************************************************************
//先写地址,后写命令/数据
//***********************************************************************/
void v_W1302(uchar ucAddr, uchar ucDa)
{
T_CLK = 0;
delayus(50);
T_RST = 0;
delayus(50);
T_RST = 1;
delayus(50);
v_RTInputByte(ucAddr); // 地址,命令
v_RTInputByte(ucDa); ///写1Byte数据
T_RST =0 ;
T_CLK =1;
delayus(50);
}
//********************************************************************
//* 说明: 先写地址,后读命令/数据
//***********************************************************************/
uchar uc_R1302(uchar ucAddr)
{
uchar ucDa;
T_RST = 0;
delayus(50);
T_CLK = 0;
delayus(50);
T_RST = 1;
v_RTInputByte(ucAddr); ///* 地址,命令 */
ucDa = uc_RTOutputByte(); ///* 读1Byte数据 */
T_RST =0;
T_CLK =1;
delayus(50);
return(ucDa);
}
//********************************************************************
//* 说明: 先写地址,后读命令/数据(寄存器多字节方式RAM)
//***********************************************************************/
void v_BurstR1302R(uchar *pReDa)
{
uchar i;
T_RST = 0;
delayus(50);
T_CLK = 0;
delayus(50);
T_RST = 1;
delayus(50);
v_RTInputByte(0xff); // 0xbf:时钟多字节读命令
for (i=31; i>0; i--) //31Byte 寄存器数据
{
*pReDa = uc_RTOutputByte(); // 读1Byte数据
delayus(50);
pReDa++;
}
T_RST =0;
T_CLK = 1;
delayus(50);
}
//********************************************************************
//* 功能: 设置初始时间
//* 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
//***********************************************************************/
void v_Set1302(uchar *pSecDa)
{
uchar i;
uchar ucAddr = 0x80;
v_W1302(0x8e,0x00); //控制命令,WP=0,写操作
delayus(50);
for(i =7;i>0;i--)
{
v_W1302(ucAddr,*pSecDa); //// 秒 分 时 日 月 星期 年
delayus(50);
pSecDa++;
ucAddr +=2;
}
v_W1302(0x8e,0x80); // 控制命令,WP=1,写保护
}
//********************************************************************
//* 功能:读数据并进行BCD-十进制处理
//*********************************************************************
void read_sec()
{
uchar dat;
dat=uc_R1302(0x81);//秒
second0=dat&0x0f;
second1=(dat>>4)&0x07;
}
void read_min()
{
uchar dat;
dat=uc_R1302(0x83);//分
minute0=dat&0x0f;
minute1=(dat>>4)&0x07;
}
void read_hour()
{
uchar dat;
dat=uc_R1302(0x85);//时
hour0=dat&0x0f;
hour1=(dat>>4)&0x03;
}
void read_data()
{
uchar dat;
dat=uc_R1302(0x87);//日
date0=dat&0x0f;
date1=(dat>>4)&0x03;
}
void read_day()
{
uchar dat;
dat=uc_R1302(0x8b);//周
day=dat&0x07;
}
void read_month()
{
uchar dat;
dat=uc_R1302(0x89);//月
month0=dat&0x0f;
month1=(dat>>4)&0x01;
}
void read_year()
{
uchar dat;
dat=uc_R1302(0x8d);//年
year0=dat&0x0f;
year1=dat>>4;
}
//*************************************************************
//功能:主函数
//***********************************************************
main()
{
ADCON1=0X0E;
TRISD=0X00;
v_W1302(0x8E, 0x00); //设置成写入允许
delayus(8);
//v_W1302(0x80, 0x00);
//v_Set1302(DisCash);//设置初始时间,并打开时钟
delayus(8);
// v_W1302(0x8E, 0x00); //设置成写入允许
delayus(8);
v_W1302(0x90, 0x00); //不允许慢充电寄存器
delayus(8);
v_W1302(0x8E,0x80); //设置成禁止写入允许
delayus(8);
//read_year();
//read_month();
//month1=0x0d;
//DisCash[5]=8;;
while(1)
{
//read_sec();
//Delay(40);
PORTD=uc_R1302(0x81);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -