#include<reg52.h>
#include<lcd1602xs.h>
#define uchar unsigned char
#define uint unsigned int
#define WRITE_SECOND 0x80
#define WRITE_MINUTE 0x82
#define WRITE_HOUR 0x84
#define READ_SECOND 0x81
#define READ_MINUTE 0x83
#define READ_HOUR 0x85
#define WRITE_PROTECT 0x8E
sbit ACC_7=ACC^7;//位寻址寄存器定义
sbit SCLK=P1^6; // DS1302时钟信号 6脚
sbit DIO=P1^7; // DS1302数据信号 7脚
sbit CE=P1^5; // DS1302片选 5脚
void Initial( );
void Write1302 ( uchar addr,dat ) ;
uchar Read1302 (uchar addr );
uchar miao;
void main()
{
lcdinit();//1602初始化
Initial();//时钟初始化
while(1)
{
miao=Read1302(READ_SECOND);//读取秒
lcddisp(10,miao);//显示秒
}
}
void Write1302 ( uchar addr,dat ) //地址、数据发送子程序
{
uchar i,temp;
CE=0; //CE引脚为低,数据传送中止
SCLK=0; //清零时钟总线
CE = 1; //CE引脚为高,逻辑控制有效//发送地址
for ( i=8; i>0; i-- ) //循环8次移位
{
SCLK=0;
temp=addr;
DIO=(bit)(temp&0x01);//每次传输低字节
addr>>= 1;//右移一位
SCLK=1;//发送数据
}
for ( i=8; i>0; i-- )
{
SCLK=0;
temp=dat;
DIO=(bit)(temp&0x01);
dat>>=1;
SCLK=1;
}
CE=0;
}
uchar Read1302 (uchar addr )//数据读取子程序
{
uchar i,temp,dat1,dat2;
CE=0;
SCLK=0;
CE=1;
for ( i=8; i>0; i-- ) //发送地址 //循环8次移位
{
SCLK=0;
temp=addr;
DIO=(bit)(temp&0x01);//每次传输低字节
addr>>=1; //右移一位
SCLK=1; //读取数据
}
for ( i=8;i>0;i--)
{
ACC_7=DIO;
SCLK=0;
ACC>>=1;
SCLK=1;
}
CE=0;
dat1=ACC;
dat2=dat1/16; //数据进制转换
dat1=dat1%16; //十六进制转十进制
dat1=dat1+dat2*10;
return (dat1);
}
void Initial( )//初始化DS1302
{
Write1302(WRITE_PROTECT,0X00); //禁止写保护
Write1302(WRITE_SECOND,0x56); //秒位初始化
Write1302(WRITE_MINUTE,0x34); //分钟初始化
Write1302(WRITE_HOUR,0x12); //小时初始化
Write1302(WRITE_PROTECT,0x80); //允许写保护
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>