51单片机驱动DS1302的代码
时间: 2023-03-02 19:43:17 浏览: 186
以下是基于C语言的51单片机驱动DS1302实时时钟的代码,需要用到DS1302的时钟和IO口:
```c
#include <reg51.h>
sbit SCLK = P1^0; //定义SCLK引脚
sbit DSIO = P1^1; //定义DSIO引脚
sbit RST = P1^2; //定义RST引脚
void Write_DS1302_Byte(unsigned char dat) //写入一个字节的数据
{
unsigned char i;
for(i=0;i<8;i++) //发送8位数据
{
DSIO=dat&0x01; //先发送最低位
SCLK=0; //拉低时钟线
dat>>=1; //移位,准备发送下一位
SCLK=1; //拉高时钟线,数据被写入
}
}
unsigned char Read_DS1302_Byte() //读取一个字节的数据
{
unsigned char i;
unsigned char dat=0;
for(i=0;i<8;i++) //接收8位数据
{
dat>>=1; //先接收最低位
if(DSIO==1) dat|=0x80; //如果接收到高电平,就将最高位设置为1
SCLK=0; //拉低时钟线
SCLK=1; //拉高时钟线,准备接收下一位
}
return dat;
}
void Write_DS1302(unsigned char address,unsigned char dat) //向DS1302写入一个字节的数据
{
RST=0; //拉低复位线
SCLK=0; //拉低时钟线
RST=1; //拉高复位线
Write_DS1302_Byte(address); //写入地址
Write_DS1302_Byte(dat); //写入数据
RST=0; //写入完成,再次拉低复位线
}
unsigned char Read_DS1302(unsigned char address) //从DS1302读取一个字节的数据
{
unsigned char dat;
RST=0; //拉低复位线
SCLK=0; //拉低时钟线
RST=1; //拉高复位线
Write_DS1302_Byte(address); //写入地址
dat=Read_DS1302_Byte(); //读取数据
RST=0; //读取完成,再次拉低复位线
return dat;
}
void DS1302_Init() //初始化DS1302
{
Write_DS1302(0x8e,0x00); //禁用写保护
Write_DS1302(0x80,0x00); //秒清零
Write_DS1302(0x82,0x00); //分清零
Write_DS1302(0x84,0x00); //时清零
Write_DS1302(0x86,0x01); //日为1
Write_DS1302(0x88,0x01); //月为1
Write_DS1302(0x8c,0x20); //年为20
Write_DS1302(0x8e,0
阅读全文