📄 ds1302用1位led显示时钟的设计.c
字号:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar xingqi,nian,yue,ri,xiaoshi,fen,miao;
uchar dd=2;
sbit clk=P1^0;
sbit dat=P1^1;
sbit rst=P1^2;
sbit A0=ACC^0;
sbit A1=ACC^1;
sbit A2=ACC^2;
sbit A3=ACC^3;
sbit A4=ACC^4;
sbit A5=ACC^5;
sbit A6=ACC^6;
sbit A7=ACC^7;
sbit p30=P3^0;
sbit p31=P3^1;
sbit p32=P3^2;
sbit p33=P3^3;
sbit p34=P3^4;
sbit p35=P3^5;
sbit p36=P3^6;
sbit p37=P3^7;
bit flag=0;
uchar code tab[]={ 0xff,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,};
uchar code tab1[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15,
0x16,0x17,0x18,0x19,0x20,0x21,0x22,0x23,
0x24,0x25,0x26,0x27,0x28,0x29,0x30,0x31,
0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,
0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,
0x48,0x49,0x50,0x51,0x52,0x53,0x54,0x55,
0x56,0x57,0x58,0x59,0x60};
//-------------------------------------------------------
void InputByte(uchar dd)//写一个字节到1302中
{uchar i;
ACC=dd;
for(i=8;i>0;i--)
{
dat=A0;
clk=1;
clk=0;
ACC=ACC>>=1;
}
}
//-------------------------------------------------------
void OutputByte(void) //从ds1302中读i个数据出来
{ uchar i;
dat=1;
for(i=8;i>0;i--)
{
ACC=ACC>>1;
A7=dat;
clk=1;
clk=0;
}
dd=ACC;
}
void Write(uchar addr,uchar num)
{ rst=0;
clk=0;
rst=1;
InputByte(addr); //写地址
InputByte(num); //写数据
clk=1;
rst=0;
}
void WriteSec(uchar num)
{
Write(0x80,num);
}
void WriteMin(uchar num)
{
Write(0x82,num);
}
void WriteHr(uchar num)
{
Write(0x84,num);
}
void WriteDay(uchar num)
{
Write(0x86,num);
}
void WriteMn(uchar num)
{
Write(0x88,num);
}
void WriteWe(uchar num)
{
Write(0x8a,num);
}
void WriteYs(uchar num)
{
Write(0x8c,num);
}
void DisableWP(void)
{
Write(0x8e,0x00);
}
void Read(uchar addr)
{ rst=0;
clk=0;
rst=1;
InputByte(addr);
OutputByte();
clk=1;
rst=0;
}
//初始化设置时间 08年5月27号,23点58分00秒
void main(void)
{ uchar i;
uchar fen1,fen2,fen3,fen4;
P3=0xff;
DisableWP();//非写保护
WriteSec(0x00);//秒 //16进制
WriteMin(0x58);//分
WriteHr(0x23);//时
WriteDay(0x27);//日
WriteMn(0x05);//月
WriteYs(0x08);//年
WriteWe(0x02);//星期
while(1)
{ for(i=0;i<200;i++); for(i=0;i<200;i++); for(i=0;i<200;i++);
for(i=0;i<200;i++); for(i=0;i<200;i++); for(i=0;i<200;i++);
Read(0x8b);//读数据
xingqi=dd;
P2=tab[xingqi];//显示星期
if(p30==0) //xingqi
if(flag)
{ Read(0x8b);//读数据
xingqi=dd;
xingqi++;
if(xingqi>=8)
xingqi=1;
WriteWe(xingqi);//星期
while(p30==0);
}
if(p31==0) //nian
if(flag)
{ Read(0x8d);//读数据
fen1=dd;
fen2=fen1&0x0f;
//这是因为proteus提供的显示方式用BCD,所以就要这种方法转十进制
fen3=fen1&0xf0;
fen3>>=4;
nian=fen3*10+fen2;
nian++;
if(nian>=31)
nian=8;
WriteYs(tab1[nian]);
while(p31==0);
}
if(p32==0) //yue
if(flag)
{ Read(0x89);//读数据
fen1=dd;
fen2=fen1&0x0f;
fen3=fen1&0xf0;
fen3>>=4;
yue=fen3*10+fen2;
yue++;
if(yue>=13)
yue=1;
WriteMn(tab1[yue]);
while(p32==0);
}
if(p33==0) //ri
if(flag)
{ Read(0x87);//读数据
fen1=dd;
fen2=fen1&0x0f;
fen3=fen1&0xf0;
fen3>>=4;
ri=fen3*10+fen2;
ri++;
if(ri>=32)
ri=1;
WriteDay(tab1[ri]);//ri
while(p33==0);
}
if(p34==0) //xiaoshi
if(flag)
{ Read(0x85);//读数据
fen1=dd;
fen2=fen1&0x0f;
fen3=fen1&0xf0;
fen3>>=4;
xiaoshi=fen3*10+fen2;
xiaoshi++;
if(xiaoshi>=24)
xiaoshi=0;
WriteHr(tab1[xiaoshi]);
while(p34==0);
}
if(p35==0) //fen
if(flag)
{ Read(0x83);//读数据
fen1=dd;
fen2=fen1&0x0f;
fen3=fen1&0xf0;
fen3>>=4;
fen=fen3*10+fen2;
fen++;
fen4=0;
if(fen>=60)
fen=0;
WriteMin(tab1[fen]);
while(p35==0);
}
if(p37==0)//调整标志
{ flag=~flag;
if(flag)
WriteSec(0x80);
else
WriteSec(0x00);
while(p37==0);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -