找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2704|回复: 2
打印 上一主题 下一主题
收起左侧

基于51单片机的万年历(实时时钟) 数码管显示版本 需要ds1302

[复制链接]
跳转到指定楼层
楼主
最近帮朋友做设计,各种找万年历的程序,仿真原理图,想参考,但是发现好多并不能用,改了好久改的,大家可以放心下载,有任何问题,欢迎提问
供大家学习参考,还请大家不要直接原本照抄

单片机源程序如下:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DS1302_SCLK=P1^6;          //1302引脚位变量定义
sbit DS1302_IO=P1^7;
sbit DS1302_RST=P1^5;
sbit ACC_7=ACC^7;           //ACC位变量定义        
sbit ACC_0=ACC^0;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar second,minute,hour,week,day,month,year;    //定义年,月,日,星期,时,分,秒计数变量
uchar t1302[]={0x20,0x06,0x11,0x12,0x00,0x00};   //DS1302初值:年,月,日,星期,时,分,秒
void delay (uint x)           //延时函数
{
uint i,j;
for(i=x;i>0;i--);
for(j=0;j<120;j++);
}
void display()
{
P0=0;
P2=0xfe;
P0=table[year/16] ;                                       //显示年的十位
delay(15);
P2=0xff;
P2=0xfd;
P0=(table[year%16])|0X80;                                 //显示年的个位  
delay(15);
P2=0xff;
P2=0xfb;   
P0=table[(month/16)]  ;                                   //显示月的十位
delay(15);
P2=0xff;
P2=0xf7;        
P0=(table[month%16])|0X80;                                //显示月的个位        
delay(15);
P2=0xff;
P2=0xef;        
P0=table[day/16];                                         //显示日的十位      
delay(15);  
P2=0xff;
P2=0xdf;        
P0=table[day%16]|0X80;                                    //显示日的个位        
delay(15);
P2=0xff;
P2=0xbf;
P0=table[hour/16] ;                                       //显示时的十位
delay(15);
P2=0xff;
P2=0x7f;
P0=(table[hour%16])|0X80;                                 //显示时的个位  
delay(15);  
P2=0xff;
P3=0xfe;        
P0=table[(minute/16)]  ;                                  //显示分的十位
delay(15);
P3=0xff;
P3=0xfd;        
P0=(table[minute%16])|0X80;                               //显示分的个位        
delay(15);
P3=0xff;
P3=0xfb;        
P0=table[second/16];                                      //显示秒的十位      
delay(15);
P3=0xff;
P3=0xf7;        
P0=table[second%16];                                      //显示秒的个位        
delay(15);
P3=0xff;
}
void init()
{
TMOD=0x11;                    //指定定时/计数器的工作方式为3
TH0=0;                        //定时器T0的高四位=0
TL0=0;                        //定时器T0的低四位=0
EA=1;                         //系统允许有开放的中断
ET0=1;                        //允许T0中断
TR0=1;                        //开启中断,启动定时器
}
void timer0() interrupt 1                   //中断函数读取1302数据
{
second=read_ds1302(0x81);          //读秒寄存器        
minute=read_ds1302(0x83);          //读分寄存器           
hour=read_ds1302(0x85);           //读时寄存器      
month=read_ds1302(0x89);          //读月寄存器         
day=read_ds1302(0x87);           //读日寄存器         
year=read_ds1302(0x8d);           //读年寄存器         
}


余下代码在附件keil工程文件中,附件包含proteus仿真原理图 电子时钟数码管.zip (43.66 KB, 下载次数: 81)

05.png (69.7 KB, 下载次数: 120)

05.png

04.png (171.15 KB, 下载次数: 115)

04.png

03.png (238.07 KB, 下载次数: 112)

03.png

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:738485 发表于 2020-6-11 19:34 | 只看该作者
有一个warning是因为我在主函数中没有调用1302的初始化函数,因为不想从设定的时间开始走,如有需要可以去掉主函数init_1302()前面的"//"
回复

使用道具 举报

板凳
ID:529213 发表于 2023-5-22 15:09 来自手机 | 只看该作者
请问没有按键,怎么调时间?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表