51单片机做一个10秒倒计时的程序

51单片机做一个10秒倒计时的程序,第1张

C语言

#include

#define

uint

unsigned

int

#define

uchar

unsigned

char

sbit

p27=P2^7//数码管位选端定义

uchar

c,i

//数码管译码表

unsigned

char

code

NumDecode[]

=

{

0XC0,//0

0XF9,//1

0XA4,//2

0XB0,//3

0X99,//4

0X92,//5

0X82,//6

0XF8,//7

0X80,//带知8

0X90,//9

}

void

main()

{

i=0//10秒计时设置

c=0//中断次数计数

p27=1//数码管位选端关闭蠢扰消

TMOD=1//设置定时器0为工作方式1

TH0=(65536-46080)/256//定时50ms高8位求模

TL0=(65536-46080)%256//定时50ms低8位求余

EA=1//开总中断

ET0=1//定时器0中断

TR0=1//启动定时器0

while(1)

{

if(c==20)//50ms中断20次

{

c=0

i++//倒计时总数每秒减1

}

if(i<10)

{

p27=0//数码管位选选李扮通

P0=NumDecode[i]//显示数据

}

else

//循环计时设置

{

i=0

}

}

}

void

timer0()

interrupt

1//定时器0中断入口

{

TH0=(65536-46080)/256//定时器重新赋初值

TL0=(65536-46080)%256

c++//中断次数

}

#include<reg51.h>

#define uchar unsigned char

uchar code ledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}//0-9

uchar sec=0,min=0,hour

uchar time

uchar disdat[6]

void delay(unsigned int x)

{

unsigned int i,j

for(i=0i<xi++)

for(j=0j<120j++)

}

void dischg()

{

disdat[0]=sec%10

disdat[1]=sec/10

disdat[2]=min%10

disdat[3]=min/10

disdat[4]=hour%10

disdat[5]=hour/10

}

void t0isr() interrupt 1 //秒计时

{

TH0=0x3c

TL0=0xb0

time++

if(time==20)

{

time=0

if(sec>0)sec--

else if(min>0){sec=99min--}

else if(hour>0){sec=99min=99hour--}

}

dischg()

}

void t1isr() interrupt 3 //显示

{

TH1=0xec

TL1=0x78

switch(scanled)

{

case 0:

P2=0x20

P0=~ledtab[disdat[5]]

break

case 1:

P2=0x10

P0=~ledtab[disdat[4]]

break

case 2:

P2=0x08

P0=~ledtab[disdat[3]]

break

case 3:

P2=0x04

P0=~ledtab[disdat[2]]

break

case 4:

P2=0x02

P0=~ledtab[disdat[1]]

break

case 5:

P2=0x01

P0=~ledtab[disdat[0]]

break

default:break

}

scanled++

scanled%=6

}

main()

{

TMOD=0x11

TH0=0x3c

TL0=0xb0

TH1=0xec

TL1=0x78

TR1=1

TR0=0

ET0=1

ET1=1

EA=1

fmq=0

scanled=0

time=0

mode=1

dischg()

while(1)

{

if(keyhu==0)

{

while(keyhu==0)

TR0=0

hour++

hour%=24

}

if(keyhd==0)

{

while(keyhd==0)

TR0=0

if(hour>0)hour--

if(hour==0)hour=23

}

if(keymu==0)

{

while(keymu==0)

TR0=0

min++

min%=60

}

if(keymd==0)

{

while(keymd==0)

TR0=0

if(min>0)min--

if(min==0)min=59

}

if(keysu==0)

{

while(keysu==0)

TR0=0

sec++

sec%=60

}

if(keysd==0)

{

while(keysd==0)

TR0=0

if(sec>0)sec--

if(sec==0)sec=59

}

if(keyst==0)

{

while(keyst==0)

TR0=~TR0

}

dischg()

}

}

这是一个倒计时案例,你可以参考一下:

ORG 0000H

LJMP MAIN

ORG 000BH

LJMP T0ISR

ORG 0030H

MAIN:

 握伍让   MOV TMOD,#01H

    MOV TH0,#HIGH(65536-10000)

    MOV TL0,#LOW(65536-10000)

    SETB ET0

    SETB EA

 MOV R0,#9

 MOV R1,#9

 MOV R2,#0

 MOV R3,#9

 CLR 00H

 CLR 01H

LOOP:

 JB P1.0,LP01

 段局JNB P1.0,$

 SETB TR0

 CLR 01H

 SJMP LOOP0

LP01:

 JB P1.1,LP02

 JNB P1.1,$

 SETB 01H

 SJMP LOOP0

LP02:

 JB P1.2,LOOP0

 JNB P1.1,$

 CLR TR0

 MOV P3,#0FDH

 MOV P2,#0

 MOV P3,#0FEH

 MOV P2,#0

 SJMP MAIN

LOOP0:

 JB 00H,LOOP1

 MOV A,R0

 SJMP LOOP2

LOOP1:

 MOV A,R1

LOOP2:

 MOV DPTR,#TABLE

 MOVC A,@A+DPTR

 MOV R3,A

 SJMP LOOP

T0ISR:

    CLR TR0

    MOV TH0,#HIGH(65536-10000)

    MOV TL0,#LOW(65536-10000)

  橘拍  SETB TR0

 JB 01H,T0C

 INC R2

T0C:

 CPL 00H

 MOV A,R3

 JB 00H,T001

 MOV P3,#0FDH

 MOV P2,A

 SJMP T002

T001:

 MOV P3,#0FEH

 MOV P2,A

T002:

 MOV A,R2

 CJNE A,#100,T0E

 MOV R2,#0

 MOV A,R0

 JZ T003

 DEC R0

 SJMP T0E

T003:

 MOV A,R1

 JZ T004

 DEC R1

 MOV R0,#9

T0E:

 RETI

T004:

 CLR TR0

 RETI

TABLE:      共阴极数码管显示代码表

    DB    3FH,06H,5BH,4FH,66H 01234

    DB    6DH,7DH,07H,7FH,6FH 56789

END


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存