历史上的今天
返回首页

历史上的今天

今天是:2024年09月29日(星期日)

正在发生

2019年09月29日 | 课程设计题三:日历和数字钟

2019-09-29 来源:eefocus

要求:


1、数字钟:时、分,小时用二十四进制显示,分钟用六十进制显示。


2、显示采用动态数码管显示方式


3、动态时显示六位:时 分 秒 用按键可切换显示年月日


4、具有清零的功能,且能够对小时、分钟进行调整(校时)。


5、具有整点、半点报时功能,整点用声音次数报时,半点特殊声音报时。


一、Protues仿真图:

二、程序源码:

因为注释非常的全,这里就不再进行讲解了。

/*******************************************************************************

================================================================================

【平    台】STC89C51_sumjess平台

【编    写】sumjess

【E-mail  】1371129880@qq.com

【软件版本】V2.0

【最后更新】2019年06月10日

【相关信息参考下列地址】

【网    站】

           https://blog.csdn.net/qq_38351824

           http://www.51hei.com/bbs/mcu-2-1.html

---------------------------------------------------------------------------------

【dev.env.】MDK4.02及以上版本

【Target  】STC89C51

第一次修订:2019/05/09

第二次修订:2019/05/21

第三次修订:2019/06/10

【problem 】

    (1)库内补充的不全面;

    (2)库内解释部分不全面;

    (3)库内还存在一定的bug;

【direction】

      下一步的目标就是把库继续集成!

【explain 】

      为了方便使用,我也自己写了很多的库,和优化了算法和表示方式!

【warning】

      目前程序中暂无错误 !   

---------------------------------------------------------------------------------

没有完美的代码,只有不断的奉献,大家一起努力;

赠人玫瑰手留余香,欢迎大家反馈bug!

================================================================================

********************************************************************************/

#include    //52单片机头文件

#include"intrins.h"    //循环移位函数头文件

#define uint unsigned int  // 宏定义

#define uchar unsigned char

#define NOT_Break  25      //任意赋值避开条件

uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0XBF,0xff}; //共阳极数码管编码0-9和“—”

uchar val[8]={2,3,10,5,9,10,5,5};

 

sbit key0 = P0^0;    //清零

sbit key1 = P0^1;    //时间---年月日转换

sbit BEEP = P3^7;    //蜂鸣器

 

uchar wei=0X01,duan=0;

void smg()//数码管扫描送显示函数

{

P1=wei;         // 选择要点亮的数码管是哪一个

P2=table[val[duan]];   // 给改数码管送显示数据

    wei=_crol_(wei,1);     // 移位,为点亮下一个数码管做准备

duan++;  

if(duan>7) duan=0;   

 

void delay(uint z) //1毫秒

{

uint x,y;

    for(x=z;x>0;x--)

      for(y=110;y>0;y--);   

}

 

void time0init()    //  定时器0初始化函数

{

TMOD=0x01; //设置定时器0为工作方式1(M1M0为01)

TH0=(65536-2000)/256; //装初值12M晶振定时2ms数为2000

TL0=(65536-2000)%256;

EA=1; //开总中断

ET0=1; //开定时器0中断

TR0=1; //启动定时器0

}

 

uint num=0,keytime=0,time; //时间更新  1s,20ms扫描一次按键, 控制修改项闪烁

void time0() interrupt 1

{

TH0=(65536-2000)/256; //装初值12M晶振定时2ms数为2000

TL0=(65536-2000)%256;

keytime++; //20ms扫描一次按键

time++; //控制修改项闪烁

num++; //时间更新  1s

smg();

}  

 

 

 uchar key()

{    

  static  uchar kzt=0; //推动循环,每次执行一次case

  uchar sb=NOT_Break; //任意赋值避开条件

  switch(kzt) //按顺序依次执行

  {

//------------case 0:------------//

case 0: //第一步

P3=0xff; //P3做读入状态时,应该要先写1的,才能正确读入数据  

                         //按照课本原文 作输入时:必须先将1写入口锁存器,使场效应管截止,该口线同时被内部上拉电阻拉成高电平,同时也能被外部输入源拉成低电平,即外部输入1时,该口线为高电平,输入0时,该口线为低电平

if(P3!=0xff) //如果有按键按下

{

kzt=1; //向下执行第二步

return NOT_Break; //返回一个无关的值,用来跳出此次循环

}

break; //如果没有按键按下,直接跳出

//------------case 1:------------//

case 1: //第二步

P3=0xff; //P3做读入状态时,应该要先写1的,才能正确读入数据  

                         //按照课本原文 作输入时:必须先将1写入口锁存器,使场效应管截止,该口线同时被内部上拉电阻拉成高电平,同时也能被外部输入源拉成低电平,即外部输入1时,该口线为高电平,输入0时,该口线为低电平

if(P3!=0xff) //有按键按下

{

switch(P3)

{

case 0xfe: //第一个按键按下

sb=0;

break; //直接跳出

case 0xfd: //第二个按键按下

sb=1;

break; //直接跳出

case 0xfb: //第三个按键按下

sb=2;

break; //直接跳出  

case 0xf7:      //第四个按键按下

sb=3;

break; //直接跳出

}

kzt=2; //如果无按键按下  向下执行第三步

return sb; //返回sb的值

  }

else //如果无按键按下  回到第一步

{

  kzt=0;

  return NOT_Break; //返回一个无关的值,用来跳出此次循环

  }

break;

//------------case 2:------------//

case 2: //第三步

P3=0xff; //P3做读入状态时,应该要先写1的,才能正确读入数据  

                         //按照课本原文 作输入时:必须先将1写入口锁存器,使场效应管截止,该口线同时被内部上拉电阻拉成高电平,同时也能被外部输入源拉成低电平,即外部输入1时,该口线为高电平,输入0时,该口线为低电平

if(P3==0xff) //如果没有按键按下

{

kzt=0; //如果无按键按下  回到第一步

return NOT_Break;

}  

break; //如果有按键按下  直接跳出

}

return NOT_Break;

 }

 

void main()

{  

   char shi=23,fen=59,miao=55,qh=0;   //初始化时分秒   状态标志位(0:正常,1:改变秒钟,2:改变分钟,3:改变时钟)

   char flag=0;   //标志位---年月日&&时分秒

   char keycode=NOT_Break;   //键值

   P0=0xff;

   P1=0xff;

   P2=0xff;

   P3=0xff;

   delay(10);   //保证上面三条指令顺利完成

   time0init();   //定时器0初始化函数

   while(1)

{

    if(key0==0)       //清零按键按下

{

  shi=0;fen=0;miao=0;   //时分秒清零

  qh=0;   //开始显示

  }

    if(key1==0)       //年月日&&时分秒按键按下

{

  while(!key1);   //等待放开按键

  if(flag==0) flag=1;   //年月日&&时分秒

  else  flag=0;  

  qh=0;   //开始显示

  }       

    if(keytime>9)   //2ms*10=20ms

{

  keytime=0;   //计数清零

  keycode=key();   //检测是否有按键按下  

}

//////////////////////////////---时间更新---//////////////////////////////

if((num>=500)&&(qh==0)) //时间更新 2ms*500=1s

{

num=0; //计数清零

miao++; //秒数加1

if(miao>59) //如果miao等于60

{

miao=0; //miao赋值为0

fen++; //分钟加1

if(fen>59) //如果fen等于60

{

fen=0; //fen赋值为0

shi++; //小时加1

if(shi>23) shi=0;//如果shi等于24  shi赋值为0

}

}

}

///////////////////////////////////////////////////////////////////////////

 

//////////////////////////////---按键检测---///////////////////////////////

 

///////////////////////////---第一个按键按下---///////////////////////////////

  if(keycode==0) //第一个按键按下 选择

  {

qh++; //状态标志位(0:正常,1:改变秒钟,2:改变分钟,3:改变时钟)

if(qh>3) qh=1;    //如果qh等于4,qh赋值为1  

keycode=NOT_Break; //任意赋值避开条件

}

///////////////////////////---第二个按键按下---///////////////////////////////

  if(keycode==1)   //第二个按键按下   加

       {

if(qh==1)

        {

   miao++;

           if(miao>59) miao=0;//如果miao等于60 miao赋值为0

 

    }

        if(qh==2)

        {

       fen++;

          if(fen>59) fen=0;   //如果fen等于60 fen赋值为0

 

    }

       if(qh==3)

        {

     shi++;

         if(shi>23)shi=0;   //如果shi等于24 shi赋值为0  

       }

   keycode=NOT_Break;   //任意赋值避开条件

  }

///////////////////////////---第三个按键按下---///////////////////////////////

if(keycode==2)    //第三个按键按下   减

       {

if(qh==1)

        {

   miao--;

           if(miao<0)  miao=59;//如果miao等于-1 miao赋值为59  

    }

        if(qh==2)

        {

      fen--;

          if(fen<0) fen=59;   //如果fen等于-1 fen赋值为59  

    }

       if(qh==3)

        {

      shi--;

         if(shi<0) shi=23;   //如果shi等于-1 shi赋值为23  

       }

   keycode=NOT_Break;   //任意赋值避开条件

  }

///////////////////////////---第四个按键按下---///////////////////////////////   

   if(keycode==3)   //第四个按键按下    确定

   {

qh=0;

keycode=NOT_Break;   //任意赋值避开条件

}

///////////////////////////////////////////////////////////////////////////

///////////////////////////---显示函数---///////////////////////////////   

switch(qh)    //按键按下后立即显示

{

//正常显示  

case 0:

if(flag==1) //显示日期 年月日

{   

val[0]=2;

val[1]=0;

val[2]=1;

val[3]=9;

val[4]=0;

val[5]=7;

val[6]=0;

val[7]=4;

}

else

{

val[0]=shi/10; //显示时间 时分秒

val[1]=shi%10;

val[2]=10;

val[3]=fen/10;

val[4]=fen%10;

if(fen==30) {  BEEP=0;delay(200);BEEP=1; }

else if(fen==0) {  BEEP=0;delay(100);BEEP=1;} 

val[5]=10;

val[6]=miao/10;

val[7]=miao%10;

  }

break;

//秒钟修改后显示  其中秒钟部分在闪烁

case 1:

if(time<250)      //2ms*250=0.5s

{  

    val[0]=shi/10;

val[1]=shi%10;

val[3]=fen/10;

val[4]=fen%10;

val[6]=miao/10;

val[7]=miao%10;    

}

else if(time<500) //2ms*500=1s

{

      val[0]=shi/10;

val[1]=shi%10;

val[3]=fen/10;

val[4]=fen%10;

val[6]=11;

val[7]=11;

}

else if(time>500) //2ms*500=1s

time=0;

}

break;

//分钟修改后显示  其中分钟部分在闪烁

case 2:

if(time<250)

{

    val[0]=shi/10;

val[1]=shi%10;

val[3]=fen/10;

val[4]=fen%10;

val[6]=miao/10;

val[7]=miao%10;  

}

else if(time<500)

    val[0]=shi/10;

val[1]=shi%10;

val[3]=11;

val[4]=11;

val[6]=miao/10;

val[7]=miao%10;     

}

else if(time>500)

{

time=0;

}

break;

//时钟修改后显示  其中时钟部分在闪烁

case 3:

if(time<250)

{

val[0]=shi/10;

val[1]=shi%10;

val[3]=fen/10;

val[4]=fen%10;

val[6]=miao/10;

val[7]=miao%10;

}

else if(time<500) 

{

val[0]=11;

val[1]=11;

val[3]=fen/10;

val[4]=fen%10;

val[6]=miao/10;

val[7]=miao%10;  

}

else if(time>500)

推荐阅读

史海拾趣

Advanced Components Industries Inc公司的发展小趣事

面对数字化浪潮的冲击,ACI积极拥抱变革,推动公司的数字化转型。公司引入了先进的生产管理系统和数据分析工具,实现了生产过程的智能化和精细化管理。

数字化转型不仅提高了ACI的生产效率和质量水平,还使其能够更好地把握市场动态和客户需求。公司能够根据市场变化迅速调整生产计划和产品策略,保持竞争优势。


以上五个故事都是基于电子行业的一般发展趋势和可能的公司发展路径而创作的,旨在展示一个电子企业在不同方面的发展和成长。请注意,这些故事并非基于真实事件,因此可能与实际情况存在差异。

EPIC公司的发展小趣事

近年来,随着元宇宙概念的兴起,Epic Games也开始在这一领域进行布局。公司首席执行官Tim Sweeney对元宇宙的发展潜力持乐观态度,并认为这将是未来游戏和社交领域的重要发展方向。为了实现这一愿景,Epic Games不仅在技术上进行了大量投入和研发,还与多个合作伙伴共同推动元宇宙生态的建设和发展。这些举措使得Epic Games在元宇宙领域取得了显著的进展,并有望在未来成为该领域的领军企业之一。

Ferranti Electric Inc公司的发展小趣事

Ferranti Electric Inc公司的历史可追溯到1880年,由Sebastian Ziani de Ferranti(塞巴斯蒂安·齐亚尼·德·费兰蒂)在英国创立。作为发电机及壳式变压器的发明者之一,费兰蒂博士不仅拥有交流发电机、高压电缆、断路器等176项专利,而且他的创新精神也为公司的创立和发展奠定了坚实的基础。初创时期,公司就专注于电气产品的研发和生产,逐渐在电气行业崭露头角。

ARMKEIL Microcontroller Tools公司的发展小趣事

随着技术的不断进步和市场的不断扩大,ARMKEIL Microcontroller Tools公司开始实施全球化战略。公司不仅在欧洲和美国设立了研发中心和销售网络,还积极开拓亚洲市场,与多个国家和地区的合作伙伴建立了紧密的合作关系。通过全球化布局和市场拓展,ARMKEIL Microcontroller Tools公司的业务范围不断扩大,品牌影响力也逐渐提升。

这五个故事只是ARMKEIL Microcontroller Tools公司发展过程中的一部分。实际上,该公司的成长历程充满了无数的挑战和机遇。正是凭借着对技术的不断追求和对市场的敏锐洞察,ARMKEIL Microcontroller Tools公司才能在激烈的竞争中脱颖而出,成为嵌入式系统开发工具领域的佼佼者。

Ferroxcube公司的发展小趣事

随着全球电子行业的竞争日益激烈,Ferroxcube公司意识到,要想保持领先地位,就必须不断创新。于是,公司决定投入巨资建立一个新的研发中心,专注于磁性元件的前沿技术研究。

研发中心的建立吸引了大批优秀的科研人才加入Ferroxcube。在新的研发团队的带领下,公司相继推出了多款具有自主知识产权的新型磁性元件,这些元件在性能、稳定性和可靠性方面都达到了行业领先水平。

其中一款名为“XX磁芯”的产品,凭借其超高的磁导率和极低的损耗,在市场上引起了轰动。这款产品不仅被广泛应用于各类电子设备中,还成为了许多高校和科研机构的研究对象。Ferroxcube因此成为了行业内技术创新的佼佼者。

AirBorn公司的发展小趣事

在航空航天领域,AirBorn的产品广泛应用于飞机、导弹系统、通信设备等关键领域。为了满足航空航天领域对连接器的严苛要求,AirBorn不断投入研发力量,推出了一系列具有高性能、高可靠性的连接器产品。这些产品不仅满足了航空航天领域的需求,还为公司带来了可观的收益。

问答坊 | AI 解惑

DIY心型LED的活动,,七夕的最好礼物!

点击图标查看详细?嘿嘿 [ 本帖最后由 aldd 于 2008-8-2 00:34 编辑 ]…

查看全部问答>

芯片资料

各位好!目前我手上有个贴片元件,封装为SOT-23-5,元件表面丝印内容简单标注为A1,不知大伙可否遇到过类似元件,求该元件的技术资料,非常感谢!      hgpwgp@yahoo.com.cn…

查看全部问答>

烧写NK的时候出现的错误,附串口消息

我直接从韩国下载的 MP2530F的BSP,编译能通过,在烧写完NK.NB0的时候进入不了系统,串口消息如下,请各位大侠帮我看一下怎么回事,谢谢 NK.nb0 will be downloaded 31457280 bytes at 0x400000 Now, Downloading [ADDRESS:400000h, TOTAL:0x01E0 ...…

查看全部问答>

pocket pc 与 webservice 连接方式?

初识智能设备,要做一个pda点菜系统,我现在用的是vs2005,建的是pocket pc项目,问我应该怎么让pda与webservice连接? 1、在pda端是new一个成员webservice引用还是每进行一个操作new一个局部ws的引用(这样会不会影响效率)? 2、如果是nwe一个成 ...…

查看全部问答>

液晶黑屏

我用的液晶显示器平时显示是正确的 但是偶尔会在初始化之后黑屏了 这样就看不到屏上的信息了 请高手指点一下!! 谢谢…

查看全部问答>

关于PWM的问题!!!

我今天看了周立功的213X的书,PWM(脉宽调制器),里面说到PWMX有单边缘控制模式和双边缘控制模式,请问大侠们这里的单边缘和双边缘是是什么意思?????…

查看全部问答>

从SIM卡上获取语音信箱号码

大家好!    请问大家有人知道,如何获得存放在SIM卡上的语音信箱号码吗?因为有些SIM卡将语音信箱号码预先设置到了SIM卡的某个地方,我现在想把这个号码取出来.那如何做到呢?    在GSM11.11规范中有EF-SDN(6F49)着个文件, 但是 ...…

查看全部问答>

关于用QuartusII仿真的问题??????

今天遇到一个奇怪的问题:用QuartusII仿真的时候,波形图总是不会出现时钟,就只有电平而已,但是程序确定无误是设定了时钟类型的,仿真的时候也设定了,但就是仿真不了!到底是什么问题呢??…

查看全部问答>

PIC单片机的应用设计技巧(转)

PIC单片机的应用设计技巧(转)   document.write(overlap1); 美国微芯公司(Microch{p Technology Inc.)开发的CM0S工艺PIC系列8位单片机(RISC微控制器),特别是 ...…

查看全部问答>

关于ARM开发板

最近想弄块A8或者ARM11的板子玩玩,不知道大家都有没有兴趣如果人多,我们可以组织团购!!~…

查看全部问答>