历史上的今天

今天是:2024年11月06日(星期三)

正在发生

2019年11月06日 | 基于DS1302的数字时钟设计 使用595和数码管显示

发布者:星空行者 来源: 51hei关键字:DS1302  数字时钟  数码管显示 手机看文章 扫描二维码
随时随地手机看文章

作品采用STC15W1K16S单片机和DS1302设计,配合B站上传的视频更佳。
B站搜索基于DS1302的数字时钟设计(UP凌净清河)即可查到相关视频(预计2018年6月30日下午会审核完毕)。

主要亮点:
1.时间按位设置
2.周数自动计算
3.对输入的日期有严格的合法性判断
4.数码管单个位闪烁效果
次要亮点:
1.较少的单片机IO口占用
2.38译码器转24线译码使用


请注意!为防止低成本盗用(虽然写的不怎么样),展示出的代码删去部分函数(和语句)


/*##############################################################################################

设计名称:基于DS1302的数字时钟

设计者:清河


平台:STC15W1K16S

硬件部分

数码管显示:位选使用74HC138改为2-4线译码、段选使用74HC573提高带载能力

74HC595静态显示:使用74HC595驱动一位共阴极数码管静态显示当前星期

独立按键:共4个,用于进行各项调整

DS1302:配电池,实现断电走时

LED指示灯:指示当前所处状态和闹钟开启与否

蜂鸣器:使用5V有源蜂鸣器,提供闹钟功能


软件部分

使用定时器0实现对DS1302数据的定时读取,间隔500ms,以便更新当前的显示值,读取到的值以全局变量形式储存

可以考虑使用定时器1实现数码管中间秒指示的闪烁

##############################################################################################*/


#include

#include

sbit SCLK=P1^6;

sbit RST=P5^4;

sbit DSIO=P1^7;

sbit SER=P1^2;

sbit RCLK=P1^3;

sbit SRCLK=P1^4;

sbit S1=P1^0;

sbit S2=P1^1;

sbit bell=P3^7;

sbit SET=P3^6;

sbit UP=P3^5;

sbit DOWN=P3^4;

sbit SHOW=P3^3;

sbit setled=P3^1;

sbit clkled=P3^0;


unsigned char code smgduan[11]={0x3f,0x0a,0x57,0x4f,0x6a,0x6d,0x7d,0x0b,0x7f,0x6f,0x00};

unsigned char code smgduan_dp[12]={0xbf,0x8a,0xd7,0xcf,0xea,0xed,0xfd,0x8b,0xff,0xef,0x00,0x80};

unsigned char code hcwei[8]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07};

unsigned char code READ_RTC_ADDR[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};

unsigned char code WRITE_RTC_ADDR[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};

unsigned char TIME[7]={0,0x34,0x19,0x17,0x06,0x07,0x18};

unsigned int time_trans[7]={0,0,0,0,0,0,0};

unsigned char display_time[4]={0,0,0,0};

unsigned char display_monthday[4]={1,1,1,1};

unsigned char display_year[4]={2,2,2,2};

unsigned char display_second[4]={0,0,9,9};

unsigned char display_week=0;

unsigned char clock[4]={0,8,3,0};

unsigned char set_time[4]={0,0,0,1};

unsigned char set_monthday[4]={0,0,0,2};

unsigned char set_year[4]={0,0,0,3};

unsigned char set_clock[4]={0,8,3,0};

unsigned char set_write[7]={0,0,0,0,0,0,0};

bit flag_display=1;

bit flag_SET=0;

bit flag_clock=0;

bit flag_clock_arrive=0;

bit flag_exit=0;

unsigned char display_mod=0;

unsigned char set_mod=0;

unsigned char flashbit=0;

unsigned char t0_cnt=0

unsigned int year_temp;


void Ds1302Write(unsigned char addr, unsigned char dat)

