?? 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 + -