设计一个由6个LED数码管作为显示器,以AT89C51单片机作为主控器,以DS1307作为时钟芯片,能进行“时分秒”以及“年月日”变换显示的一个具有较高精度,并且可以自动校准时间的实时数字时钟。
本设计具体实现采用了一块DS1307芯片、六个BCD码数码管、51单片机和其他元件构成。设计的数字时钟可以完成00:00:00到23:59:59显示时、分、秒,并且可以自动切换闪烁显示年、月、日计时功能。通过利用Proteus软件,仿真实现设计的数字时钟显示。
附件含Proteus仿真及程序
整体电路仿真图
单片机源程序如下:
- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit sda=P1^1;
- sbit scl=P1^0;
- void delay();
- void delay1();
- void start();
- void stop();
- uchar read(uchar address0,uchar wordaddress,uchar address1);
- uchar year=0,month=0,date=0,hour=0,minute=0,second=0;
- void main()
- {
- while(1)
- { second=read(0xd0,0x00,0xd1);
- minute=read(0xd0,0x01,0xd1);
- hour=read(0xd0,0x02,0xd1);
- date=read(0xd0,0x04,0xd1);
- month=read(0xd0,0x05,0xd1);
- year=read(0xd0,0x06,0xd1);
- P0=hour;
- P2=minute;
- P3=second;
- delay1();
- P0=year;
- P2=month;
- P3=date;
- delay1();
- }
- }
- void delay1()
- {
- uint i,j;
- for(i=0;i<1000;i++)
- for(j=0;j<125;j++);
- }
- void start()
- {
- scl=1;
- delay();
- sda=1;
- delay();
- sda=0;
- delay();
- }
- void delay()
- { uchar i=125;
- while(i>0)
- i--;
- }
- void stop()
- {
- scl=1;
- delay();
- sda=0;
- delay();
- sda=1;
- delay();
- }
- uchar read(uchar address0,uchar wordaddress,uchar address1)
- {
- uchar a,a0,i,n,data1;
- start();
- for(n=0;n<3;n++)
- {
- if(n==0)a0=address0;
- else if(n==1)a0=wordaddress;
- else if(n==2)
- {
- start();
- a0=address1;
- }
- for(i=0;i<8;i++)
- {
- scl=0;
- delay();
- a=a0;
- a=a&0x80;
- if(a==0x80)
- sda=1;
- else
- sda=0;
- delay();
- scl=1;
- delay();
- scl=0;
- delay();
- a0=a0<<1;
- }
- sda=1;
- delay();
- scl=1;
- delay();
- scl=0;
- }
- for(i=0;i<8;i++)
- {
- data1=data1<<1;
- sda=1;
- delay();
- scl=0;
- delay();
- scl=1;
- delay();
- if(sda==1)
- data1|=0x01;
- }
- scl=0;
- delay();
- sda=1;
- delay();
- stop();
- return data1;
- }
复制代码
所有资料51hei提供下载:
数字时钟.rar
(93.68 KB, 下载次数: 191)
|