{

    unsigned char n;RST = 0;_nop_();SCLK = 0;_nop_();RST = 1; _nop_();

    for (n=0; n<8; n++){DSIO = addr & 0x01;addr >>= 1;SCLK = 1;_nop_();SCLK = 0;_nop_();}

    for (n=0; n<8; n++){DSIO = dat & 0x01;dat >>= 1;SCLK = 1;_nop_();SCLK = 0;_nop_();}    RST = 0;_nop_();

}


unsigned char Ds1302Read(unsigned char addr)

{

    unsigned char n,dat,dat1;RST = 0;_nop_();SCLK = 0;_nop_();RST = 1;_nop_();

    for(n=0; n<8; n++){DSIO = addr & 0x01;addr >>= 1;SCLK = 1;_nop_();SCLK = 0;_nop_();}_nop_();

    for(n=0; n<8; n++){dat1 = DSIO;dat = (dat>>1) | (dat1<<7);SCLK = 1;_nop_();SCLK = 0;_nop_();}

    RST = 0;_nop_();    SCLK = 1;_nop_();DSIO = 0;_nop_();DSIO = 1;_nop_();return dat;   

}


void Ds1302Init()

{unsigned char n;Ds1302Write(0x8E,0X00);for(n=0;n<7;n++){Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);}Ds1302Write(0x8E,0x80);}


void Ds1302ReadTime()

{unsigned char n;for(n=0;n<7;n++){TIME[n]=Ds1302Read(READ_RTC_ADDR[n]);}}


void TimeReset()

{

    unsigned char n;TR0=0;

    Ds1302Write(0x8E,0X00);for (n=0; n<7; n++){Ds1302Write(WRITE_RTC_ADDR[n],set_write[n]);}

    Ds1302Write(0x8E,0x80);for(n=0;n<4;n++){clock[n]=set_clock[n];}TR0=1;

}


void delay(unsigned int cnt)

{while(cnt--);}


void hc595send(unsigned char dat)

{unsigned char a;SRCLK=0;RCLK=0;for(a=0;a<8;a++){SER=dat>>7;dat<<=1;SRCLK=1;_nop_();_nop_();SRCLK=0;}RCLK=1;_nop_();_nop_();RCLK=0;}


void time_assign()

{

    display_time[0]=time_trans[2]/10;display_time[1]=time_trans[2]%10;display_time[2]=time_trans[1]/10;display_time[3]=time_trans[1]%10;

    display_monthday[0]=time_trans[4]/10;display_monthday[1]=time_trans[4]%10;display_monthday[2]=time_trans[3]/10;display_monthday[3]=time_trans[3]%10;

    display_year[0]=2;display_year[1]=0;display_year[2]=(time_trans[6]%100)/10;display_year[3]=time_trans[6]%10;

    display_week=time_trans[5];display_second[0]=10;display_second[1]=11;display_second[2]=time_trans[0]/10;display_second[3]=time_trans[0]%10;

    if(flag_display){hc595send(hcwei[display_week]);}else{hc595send(0x00);}

    if(display_time[0]==clock[0]&&display_time[1]==clock[1]&&display_time[2]==clock[2]&&display_time[3]==clock[3]){flag_clock_arrive=1;}else{flag_clock_arrive=0;}

}


void smgdisplay(unsigned char smg_temp[])

{

    unsigned char i;

    for(i=0;i<4;i++)

    {

        switch(i)

        {

            case(0):S1=0;S2=1; break;

            case(1):S1=0;S2=0; break;

            case(2): S1=1;S2=0; break;

            case(3):S1=1;S2=1; break;    

        }

        if(flag_SET)

        {

            switch(set_mod)

            {

                case 0:P2=smgduan_dp[smg_temp[i]];break;

                case 1:P2=smgduan[smg_temp[i]];break;

                case 2:P2=smgduan[smg_temp[i]];break;

                case 3:P2=smgduan_dp[smg_temp[i]];break;

            }

        }

        else

        {

            switch(display_mod)

            {

                case 0:P2=smgduan_dp[smg_temp[i]];break;

                case 1:P2=smgduan[smg_temp[i]];break;

                case 2:P2=smgduan[smg_temp[i]];break;

                case 3:P2=smgduan_dp[smg_temp[i]];break;

                case 4:P2=smgduan_dp[smg_temp[i]];break;

            }

        }

        delay(100); 

        P2=0x00;

    }

}


