DS1302程序分享
注意那個(gè)IO口要和電源間接個(gè)電阻哦,還有我的外接電源用的手機(jī)電池,為這個(gè)去買(mǎi)充電電池不劃算的
# include <AT89x52.h>
# define LCD_DB P0
sbit LCD_RS=P1^0;
sbit LCD_RW=P1^1;
sbit LCD_E=P1^2;
sbit DS1302_SCLK = P3^4;
sbit DS1302_IO = P3^3;
sbit DS1302_RST = P3^5;
//定義待設(shè)置的時(shí)間:秒、分、時(shí)、日、月、星期、年、控制字
char table[]={0x00,0x58,0x12,0x8,0x3,0x06,0x06,0x00};
char table1[]={0x11};
char table2[]={0x22};
unsigned char bdata time_rx ;
sbit time_rx7 = time_rx^7;
# define uchar unsigned char
# define uint unsigned int
void LCD_init(void);//初始化函數(shù)
void LCD_write_command(uchar command);//寫(xiě)指令函數(shù)
void LCD_write_data(uchar dat);//寫(xiě)數(shù)據(jù)函數(shù)
void LCD_disp_char(uchar x,uchar y,uchar dat);//在某個(gè)屏幕位置上顯示一個(gè)字符,X(0-16),y(1-2)
void delay_n40us(uint n);//延時(shí)函數(shù)
//寫(xiě)一個(gè)字節(jié)數(shù)據(jù)函數(shù)
void time_write_1(unsigned char time_tx)
{
int j; //設(shè)置循環(huán)變量
for(j=0;j<8;j++) //連續(xù)寫(xiě)8bit
{
DS1302_IO = 0; //先設(shè)置數(shù)據(jù)為0
DS1302_SCLK = 0; //時(shí)鐘信號(hào)拉低
if(time_tx&0x01) //判斷待發(fā)送的數(shù)據(jù)位是0或1
{
DS1302_IO = 1; //待發(fā)送數(shù)據(jù)位是1
}
time_tx=time_tx>>1; //待發(fā)送的數(shù)據(jù)右移1位
DS1302_SCLK = 1; //拉高時(shí)鐘信號(hào)
}
DS1302_SCLK = 0; //寫(xiě)完一個(gè)字節(jié),拉低時(shí)鐘信號(hào)
}
//---------------------------------------------
//讀一個(gè)字節(jié)函數(shù)
unsigned char time_read_1()
{
int j; //設(shè)置循環(huán)變量
DS1302_IO = 1; //設(shè)置為輸入方式
for(j=0;j<8;j++) //連續(xù)讀取8bit
{
DS1302_SCLK = 0; //拉低時(shí)鐘信號(hào)
time_rx=time_rx>>1; //接收寄存器右移1位
time_rx7=DS1302_IO; //把接收到的數(shù)據(jù)放到接收寄存器的最高位
DS1302_SCLK = 1; //拉高時(shí)鐘信號(hào)
}
DS1302_SCLK = 0; //拉低時(shí)鐘信號(hào)
return(time_rx); //返回讀取到的數(shù)據(jù)
}
//DS1302初始化函數(shù)
void ds1302_init()
{
DS1302_SCLK = 0; //拉低時(shí)鐘信號(hào)
DS1302_RST = 0; //復(fù)位DS1302
DS1302_RST = 1; //使能DS1302
time_write_1(0x8e); //發(fā)控制命令
time_write_1(0); //允許寫(xiě)DS1302
DS1302_RST = 0; //復(fù)位
}
//---------------------------------------------
//---------------------------------------------
//設(shè)置時(shí)間函數(shù)
void set_time()
{
int i; //定義循環(huán)變量
DS1302_RST = 1; //使能DS1302
time_write_1(0xbe); //時(shí)鐘多字節(jié)寫(xiě)命令
for(i=0;i<8;i++) //連續(xù)寫(xiě)8個(gè)字節(jié)數(shù)據(jù)
{
time_write_1(table[i]); //調(diào)用寫(xiě)一個(gè)字節(jié)函數(shù)
}
DS1302_RST = 0; //復(fù)位
}
//---------------------------------------------
//---------------------------------------------
//設(shè)置是否初始化標(biāo)志
void set_ytime()
{
DS1302_RST = 1; //使能DS1302
time_write_1(0xc0); //時(shí)鐘多字節(jié)寫(xiě)命令
time_write_1(table1[0]); //調(diào)用寫(xiě)一個(gè)字節(jié)函數(shù)
DS1302_RST = 0; //復(fù)位
}
//讀取初始化標(biāo)志函數(shù)
void get_ytime()
{
DS1302_RST = 1; //使能DS1302
time_write_1(0xc1); //發(fā)送多字節(jié)讀取命令
table2[0]=time_read_1(); //調(diào)用讀取1個(gè)字節(jié)數(shù)據(jù)的函數(shù)
DS1302_RST = 0; //復(fù)位DS1302
}
//---------------------------------------------
//讀取時(shí)間函數(shù)
void get_time()
{
int i; //設(shè)置循環(huán)變量
DS1302_RST = 1; //使能DS1302
time_write_1(0xbf); //發(fā)送多字節(jié)讀取命令
for(i=0;i<7;i++) //連續(xù)讀取7個(gè)字節(jié)數(shù)據(jù)
{
table[i]=time_read_1(); //調(diào)用讀取1個(gè)字節(jié)數(shù)據(jù)的函數(shù)
}
DS1302_RST = 0; //復(fù)位DS1302
}
//*******初始化函數(shù)***************
void LCD_init(void)
{
delay_n40us(10000);
LCD_write_command(0x38);//設(shè)置8位格式,2行,5x7
LCD_write_command(0x38);//設(shè)置8位格式,2行,5x7
LCD_write_command(0x38);//設(shè)置8位格式,2行,5x7
LCD_write_command(0x02);//整體顯示,關(guān)光標(biāo),不閃爍
LCD_write_command(0x0C);//清除屏幕顯示
LCD_write_command(0x06);//設(shè)定輸入方式,增量不移位
}
//********************************
//********寫(xiě)指令函數(shù)************
void LCD_write_command(uchar dat)
{
LCD_E = 0;
LCD_RS=0;//指令
LCD_RW=0;//寫(xiě)入
LCD_DB=dat;
LCD_E=1;//允許
delay_n40us(10);//實(shí)踐證明,我的LCD1602上,用for循環(huán)1次就能完成普通寫(xiě)指令。
LCD_E = 0;
}
//*******************************
//********寫(xiě)數(shù)據(jù)函數(shù)*************
void LCD_write_data(uchar dat)
{
LCD_E = 0;
LCD_RS=1;//數(shù)據(jù)
LCD_RW=0;//寫(xiě)入
LCD_DB=dat;
LCD_E=1;//允許
delay_n40us(10);
LCD_E = 0;
}
//********************************
//*******顯示一個(gè)字符函數(shù)*********
void LCD_disp_char(uchar x,uchar y,uchar dat)
{
uchar address;
if(y==1)
address="0x80"+x;
else
address="0xc0"+x;
LCD_write_command(address);
LCD_write_data(dat);
}
void delay_n40us(uint n)
{
uint i;
uchar j;
for(i=n;i>0;i--)
for(j=0;j<15;j++)
; //
} //
//*******************************
void disp_time()
{
LCD_disp_char(3,1,((table[2]&0xf0)>>4)+0x30);
LCD_disp_char(4,1,(table[2]&0x0f)+0x30);
LCD_disp_char(5,1,':');
LCD_disp_char(6,1,((table[1]&0xf0)>>4)+0x30);
LCD_disp_char(7,1,(table[1]&0x0f)+0x30);
LCD_disp_char(8,1,':');
LCD_disp_char(9,1,((table[0]&0xf0)>>4)+0x30);
LCD_disp_char(10,1,(table[0]&0x0f)+0x30);
}
//*********主函數(shù)*****************
void main(void)
{
get_ytime();
if(table2[0]==0x11)
{
;
}
else
{
ds1302_init(); //調(diào)用DS1302初始化函數(shù)
set_time(); //調(diào)用設(shè)置時(shí)間函數(shù)
set_ytime(); //調(diào)用設(shè)置標(biāo)志函數(shù)
}
DS1302_RST = 1; //使能DS1302
time_write_1(0x90); //充電命令
time_write_1(0xa5); //打開(kāi)充電二級(jí)管 一個(gè)二級(jí)管串聯(lián)一個(gè)2K電阻
DS1302_RST = 0; //復(fù)位DS1302
LCD_init();
while(1)
{
get_time(); //調(diào)用取時(shí)間函數(shù)
disp_time();
}
}