ds1302倒计时c语言编程,对DS1302进行写入和读取操作的程序
时间: 2024-03-20 18:44:15 浏览: 20
下面是DS1302倒计时的C语言编程代码,包括DS1302写入和读取操作的程序:
```c
#include <reg52.h>
#include <intrins.h>
// 定义DS1302的IO口
#define DS1302_SCLK P2_0
#define DS1302_IO P2_1
#define DS1302_RST P2_2
// 定义DS1302的控制字节
#define DS1302_SECONDS 0x80
#define DS1302_MINUTES 0x82
#define DS1302_HOURS 0x84
#define DS1302_DATE 0x86
#define DS1302_MONTH 0x88
#define DS1302_DAY 0x8A
#define DS1302_YEAR 0x8C
#define DS1302_CONTROL 0x8E
#define DS1302_CHARGER 0x90
#define DS1302_CLKBURST 0xBE
#define DS1302_RAMSTART 0xC0
#define DS1302_RAMEND 0xFC
// 定义DS1302的写入和读取操作函数
void DS1302_WriteByte(unsigned char addr, unsigned char dat);
unsigned char DS1302_ReadByte(unsigned char addr);
// 定义DS1302的初始化函数
void DS1302_Init();
// 定义DS1302的倒计时函数
void DS1302_Countdown(unsigned char minute);
// 定义延时函数
void Delay(unsigned int n);
// 主函数
void main()
{
DS1302_Init(); // 初始化DS1302
while(1)
{
DS1302_Countdown(1); // 进行1分钟的倒计时
}
}
// DS1302写入操作函数
void DS1302_WriteByte(unsigned char addr, unsigned char dat)
{
unsigned char i;
// 先将DS1302的RST置低
DS1302_RST = 0;
Delay(1);
// 先发送地址
for(i=0; i<8; i++)
{
DS1302_SCLK = 0;
DS1302_IO = addr & 0x01;
addr >>= 1;
DS1302_SCLK = 1;
}
// 再发送数据
for(i=0; i<8; i++)
{
DS1302_SCLK = 0;
DS1302_IO = dat & 0x01;
dat >>= 1;
DS1302_SCLK = 1;
}
// 最后将DS1302的RST置高
DS1302_RST = 1;
}
// DS1302读取操作函数
unsigned char DS1302_ReadByte(unsigned char addr)
{
unsigned char i, dat = 0;
// 先将DS1302的RST置低
DS1302_RST = 0;
Delay(1);
// 先发送地址
for(i=0; i<8; i++)
{
DS1302_SCLK = 0;
DS1302_IO = addr & 0x01;
addr >>= 1;
DS1302_SCLK = 1;
}
// 再读取数据
for(i=0; i<8; i++)
{
DS1302_SCLK = 0;
dat >>= 1;
if(DS1302_IO)
dat |= 0x80;
DS1302_SCLK = 1;
}
// 最后将DS1302的RST置高
DS1302_RST = 1;
return dat;
}
// DS1302初始化函数
void DS1302_Init()
{
// 先关闭写保护
DS1302_WriteByte(DS1302_CONTROL, 0x00);
// 设置12小时制
DS1302_WriteByte(DS1302_HOUR, 0x80);
// 设置日期时间
DS1302_WriteByte(DS1302_YEAR, 0x20);
DS1302_WriteByte(DS1302_MONTH, 0x02);
DS1302_WriteByte(DS1302_DATE, 0x01);
DS1302_WriteByte(DS1302_DAY, 0x01);
DS1302_WriteByte(DS1302_HOUR, 0x12);
DS1302_WriteByte(DS1302_MINUTE, 0x00);
DS1302_WriteByte(DS1302_SECOND, 0x00);
// 最后再次打开写保护
DS1302_WriteByte(DS1302_CONTROL, 0x80);
}
// DS1302倒计时函数
void DS1302_Countdown(unsigned char minute)
{
unsigned char seconds = 0;
// 先将DS1302的RST置低
DS1302_RST = 0;
Delay(1);
// 先发送地址
DS1302_SCLK = 0;
DS1302_IO = DS1302_CLKBURST;
DS1302_SCLK = 1;
// 再读取数据
seconds = DS1302_ReadByte(DS1302_SECONDS);
// 最后将DS1302的RST置高
DS1302_RST = 1;
// 进行倒计时
while(minute > 0)
{
Delay(60000);
seconds--;
if(seconds == 0xFF)
{
seconds = 59;
minute--;
}
// 先将DS1302的RST置低
DS1302_RST = 0;
Delay(1);
// 先发送地址
DS1302_SCLK = 0;
DS1302_IO = DS1302_SECONDS;
DS1302_SCLK = 1;
// 再写入数据
DS1302_WriteByte(DS1302_SECONDS, seconds);
// 最后将DS1302的RST置高
DS1302_RST = 1;
}
}
// 延时函数
void Delay(unsigned int n)
{
unsigned int i, j;
for(i=0; i<n; i++)
{
for(j=0; j<123; j++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
```
以上代码中,DS1302_WriteByte()函数用于向DS1302写入数据,DS1302_ReadByte()函数用于从DS1302读取数据,DS1302_Init()函数用于初始化DS1302,DS1302_Countdown()函数用于进行倒计时,Delay()函数用于延时。
需要注意的是,在使用DS1302时,需要先关闭写保护,然后再进行写入操作,最后再打开写保护。此外,DS1302的数据读取需要使用DS1302时钟突发读取命令,即先发送DS1302_CLKBURST命令,然后再读取数据。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)