AT89c51单片机程序控制两个数码管显示00-59秒表的程序要怎么编啊

AT89c51单片机程序控制两个数码管显示00-59秒表的程序要怎么编啊,第1张

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);//延时消抖

if(key1==0)

{

while(key1==0);//等待按键抬起

TR0=!TR0;//启动或停止

}

}

if(key2==0&&TR0==0)//判断按键是否按下及是否在走时

{

Delay1ms(10);//延时消抖

if(key2==0)

{

while(key2==0);//等待按键抬起

a=0; second=0;

}

}

display(second);

}

}

//中断子程序

void Timer0(void) interrupt 1

{

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

a++;

if(a==100 ) second++;

if(second==60) second=0;

}

最低位,是001s 变化一次,一秒钟,变化 100 次。

这么快,人的眼睛,分辨不出来。

只能看到一个 8。

停止时,才能看到稳定的数字。

程序如下:

#include<reg52h>

sbit P3_5 =P3^5;

unsigned char counet, m[4] = {0,0,0,0};  

void display() 

{

  unsigned char code Tab[] = {

    0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

  unsigned char code Bit[] = {8, 4, 2, 1};

  unsigned char i, j;

  for (i = 0; i < 4; i++)  {

    P0 = Tab[m[i]];  if (i == 2)  P0 &= 127;

    P2 = Bit[i]; for(; j > 0; j++);  P2 = 0;

  }

}

void wait_key()

{

  while( P3_5)  display();

  while(!P3_5)  display();

}

main() 

{

  TMOD = 0x02;

  IE = 0x82;

  while(1)  {

    wait_key(); TR0 = 1; TH0 = TL0 = 6;

    wait_key(); TR0 = 0;

    wait_key(); m[0] = m[1] = m[2] = m[3] = 0;    

  }

}

void time0() interrupt 1  

{

  counet++;

  counet %= 40;

  if(!counet) {

    m[0]++;  m[0] %= 10;

    if(!m[0]) {

      m[1]++;  m[1] %= 10;

      if(!m[1]) {

        m[2]++;  m[2] %= 10;

        if(!m[2]) {

          m[3]++;  m[3] %= 10;

   }}}}

}

其实,控制秒表的启动和停止,很简单。要做秒表,一定要用定时器吧,假如用T0,那开始初始化时,不写TR0=1,先不启动。

当按一下键,再启动,TR0=1,就开始计时了。

再 按一下键,就停止,TR0=0,就不计时了。

程序好写,先 定义一个按键

sbit key=P1^1; //具体是哪个 键,你自己改

主程序中,判断按键和启动/停止

if(key==0)

{

delay(); //具体延时时间自己定

if(key==0)

{

TR0=!TR0; //每按一次,取反 一次

while(key==0);

}

}

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

;功能:本程序实现P0口的对数码管动态显示秒表的分、秒、1/100秒;

; 计时程序由中断服务程序实现,采用定时计数器T0工作方式1;

; P2口实现对数码管的片选功能

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

;==========================初始化================================

SHUCHU EQU P2 ;定义P0口为输出口

PIANXUAN EQU P1 ;定义P2口为片选口

MIAO EQU 30H

FEN EQU 31H

MIAO0 EQU 32H

SHUZI EQU 33H

C_0 BIT 20H0

;======================系统程序开始==============================

ORG 00H

LJMP START

ORG 03H

LJMP ON_OFF

ORG 0BH

LJMP T0_1

ORG 13H

LJMP RESET

ORG 30H

START:

CALL INIT

SETB C_0

MOV MIAO,#00

MOV MIAO0,#00

MOV FEN,#00

MOV DPTR,#TAB

MOV R2,#5

MAIN:

JNB C_0,$

CLR C_0

LL: CALL DISPLAY

CALL SHIJIAN

JMP MAIN

;========================时间子程序=============================

;输入:"30H、31H、32H"

;输出:无

;实现的功能:分、秒、百分之秒的计算。

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

SHIJIAN:

DJNZ R2,TIAOCHU

MOV R2,#5

INC MIAO0

MOV R3,MIAO0

CJNE R3,#100,TIAOCHU

MOV MIAO0,#00

INC MIAO

MOV R3,MIAO

CJNE R3,#60,TIAOCHU

MOV MIAO,#00

INC FEN

MOV R3,FEN

CJNE R3,#60,TIAOCHU

MOV FEN,#00

TIAOCHU:RET

;========================显示子程序=============================

;输入:"A"

;输出:"P2口"

;实现的功能:显示秒、分、百分之妙

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

DISPLAY:MOV SHUZI,MIAO0

CALL JISUAN

MOVC A,@A+DPTR

MOV SHUCHU,A ;显示十位

MOV PIANXUAN,#10H ;片选

CALL DELAY

MOV PIANXUAN,#00H

MOV A,B

MOVC A,@A+DPTR

MOV SHUCHU,A ;显示个位

MOV PIANXUAN,#20H ;片选

CALL DELAY ;延时

MOV PIANXUAN,#00H

MOV SHUZI,MIAO

CALL JISUAN

MOVC A,@A+DPTR

MOV SHUCHU,A ;显示十位

MOV PIANXUAN,#04H ;片选

CALL DELAY

MOV PIANXUAN,#00H

MOV A,B

MOVC A,@A+DPTR

MOV SHUCHU,A ;显示个位

MOV PIANXUAN,#08H ;片选

CALL DELAY ;延时

MOV PIANXUAN,#00H

MOV SHUZI,FEN

CALL JISUAN

MOVC A,@A+DPTR

MOV SHUCHU,A ;显示十位

MOV PIANXUAN,#01H ;片选

CALL DELAY

MOV PIANXUAN,#00H

MOV A,B

MOVC A,@A+DPTR

MOV SHUCHU,A ;显示个位

MOV PIANXUAN,#02H ;片选

CALL DELAY ;延时

MOV PIANXUAN,#00H

RET

;========================计算子程序=============================

;输入:30H

;输出:"A和B"

;实现的功能:把33H中的数据十位和个位分离出来

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

JISUAN:MOV A,SHUZI ;数据放在A中

MOV B,#10 ;除数放在B中

DIV AB ;商放在A中,余数放在B中

RET

;====================复位中断服务程序============================

;输入;无

;输出: 无

;实现的功能:把30H、31H、32H中的数据清零。

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

RESET:PUSH ACC

MOV 30H,#00H

MOV 3H,#00H

MOV 32H,#00H

CALL DELAY

POP ACC

RETI

;====================启停中断服务程序============================

;输入;无

;输出: 无

;实现的功能:关闭定时器

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

ON_OFF:CPL TR0

CALL DELAY

RETI

;====================定时中断0服务子程序========================

;输入:无

;输出:无

;实现的功能:实现定时20MS,影响标中断志位C_0

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

T0_1:MOV TL0,50H ;设置定时初值

MOV TH0,51H

SETB C_0 ;定时标志位清0

RETI

;========================中断设置子程序=========================

;输入:无

;输出:无

;实现的功能:初始化设置定时器,设置初值,开中断0、中断1,定时器0

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

INIT:MOV TMOD,#01H ;定时器0工作方式1

MOV DPTR,#65536-20000

MOV 50H,DPL

MOV 51H,DPH

MOV TL0,50H ;设置定时初值

MOV TH0,51H

MOV IE,#87H ;开定时器中断0

MOV TCON,#15H

RET

;======================延时程序==================================

;输入;无

;输出: 无

;实现的功能:延时一段时间

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

DELAY:MOV R6,#80

L7:MOV R5,#60

L8:DJNZ R5,$

DJNZ R6,L7

RET

;======================共阳查表数据==============================

TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H

;===========================结束=================================

END

以上就是关于AT89c51单片机程序控制两个数码管显示00-59秒表的程序要怎么编啊全部的内容,包括:AT89c51单片机程序控制两个数码管显示00-59秒表的程序要怎么编啊、利用51单片机设计一个秒表 (一定要按要求做到0.01秒)、51单片机中用数码管做秒表时怎么用一个独立按键控制开始和暂停,即第一次按下计时,在按下时暂停等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9862005.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存