DS1302是一款可离线运转的实时时钟。本周我的学习任务是利用它和LCD1602来在学习板上制作一个时钟。
下面是代码(除LCD1602的头文件)
main
#include <REGX52.H>
#include "LCD1602.h"
#include "DS1302.H"
unsigned char Second,Minutes,Hours;
void main()
{
unsigned char Number;
LCD_Init();
LCD_ShowString(1,1,"Real Time Clock");
LCD_ShowChar(2,3,':');
LCD_ShowChar(2,6,':');
DS1302_Init();
DS1302_WriteByte(0x8E,0x00); //解除写保护
DS1302_WriteByte(0x80,0x15); //设置秒
DS1302_WriteByte(0x82,0x05); //设置分钟
DS1302_WriteByte(0x84,0x22); //设置24小时计时,设置小时
DS1302_WriteByte(0x86,0x11); //日期
DS1302_WriteByte(0x88,0x05); //月份
DS1302_WriteByte(0x8A,0x01); //星期
DS1302_WriteByte(0x8C,0x20); //年份0-99;
while(1)
{
Second=DS1302_ReadByte(0x81);
Minutes=DS1302_ReadByte(0x83);
Hours=DS1302_ReadByte(0x85);
LCD_ShowNum(2,1,Second,2);
LCD_ShowNum(2,4,Minutes/16*10+Minutes%16,2);
LCD_ShowNum(2,7,Hours/16*10+Hours%16,2);
}
}
DS1302.c
#include <REGX52.H>
sbit DS1302_SCLK=P3^6;
sbit DS1302_IO=P3^4;
sbit DS1302_CE=P3^5;
void DS1302_Init()
{
DS1302_CE=0;
DS1302_SCLK=0;
}
void DS1302_WriteByte(unsigned char Command,date)
{
unsigned int i;
DS1302_CE=1;
for(i=0;i<8;i++)
{
DS1302_IO=Command & (0x01<<i);
DS1302_SCLK=1;
DS1302_SCLK=0;
}
for(i=0;i<8;i++)
{
DS1302_IO=date & (0x01<<i);
DS1302_SCLK=1;
DS1302_SCLK=0;
}
DS1302_CE=0;
}
unsigned char DS1302_ReadByte(unsigned char Command)
{
unsigned int i;
unsigned char time=0x00;
DS1302_CE=1;
DS1302_SCLK=1;
for(i=0;i<8;i++)
{
DS1302_IO=Command & (0x01<<i);
DS1302_SCLK=0;
DS1302_SCLK=1;
}
for(i=0;i<8;i++)
{
DS1302_SCLK=1;
DS1302_SCLK=0;
if(DS1302_IO){time=time | (0x01<<i);}
}
DS1302_CE=0;
DS1302_IO=0;
return time;
}
.h
ifndefine __DS1302_H__
#define __DS1302_H__
void DS1302_Init();
void DS1302_WriteByte(unsigned char Command,date);
unsigned char DS1302_ReadByte(unsigned char Command);
#endif