单片机数字钟设计

发布者:TranquilMind88最新更新时间:2013-04-02 来源: 51hei关键字:单片机  数字钟  AT89S51 手机看文章 扫描二维码
随时随地手机看文章

1.实验任务

(1.开机时,显示12:00:00的时间开始计时;

(2.P0.0/AD0控制“秒”的调整,每按一次加1秒;

(3.P0.1/AD1控制“分”的调整,每按一次加1分;

(4.P0.2/AD2控制“时”的调整,每按一次加1个小时;

2.电路原理图

点击浏览下一页

图4.20.1

3.系统板上硬件连线

(1.把“单片机系统”区域中的P1.0-P1.7端口用8芯排线连接到“动态数码显示”区域中的A-H端口上;

(2.把“单片机系统:区域中的P3.0-P3.7端口用8芯排线连接到“动态数码显示”区域中的S1-S8端口上;

(3.把“单片机系统”区域中的P0.0/AD0、P0.1/AD1、P0.2/AD2端口分别用导线连接到“独立式键盘”区域中的SP3、SP2、SP1端口上;

4.相关基本知识

(1.动态数码显示的方法

(2.独立式按键识别过程

(3.“时”,“分”,“秒”数据送出显示处理方法

5.程序框图

6.汇编源程序

SECOND          EQU 30H

MINITE                     EQU 31H

HOUR            EQU 32H

HOURK          BIT P0.0

MINITEK         BIT P0.1

SECONDK        BIT P0.2

DISPBUF                    EQU 40H

DISPBIT            EQU 48H

T2SCNTA          EQU 49H

T2SCNTB         EQU 4AH

TEMP                      EQU 4BH

        ORG 00H

        LJMP START

        ORG 0BH

        LJMP INT_T0

START:  MOV SECOND,#00H

        MOV MINITE,#00H

        MOV HOUR,#12

        MOV DISPBIT,#00H

        MOV T2SCNTA,#00H

        MOV T2SCNTB,#00H

        MOV TEMP,#0FEH

        LCALL DISP

        MOV TMOD,#01H

        MOV TH0,#(65536-2000) / 256

        MOV TL0,#(65536-2000) MOD 256

        SETB TR0

        SETB ET0

        SETB EA [page]

WT:     JB SECONDK,NK1

        LCALL DELY10MS

        JB SECONDK,NK1

        INC SECOND

        MOV A,SECOND

        CJNE A,#60,NS60

        MOV SECOND,#00H

NS60:   LCALL DISP

        JNB SECONDK,$

NK1:    JB MINITEK,NK2

        LCALL DELY10MS

        JB MINITEK,NK2

        INC MINITE

        MOV A,MINITE

        CJNE A,#60,NM60

        MOV MINITE,#00H

NM60:   LCALL DISP

        JNB MINITEK,$

NK2:    JB HOURK,NK3

        LCALL DELY10MS

        JB HOURK,NK3

        INC HOUR

        MOV A,HOUR

        CJNE A,#24,NH24

        MOV HOUR,#00H

NH24:   LCALL DISP

        JNB HOURK,$

NK3:    LJMP WT

DELY10MS:

        MOV R6,#10

D1:     MOV R7,#248

        DJNZ R7,$

        DJNZ R6,D1

        RET

DISP:  

        MOV A,#DISPBUF

        ADD A,#8

        DEC A

        MOV R1,A

        MOV A,HOUR

        MOV B,#10

        DIV AB

        MOV @R1,A

        DEC R1

        MOV A,B

        MOV @R1,A

        DEC R1

        MOV A,#10

        MOV@R1,A

        DEC R1

        MOV A,MINITE

        MOV B,#10

        DIV AB

        MOV @R1,A

        DEC R1

        MOV A,B

        MOV @R1,A

        DEC R1

        MOV A,#10

        MOV@R1,A

        DEC R1

        MOV A,SECOND

        MOV B,#10

        DIV AB

        MOV @R1,A

        DEC R1

        MOV A,B

        MOV @R1,A

        DEC R1

        RET

INT_T0:

        MOV TH0,#(65536-2000) / 256

        MOV TL0,#(65536-2000) MOD 256

        MOV A,#DISPBUF

        ADD A,DISPBIT

        MOV R0,A

        MOV A,@R0

        MOV DPTR,#TABLE

        MOVC A,@A+DPTR

        MOV P1,A

        MOV A,DISPBIT

        MOV DPTR,#TAB

        MOVC A,@A+DPTR

        MOV P3,A

        INC DISPBIT

        MOV A,DISPBIT

        CJNE A,#08H,KNA

        MOV DISPBIT,#00H

KNA:    INC T2SCNTA

        MOV A,T2SCNTA

        CJNE A,#100,DONE

        MOV T2SCNTA,#00H

        INC T2SCNTB

        MOV A,T2SCNTB

        CJNE A,#05H,DONE

        MOV T2SCNTB,#00H

        INC SECOND

        MOV A,SECOND

        CJNE A,#60,NEXT

        MOV SECOND,#00H

        INC MINITE

        MOV A,MINITE

        CJNE A,#60,NEXT

        MOV MINITE,#00H

        INC HOUR

        MOV A,HOUR

        CJNE A,#24,NEXT

        MOV HOUR,#00H

NEXT:   LCALL DISP

DONE:   RETI

TABLE:  DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H

TAB:    DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH

        END [page]

7. C语言源程序

#include

unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,

                               0x66,0x6d,0x7d,0x07,

                               0x7f,0x6f,0x77,0x7c,

                               0x39,0x5e,0x79,0x71,0x00};

unsigned char dispbitcode[]={0xfe,0xfd,0xfb,0xf7,

                             0xef,0xdf,0xbf,0x7f};

unsigned char dispbuf[8]={0,0,16,0,0,16,0,0};

unsigned char dispbitcnt;

unsigned char second;

unsigned char minite;

unsigned char hour;

unsigned int tcnt;

unsigned char mstcnt;

unsigned char i,j;

void main(void)

{

  TMOD=0x02;

  TH0=0x06;

  TL0=0x06;

  TR0=1;

  ET0=1;

  EA=1;

  while(1)

    {

      if(P0_0==0)

        {

          for(i=5;i>0;i--)

          for(j=248;j>0;j--);

          if(P0_0==0)

            {

              second++;

              if(second==60)

                {

                  second=0;

                }

              dispbuf[0]=second;

              dispbuf[1]=second/10;

              while(P0_0==0);

            }

        }

      if(P0_1==0)

        {

          for(i=5;i>0;i--)

          for(j=248;j>0;j--);

          if(P0_1==0)

            {

              minite++;

              if(minite==60)

                {

                  minite=0;

                }

              dispbuf[3]=minite;

              dispbuf[4]=minite/10;

              while(P0_1==0);

            }

        }

      if(P0_2==0)

        {

          for(i=5;i>0;i--)

          for(j=248;j>0;j--);

          if(P0_2==0)

            {

              hour++;

              if(hour==24)

                {

                  hour=0;

                }

              dispbuf[6]=hour;

              dispbuf[7]=hour/10;

              while(P0_2==0);

            }

        }

    }

}

void t0(void) interrupt 1 using 0

{

  mstcnt++;

  if(mstcnt==8)

    {

      mstcnt=0;

      P1=dispcode[dispbuf[dispbitcnt]];

      P3=dispbitcode[dispbitcnt];

      dispbitcnt++;

      if(dispbitcnt==8)

        {

          dispbitcnt=0;

        }

    }

  tcnt++;

  if(tcnt==4000)

    {

      tcnt=0;

      second++;

      if(second==60)

        {

          second=0;

          minite++;

          if(minite==60)

            {

              minite=0;

              hour++;

              if(hour==24)

                {

                  hour=0;

                }

            }

        }

      dispbuf[0]=second;

      dispbuf[1]=second/10;

      dispbuf[3]=minite;

      dispbuf[4]=minite/10;

      dispbuf[6]=hour;

      dispbuf[7]=hour/10;

    }

}

关键字:单片机  数字钟  AT89S51 引用地址:单片机数字钟设计

上一篇:单片机电子琴设计
下一篇:单片机计算器设计

推荐阅读最新更新时间:2024-03-16 13:21

51单片机的软件复位
请先看最下面的程序 这是一款针对Keil软件的,被称作 纯软件 复位的程序。所谓 纯软件 是指它没有直接操作硬件以及寄存器。 事实上如果不懂硬件和汇编也不可能有这段C程序,不管怎么样,我们还是来看一看它的真面目: 我们知道51 单片机 可以把数据放在程序存储器里面,也就是程序和数据没有本质区别,都是一些特定的数据。如果我们将一段程序,以数组数据的形式存储在程序存储器里面,那么是不是也可以执行呢?答案是肯定的。 - 言归正传,先来看看这个数组数据 0xe4,0xc0,0xe0,0xc0,0xe0,0x22,中Keil的汇编窗口看出,它其实是四条汇编语句: CLR A ;编
[单片机]
谈谈单片机C语言编程中不经意间的一个小错误!
我们知道,51单片机有几个不同的中断源。 对于一个系统的设计,通常在初始化程序里面需要定义各个中断等 比如: TMOD = 0x21; // T1 mode 2 T0,mode 1 //GATE C/T M1 M0 GATE C/T M1 M0 TL1 = 0xfd; // 0xfa=4800 bps 0xfd=9600 bps TH1 = 0xfd; TH0 = -(10000/256); TL0 = -(10000%256); PCON = 0; //波特率不变等设置 SCON = 0x50; //串口1方式1,允许接收 IT0 = 1; //外部中断0下降沿有效 IT1 = 1; //外部中断1下降沿有
[单片机]
MSP430 MCU内部时钟极低功耗生成随机数字
不管是生成随机器件地址、强化加密算法还是创建独立产品密钥,可靠地生成随机数字都变得日益重要。这些随机数字对于日常嵌入式系统特别有用,比如车库门接收机必须一一对应地正确识别远程控制的随机数字,以防止非授权访问。为了生成随机数字,开发人员可以使用高级 16 位 MCU 确保将所有信号都控制在 MCU 内部,而且与昂贵的模拟硬件相比,这种解决方案成本更低、安全性也更高。 双时钟芯片架构可以支持 TI 超低功耗MCU MSP430 的随机数字生成能力。超低频振荡器 (VLO) 与数控振荡器 (DCO) 是两个独立的时钟系统,可以利用二者间的计时差生成随机位流。一个 VLO 时钟周期中的DCO 时钟数量大致相同。然而,由于 VLO 与
[单片机]
晶振在单片机中作用
简单地说,没有晶振,就没有时钟周期,没有时钟周期,就无法执行程序代码,单片机就无法工作。   单片机工作时,是一条一条地从RoM中取指令,然后一步一步地执行。单片机访问一次存储器的时间,称之为一个机器周期,这是一个时间基准。—个机器周期包括12个时钟周期。如果一个单片机选择了12MHz晶振,它的时钟周期是1/12us,它的一个机器周期是12×(1/12)us,也就是1us。   MCS—51单片机的所有指令中,有一些完成得比较快,只要一个机器周期就行了,有一些完成得比较馒,得要2个机器周期,还有两条指令要4个机器周期才行。为了衡量指令执行时间的长短,又引入一个新的概念:指令周期。所谓指令周期就是指执行一条指令的时间。例如,当需要计
[单片机]
51单片机4种工作方式及应用示例
一、方式0: 二、方式1 三、方式2 四、方式3
[单片机]
51<font color='red'>单片机</font>4种工作方式及应用示例
51单片机实现在串口接收中断里即时解析数据头的特殊程序框架
一、使用proteus绘制简单的电路图,用于后续仿真 二、编写程序 /******************************************************************************************************************** ---- @Project: USART ---- @File: main.c ---- @Edit: ZHQ ---- @Version: V1.0 ---- @CreationTime: 20200712 ---- @ModifiedTime: 20200712 ----
[单片机]
51<font color='red'>单片机</font>实现在串口接收中断里即时解析数据头的特殊程序框架
单片机成长之路(51基础篇) - 006 在Linux下搭建开发烧写环境
在Linux下没有像keli那样好用的IDE来开发51单片机,开发环境只能自己搭建了。 第一步:安装交叉编译工具 a) 安装SDCC sudo apt-get install sdcc b)测试SDCC是否可用,这是个网上找的简单的流水灯代码 test.c, 用来测试 1 #include 8051.h 2 3 #define uint unsigned int 4 #define uchar unsigned char 5 uchar tab = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; 6 7 void Delay(uint xms){ 8 uin
[单片机]
<font color='red'>单片机</font>成长之路(51基础篇) - 006 在Linux下搭建开发烧写环境
一种基于PIC单片机的便携式磁记忆检测仪
   引言   金属构件和零部件发生损坏的主要原因,是各种微观和宏观机械应力集中导致疲劳失效,其基本特征表现为材料在低于静强度极限的交变应力持续作用下,生成多种类型的微观内部缺陷,并逐渐演化为宏观裂纹,裂纹扩展最终导致结构破坏。因此,进行疲劳分析,有效评价应力变形状况,测定未来裂缝发展的位置、大小和方向,成为评价金属零部件与构件结构强度和可靠性的一个重要依据。为了及时准确的找出最大机械应力变形区域,20世纪90年代后期,以杜波夫为代表的俄罗斯学者率先提出一种崭新的诊断技术—金属磁记忆检测。本文采用PIC单片机,设计了高性价比的便携式磁记忆检测仪,具有低成本、低功耗和快速检测等特点,可以满足各种场合,特别是难以到达部位的应力集中区
[模拟电子]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved