DS1302
基础知识
DS1302是一款数字时钟芯片,通常用于电子设备中,例如数字时钟、计时器、温度计等。它具有实时时钟(RTC)功能,可以提供年、月、日、时、分、秒的时间信息,并能够自动调整闰年。DS1302还具有存储器功能,可以存储一些关键的配置信息,例如时钟校准参数等。
DS1302用SPI协议与51单片机通信。
DS1302编程
在比赛中,关于DS1302的函数是DS1302时间的设置,这个函数都是基于SPI底层文件中修改添加。
1)设置时间流程及代码
- 关闭写入保护
- 写入时钟数据(写入时分秒寄存器地址为偶数)
- 打开写入保护
(时分秒对应的寄存器位置)
void Clock_Set(u8 hour, u8 minuite, u8 second)
{
Write_Ds1302_Byte(0x8e,0x00); //关闭写保护
Write_Ds1302_Byte(0x80,DecToBCD(second)); //写入秒钟数据
Write_Ds1302_Byte(0x82,DecToBCD(minuite)); //写入分钟数据
Write_Ds1302_Byte(0x84,DecToBCD(hour)); //写入时间数据
Write_Ds1302_Byte(0x8e,0x80); //打开写保护
}
2)读取时间流程及代码
直接调用读取DS1302函数(寄存器地址为奇数,并且要记得把BCD转换成十进制)
BCD(Binary-Coded Decimal)码:用4位二进制数来表示1位十进制数中的0~9这10个数码—— 用十六进制表示十进制,例如0x25代表十进制的25
十进制转BCD码宏定义:
#define DecToBcD(dec)(dec/10*16)+(dec%10)
(dec / 10 * 16)
将十进制的十位数转换为BCD码的高四位,然后(dec % 10)
将十进制的个位数转换为BCD码的低四位,最后这两部分通过加法组合成最终的BCD码。
BCD码转十进制宏定义:
#define BCDToDec(bcd)(bcd/16*10)+(bcd%16)
(bcd / 16 * 10)
将BCD码的高四位转换为十进制的十位数,然后(bcd % 16)
将BCD码的低四位转换为十进制的个位数,最后这两部分通过加法组合成最终的十进制数。
3)在mian中调用函数
//将DS1302的时间初值设置为23:59:55,然后读取DS1302的时间,并显示在数码管上
//DS1302时间读取
u8 hour,minute,second;
void vDS1302_Process()
{
second = BCDToDec(Read_Ds1302_Byte(0x81));
minute = BCDToDec(Read_Ds1302_Byte(0x83));
hour = BCDToDec(Read_Ds1302_Byte(0x85));
}
//数码管操作函数
void vSMG_Process()
{
smg_buf[0]=smg_code[hour/10]; //旋转电位器的电压值
smg_buf[1]=smg_code[hour%10];
smg_buf[2]=0x00;
smg_buf[3]=smg_code[minute/10];
smg_buf[4]=smg_code[minute%10];
smg_buf[5]=0x00;
smg_buf[6]=smg_code[second/10];
smg_buf[7]=smg_code[second%10];
}
void main(void)
{
vSystem_Init();
vClock_Set(23,59,55);
vTimer2_Init();
while(1)
{
vSMG_Process();
vDS1302_Process();
}
}
//中断服务程序
void vTimer2_ISR() interrupt 12 //中断入口
{
vSMG_Display();
}