📄 1302a.c
字号:
//DS1302时钟芯片程序
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit CLK=P2^3; //定义口
sbit IO=P2^4;
sbit RST=P2^5;
sbit ACC7=ACC^7;
sbit ACC0=ACC^0;
uchar a[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}, //定义数码管显示码
b[8]={0x57,0x56,0x23,0x21,0x11,0x04,0x73,0xbe},//写入时钟数据 ,最后be突发访问
c[7],v[8]; //c存放读出时钟数据
//uchar u[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe},v[8]; //u[]位选信号,v[]显示信号
void delay(uchar z) // 延时
{
uchar i,j;
for(i=z;i>0;i--)
for(j=200;j>0;j++);
}
void delaynop()
{ uchar i;
for(i=4;i>0;i--);
}
// 显示子程序
void display(void)
{
uchar x,i,l;
for(i=0;i<8;i++)
{ if (i==2||i==5)
x=10;
else
x=v[i];
P0=a[x]; //LED是P0口驱动
delaynop();
l=P2&0xf8 ;
P2=l+7-i;
delay(5);
}
delay(20);
}
//********DS1302读写程序************
void w(uchar u) //写入1位字节
{
uchar i;
ACC = u;
for(i=8; i>0; i--)
{
IO = ACC0;
CLK = 1;
CLK = 0;
ACC = ACC >> 1;
}
}
uchar r(void) //读出1位字节
{
uchar i;
for(i=8; i>0; i--)
{
ACC = ACC >>1;
ACC7 = IO;
CLK = 1;
CLK = 0;
}
return(ACC);
}
void W1302(uchar ucAddr, uchar ucDa)
{
RST = 0;
CLK = 0;
RST = 1;
w(ucAddr); // 地址,命令
w(ucDa); //写1Byte数据
CLK = 1;
RST = 0;
}
void wclock(uchar *p) //写入时钟多字节数据
{
uchar i;
// W1302(0x80,0x00); //停止时钟
W1302(0x8e,0x00); // 允许写
RST=0;
CLK=0;
RST=1;
w(0xbe); //写多字节命令
for(i=8;i>0;i--)
{
w(*p); //按数组指针逐个写入,写入数据在主函数调用时指向b数组
p++;
}
W1302(0x00,0x50); //启动定时器
CLK=1;
RST=0;
}
void rclock(uchar *p) //读出时钟多字节数据
{
uchar i;
RST=0;
CLK=0;
RST=1;
w(0xbf);
for(i=7;i>0;i--)
{
*p=r();
p++;
}
CLK=1;
RST=0;
}
void main(void)
{
wclock(b);
while(1)
{
rclock(c);
switch(v[0])
{
case(5):
v[1]=(c[3]&0xf0)>>4,
v[0]=c[3]&0x0f,
v[4]=(c[4]&0xf0)>>4;
v[3]=c[4]&0x0f,
v[7]=(c[6]&0xf0)>>4,
v[6]=c[6]&0x0f,
display();
delay(50);
break;
default:
v[1]=(c[0]&0xf0)>>4,
v[0]=c[0]&0x0f,
v[4]=(c[1]&0xf0)>>4,
v[3]=c[1]&0x0f,
v[7]=(c[2]&0xf0)>>4,
v[6]=c[2]&0x0f,
display();
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -