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