📄 ds1302.c
字号:
/*作者:史叔伍
完成日期:2008-10-27
程序完成功能:显示时间,显示格式00:00:00
*/
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit SCLK=P3^3;
sbit IO=P3^4;
sbit RST=P3^5;
sbit BIT7=ACC^7; //将数据放入ACC便于位寻址,如果用变量没法位寻址
sbit BIT0=ACC^0;
uchar code table[]=
{0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
uchar curtime[7];
uchar pda[7];
/*延时程序*/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*八位数据写入*/
void writebyte(uchar dat)
{
uchar i;
ACC=dat;//将要写入的数放入ACC
RST=1; //启动数据传送
for(i=8;i>0;i--)//循环八次,写入八位数据,从低位到高位
{
IO=BIT0; //将ACC^0的值赋给时钟数据线
SCLK=0;
SCLK=1; //在时钟线的上升沿写入一位数据
ACC=ACC>>1; //将高一位数据移到ACC^0
}
}
/*八位数据读出*/
uchar readbyte(void)
{
uchar i;
RST=1;//启动数据传送
for(i=8;i>0;i--) //读出八位数据,从低位到高位
{
ACC=ACC>>1; //将前一下降沿读出的数据右移一位,从而该次读出的数放入ACC^7
IO=1; //P1口输入之前置1
SCLK=1;
SCLK=0; //在时钟线的下降升沿读出一位数据
BIT7=IO;
}
return(ACC);
}
/*将指令或数据写入对应寄存器*/
void writereg(uchar addr,uchar dat)
{
RST=0;
SCLK=0;//只有在SCLK为低电平时,才能将RST置为高电平
delay(1);
RST=1;
writebyte(addr);
writebyte(dat);
SCLK=1;
RST=0;
delay(1);
RST=1;
IO=1;
}
/*读出对应寄存器*/
uchar readreg(uchar addr)
{
uchar dat;
RST=0;
SCLK=0;
delay(1);
RST=1;
writebyte(addr);
dat=readbyte();
RST=0;
return(dat);
}
/*设置时间初值*/
void settime(uchar *pda)
{
uchar i;
uchar addr=0x80;//偶数为写操作
writereg(0x8e,0x00);//将控制寄存器值设为零,最高位WP=0允许写
for(i=7;i>0;i--) //将7个时间初值写入对应寄存器
{
writereg(addr,*pda); //写对应时钟寄存器的值
pda++;
addr+=2;
}
writereg(0x8e,0x80); //写保护,防止干扰影响时间值
}
/*读取当前时间值*/
void gettime(uchar curtime[])
{
uchar i,j;
uchar addr=0x81; //奇数为读操作
bdata uchar sec; //可位寻址内部数据存储器,允许位与字节混合访问
for(i=0;i<7;i++)
{
curtime[i]=readreg(addr);//读对应时钟寄存器的值
sec=curtime[i];
j=sec>>4;//将BCD码转化成为对应十进制数
j*=10;
sec=sec&0x0f;
sec+=j;
curtime[i]=sec;
addr+=2;
}
}
/*6位数码管显示*/
void show(uchar *curtime)
{
P1=0xfe;
P0=table[curtime[0]%10]; //每读回来的一个curtime[i]是两位十进制数
delay(3);
P1=0xfd;
P0=table[curtime[0]/10];
delay(3);
P1=0xfb;
P0=table[curtime[1]%10];
delay(3);
P1=0xf7;
P0=table[curtime[1]/10];
delay(3);
P1=0xef;
P0=table[curtime[2]%10];
delay(3);
P1=0xdf;
P0=table[curtime[2]/10];
delay(3);
}
/*主程序*/
void main()
{
settime(pda);
while(1)
{
gettime(curtime);
show(curtime);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -