单片机六十秒倒计时程序

单片机六十秒倒计时程序,第1张

数码管段选接P2口,位选接P3.0和P3.1,

采用定时器T0定时10ms,60H为1s计数单元,计数100次为1sORG 0000H 程序从0地址开始

LJMP MAIN 跳到MAIN处执行

ORG 000BH 定时器T0

LJMP TIME0

ORG 0030H

MAIN:MOV TMOD,#01H 设置T0工作在模式1

MOV TH0,#0D8H 赋初值,定时10ms

MOV TL0,#0F0H

MOV IE,#82H 开CPU中断,开定时器0中断

MOV R3,#60

SETB TR0 启动T0定时器工作

MOV 60H,#100给60H单元赋初值

CLR 4FH 清零4FH单元

DISPLAY: 显示子程序

MOV DPTR,#TAB DPTR指向编码表位置

MOV A,R3 将R3的内容复制到A

MOV B,#10

DIV AB A除B,商给A,余数给B

MOVC A,@A+DPTR 根据A的值取出编码表中的编码

MOV P2,A 由P1口输出A的内容

CLR P3.0 清零P2.0

SETB P3.0 置位P2.0 MOV A,B

MOVC A,@A+DPTR 根据A的值取出编码表中的编码

MOV P2,A 由P1口输出A的内容

CLR P3.1 清零P2.1

SETB P3.1 置位P2.1

JNB 4FH,DISPLAY 判断1秒时间是否到,没有到,则跳转到DIAPLAY处

CLR 4FH 1秒到,清4FH

LJMP DISPLAY 调用显示子程序 TIME0:MOV TH0,#0D8H赋初值

MOV TL0,#0F0H

DJNZ 60H,TT 60H单元自减1,判断是否为0,不为0则跳转到TT处

MOV 60H,#100 60H单元为0,则重新给其赋值100

SETB 4FH 同时置位4FH单元

DEC R3R3自加1

CJNE R3,#00H,TT 判断R3是否为0,否则跳转TT处

CLR TR0

TT:RETI

TAB: 编码表

DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH 共阴

END程序结束

7SEG-COM-CATHODE 为共阴管

#include<reg51.h>

#define uchar unsigned char

#define uint unsigned int

uchar num=60,shi,ge

uchar code TAB[]={

  0x3F,/*0*/

        0x06,/*1*/

        0x5B,/*2*/

        0x4F,/*3*/

        0x66,/*4*/

        0x6D,/*5*/

        0x7D,/*6*/

        0x07,/*7*/

        0x7F,/*8*/

        0x6F,/*9*/

 }

void T0INTinit()

{

TMOD=0x01

TH0=(65536-50000)/256

TL0=(65536-50000)%256

EA=1

ET0=1

TR0=1

}

void main()

{

T0INTinit()

while(1)

{

shi=num/10

ge=num%10

P0=TAB[shi]

P2=TAB[ge]

}

}

void T0INT() interrupt 1

{

uchar i

TH0=(65536-50000)/256

TL0=(65536-50000)%256

i++

if(i==20)

{

i=0

num--

if(num==0)

num=60

}

}

ORG     00H  

          SJMP    STAR   

          ORG     1BH

          SJMP    TIS              转T1中断服务程序

          ORG     30H

   STAR:  MOV     R2,#60H       倒计时初值

          MOV     R4,#20H       定时中断溢出计数器

          MOV     IE,#88H      开中断

          MOV     TMOD,#10H      

          MOV     TH1,#3CH       定时初值

          MOV     TL1,#0B0H     定时初值

          SETB    TR1       启动

          ACALL   DIS       调用显示子程序

          SJMP    $

   TIS:   MOV     TH1,#3CH

          MOV     TL1,#0B0H

          DJNZ    R4,T1S1          定时1S到否

          MOV     R4,#20       到1S,重置R4=20

          DJNZ    R2,T1S0       倒计时递减

          CLR     TR1          倒计时结束,关定时器

   T1S0:  ACALL   DIS      调显示

   T1S1:  RETI                    中断返回

   SEG7:  INC     A             A的值加一

          MOVC    A,@A+PC         取显示断段

       RET   

       DB  0C0H,0F9H,0A4H,0B0H     0至3的共阳型显示码

       DB  99H,92H,82H,0F8H     4至7的共阳型显示码

       DB  80H,90H,88H,83H     8至B的共阳型显示码

       DB  0C6H,0A1H,86H,8EH     C至F的共阳型显示码

  DIS: MOV     A,R2            单字节十六进制数转为十进制数

       MOV     B,#10   

       DIV     AB 

       ACALL   SEG7 

       MOV     P1,A             显示十位

       MOV     A,B

       ACALL   SEG7

       MOV     P2,A           显示个位

       RET                子程序返回

       END 


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

原文地址: http://outofmemory.cn/yw/11130843.html

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

发表评论

登录后才能评论

评论列表(0条)

保存