STC89c52单片机,12M晶振。计时用T2定时器,16位自动重装模式  基本功能如下: 可以显示年份、月、日、时间,有闹钟功能,有倒计时功能。 上电默认显示时间,可通过按键切换显示年份、日期、闹钟、倒计时,显示一定时间后自动返回到时间显示。 在相应的显示状态下按设置键进行相应的设置。如在时间显示时按设置键可调整时间。其余类推倒计时最多可以倒数99小时59分59秒,设置完倒计时时间后进入倒数状态,闪烁显示倒数时间,中途可按键退出,倒数结束后铃响1分钟返回时间显示。 闹钟可选择开或关,闹铃响1分钟停止。

电路原理图如下:


制作出来的实物图如下:

单片机源程序如下:

#include


#define uchar unsigned char

#define uint unsigned int


#define DispOFF 10;        //显示关

#define POINT 21;        //显示小点

#define F 22;

#define H 23;

#define M 24;

#define N 25;

#define O 26;


sbit buzzer=P3^7;        //蜂鸣器控制脚


uchar T2Count;

uint T0Count;

uchar key,key_new,key_old,KeyPressTime;

uchar status;

uchar month,day,hour,min,sec,AlarmHr,AlarmMin;

uchar LastDay;

uchar AlmTime,AlmCount,DispTime;

uchar CountHr,CountMin,CountSec,CountSetSta=0;

uint year;

bit TimeAdj,AlarmAdj,AlarmSta;

bit adjust,DigiBit;

//数码管显示代码

uchar code LedCode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,

                      0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x7f,

                                          0x8e,0x89,0xc8,0xab,0xa3

                     };

uchar Disp[4];


void LedScan(void);

void KeyScan(void);

void years(void);

void date(void);

void timer(void);

void alarmClock(void);

void CountDown(void);

void ring(void);

uchar DaysCount(void);


void Init(void)

{

TH2=0x3c;TL2=0xb0;

RCAP2H=0x3c;RCAP2L=0xb0;

EA=1;ET2=1;

TR2=1;

TMOD=0x01;

//TH0=0x3c;

//TL0=0xb0;

ET0=1;

P1=0xff;

year=2011;

month=1;

day=1;

hour=0;

min=0;

status=2;

buzzer=1;

}

/************主函数*************/

void main(void)

{

Init();

while(1)

   {

    KeyScan();

    LastDay=DaysCount();

        switch(status)        //显示状态                               

             {

                  case 0:years();break;                        //显示年

                  case 1:date();break;                        //显示日期

                  case 2:timer();break;                        //显示时间

          case 3:alarmClock();break;        //显示闹钟时间

                  case 4:CountDown();break;                //显示倒计时

         }

    LedScan();       

    ring();

   }

}


/***************定时器T0中断函数,用于倒计时**************/

void timer0(void) interrupt 1 using 2

{TH0=0x3c;

TL0=0xb0;

T0Count++;

if(CountHr||CountMin||CountSec)

        {if(T0Count==20)

                {CountSec--;T0Count=0;}

         if(CountSec>=60)

                {CountSec=59;CountMin--;}

         if(CountMin>=60)

                {CountMin=59;CountHr--;}

        }

if(T0Count==1200)

        {TR0=0;

         T0Count=0;

        }

}

/**************定时器T2中断函数,用于计时**************/

void timer2(void) interrupt 5 using 1

{

TF2=0;

if(++T2Count==20)

   {sec++;T2Count=0;}

if(!TimeAdj)        //时间调整时,暂停计时

        {if(sec==60)

                   {min++;sec=0;}

         if(min==60)

                   {hour++;min=0;}

         if(hour==24)

                   {day++;hour=0;}

         if(day>LastDay)

                   {month++;day=1;}

         if(month>12)

            {year++;month=1;}

        }

}


void delay(uchar x)

{

uchar k;

while(x--)

      for(k=0;k<123;k++);

}

/***********数码管扫描显示函数***************/

void LedScan(void)

{

uchar i;

uchar temp=0x08;

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

    {

     P0=LedCode[Disp[i]];        //送段码

     P2=~temp;temp>>=1;                //LED显示位控制

     delay(3);                                //延时

         P2=0xff;                                //关显示

    }

}

/**********按键扫描程序***************/

void KeyScan(void)

{

if((P1&0x0f)!=0x0f)                //如果按下按键

   {if(KeyPressTime>0)                //延时

          {

           switch(~(P1|0xf0))        //判断键值

             {

              case 0x01:key_new=1;break;

              case 0x02:key_new=2;break;

              case 0x04:key_new=3;break;

                          case 0x08:key_new=4;break;

                         }

          }

        KeyPressTime++;                        //按键时间加1

   }

else                                                //如果没有按键按下

   {key_new=0;                                //键值清零

    KeyPressTime=0;                        //按键时间清零

   }

if(key_new!=key_old)                //如果前后两次键值不同

    {key=key_new;                        //键值等于本次键值

        }

else                                                //如果前后两次键值相同(按住按键未释放)

   {key=0;                                        //键值清零

    if(KeyPressTime>100)        //按键时间大于100,差不多1秒(作长按键处理)

          {KeyPressTime-=30;        //按键时间减30,当累加到100再次动作,相当于300毫秒按键一次,

           key=key_new;                        //得到本次键值

          }

   }

key_old=key_new;                   //记住本次键值

}

/***********计算本月有多少天**************/

uchar DaysCount(void)                                                       

{

if(month==4||month==6||month==9||month==11)                //4、6、9、11月为30天

   return 30;

else if(month!=2)                                                                //1、3、5、7、8、10、12月为31天

        return 31;

if(month==2)

  {if((year%4==0&&year%100!=0)||(year%400==0))

      return 29;                                                                //闰年2月为29天

   else

      return 28;                                                                //非闰年2月为28天

  }

}

/**************年函数**************/

void years(void)

{

if(adjust)                //设置,调整年

   {

        switch(key)        //处理按键

                {case 1:{

                             year++;                //年加1

                                 break;

                                }

                 case 2:{

                                 year--;                //年减1

[1] [2] [3] [4]
关键字:单片机  数码管时钟  STC89c52 引用地址:单片机数码管时钟电路图

上一篇:基于51单片机的红外智能风扇程序
下一篇:51单片机控制12864液晶显示屏显示图片

推荐阅读

虽然机器人行业已经发展了半个世纪,但仍然处于分散发展的阶段,目前,机器人已经作为新型的战略高技术产业受到各国的高度重视,尤其是西方发达国家。我国机器人行业发展迅猛,连续十年的平均增速超过23%,接近世界平均增速12%的两倍,增长速度连续八年保持世界第一。去年的市场份额已占全球的1/3,预计未来会到达50%。虽然我国机器人核心技术与西方发达国...
“用电信息采集成功率99.3%,王畈村1号台区线损出现异常波动……”8月20日,湖北孝感安陆市供电公司雷公供电所所长毛勇登录“班组透视窗”管理平台,仅用10分钟,就得到了一份详细的分析报告。平台对30多套业务系统、140多项考核指标进行了自动查询和智能分析,共监测到11个异动问题。雷公供电所所长程志兵根据这份分析报告,迅速拟出了当天的重点工作任...
安全研究人员透露,已经发现许多 Xcode 项目包含可以攻击 Safari 和其他浏览器的恶意软件,而 XCSSET 恶意软件的发现却通过未知的方式进入了 Mac 软件项目。Trend Micro 的研究人员发现了该公司所描述的“与 Xcode 开发人员项目有关的异常感染”,恶意软件会将自身整合到项目本身中。该恶意软件被发现具有多种有效载荷的可能性,尽管它对使用...
距离台积电宣布美国设厂决定过去了一年多时间。这期间,美国新任总统拜登上台公布了一揽子补贴计划,亚利桑那州干旱情况日渐严重,供应商汉唐突发内乱……都给台积电的新厂建设计划蒙上不确定性。供应商内乱 无尘室设备合同去向不明8月23日,台积电最大的无尘室设备供应商汉唐发布公告称,有关台积电海外建厂的方案,该公司目前尚无任何接洽或信息。作为...

史海拾趣

问答坊 | AI 解惑

交流变为直流的稳压电源

在输入电压220V、50Hz、电压变化范围+15%~-15%条件下; a、 输出电压可调范围:+3V~+15V; b、 最大输出电流:2A; c、 电压调整率≤0.2%(输入电压变化范围+15%~-15%下,满载); d、 负载调整率≤1% e、 纹波电压(峰- ...…

查看全部问答∨

版主上任 第二份礼物

在使用FPGA的过程中,画PCB是一件苦差事,尤其是刚开始时建Symbol. 凡是能够回复此帖的,俺将来可以帮助你生成画原理图的symbol.  仅支持mentor和Cadence的PCB工具。…

查看全部问答∨

15075018luerdu(程序一)

这个程序的作用是 ;把V/F转换得到的脉冲送到单片机的T0口计数, ;计数的结果放到R2,R3中 ;求出计数值的万,千,百,十,个位,然后分别放在74H,73H,72H,71H,70H中 ;最后把结果通过4094串行移位寄存器显示出来 ORG 0000H LJM ...…

查看全部问答∨

各位做嵌入式开发的兄弟,都在哪个城市?

不知做嵌入式开发,哪里的兄弟多些?所在地的情况如何?…

查看全部问答∨

寻AT91RM9200的VxWorksBSP!

我在www.pudn.com下载的AT91RM9200(DKEK)VxWorksBSP.RAR,但下载下来才知道只是一份开发者指南,不是源码。我现在准备上AT91RM9200,也准备买一块评估板,但都没有VxWorks的BSP,大家能送我一份吗?我们可以交换源码的。 谢谢! …

查看全部问答∨

变频器接地对干扰的影响

1     单点 接地,为许多在一起的电路提供公共电位参考点,由于只有一点接地,所以构成不了地回路的问题,因此就几乎不存在干扰的问   题,在通信速率低于1000KHZ时,选用一点接地效果比较好。 2    ...…

查看全部问答∨

选型请教:

请问版主,我只要以下功能和特性,选哪个芯片好: 1.STM32, 2.带CAN2.0B 3.带USB全速从机接口. 4.带JTAG接口, 5.LQFP封装. 6.引脚越少越好 7.价格最便宜 8.很好买到 谢谢!…

查看全部问答∨

如何实现CAN/zigbee转换

如题,要求有硬件设计和代码编写…

查看全部问答∨

10种软件滤波方法

1、限幅滤波法(又称程序判断滤波法)     A、方法:         根据经验判断,确定两次采样允许的最大偏差值(设为A)         每次检测到新值时判断: ...…

查看全部问答∨

msp430写ds18b20读取错误

能够初始化ds18b20,但读取怎么都不正确!!…

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

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

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

更多每日新闻

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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