DS1302基于STC89C52输入输出数据
关于 DS1302 的详细数据与参数就不再多叙述,网上可以找到很多。我推荐这一篇文章:https://blog.csdn.net/u013184273/article/details/78843881
本文章主要是对输入输出的代码做出一些示范或者补充
简单来说,就是:
数据在SCLK上升沿时,DS1302读数据,在SCLK下降沿时,DS1302写数据
以读写秒寄存器为例
#include<reg52.h>
//具体引脚根据自身决定
sbit SCLK = P3 ^ 6 ;
sbit IO = P3 ^ 4 ;
sbit RST = P3 ^ 5 ;
//延迟函数
void delay ( int x ) {
int y ;
for ( ; x > 0 ; x-- )
for ( y = 110 ; y > 0 ; y-- ) ;
}
//初始化
void init () {
//只有再SCLK低电平时,才能将RST置高,提前将所用接口置低电平是个不错的选择
SCLK = 0 ;
RST = 0 ;
IO = 0 ;
}
//写数据
void WriteSecond ( unsigned char second ) {
unsigned char i ;
RST = 1 ;
//先写指令
for ( i = 0 ; i < 8 ; i ++ ) {
//从最低位开始,将最低为放入IO口
IO = ( 0x80 >> i ) & 0x01 ;
//上升沿DS1302读数据
SCLK = 0 ; SCLK = 1 ; delay ( 1 ) ;
}
delay ( 1 ) ;
//再写数据
for ( i = 0 ; i < 8 ; i++ ) {
IO = ( second >> i ) & 0x01 ;
SCLK = 0 ; SCLK = 1 ; delay ( 1 ) ;
}
RST = 0 ;
}
unsigned char ReadSecond ( ) {
unsigned char i , bit00 , ReadData = 0 ;
RST = 1 ;
//写指令
for ( i = 0 ; i < 8 ; i++ ) {
IO = ( 0x81 >> i ) & 0x01 ;
SCLK = 0 ; SCLK = 1 ; delay ( 1 ) ;
}
delay ( 1 ) ;
//读数据
for ( i = 0 ; i < 8 ; i++ ) {
//值得注意的是,写数据时单片机先写入,再让DS1302读取
//读时相反,先让DS1302将数据写入IO口,再由单片机读取
//下降沿DS1302写数据
SCLK = 1 ; SCLK = 0 ; delay ( 1 ) ;
//读数据
bit00 = IO ; ReadData += ( bit00 << i ) ;
}
RST = 0 ;
return ReadData ;
}
main () {
unsigned char i ;
init () ;
WriteSecond ( 0x31 ) ;
i = ReadSecond () ;
}
另外还需注意,无论是单片机还是DS1302读写数据,都是从最低位开始。
另外提一点,本人也是嵌入式入门者,如有错误,欢迎指正