51单片机pcf8563程序
时间: 2023-10-16 09:11:53 浏览: 85
这里提供一个基于51单片机的PCF8563实时时钟程序
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SDA=P2^0; //定义SDA
sbit SCL=P2^1; //定义SCL
unsigned char second=0,minute=0,hour=0,day=0,date=0,month=0,year=0;
unsigned char bcd_to_decimal(unsigned char bcd); //BCD码转换为十进制数
unsigned char decimal_to_bcd(unsigned char decimal); //十进制数转换为BCD码
void i2c_start(void); //I2C起始信号
void i2c_stop(void); //I2C停止信号
void i2c_ack(void); //I2C应答信号
void i2c_no_ack(void); //I2C非应答信号
void i2c_write_byte(unsigned char dat); //I2C写一个字节
unsigned char i2c_read_byte(void); //I2C读一个字节
void write_rtc(unsigned char addr,unsigned char dat); //写入RTC数据
unsigned char read_rtc(unsigned char addr); //读取RTC数据
void set_rtc(void); //设置RTC
void get_rtc(void); //读取RTC
void main()
{
set_rtc();
while(1)
{
get_rtc();
}
}
unsigned char bcd_to_decimal(unsigned char bcd)
{
return ((bcd/16*10)+(bcd%16));
}
unsigned char decimal_to_bcd(unsigned char decimal)
{
return ((decimal/10*16)+(decimal%10));
}
void i2c_start(void)
{
SDA=1;
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
SDA=0;
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
_nop_();
_nop_();
}
void i2c_stop(void)
{
SDA=0;
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
SDA=1;
_nop_();
_nop_();
_nop_();
_nop_();
}
void i2c_ack(void)
{
SDA=0;
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
_nop_();
_nop_();
_nop_();
_nop_();
}
void i2c_no_ack(void)
{
SDA=1;
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
_nop_();
_nop_();
_nop_();
_nop_();
}
void i2c_write_byte(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
SDA=(dat&0x80)>>7;
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
_nop_();
_nop_();
_nop_();
_nop_();
dat<<=1;
}
i2c_ack();
}
unsigned char i2c_read_byte(void)
{
unsigned char i,dat=0;
for(i=0;i<8;i++)
{
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
dat<<=1;
dat|=SDA;
SCL=0;
_nop_();
_nop_();
_nop_();
_nop_();
}
return dat;
}
void write_rtc(unsigned char addr,unsigned char dat)
{
i2c_start();
i2c_write_byte(0xa2);
i2c_write_byte(addr);
i2c_write_byte(dat);
i2c_stop();
}
unsigned char read_rtc(unsigned char addr)
{
unsigned char dat;
i2c_start();
i2c_write_byte(0xa2);
i2c_write_byte(addr);
i2c_start();
i2c_write_byte(0xa3);
dat=i2c_read_byte();
i2c_no_ack();
i2c_stop();
return dat;
}
void set_rtc(void)
{
write_rtc(0x00,decimal_to_bcd(0x00)); //秒
write_rtc(0x01,decimal_to_bcd(0x59)); //分
write_rtc(0x02,decimal_to_bcd(0x23)); //时
write_rtc(0x03,decimal_to_bcd(0x01)); //星期
write_rtc(0x04,decimal_to_bcd(0x23)); //日
write_rtc(0x05,decimal_to_bcd(0x05)); //月
write_rtc(0x06,decimal_to_bcd(0x21)); //年
}
void get_rtc(void)
{
second=bcd_to_decimal(read_rtc(0x00));
minute=bcd_to_decimal(read_rtc(0x01));
hour=bcd_to_decimal(read_rtc(0x02));
day=bcd_to_decimal(read_rtc(0x03));
date=bcd_to_decimal(read_rtc(0x04));
month=bcd_to_decimal(read_rtc(0x05));
year=bcd_to_decimal(read_rtc(0x06));
}
阅读全文