电子开发 | 基础入门 | 电路原理图 | 姊舰鍥惧疄渚� | PLC鍩虹   銆婂鏋滃枩娆㈡湰绔欙紝璇锋寜 Ctrl+D 鎵嬪姩鏀惰棌锛佹劅璋㈡偍鐨勬敮鎸併€�涓€璧峰涔犱竴璧疯繘姝ワ紝鐢靛瓙寮€鍙戠帇娆㈣繋鎮紒.

电子开发网

电子开发网电子设计 | 电子开发网Rss 2.0 会员中心 会员注册

鈽呯數璺叕寮忔墜鍐岋紝鏈€鏂扮増銆婄數瀛愮數璺叕寮忚绠楀櫒銆嬶紝鐢佃矾鍏紡鏌ヨ鎵嬪唽 鐢佃矾鍏紡璁$畻鍣ㄣ€愮數瀛愪粠涓氫汉鍛樺繀澶囨墜鍐屻€�
鈽嗗崄澶╁浼氬崟鐗囨満瀹炰緥100 c璇█ chm鏍煎紡銆傝祫鏂欏唴瀹硅缁嗭紝瑕嗙洊渚嬪瓙澶氾紝鍐呭骞裤€愮數瀛愪粠涓氫汉鍛樺繀澶囨墜鍐屻€�
搜索: 您现在的位置: 电子开发网 >> 电子开发 >> 单片机 >> 正文

用单片机AT89C51设计的数字钟,AT89C51 Digital Clock

作者:佚名    文章来源:本站原创    点击数:1532    更新时间:2018-02-22

用单片机AT89C51设计的数字钟,AT89C51 Digital Clock

关键字:AT89C51,电子钟电路图,51单片机

1.实验任务
(1).开机时,显示12:00:00的时间开始计时;
(2).P0.0/AD0控制“秒”的调整,每按一次加1秒;
(3).P0.1/AD1控制“分”的调整,每按一次加1分;
(4).P0.2/AD2控制“时”的调整,每按一次加1个小时;
2.电路原理图



用单片机AT89C51设计的数字钟,AT89C51 Digital Clock       


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
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
        p 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
        p 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
        p 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语言源程序

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;
    }
}

 


Tags:单片机,数字时钟,c语言程序  
责任编辑:admin
  • 上一篇文章:
  • 下一篇文章: 没有了
  • 请文明参与讨论,禁止漫骂攻击,不要恶意评论、违禁词语。 昵称:
    1分 2分 3分 4分 5分

    还可以输入 200 个字
    [ 查看全部 ] 网友评论
        没有任何评论
    鐢靛瓙寮€鍙戠綉锛氭眹闆嗙患鍚堝悇绫荤數瀛愬埗浣滀笌鐢佃矾鍥剧殑缃戠珯锛宲lc宸ユ帶鎶€鏈�,妯$數鏁扮數鐭ヨ瘑,鍗曠墖鏈篍DA绛夌瓑锛佽崯钀冪數璺浘缃戠珯绮惧崕锛屼负宸ョ▼甯堝垱閫犱环鍊笺€傛杩庡叧娉ㄥ井淇″叕浼楀彿锛氱數瀛愬紑鍙戠綉锛�
    最新文章
     简单三极管逆变器
     TL494制作50HZ逆变
     80W简单的功放电路
     555制作的简易电子
     850热风枪电路图原
     直流12v荧光灯电路
    关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 在线帮助 - 文章列表
    返回顶部
    刷新页面
    下到页底
    晶体管查询