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

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

Lesson 18

1.实验任务
(1.             开始时,显示“00”,第1次按下SP1后就开始计时。
(2.             第2次按SP1后,计时停止。
(3.             第3次按SP1后,计时归零。
2.电路原理图
3.系统板上硬件连线
(1.把“单片机系统”区域中的P0.0/AD0-P0.7/AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a-h端口上;要求:P0.0/AD0对应着a,P0.1/AD1对应着b,……,P0.7/AD7对应着h。
(2.把“单片机系统”区域中的P2.0/A8-P2.7/A15端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a-h端口上;要求:P2.0/A8对应着a,P2.1/A9对应着b,……,P2.7/A15对应着h。
(3.把“单片机系统“区域中的P3.5/T1用导线连接到”独立式键盘“区域中的SP1端口上;
4.程序框
T0中断服务程序框

T0中断入口

TCNT加1

TCNT=400吗?

TCNT=0

SEC加1

SEC=100吗?

SEC=0

处理SEC并显示

中断返回
  

5.汇编源程序
TCNTA                       EQU 30H
TCNTB                     EQU 31H
SEC             EQU 32H
KEYCNT                   EQU 33H
SP1             BIT P3.5
               ORG 00H
               LJMP START
                     ORG 0BH
               LJMP INT_T0
START:       MOV KEYCNT,#00H
               MOV SEC,#00H
               MOV A,SEC
               MOV B,#10
               DIV AB
               MOV DPTR,#TABLE
               MOVC A,@A+DPTR
               MOV P0,A
               MOV A,B
               MOV DPTR,#TABLE
               MOVC A,@A+DPTR
               MOV P2,A
               MOV TMOD,#02H
               SETB ET0
               SETB EA
WT:             JB SP1,WT
               LCALL DELY10MS
               JB SP1,WT
               INC KEYCNT
               MOV A,KEYCNT
               CJNE A,#01H,KN1
               SETB TR0
               MOV TH0,#06H
               MOV TL0,#06H
               MOV TCNTA,#00H
               MOV TCNTB,#00H
               LJMP DKN
KN1:           CJNE A,#02H,KN2
               CLR TR0
               LJMP DKN
KN2:           CJNE A,#03H,DKN
               MOV SEC,#00H
               MOV A,SEC
               MOV B,#10
                     DIV AB
               MOV DPTR,#TABLE
               MOVC A,@A+DPTR
               MOV P0,A
               MOV A,B
               MOV DPTR,#TABLE
               MOVC A,@A+DPTR
               MOV P2,A
               MOV KEYCNT,#00H
DKN:       JNB SP1,$
               LJMP WT
DELY10MS:
                     MOV R6,#20
D1:               MOV R7,#248
               DJNZ R7,$
               DJNZ R6,D1
               RET
INT_T0:
               INC TCNTA
               MOV A,TCNTA
               CJNE A,#100,NEXT
               MOV TCNTA,#00H
               INC TCNTB
               MOV A,TCNTB
               CJNE A,#4,NEXT
               MOV TCNTB,#00H
               INC SEC
               MOV A,SEC
               CJNE A,#100,DONE
               MOV SEC,#00H
DONE:                         MOV A,SEC
               MOV B,#10
               DIV AB
               MOV DPTR,#TABLE
               MOVC A,@A+DPTR
               MOV P0,A
               MOV A,B
               MOV DPTR,#TABLE
               MOVC A,@A+DPTR
               MOV P2,A
NEXT:     RETI
TABLE:   DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
               END
6. 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 second;
unsigned char keycnt;
unsigned int tcnt;
void main(void)
{
   unsigned char i,j;
   TMOD=0x02;
   ET0=1;
   EA=1;
   second=0;
   P0=dispcode[second/10];
   P2=dispcode[second%10];
   while(1)
       {
           if(P3_5==0)
               {
                   for(i=20;i>0;i--)
                   for(j=248;j>0;j--);
                   if(P3_5==0)
                       {
                           keycnt++;
                           switch(keycnt)
                               {
                                   case 1:
                                       TH0=0x06;
                                       TL0=0x06;
                                       TR0=1;
                                       break;
                                   case 2:
                                       TR0=0;
                                       break;
                                   case 3:
                                       keycnt=0;
                                       second=0;
                                       P0=dispcode[second/10];
                                       P2=dispcode[second%10];
                                       break;
                               }
                           while(P3_5==0);
                       }
               }
       }
}
void t0(void) interrupt 1 using 0
{
   tcnt++;
   if(tcnt==400)
       {
           tcnt=0;
           second++;
           if(second==100)
               {
                   second=0;
               }
           P0=dispcode[second/10];
           P2=dispcode[second%10];
       }
}
  
我要评论
  • 匿名发表
  • [添加到收藏夹]
  • 发表评论:(匿名发表无需登录,已登录用户可直接发表。) 登录状态:未登录
最新评论
所有评论[0]
    暂无已审核评论!

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

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