新闻  |   论坛  |   博客  |   在线研讨会
单片机实现数字钟
tvb2058 | 2007-09-14 13:55:37    阅读:5524   发布文章

20061211 星期一 上午 11:34

1.实验任务

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

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

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

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

2.电路原理图

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

(排阻的公共端C接电源,其他的8个脚分别对应用的接P1.0~P1.7,在接数码管的S1~S4[共两组]用来选中4*2=8位数码管的其中一位,数码管是动态显示的,延时要短一点,但不少于20ms太短数据变化快不容易看清楚)
这篇文章是转载的,它的P1口和P0口颠倒了,如果R1作上拉电阻用,P1内置上拉电阻;如果作为限流用,应该再接三极管的放大,而排阻R1也不是这么接的.你就把P1口和P0口换一下吧,因为照它下面接按键的P0.0P0.2作输入用,却没接上拉电阻(上拉电阻不要超过470Ω

  找了张相似的电路图,给你发过去了

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客