教学篇-DS1302时钟芯片的设置和读取
admin · 经验心得 · 2024年09月27日

时钟芯片使用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


标签1 ( 15 )
标签2 ( 12 )
标签3 ( 4 )
标签4 ( 2 )
标签5 ( 7 )
标签6 ( 5 )
标签 ( 2 )