?? s.c
字號:
#include<reg51.h>
#include<intrins.h>
sbit SCLK=P0^0; //時鐘線
sbit IO=P0^1; //數據線
sbit RST=P0^2; //RST線
unsigned char bdata ds1302_data;//bdata型變量可以進行位尋址
sbit bit_data0=ds1302_data^0;
sbit bit_data7=ds1302_data^7;
void delay(unsigned int t) //延時
{
unsigned int m,n;
for(m=0;m<t;m++)
for(n=0;n<10;n++);
}
void write_byte(unsigned char d) //寫一個字節操作
{
unsigned char i;
ds1302_data=d;
for(i=8;i>0;i--)
{
IO=bit_data0; //從數據的地位開始發
SCLK=1; //寫入每位數據操作是在時鐘的上升沿
_nop_();
SCLK=0;
ds1302_data=ds1302_data>>1; //每位右移一位
}
}
unsigned char read_byte(void) //讀一個字節操作
{unsigned char i;
for(i=8;i>0;i--){ds1302_data=ds1302_data>>1;//先進行右移一位操作
bit_data7=IO;//從高位開始讀入數據
SCLK=1; //讀操作是在時鐘線的下降沿
_nop_();
SCLK=0;}
return(ds1302_data);
}
/*向一個寄存器寫數據操作,address為地址,dsdata為數據*/
void write_ds1302(unsigned char address,unsigned char dsdata)
{
RST=0;
SCLK=0;
RST=1;//在寫操作中,RST始終要為1
write_byte(address);//先寫入地址
_nop_();
write_byte(dsdata);//再寫入數據
SCLK=1;
RST=0;
}
/*向一個寄存器讀操作,address為地址*/
unsigned char read_ds1302(unsigned char address)
{unsigned char ucdata;
RST=0;
SCLK=0;
RST=1; //讀操作中RST始終為1
write_byte(address);//先寫入地址
_nop_();
ucdata=read_byte();//再讀出數據
SCLK=1;
RST=0;
return(ucdata);
}
/******************************BCD轉十進制************************/
uchar time_change[14]; //轉成十進制的時間
void bcd_change(uchar *p)
{uchar i;
for(i=0;i<7;i++)
{ time_change[2*i+1]=(p[i]&0x0f); //轉低四位
p[i]>>=4;
time_change[2*i]=p[i];//轉高四位
}
}
/*readtime為讀出的時間,從0-14位,每一對分別為秒 分 時 日 月 周 年,而每低高兩位分別為十位和個位*/
main()
{unsigned char readtime[7],i;
TMOD=0x20;
SCON=0x50;
TH1=0xfd;
TL1=0xfd;
TR1=1;
write_ds1302(0x8e,0x00);_nop_();//先使寫保護寄存器能寫
write_ds1302(0x90,0x06);_nop_();//向慢速充電寄存器寫
write_ds1302(0x8c,0x05);_nop_();//向年寄存器寫數據
write_ds1302(0x8a,0x03);_nop_();//向周寄存器寫數據
write_ds1302(0x88,0x08);_nop_();//向月寄存器寫數據
write_ds1302(0x86,0x02);_nop_();//向日寄存器寫數據
write_ds1302(0x84,0x08);_nop_();//向時寄存器寫數據
write_ds1302(0x82,0x05);_nop_();//向分寄存器寫數據
write_ds1302(0x80,0x00);_nop_();//向秒寄存器寫數據
write_ds1302(0x8e,0x80);_nop_();//使寫保護寄存器禁止寫
while(1)
{ for(i=0;i<7;i++){readtime[i]=read_ds1302(0x81+i+i);}//讀出時間,格式為BCD碼,個位和十位都一個字節中
for(i=0;i<7;i++){SBUF=readtime[i];while(TI==0);TI=0;}//串口發出數據
delay(5000);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -