#include "reg52.h"
#include "intrins.h"
sbit SCK=P1^7;//´®ÐÐʱÖÓ
sbit SDA=P2^3;//I/oÒý½Å
sbit RST=P1^3;//¸´Î»Òý½Å
void Write_Ds1302_Byte(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++)
{
SCK=0;
SDA=temp&0x01;
temp>>=1;
SCK=1;
}
}
void Write_Ds1302( unsigned char address,unsigned char dat )
{
RST=0;_nop_();
SCK=0;_nop_();
RST=1;_nop_();
Write_Ds1302_Byte(address);
Write_Ds1302_Byte(dat);
RST=0;
}
unsigned char Read_Ds1302 ( unsigned char address )
{
unsigned char i,temp=0x00;
RST=0;_nop_();
SCK=0;_nop_();
RST=1;_nop_();
Write_Ds1302_Byte(address);
for (i=0;i<8;i++)
{
SCK=0;
temp>>=1;
if(SDA)
temp|=0x80;
SCK=1;
}
RST=0;_nop_();
RST=0;
SCK=0;_nop_();
SCK=1;_nop_();
SDA=0;_nop_();
SDA=1;_nop_();
return (temp);
}
//¶ÁºÍдÊý×é
unsigned char Write_Ds1302_arr[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
unsigned char Read_Ds1302_arr[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
//20Äê4ÔÂ18ÈÕ£¬ÖÜÁù£¬23µã59·Ö24Ãë
unsigned char Timer[7]={0x24,0x59,0x23,0x18,0x04,0x06,0x20};//½»»»
//Ds1302³õʼ»¯
void init_Ds1302()
{
unsigned char i;
Write_Ds1302(0x8e,0x00);
for(i=0;i<7;i++)
{
Write_Ds1302(Write_Ds1302_arr[i],Timer[i]);
}
Write_Ds1302(0x8e,0x80);
}
void Read_Ds1302_Timer()
{
unsigned char i;
for(i=0;i<7;i++)
{
Timer[i]=Read_Ds1302(Read_Ds1302_arr[i]);
}
}
unsigned char SMG_1[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//ÊýÂë¹Ü0µ½¾Å
//³õʼ»¯ÊýÂë¹Ü
void init_SMG(unsigned char dat)
{
P0=0xff;
P2=(P2 &0x1f) |0xc0;
P2 &=0x1f;
P0=dat;
P2=(P2 &0x1f) |0xe0;
P2 &=0x1f;
}
//SMG°´Î»
void SMG_bit(unsigned char dat,unsigned char pos)
{
P0=0xff;
P2=(P2 &0x1f) |0xe0;
P2 &=0x1f;
P0=0x01<<pos;
P2=(P2 &0x1f) |0xc0;
P2=P2&0x1f;
P0=dat;
P2=(P2 &0x1f) |0xe0;
P2 &=0x1f;
}
void delay(unsigned char t)
{
while(t--);
}
void Display_SMG()
{
SMG_bit( SMG_1[Timer[2]/16],0);//СʱµÄ¸öλBCDת¶þ½øÖÆ
delay(200);
SMG_bit( SMG_1[Timer[2]%16],1);
delay(200);
SMG_bit( 0xbf,2);
delay(200);
SMG_bit( SMG_1[Timer[1]/16],3);
delay(200);
SMG_bit( SMG_1[Timer[1]%16],4);
delay(200);
SMG_bit( 0xbf,5);
delay(200);
SMG_bit( SMG_1[Timer[0]/16],6);
delay(200);
SMG_bit( SMG_1[Timer[0]%16],7);
delay(200);
init_SMG(0xff);
}
void init_led_buss()
{
P0=0xff;
P2=(P2 &0x1f) |0x80;
P2=P2&0x1f;
P0=0x00;
P2=(P2 &0x1f) |0xa0;
P2 &=0x1f;
}
void main()
{
init_led_buss();
init_Ds1302();
while(1)
{
Read_Ds1302_Timer();
Display_SMG();
}
}
【蓝桥杯单片机】DS1302时钟程序
最新推荐文章于 2024-05-30 21:04:27 发布