求用单片机设计一个秒表AT89C51

要求1、按开关K1 秒表开始计时 再按开关K1计时暂停,按开关K2秒表复位
2,如果可以的话顺便发一下电路图
3、最好是用汇编编写程序(本人看不懂C)
谢谢

;汇编程序如下。

;使用T0定时方式1,每隔50ms中断一次,用于修改时间及显示

;使用外部中断0、1,用于控制启动和清零

;========================================================

        ORG  0000H

        AJMP MAIN

        ORG  0003H

        AJMP X0_INT

        ORG  000BH

        AJMP T0_INT

        ORG  0013H

        AJMP X1_INT

MAIN:

        MOV  TMOD,#01H            ;T0定时方式1

        MOV  TH0, #(65536-50000) / 256    ;50ms@12MHz

        MOV  TL0, #(65536-50000) MOD 256;

        SETB TR0

        SETB ET0                 ;开启定时中断

        SETB EX0

        SETB EX1

        SETB EA                  ;定时器初始化结束,下面循环显示即可

        MOV  R1, #99H            ;0~99计数.

        MOV  R7, #1              ;50ms计数.

        MOV  P0, #0C0H

        MOV  P2, #0C0H

LOOP:

        SJMP LOOP

;-----------------------------------------------------------

DELAY:                           ;延时子程序.

AA4:    MOV  R4,  #0

        DJNZ R4,  $

        DJNZ R4,  $

        RET

;-----------------------------------------------------------

X0_INT:                          ;启动/停止

        CPL  F0

        RETI

;-----------------------------------------------------------

X1_INT:                          ;清零

        MOV  R1, #0

        MOV  P0, #0C0H

        MOV  P2, #0C0H

        RETI

;-----------------------------------------------------------

T0_INT:                          ;50ms中断执行一次.

        MOV TL0, #(65536-50000) MOD 256;

        MOV TH0, #(65536-50000) / 256    ;50ms@12MHz

        DJNZ R7, T0_END          ;中断不到20次.

        MOV  R7, #20

        JNB  F0, T0_END

        MOV  A,  R1

        ADD  A,  #1

        DA   A

        MOV  R1, A

        ANL  A,  #0FH

        MOV  DPTR, #TAB

        MOVC A, @A+DPTR          ;查出段码

        MOV  P2, A

        MOV  A,  R1

        SWAP A

        ANL  A,  #0FH

        MOVC A, @A+DPTR          ;查出段码

        MOV  P0, A               ;显示十位数.

T0_END:

        RETI

;-----------------------------------------------------------

TAB:

        DB   0c0H,0f9H,0a4H,0b0H,99H,92H,82H,0f8H,80H, 90H

        END

;===========================================================

;仿真截图如下:

温馨提示:内容为网友见解,仅供参考
第1个回答  2010-05-29

对不起,我不会用汇编做,所以用c语言编了一个,希望对你有帮助

#include <reg51.h>

#define uchar unsigned char

sbit start=P3^6;

sbit stop=P3^5;

