📄 1302.c
字号:
/************************************************************************************/
/* 程序名:实时时钟DS1302代码 */
/* */
/* 晶振:12.0 M CPU型号:AT89S52 */
/* */
/* */
/* 功能描述: 将J6和6,7,8脚分别和J7的6,7,8脚 */
/* (自上往下数)用短路帽连接起来! */
/* */
/* http://www.mculover.net */
/* http://www.mculover.net/bbs */
/* */
/* */
/* 湘灵电子工作室 版权所有 */
/* 2006-03-20 */
/************************************************************************************/
#include<reg51.h>
sbit clock_clk = P1 ^ 7;//ds1302_clk
sbit clock_dat = P1 ^ 6;//ds1302_dat
sbit clock_rst = P1 ^ 5;//ds1302_rst
//为了编程方便定义的位变量
sbit a0 = ACC ^ 0;
sbit a1 = ACC ^ 1;
sbit a2 = ACC ^ 2;
sbit a3 = ACC ^ 3;
sbit a4 = ACC ^ 4;
sbit a5 = ACC ^ 5;
sbit a6 = ACC ^ 6;
sbit a7 = ACC ^ 7;
unsigned char Tab_Num[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99,
0x92, 0x82, 0xf8, 0x80, 0x90};//0-9数字
/*****************************************************************/
void Delay(int num)//延时函数
{
while(num--) ;
}
/*************************1 3 0 2 *****************************/
void clock_out(unsigned char dd)
{
ACC=dd;
clock_dat=a0; clock_clk=1; clock_clk=0;
clock_dat=a1; clock_clk=1; clock_clk=0;
clock_dat=a2; clock_clk=1; clock_clk=0;
clock_dat=a3; clock_clk=1; clock_clk=0;
clock_dat=a4; clock_clk=1; clock_clk=0;
clock_dat=a5; clock_clk=1; clock_clk=0;
clock_dat=a6; clock_clk=1; clock_clk=0;
clock_dat=a7; clock_clk=1; clock_clk=0;
}
unsigned char clock_in(void)
{
clock_dat=1;
a0=clock_dat;
clock_clk=1; clock_clk=0; a1=clock_dat;
clock_clk=1; clock_clk=0; a2=clock_dat;
clock_clk=1; clock_clk=0; a3=clock_dat;
clock_clk=1; clock_clk=0; a4=clock_dat;
clock_clk=1; clock_clk=0; a5=clock_dat;
clock_clk=1; clock_clk=0; a6=clock_dat;
clock_clk=1; clock_clk=0; a7=clock_dat;
return(ACC);
}
unsigned char read_clock(unsigned char ord)
{
unsigned char dd=0;
clock_clk=0;
clock_rst=0;
clock_rst=1;
clock_out(ord);
dd=clock_in();
clock_rst=0;
clock_clk=1;
return(dd);
}
void write_clock(unsigned char ord, unsigned char dd)
{
clock_clk=0;
clock_rst=0;
clock_rst=1;
clock_out(ord);
clock_out(dd);
clock_rst=0;
clock_clk=1;
}
/******************************************************************/
void Disp(void)//显示和闪烁函数
{
unsigned char d, e;
d=read_clock(0x81);//读秒
e=d;
d=d>>4;
e=e&0x0f;
P0 = Tab_Num[ d ];
P2 = 0xfd;
Delay(250);
P2 = 0xff;
P0 = Tab_Num[ e ];
P2 = 0xfe;
Delay(250);
P2 = 0xff;
d=read_clock(0x83);//读分钟
e=d;
d=d>>4;
e=e&0x0f;
P0 = Tab_Num[ d ];
P2 = 0xef;
Delay(250);
P2 = 0xff;
P0 = Tab_Num[ e ];
P2 = 0xe7;
Delay(250);
P2 = 0xff;
d=read_clock(0x85);//读小时
e=d;
d=d>>4;
e=e&0x0f;
P0 = Tab_Num[ d ];
P2 = 0x7f;
Delay(250);
P2 = 0xff;
P0 = Tab_Num[ e ];
P2 = 0xbf;
Delay(250);
P2 = 0xff;
/*************************************************************
d=read_clock(0x87);//读日
e=d;
d=d>>4;
e=e&0x0f;
P0 = Tab_Num[ d ];
P2 = 0x01;
Delay(2000);
P2 = 0x00;
P0 = Tab_Num[ e ];
P2 = 0x02;
Delay(2000);
P2 = 0x00;
d=read_clock(0x89);//读月
e=d;
d=d>>4;
e=e&0x0f;
P0 = Tab_Num[ d ];
P2 = 0x01;
Delay(2000);
P2 = 0x00;
P0 = Tab_Num[ e ];
P2 = 0x02;
Delay(2000);
P2 = 0x00;
d=read_clock(0x8d);//读年
e=d;
d=d>>4;
e=e&0xf;
P0 = Tab_Num[ d ];
P2 = 0x01;
Delay(2000);
P2 = 0x00;
P0 = Tab_Num[ e ];
P2 = 0x02;
Delay(2000);
P2 = 0x00;
**********************************************************/
}
/*--------------------时钟的初始化---------------------------*/
void Init_1302(void)
{
write_clock(0x8e,0x00);//close_protect
Delay(250);
write_clock(0x8c,0x05);//year
Delay(250);
write_clock(0x8a,0x04);//week_day
Delay(250);
write_clock(0x88,0x10);//month
Delay(250);
write_clock(0x86,0x20);//date
Delay(250);
write_clock(0x84,0x00);//hour
Delay(250);
write_clock(0x82,0x22);//minute
Delay(250);
write_clock(0x80,0x00);//second
Delay(250);
write_clock(0x90,0xa5);//supply_power
Delay(250);
write_clock(0x8e,0x80);//open_protect
Delay(250);
}
/*******************主函数************************************/
void main(void)
{
Init_1302( );//初始化DS1302寄存器
while(1)
{
Disp( );
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -