ds1302.docx
- 文档编号:9729126
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:18
- 大小:18.21KB
ds1302.docx
《ds1302.docx》由会员分享,可在线阅读,更多相关《ds1302.docx(18页珍藏版)》请在冰豆网上搜索。
ds1302
DS1302C51源代码
#include
#include
#definemcuport2P2
#definemcuport1P1
unsignedcharpd;
/*********************************************************************/
sbitT_CLK="P0"^7;/*实时时钟时钟线引脚*/
sbitT_IO="P0"^6;/*实时时钟数据线引脚*/
sbitT_RST="P0"^5;/*实时时钟复位线引脚*/
sbitACC0=ACC^0;
sbitACC7=ACC^7;
//lcd引脚声明
/**************************************************/
sbitrs="P0"^0;
sbitrw="P0"^1;
sbite="P0"^3;
/********************************************************************
*名称:
v_RTInputByte
*说明:
*功能:
往DS1302写入1Byte数据
*调用:
*输入:
ucDa写入的数据
*返回值:
无
***********************************************************************/
voidv_RTInputByte(unsignedcharucDa)
{
unsignedchari;
ACC=ucDa;
for(i="8";i>0;i--)
{
T_IO=ACC0;/*相当于汇编中的RRC*/
T_CLK=1;
T_CLK=0;
ACC=ACC>>1;
}
}
/********************************************************************
*名称:
ucharuc_RTOutputByte
*说明:
*功能:
从DS1302读取1Byte数据
*调用:
*输入:
*返回值:
ACC
***********************************************************************/
unsignedcharuc_RTOutputByte(void)
{
unsignedchari;
for(i="8";i>0;i--)
{
ACC=ACC>>1;/*相当于汇编中的RRC*/
ACC7=T_IO;
T_CLK=1;
T_CLK=0;
}
return(ACC);
}
/********************************************************************
*
*名称:
v_W1302
*说明:
先写地址,后写命令/数据
*功能:
往DS1302写入数据
*调用:
v_RTInputByte()
*输入:
ucAddr:
DS1302地址,ucDa:
要写的数据
*返回值:
无
***********************************************************************/
voidv_W1302(unsignedcharucAddr,unsignedcharucDa)
{
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:
读取的数据
***********************************************************************/
unsignedcharuc_R1302(unsignedcharucAddr)
{
unsignedcharucDa;
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_BurstW1302T
*说明:
先写地址,后写数据(时钟多字节方式)
*功能:
往DS1302写入时钟数据(多字节方式)
*调用:
v_RTInputByte()
*输入:
pSecDa:
时钟数据地址格式为:
秒分时日月星期年控制
*8Byte(BCD码)1B1B1B1B1B1B1B1B
*返回值:
无
***********************************************************************/
voidv_BurstW1302T(unsignedchar*pSecDa)
{
unsignedchari;
v_W1302(0x8e,0x00);/*控制命令,WP="0",写操作?
*/
T_RST=0;
T_CLK=0;
T_RST=1;
v_RTInputByte(0xbe);/*0xbe:
时钟多字节写命令*/
for(i="8";i>0;i--)/*8Byte=7Byte时钟数据+1Byte控制*/
{
v_RTInputByte(*pSecDa);/*写1Byte数据*/
pSecDa++;
}
T_CLK=1;
T_RST=0;
}
/********************************************************************
*名称:
v_BurstR1302T
*说明:
先写地址,后读命令/数据(时钟多字节方式)
*功能:
读取DS1302时钟数据
*调用:
v_RTInputByte(),uc_RTOutputByte()
*输入:
pSecDa:
时钟数据地址格式为:
秒分时日月星期年
*7Byte(BCD码)1B1B1B1B1B1B1B
*返回值:
ucDa:
读取的数据
***********************************************************************/
voidv_BurstR1302T(unsignedchar*pSecDa)
{
unsignedchari;
T_RST=0;
T_CLK=0;
T_RST=1;
v_RTInputByte(0xbf);/*0xbf:
时钟多字节读命令*/
for(i="8";i>0;i--)
{
*pSecDa=uc_RTOutputByte();/*读1Byte数据*/
pSecDa++;
}
T_CLK=1;
T_RST=0;
}
/********************************************************************
*名称:
v_BurstW1302R
*说明:
先写地址,后写数据(寄存器多字节方式)
*功能:
往DS1302寄存器数写入数据(多字节方式)
*调用:
v_RTInputByte()
*输入:
pReDa:
寄存器数据地址
*返回值:
无
***********************************************************************/
voidv_BurstW1302R(unsignedchar*pReDa)
{
unsignedchari;
v_W1302(0x8e,0x00);/*控制命令,WP="0",写操作?
*/
T_RST=0;
T_CLK=0;
T_RST=1;
v_RTInputByte(0xfe);/*0xbe:
时钟多字节写命令*/
for(i="31";i>0;i--)/*31Byte寄存器数据*/
{
v_RTInputByte(*pReDa);/*写1Byte数据*/
pReDa++;
}
T_CLK=1;
T_RST=0;
}
/********************************************************************
*名称:
uc_BurstR1302R
*说明:
先写地址,后读命令/数据(寄存器多字节方式)
*功能:
读取DS1302寄存器数据
*调用:
v_RTInputByte(),uc_RTOutputByte()
*输入:
pReDa:
寄存器数据地址
*返回值:
无
***********************************************************************/
voidv_BurstR1302R(unsignedchar*pReDa)
{
unsignedchari;
T_RST=0;
T_CLK=0;
T_RST=1;
v_RTInputByte(0xff);/*0xbf:
时钟多字节读命令*/
for(i="31";i>0;i--)/*31Byte寄存器数据*/
{
*pReDa=uc_RTOutputByte();/*读1Byte数据*/
pReDa++;
}
T_CLK=1;
T_RST=0;
}
/********************************************************************
*名称:
v_Set1302
*说明:
*功能:
设置初始时间
*调用:
v_W1302()
*输入:
pSecDa:
初始时间地址。
初始时间格式为:
秒分时日月星期年
*7Byte(BCD码)1B1B1B1B1B1B1B
*返回值:
无
***********************************************************************/
voidv_Set1302(unsignedchar*pSecDa)
{
unsignedchari;
unsignedcharucAddr=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码)1B1B1B1B1B1B1B
*返回值:
无
***********************************************************************/
voidv_Get1302(unsignedchar ucCurtime[])
{
unsignedchari;
unsignedcharucAddr=0x81;
for(i="0";i<7;i++)
{
ucCurtime[i]=uc_R1302(ucAddr);/*格式为:
秒分时日月
星期年*/
ucAddr+=2;
}
}
/********************************************************************************/
//lcd写命令使能
/********************************************************************************/
voidenable(void)
{
unsignedcharj,k;
rs="0";
rw="0";
_nop_();
e="0";
for(k="10";k>0;k--)
for(j="245";j>0;j--);
e="1";
}
/**********************************************************************/
//lcd写数据使能
/**********************************************************************/
voidwriter(void)
{
unsignedcharj,k;
rs="1";
rw="0";
_nop_();
e="0";
for(k="10";k>0;k--)
for(j="245";j>0;j--);
e="1";
}
/********************************************************************/
//初始化
/********************************************************************/
voidstart(void)
{
mcuport2=0x01; //
enable();
mcuport2=0x01; //
enable();
mcuport2=0x38;
enable();
mcuport2=0x0f;
enable();
mcuport2=0x06;
enable();
}
/*********************************************************************
延时40MS
*********************************************************************/
voiddelay40ms(void)
{
unsignedchari,j;
for(i="40";i>0;i--)
for(j="248";j>0;j--);
}
/********************************************************************/
unsignedchar key4x4()
{
unsignedchartemp;
unsignedcharkey,keydata;
keydata="0xff";
while(keydata==0xff)
{
keydata="0xff";
mcuport1=0xff;
mcuport1=mcuport1&0xef;
temp="mcuport1";
temp="temp"&0x0f;
if(temp!
=0x0f)
{
delay40ms();
temp="mcuport1";
temp="temp"&0x0f;
if(temp!
=0x0f)
{
temp="mcuport1";
temp="temp"&0x0f;
switch(temp)
{
case0x0e:
key="0";
break;
case0x0d:
key="1";
break;
case0x0b:
key="2";
break;
case0x07:
key="3";
break;
}
keydata="key";
}
}
mcuport1=0xff;
mcuport1=mcuport1&0xdf;
temp="mcuport1";
temp="temp"&0x0f;
if(temp!
=0x0f)
{
delay40ms();
temp="mcuport1";
temp="temp"&0x0f;
if(temp!
=0x0f)
{
temp="mcuport1";
temp="temp"&0x0f;
switch(temp)
{
case0x0e:
key="4";
break;
case0x0d:
key="5";
break;
case0x0b:
key="6";
break;
case0x07:
key="7";
break;
}
keydata="key";
}
}
mcuport1=0xff;
mcuport1=mcuport1&0xbf;
temp="mcuport1";
temp="temp"&0x0f;
if(temp!
=0x0f)
{
delay40ms();
temp="P3";
temp="temp"&0x0f;
if(temp!
=0x0f)
{
temp="mcuport1";
temp="temp"&0x0f;
switch(temp)
{
case0x0e:
key="8";
break;
case0x0d:
key="9";
break;
case0x0b:
key="10";
break;
case0x07:
key="11";
break;
}
keydata="key";
}
}
mcuport1=0xff;
mcuport1=mcuport1&0x7f;
temp="mcuport1";
temp="temp"&0x0f;
if(temp!
=0x0f)
{
delay40ms();
temp="mcuport1";
temp="temp"&0x0f;
if(temp!
=0x0f)
{
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ds1302