DS1302模块
#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
uchar yi,er,san,si,wu,liu,qi,ba;
bit s4,s5,s6,s7;
uchar num;
sbit SCK=P1^7;
sbit SDA=P2^3;
sbit RST=P1^3;
uchar Init_Time[]={50,59,23,22,1,2,24};
uchar shijian[7];
void Write_DS1302(unsigned char address ,unsigned char dat);
unsigned char Read_DS1302(unsigned char address);
void Write_Byte(unsigned temp);
void DS1302_Init(void);
void DS1302_Get(void);
void Delayms(int ms);
void Allinit(void);
void Display1(yi,er);
void Display2(san,si);
void Display3(wu,liu);
void Display4(qi,ba);
void main(void)
{
void Allinit();
DS1302_Init();
yi=0;er=8;san=10;si=5;wu=9;liu=10;qi=5;ba=0;
while(1)
{
DS1302_Get();
yi=shijian[2]/10;er=shijian[2]%10;san=10;
si=shijian[1]/10;wu=shijian[1]%10;liu=10;
qi=shijian[0]/10;ba=shijian[0]%10;
Display1(yi,er);
Display2(san,si);
Display3(wu,liu);
Display4(qi,ba); }
}
void DS1302_Init(void) //初始化时钟
{
unsigned char i,add;
add=0x80;
Write_DS1302(0x8e,0x00);
for(i=0;i<7;i++)
{
Write_DS1302(add,Init_Time[i]);//写入
add=add+2;//地址循环
}
Write_DS1302(0x8e,0x80);
}
void DS1302_Get(void) //初始化时钟
{
unsigned char i,add;
add=0x81;
Write_DS1302(0x8e,0x00);
for(i=0;i<7;i++)
{
shijian[i]=Read_DS1302(add);//写入
add=add+2;//地址循环
}
Write_DS1302(0x8e,0x80);
}
void Write_DS1302(unsigned char address ,unsigned char dat)//写时序
{
RST=0;
_nop_();
SCK=0;
_nop_();
RST=1;
Write_Byte(address);
Write_Byte(((dat/10)<<4)|(dat%10));
}
void Write_Byte(unsigned temp)
{
unsigned char i;
for(i=0;i<8;i++)
{
SCK=0;
SDA=temp&0x01;
_nop_();
_nop_();
temp>>=1;
_nop_();
_nop_();
SCK=1;
}
}
unsigned char Read_DS1302(unsigned char address)
{
unsigned char i,temp,dat1,dat2;
RST=0;
_nop_();
SCK=0;
_nop_();
RST=1;
Write_Byte(address);
//Read
for(i=0;i<8;i++)
{
SCK=0;
_nop_();
_nop_();
temp>>=1;
if(SDA)temp|=0x80;
SCK=1;
}
SDA=0;
dat1=temp/16;
dat2=temp%16;
temp=dat1*10+dat2;
return temp;
}
void Display1(uchar yi,uchar er)
{
P2=0xc0;//打开控制数码管位选的573
P0=0x01;//选中所有数码管
P2=0xE0;//打开控制数码管段选的573
P0=tab[yi];//
Delayms(1);
P2=0xc0;//打开控制数码管位选的573
P0=0x02;//选中所有数码管
P2=0xE0;//打开控制数码管段选的573
P0=tab[er];//
Delayms(1);
}
void Display2(uchar san,uchar si)
{
P2=0xc0;//打开控制数码管位选的573
P0=0x04;//选中所有数码管
P2=0xE0;//打开控制数码管段选的573
P0=tab[san];//
Delayms(1);
P2=0xc0;//打开控制数码管位选的573
P0=0x08;//选中所有数码管
P2=0xE0;//打开控制数码管段选的573
P0=tab[si];//
Delayms(1);
}
void Display3(uchar wu,uchar liu)
{
P2=0xc0;//打开控制数码管位选的573
P0=0x10;//选中所有数码管
P2=0xE0;//打开控制数码管段选的573
P0=tab[wu];//
Delayms(1);
P2=0xc0;//打开控制数码管位选的573
P0=0x20;//选中所有数码管
P2=0xE0;//打开控制数码管段选的573
P0=tab[liu];//
Delayms(1);
}
void Display4(uchar qi,uchar ba)
{
P2=0xc0;//打开控制数码管位选的573
P0=0x40;//选中所有数码管
P2=0xE0;//打开控制数码管段选的573
P0=tab[qi];//
Delayms(1);
P2=0xc0;//打开控制数码管位选的573
P0=0x80;//选中所有数码管
P2=0xE0;//打开控制数码管段选的573
P0=tab[ba];//
Delayms(1);
}
void Allinit(void)//初始化
{
P2=0xa0;//打开控制蜂鸣器的573
P0=0x00;//关闭蜂鸣器继电器
P2=0xc0;//打开控制数码管位选的573
P0=0xff;//选中所有数码管
P2=0xE0;//打开控制数码管段选的573
P0=0xff;//关闭所有数码管
P2=0x80;//打开控制LED的573
P0=0xff;//关闭所有LED
}
void Delayms(int ms)
{
int i,j;
for(i=0;i
}