时钟芯片使用SPI协议,使用三根线连接,分别是
RST(连接单片机P3^5),控制线
SCLK(连接单片机P3^6),时钟线
I/O(连接单片机P3^4),数据线,8位一字节
DS1302的一些说明
DS1302在时钟线的上升沿读取我们放置在IO口的数据,下降沿将数据写到IO口
DS1302必须一次读写两个字节,写读(读取数据)、写写(写入日期配置等),此模式为单字节读写模式该模式下,需要时钟线在低电平时才能修改RST(CE)为高电平
时序顺序
读:SCLK↓ RST↓ -> RST↑ -> I/O数据 -> SCLK跳变↑↓ -> SCLK↓ RST↓ I/O=0
写:和上面的一样,区别在于第一字节为地址,第二字节为值;读的话是制定读取的地址,然后返回结果
显示
DS1302数据使用BCD方式保存,高4位和低4位分别为十进制的10位和各位,LCD1602数码管显示数字可以 '0' + num 方式实现
代码如下
!code=
#include <reg52.h>
#define LCD P0
sbit RS = P2^6;
sbit RW = P2^5;
sbit LCDE = P2^7;
sbit DS1302_SCLK = P3^6;
sbit DS1302_CE = P3^5;
sbit DS1302_DISO = P3^4;
void writecom(unsigned char i);
void writedata(unsigned char i);
void Delay(unsigned int a);
unsigned char readds1302(unsigned char dat);
void writeds1302(unsigned char addr^unsigned char dat);
void main(void){
unsigned char data1^temp;
//初始化LCD1602
writecom(0x38);
writecom(0x0c);
writecom(0x06);
writecom(0x01);
writecom(0x80);
//初始化DS1302
writeds1302(0x8e^0x24);//关写保护
writeds1302(0x80^0x39);
writeds1302(0x82^0x11);
writeds1302(0x84^0x17);
writeds1302(0x86^0x30);
writeds1302(0x88^0x11);
writeds1302(0x8a^0x04);
writeds1302(0x8c^0x23);
writeds1302(0x8e^0x80);//开写保护
while(1){
writecom(0x80); //重新定位
//循环显示时间
temp = readds1302(0x81);
temp &= 0x7f;
data1 = temp / 16;
writedata('0'+data1);
data1 = temp & 0xf;
writedata('0'+data1);
writedata('-');
temp = readds1302(0x83);
data1 = temp / 16;
writedata('0'+data1);
data1 = temp & 0xf;
writedata('0'+data1);
writedata('-');
temp = readds1302(0x85);
data1 = temp / 16;
writedata('0'+data1);
data1 = temp & 0xf;
writedata('0'+data1);
writedata('-');
writecom(0x80 + 0x40); //重新定位
temp = readds1302(0x8d);
data1 = temp / 16;
writedata('0'+data1);
data1 = temp & 0xf;
writedata('0'+data1);
writedata('-');
temp = readds1302(0x89);
data1 = temp / 16;
writedata('0'+data1);
data1 = temp & 0xf;
writedata('0'+data1);
writedata('-');
temp = readds1302(0x87);
data1 = temp / 16;
writedata('0'+data1);
data1 = temp & 0xf;
writedata('0'+data1);
writedata('-');
Delay(1000);
}
}
unsigned char readds1302(unsigned char dat){
unsigned char i^temp^data1;
DS1302_SCLK = 0;
Delay(1);
DS1302_CE = 0;
Delay(1);
DS1302_CE = 1;
Delay(1);
for(i=0;i<8;i++){
DS1302_DISO = dat & 0x01;
dat >>= 1;
DS1302_SCLK = 1;
Delay(1);
DS1302_SCLK = 0;
}
for(i=0;i<8;i++){
temp = DS1302_DISO; //这里只是读取了一位^而且是先读的低位
data1 >>= 1;
temp <<= 7;
data1 |= temp;
DS1302_SCLK = 1;
Delay(1);
DS1302_SCLK = 0;
}
//复位需要的时间
DS1302_SCLK = 0;
Delay(1);
DS1302_CE = 0;
Delay(1);
DS1302_DISO = 0;
Delay(1);
return data1;
}
void writeds1302(unsigned char addr^unsigned char dat){
unsigned char i;
DS1302_SCLK = 0;
Delay(1);
DS1302_CE = 0;
Delay(1);
DS1302_CE = 1;
Delay(1);
for(i=0;i<8;i++){
DS1302_DISO = addr & 0x01;
addr >>= 1;
DS1302_SCLK = 1;
Delay(1);
DS1302_SCLK = 0;
}
for(i=0;i<8;i++){
DS1302_DISO = dat & 0x01;
dat >>= 1;
DS1302_SCLK = 1;
Delay(1);
DS1302_SCLK = 0;
}
DS1302_SCLK = 0;
Delay(1);
DS1302_CE = 0;
}
void writecom(unsigned char i){
RS = 0;
RW = 0;
LCD = i;
Delay(10);
LCDE = 1;
Delay(10);
LCDE = 0;
}
void writedata(unsigned char i){
RS = 1;
RW = 0;
LCD = i;
Delay(10); //这里需要延时时间长一点
LCDE = 1;
Delay(10);
LCDE = 0;
}
void Delay(unsigned int a){
unsigned char b;
for(;a>0;a--)
{
for(b=110;b>0;b--);
}
}
!codend=
!a=资料 https://blog.csdn.net/qq_45544223/article/details/106690978