寄存器宏定义详解.docx
《寄存器宏定义详解.docx》由会员分享,可在线阅读,更多相关《寄存器宏定义详解.docx(36页珍藏版)》请在冰豆网上搜索。
寄存器宏定义详解
/******************寄存器宏定义********************/
#defineWRITE_DS1302_SECOND0X80//写入“秒”寄存器
#defineWRITE_DS1302_MINUTE0X82//写入“分”寄存器
#defineWRITE_DS1302_HOUR0X84//写入“小时”寄存器
#defineWRITE_DS1302_DAY0X86//写入“日”寄存器
#defineWRITE_DS1302_MONTH0X88//写入“月”寄存器
#defineWRITE_DS1302_WEEK0X8A//写入“星期”寄存器
#defineWRITE_DS1302_YEAR0X8C//写入“年”寄存器
#defineWRITE_DS1302_REINIT_ADDR0XC0//写入上电判断RAM寄存器
#defineREAD_DS1302_SECOND0X81//读出“秒”寄存器
#defineREAD_DS1302_MINUTE0X83//读出“分”寄存器
#defineREAD_DS1302_HOUR0X85//读出“小时”寄存器
#defineREAD_DS1302_DAY0X87//读出“日期”寄存器
#defineREAD_DS1302_MONTH0X89//读出“月”寄存器
#defineREAD_DS1302_WEEK0X8B//读出“星期”寄存器
#defineREAD_DS1302_YEAR0X8D//读出“年”寄存器
#defineREAD_DS1302_REINIT_ADDR0XC1//读出上电判断RAM寄存器
#defineWRITE_DS1302_Timing_Hour10XC2
#defineWRITE_DS1302_Timing_Min10XC4
#defineWRITE_DS1302_Timing_Hour20XC6
#defineWRITE_DS1302_Timing_Min20XC8
#defineWRITE_MODE_STA0XCA
#defineWRITE_WIN_STA0XCC
#defineREAD_DS1302_Timing_Hour10XC3
#defineREAD_DS1302_Timing_Min10XC5
#defineREAD_DS1302_Timing_Hour20XC7
#defineREAD_DS1302_Timing_Min20XC9
#defineREAD_MODE_STA0XCB
#defineREAD_WIN_STA0XCD
#defineDS1302_WRITE_PROTECT0X8E//写保护寄存器
#defineDS1302_Trickl_Charge0X90//慢速充电寄存器
/******************初始化日期时间宏定义********************/
//初始日期时间为“2011年10月09日星期日12点00分00秒”
//注意:
此处是十进制,下面“地址,数据发送子程序”中有转换
#defineINIT_SECONGD50
#defineINIT_MINUTE59
#defineINIT_HOUR22
#defineINIT_DAY9
#defineINIT_MONTH10
#defineINIT_WEEK7
#defineINIT_YEAR11
/******************写保护设置宏定义********************/
//注意:
此处是十进制,下面“地址,数据发送子程序”中有转换
#defineDS1302_WRITE_PROTECT_NO0//写保护禁止
#defineDS1302_WRITE_PROTECT_OFF128//写保护允许
/******************DS1302端口定义********************/
sbitDS1302_SCLK=P1^5;//DS1302时钟信号
sbitDS1302_DIO=P1^6;//DS1302数据信号
sbitDS1302_CE=P1^7;//DS1302片选信号
/********************充电方式宏定义*********************/
//TCSTCSTCSTCSDSDSRSRS
//慢速充电选择(TCS)位(位4~7)控制快速充电器的选择,只有1010模式才能使慢速充电器工作
//所有其它模式将禁止慢速充电器工作
//DS1302上电时,慢速充电器被禁止
//(DS)位(位2~3)选择是一个二极管(01)还是两个二极管(10),如果DS为“00”或“11”,则充电器被禁止
//RS位(位0~1)选择连接在VCC2与VCC1之间的电阻:
“00”无;“01”2K;“10”4K;“11”8K。
//如果RS为00,充电器被禁止,与TCS无关
//最大充电电流计算:
Imax=(5.0V-二极管压降)/R
#defineHold_DS1302_Charge160//=0XA5即10100101使用慢速充电器,选择一个二极管、一个电阻
/********************重新上电判断宏定义*********************/
#defineDS1302_REINIT_DATA3//=0x55即01010101
/********************标示位定义*********************/
bitDS1302_CH_flog=0;//1302时钟暂停标示位“=0”运行“=1”暂停
bitDS1302_CLK_WAY=0;//1302时钟工作方式标示位“=0”24小时方式“=1”12小时方式
externvoiddelayms(unsignedintxms);
/********************地址,数据发送子程序*********************/
voidWRITE_DS1302(unsignedcharaddr,dat)//注意:
为了方便此处的dat为十进制
{
unsignedchari,temp;
dat=(dat/10)*16+dat%10;//十进制转化成十六进制
DS1302_CE=0;//没有先前的低电平不能工作。
,,,DS1302_CE的高电平启动一次数据的传输
DS1302_SCLK=0;
DS1302_CE=1;//DS1302片选上跳变打开数据传输
for(i=0;i<8;i++)//循环8次位移
{
DS1302_SCLK=0;
temp=addr;
DS1302_DIO=(bit)(temp&0x01);//每次传送低字节
addr=addr>>1;//右移一位
delayms
(1);
DS1302_SCLK=1;
}
for(i=0;i<8;i++)//循环8次位移
{
DS1302_SCLK=0;
temp=dat;
DS1302_DIO=(bit)(temp&0x01);//每次传送低字节
dat=dat>>1;//右移一位
delayms
(1);
DS1302_SCLK=1;
}
DS1302_CE=0;////DS1302片选下跳变关闭数据传输
}
/********************数据读取子程序*********************/
unsignedcharREAD_DS1302(unsignedcharaddr)
{
unsignedchari,temp,dat;
DS1302_CE=0;//没有先前的低电平不能工作。
,,,DS1302_CE的高电平启动一次数据的传输
DS1302_SCLK=0;
DS1302_CE=1;//DS1302片选上跳变打开数据传输
for(i=0;i<8;i++)//循环8次位移
{
DS1302_SCLK=0;
temp=addr;
DS1302_DIO=(bit)(temp&0x01);//每次传送低字节
addr=addr>>1;//右移一位
delayms
(1);
DS1302_SCLK=1;
}
for(i=0;i<8;i++)
{
if(DS1302_DIO==1)
dat|=0x80;
DS1302_SCLK=1;
dat=dat>>1;
delayms
(1);
DS1302_SCLK=0;
}
DS1302_CE=0;//DS1302片选下跳变关闭数据传输
dat=(dat/16)*10+dat%16;//十六进制转化成十进制
returndat;//注意:
为了方便此处返回的值为十进制
}
/********************初始化DS1302子程序*********************/
voidINIT_DS1302()
{
if(READ_DS1302(READ_DS1302_REINIT_ADDR)!
=DS1302_REINIT_DATA)//判断是否是重新上电
{
WRITE_DS1302(DS1302_WRITE_PROTECT,DS1302_WRITE_PROTECT_NO);//禁止写保护
WRITE_DS1302(WRITE_DS1302_SECOND,INIT_SECONGD);//秒
WRITE_DS1302(WRITE_DS1302_MINUTE,INIT_MINUTE);//分
WRITE_DS1302(WRITE_DS1302_HOUR,INIT_HOUR);//小时
WRITE_DS1302(WRITE_DS1302_DAY,INIT_DAY);//日期
WRITE_DS1302(WRITE_DS1302_MONTH,INIT_MONTH);//月份
WRITE_DS1302(WRITE_DS1302_WEEK,INIT_WEEK);//星期
WRITE_DS1302(WRITE_DS1302_YEAR,INIT_YEAR);//年
WRITE_DS1302(DS1302_Trickl_Charge,Hold_DS1302_Charge);//充电方式设置
WRITE_DS1302(WRITE_DS1302_REINIT_ADDR,DS1302_REINIT_DATA);//用于主控制器重新上电判断
WRITE_DS1302(WRITE_DS1302_Timing_Hour1,6);
WRITE_DS1302(WRITE_DS1302_Timing_Min1,30);
WRITE_DS1302(WRITE_DS1302_Timing_Hour2,18);
WRITE_DS1302(WRITE_DS1302_Timing_Min2,20);