51/AVR单片机技术驿站!  <在线翻译>     便利工具    特色网址   无弹窗、无插件的绿色站点...  英才招聘   学历查询  喜欢>>收藏我站 

当前位置:首页 > C51教程 > 详细内容
【吉林科技大学】第三章:89S51实践课题--数字钟﹝★﹞
发布时间:2009/6/16  阅读次数:2117  字体大小: 【】 【】【

Lesson 21

1. 实验任务
(1.            开机时,显示12:00:00的时间开始计时;
(2.             P0.0/AD0控制“秒”的调整,每按一次加1秒;
(3.             P0.1/AD1控制“分”的调整,每按一次加1分;
(4.             P0.2/AD2控制“时”的调整,每按一次加1个小时;
2. 电路原理图
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
               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;
       }
}  
  
  
我要评论
  • 匿名发表
  • [添加到收藏夹]
  • 发表评论:(匿名发表无需登录,已登录用户可直接发表。) 登录状态:未登录
最新评论
所有评论[0]
    暂无已审核评论!

网站导航 管理登陆 ┊ 免责声明 问题反馈  友链说明
本站部分内容来自网络共享资源,如有冒犯您的权利请来信告之删除或纠正!
不得对本站进行复制、盗链或镜像,转载内容须获得同意或授权;欢迎友情链接、站务合作!

    我要报警 Alexa
 mcusy_cn#126.com (请把#改成@) 交流:522422171
本站学习交流群:138..158(高级群1-)、77930286(高级群2)、61804809(群3)
Copyright© MCUSY All Rights Reserved
本站网警备案号: WZ36040002485
  ICP备案证书号:粤ICP备09034963号