uchar code dulatab[]={0x3f,0x06,0x5b,0x4f,0x66,

       0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //数字编码0-9

uchar code welatab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位控制字

uchar msec,sec,min; 

void delay(uchar time)  //延时

{

 uchar i,j;

 for(i=0;i<time;i++)

 {

  for(j=0;j<110;j++)

  ;

 }

}

void writeled(uchar num,uchar addr)

{  

 //关显示

 P2=0xff;

 //送数据

 P0=dulatab[num];

 //开显示

 P2=welatab[addr];   

 delay(4);  

}

void display(uchar msec,uchar sec,uchar min)

{

 uchar msech,msecl,sech,secl,minh,minl;

 msech=msec/10;

 msecl=msec%10;

 sech=sec/10;

 secl=sec%10;

 minh=min/10;

 minl=min%10;

 writeled(minh,0);

 writeled(minl,1);

 writeled(10,2);

 writeled(sech,3);

 writeled(secl,4);

 writeled(10,5);

 writeled(msech,6);

 writeled(msecl,7);

}

void init()

{

 TMOD=0x10;

 TH1=0xd8;

 TL1=0xf0;

// TR1=1;

 EA=1;

 ET1=1;

}

void keyscan()

{

 if(start==0)

 {

  delay(2);

  if(start==0)

  {

   TR1=~TR1;

   while(start==0)

   {

    display(msec,sec,min); 

   }

  }

 }

 if(stop==0&&TR1==0)

 {

  delay(2);

  if(stop==0)

  {

   msec=0;

   sec=0;

   min=0;

   while(stop==0)

   {

    display(msec,sec,min); 

   }

  }

 }

}

void main()

{

 init();

 while(1)

 {

  display(msec,sec,min);

  keyscan(); 

 }  

}

void timer1() interrupt 3

{

 TH1=0xd8;

 TL1=0xf0;

 msec++;

 if(msec==100)

 {

  msec=0;

  sec++;

  if(sec==60)

  {

   sec=0;

   min++;

   if(min==60)

   {

    min=0;

   } 

  }

 }

 

}

求用单片机设计一个秒表AT89C51
ORG 0000H AJMP MAIN ORG 0003H AJMP X0_INT ORG 000BH AJMP T0_INT ORG 0013H AJMP X1_INT MAIN:MOV TMOD,#01H ;T0定时方式1 MOV TH0, #(65536-50000) \/ 256 ;50ms@12MHz MOV TL0, #(65536-50000) MOD 256;SETB TR0 SETB ET0 ;开启定时中断 SETB EX0 SET...

采用AT89C51单片机设计一只电子秒表,倒计时(60~1每间隔1秒倒数)?_百 ...
硬件电路 有2位数码管可以显示秒表的时间 0~10秒 有3个按键 K1为开始计时 K2为停止计时 K3为清零 软件设计:K1按下则启动定时器定时 每到1秒 显示器缓冲单元内容加1 K2按下则停止定时器定时 K3按下则将显示器缓冲单元内容清零。

用单片机AT89C51制作电子秒表,需要用什么元器件。
元件:89c51,四位共阴极数码管,非自锁按键,10K电阻,10uf电解电容,30pf瓷片电容,10k排阻,晶振 留个邮箱,我把Proteus仿真图发给你,以下是程序,临时写的,Proteus测试正常,不知道符不符合你的要求,你可以自己再稍作修改。用的是12M晶振 include<reg51.h> define uchar unsigned char define uint...

单片机秒表设计
用AT89C51设计一个2位的LED数码显示作为“秒表”,这应该是一个仿真题,可用两位一体的共阴数码管,用定时器T0定时,得到1秒计时。

急~!!用数码管显示60秒的秒表设计(单片机AT89C51)
;程序如下:;fosc = 11.0592MHz SP1 BIT P3.2 LED BIT P3.4 ;--- ORG 0000H SJMP START ORG 000BH MOV TH0, #4CH JNB F0, T0_END DJNZ R5, T0_END MOV R5, #20 INC R4 CJNE R4, #60, T0_E1 ;最大为59 MOV R4, #0 CLR LED T0_E1...

AT89c51单片机程序控制两个数码管显示00-59秒表的程序要怎么编啊...
display(second)子函数与两个数码管的连接方式有关 void main(void )\/\/主程序 { TMOD=0x01;\/\/ 定时器1工作方式一 ET0=1;EA=1;TH0=(65536-10000)\/256;\/\/定时10ms TL0=(65536-10000)%256;TR0=0;\/\/上电先不启动 while(1){ if(key1==0)\/\/判断按键是否按下 { Delay1ms(10);\/\/延时...

AT89C51单片机用4位数码管做秒表,要求用动态扫描做,汇编语言
;汇编时钟程序。4位共阳管。P0口段码,P2.0~P2.3位码。显示毫秒和秒。三个按键一个控制时钟开始走,一个控制暂停和继续。。。一个按键清0 ;12M晶振 2011 04 20 调试完成 STRT EQU P3.2 STP EQU P3.3 CLRR EQU P3.5 ORG 00H SJMP MAIN ORG 0BH AJMP T0INT ORG 30H MAIN: MOV ...

求C语言程序,AT89C51单片机为核心,DS18B20测温度,实时用4位LED显示...
include<reg52.h> \/\/ 试试#define uchar unsigned char #define uint unsigned int sbit DQ=P1^4; \/\/ds18b20与单片机连接口 unsigned char code str[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40} ; \/\/共阴数码管字码表unsigned char code str1[]={0...

51单片机 秒表设计
\/\/ 51单片机 秒表,显示时间为0000—9999秒,启动、停止,(停止后再次启动复位)include<reg52.h> define uint unsigned int define uchar unsigned char uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uchar bai,shi;uint...

用单片机AT89C51扩展并行可编程I\/O接口芯片8255。
RD_8255 EQU P2.0 ;8255读引脚 低电平有效 WR_8255 EQU P2.1 ;8255写引脚 低电平有效 A0_8255 EQU P2.2 ;A1_8255 EQU P2.3 ;;A1,A0:地址选择线,用来选择8255的PA口,PB口,PC口和控制寄存器。;当A1=0, A0=0时,PA口被选择;;当A1=0, A0=1时,PB口被选择;;当A1=1, ...

相似回答