void clockoo()

{

    if(flag_clock&&flag_clock_arrive&&t0_cnt==9){bell=~bell;}else{bell=0;}

}


unsigned char Leap(unsigned int year)

{

    if(year%100==0){if(year%400==0)return 1;else return 0;}else{if(year%4==0)return 1;else return 0;}

}


void sys_init()

{

    setled=1;clkled=1;bell=0;hc595send(0x76);TMOD=0x11;TL0=(65536-50000)/256;TH0=(65536-50000)%256;ET0=1;EA=1;TR0=1

}


void main()

{

    sys_init();

    while(1)

    {

        if(flag_display)

        {

            switch(display_mod)

            {

                case 0:smgdisplay(display_time);break;

                case 1:smgdisplay(display_monthday);break;

                case 2:smgdisplay(display_year);break;

                case 3:smgdisplay(display_second);break;

                case 4:smgdisplay(clock);break;

                default :display_mod=0;break;

            }

        }

        if(SET==0){delay(150);if(SET==0){flag_SET=1;setled=0;}while(!SET);}

        if(!flag_SET)

        {

            if(UP==0){delay(200);if(UP==0){flag_display=~flag_display;}while(!UP);}

            if(DOWN==0){delay(250);if(DOWN==0){flag_clock=!flag_clock;clkled=!flag_clock;}while(!DOWN);}

            if(SHOW==0&&flag_display){delay(200);if(SHOW==0){display_mod++;if(display_mod>4)display_mod=0;}while(!SHOW);}

        }

        else

        {

            while(flag_SET)

            {

                switch(set_mod)

                {

                    case 0:smgdisplay(set_time);break;

                    case 1:smgdisplay(set_monthday);break;

                    case 2:smgdisplay(set_year);break;

                    case 3:smgdisplay(set_clock);break;

                    default:set_mod=0;break;

                }

                if(UP==0)

                {

                    delay(200);

                    if(UP==0)

                    {

                        switch(set_mod)

                        {

                            case 0:if(t1_temp==10){if(set_time[flashbit]<9)set_time[flashbit]++;}else{if(t1_temp<9)t1_temp++;}break;

                            case 1:if(t1_temp==10){if(set_monthday[flashbit]<9)set_monthday[flashbit]++;}else{if(t1_temp<9)t1_temp++;}break;

[1] [2]
关键字:DS1302  数字时钟  数码管显示 引用地址:基于DS1302的数字时钟设计 使用595和数码管显示

上一篇:STC15W4K单片机内部ADC温敏电阻测量温度
下一篇:八弦激光竖琴电路图与单片机源码

推荐阅读

        集微网消息,TrendForce存储器储存研究(DRAMeXchange)今日发布报告指出,DRAM合约价格连续九个季度上涨后,在10月正式下跌。        根据这份报告的分析,今年第四季度的4GB PC DRAM模块的平均售价环比下降10.14%,从第三季度的34.5美元下降至31美元。8GB PC DRAM模块的平均售价环比下降10.29%,从第3季度的68美元降至61美元...
近日,深交所制定发布工业机器人、集成电路、锂电池、非金属建材等4件行业信息披露指引。这是深交所持续完善资本市场基础性制度,深入推进行业信息披露规则体系建设,着力提升信息披露的有效性和针对性的又一举措。据介绍,此次行业指引聚焦关键核心问题,强化特有信息披露。对于工业机器人行业,市场普遍关注公司产品性能及应用领域,指引要求相关公司披...
2018年,大众正式发布了MEB模块化纯电平台和“ELECTRIC FOR ALL”计划。2019年,首个量产车ID.3在法兰克福车展上亮相。启用全新LOGO、转型电气化、发力智能网联、目标碳中和等一系列动作开始落地。同年10月,大众的新LOGO和ID.3完成了国内首秀,并官宣ID.初见将在12个月内国产。今年11月3日,一汽-大众正式发布了首款基于MEB平台的车型——ID.4 CROZZ。...
11月6日,贺利氏电子与日本东京电子在第四届中国国际进口博览会现场举行了签约仪式,并以“贺利氏助力中国‘芯’”为主题,集中展示了集成电路领域的多种关键材料和技术,覆盖从晶圆制造、封装和测试,直到各种终端应用。同时还展示了贵金属循环利用、高效光伏电池浆料、紫外杀菌设备等。作为全球领先的材料供应商,成立于1851年的德国贺利氏为半导体、汽...

史海拾趣

问答坊 | AI 解惑

明天去买GPRS猫,大家快帮忙提点意见!

初步选定的是2406A模块的猫,明天2月13号去华腾通宇买。 另外考虑的是SIMENS MC55芯片的和GR64芯片的,价格分别是550,600,700。 我的应用要求信号稳定,信号自恢复快,GSM以及GPRS应用方面没有啥Bug。 这三种模块我都没用过,以前用过PIML的信 ...…

查看全部问答∨

求助:44B0定时器5不产生中断问题~

我在程序中使用定时器5进行定时调用AD采样函数,可是定时器一直无法启动,程序如下,还请高手们指出错误之处 void Time5IntTest(void) { rTCON = 0xffffff;  // 000    不自动重载(反转模式)|不更新TCNTB5|停止定时器5 r ...…

查看全部问答∨

关于USB设备的读取

{                 m_strLog += _T("抱歉,未找到可用的USB设备");…

查看全部问答∨

MSP430中断优先级

大家来讨论一下MSP430系列单片机如何实现中断的嵌套问题…

查看全部问答∨

EVC4.0+PXA270SDK(自定义无错)开发的软件?

使用 EVC4.0+PXA270SDK(自定义无错)开发的软件release版无法在270pPDA上使用,请问是为什么? (运行时报缺库文件)  …

查看全部问答∨

给重庆的电子工程师提供一个QQ群:20956150

给重庆的电子工程师提供一个QQ群:20956150 欢迎加入。。。…

查看全部问答∨

串口读写函数是同步的吗?

在WINCE下通过writefile写串口,原以为该函数应该是阻塞式的,与串口发送过程是同步的,即串口实际发送完毕,该函数才 能返回。现在用示波器测量了下,发现不是这样,特别是写多个字节时,串口还没有发送完毕,writefile函数就返回了。 请问在 ...…

查看全部问答∨

大家看看这块屏怎么样!~

本帖最后由 ddllxxrr 于 2016-1-7 17:12 编辑 这块屏网上标价90元,看看大家有没有需要的,如果需要的朋友多了,我们可以组织团购或者我批量进货,底价给大家也可以!~ 全新3.5寸超大点阵,全视角,MCU接口液晶屏,全套资料齐全 知道这个屏为什 ...…

查看全部问答∨

STM8S中的BEEP怎么用?为什么蜂鸣器不会响

我就配置了BEEP所在的PD4为PUSHPULL, 主程序中就写了BEEP_CSR=0x2E, 下载 (84.56 KB) 手册里的寄存器说明 2010-12-3 17:23 我菜鸟,大家帮帮忙看看 --------------- main() {       PD_DDR | ...…

查看全部问答∨

如何利用AT89C51 ADC0809 传感器MQ-3 LCD1602 继电器控制做出酒精测试器

如何利用AT89C51 ADC0809 MQ-3传感器 LCD1602液晶显示 继电器控制做出酒精测试器 有知道的朋友发我邮箱 YCC1988@yahoo.cn…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved