本站近期与电子报单片机公共实验室合作推出系列教学文章!

返回主页 51论坛 单片机教学 单片机提高 音响技术 品质技术 技术资料 软件下载 音响网址 学液晶显示 产品介绍 如何购买

单片机c语言欢迎进入51单片机学习网论坛讨论
本站新域名www.8951.com开通WWW.51C51.COM 中国单片机编程技术普及推广第一站!

20.            数字钟★﹞

1. 实验任务

(1.       开机时,显示120000的时间开始计时;

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

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

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

2. 电路原理图

4.20.1

3. 系统板上硬件连线

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

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

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

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

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

7. C语言源程序

#include <AT89X51.H>

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%10;

              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%10;

              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%10;

              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%10;

      dispbuf[1]=second/10;

      dispbuf[3]=minite%10;

      dispbuf[4]=minite/10;

      dispbuf[6]=hour%10;

      dispbuf[7]=hour/10;

    }

}  

 

 

 

              
                                 51单片机C语言实验及实践教程
第一章:  硬件资源模块
  第二章:keil c 软件使用
at89s51单片机实验及实践课题┅┅┅┅┅┅┅┅┅┅┅1.       闪烁灯                   
at89s51单片机实验及实践课题┅┅┅┅┅┅┅┅┅┅┅2.       模拟开关灯
at89s51单片机实验及实践课题┅┅┅┅┅┅┅┅┅┅┅3.       多路开关状态指示
at89s51单片机实验及实践课题┅┅┅┅┅┅┅┅┅┅┅4.       广告灯的左移右移
at89s51单片机实验及实践课题┅┅┅┅┅┅┅┅┅┅┅5.       广告灯(利用取表方式)
at89s51单片机实验及实践课题┅┅┅┅┅┅┅┅┅┅┅6.       报警产生器
at89s51单片机实验及实践课题┅┅┅┅┅┅┅┅┅┅┅7.       I/O并行口直接驱动LED显示
at89s51单片机实验及实践课题┅┅┅┅┅┅┅┅┅┅┅8.       按键识别方法之一
at89s51单片机实验及实践课题┅┅┅┅┅┅┅┅┅┅┅9.       一键多功能按键识别技术
at89s51单片机实验及实践课题┅┅┅┅┅┅┅┅┅┅┅10.   00-99计数器
at89s51单片机实验及实践课题┅┅┅┅┅┅┅┅┅┅┅11.   00-59秒计时器(利用软件延时)
at89s51单片机实验及实践课题┅┅┅┅┅┅┅┅┅┅┅12.   可预置可逆4位计数器
at89s51单片机实验及实践课题┅┅┅┅┅┅┅┅┅┅┅13.   动态数码显示技术
at89s51单片机实验及实践课题┅┅┅┅┅┅┅┅┅┅┅14.   4×4矩阵式键盘识别技术
at89s51单片机实验及实践课题┅┅┅┅┅┅┅┅┅┅┅15.   定时计数器T0作定时应用技术(一)
at89s51单片机实验及实践课题┅┅┅┅┅┅┅┅┅┅┅16.   定时计数器T0作定时应用技术(二)
at89s51单片机实验及实践课题┅┅┅┅┅┅┅┅┅┅┅17.   99秒马表设计
at89s51单片机实验及实践课题┅┅┅┅┅┅┅┅┅┅┅18.   “嘀、嘀、……”报警声
at89s51单片机实验及实践课题┅┅┅┅┅┅┅┅┅┅┅19.   “叮咚”门铃
at89s51单片机实验及实践课题┅┅┅┅┅┅┅┅┅┅┅20.   数字钟(★)
at89s51单片机实验及实践课题┅┅┅┅┅┅┅┅┅┅┅21.   拉幕式数码显示技术
at89s51单片机实验及实践课题┅┅┅┅┅┅┅┅┅┅┅22.   电子琴
at89s51单片机实验及实践课题┅┅┅┅┅┅┅┅┅┅┅23.   模拟计算器数字输入及显示
at89s51单片机实验及实践课题┅┅┅┅┅┅┅┅┅┅┅24.   8×8LED点阵显示技术
at89s51单片机实验及实践课题┅┅┅┅┅┅┅┅┅┅┅25.   点阵LED“0-9”数字显示技术
at89s51单片机实验及实践课题┅┅┅┅┅┅┅┅┅┅┅26.   点阵式LED简单图形显示技术
at89s51单片机实验及实践课题┅┅┅┅┅┅┅┅┅┅┅27.   ADC0809 A/D转换器基本应用技术
at89s51单片机实验及实践课题┅┅┅┅┅┅┅┅┅┅┅28.   数字电压表
at89s51单片机实验及实践课题┅┅┅┅┅┅┅┅┅┅┅29.   两点间温度控制
at89s51单片机实验及实践课题┅┅┅┅┅┅┅┅┅┅┅30.   四位数数字温度计
at89s51单片机实验及实践课题┅┅┅┅┅┅┅┅┅┅┅31.   6位数显频率计数器
at89s51单片机实验及实践课题┅┅┅┅┅┅┅┅┅┅┅32.   电子密码锁设计
at89s51单片机实验及实践课题┅┅┅┅┅┅┅┅┅┅┅33.   4×4键盘及8位数码管显示构成的电子密码锁
at89s51单片机实验及实践课题┅┅┅┅┅┅┅┅┅┅┅34.   带有存储器功能的数字温度计-DS1624技术应用
at89s51单片机实验及实践课题┅┅┅┅┅┅┅┅┅┅┅35 DS18B20数字温度计使用