51单片机数码管倒计时程序,从999999开始倒计时,用定时器T1的中断完成

51单片机数码管倒计时程序,从999999开始倒计时,用定时器T1的中断完成,第1张

#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()

}

}

简易电子时钟,LED数码管显示,

K1---时调整

(p36)

K2---分调整

(p37)

,数码管数据p0,数码管控制p2,上电时初始化显示:

12-00-00

#include

<reg51.h>

#include

<intrins.h>

unsigned

char

data

dis_digit

unsigned

char

key_s,

key_v

unsigned

char

code

dis_code[11]={

0x28,

0x7E,

0xA2,

0x62,

0x74,

0x61,

0x21,

0x7A,

0x20,

0x60,0xff}//0,1,2,3,4,5,6,7,8,9,关显示,数码管码表

unsigned

char

data

dis_buf[8]

unsigned

char

data

dis_index

unsigned

char

hour,min,sec

unsigned

char

sec100

sbit

K1

=

P3^6

sbit

K2

=

P3^7

bit

scan_key()

void

proc_key()

void

inc_sec()

void

inc_min()

void

inc_hour()

void

display()

void

delayms(unsigned

char

ms)

char

code

SST516[3]

_at_

0x003b

void

main(void)

{

P0

=

0xff

P2

=

0xff

TMOD

=

0x11

//

定时器0,

1工作模式1,

16位定时方式

TH1

=

0xdc

TL1

=

0

TH0

=

0xFC

TL0

=

0x17

hour

=

12

min

=

00

sec

=

00

sec100

=

0

dis_buf[0]

=

dis_code[hour

/

10]

//

时十位

dis_buf[1]

=

dis_code[hour

%

10]

//

个位

dis_buf[3]

=

dis_code[min

/

10]

//

分十位

dis_buf[4]

=

dis_code[min

%

10]

//

分个位

dis_buf[6]

=

dis_code[sec

/

10]

//

秒十位

dis_buf[7]

=

dis_code[sec

%

10]

//

秒个位

dis_buf[2]

=

0xf7

//

显示"-"

dis_buf[5]

=

0xf7

//

显示"-"

dis_digit

=

0xfe

dis_index

=

0

TCON

=

0x01

IE

=

0x8a

//

使能timer0,1

中断

TR0

=

1

TR1

=

1

key_v

=

0x03

while(1)

{

if(scan_key())

{

delayms(10)

if(scan_key())

{

key_v

=

key_s

proc_key()

}

}

}

}

bit

scan_key()

{

key_s

=

0x00

key_s

|=

K2

key_s

<<=

1

key_s

|=

K1

return(key_s

^

key_v)

}

void

proc_key()

{

EA

=

0

if((key_v

&

0x01)

==

0)

//

K1

{

inc_hour()

}

else

if((key_v

&

0x02)

==

0)

//

K2

{

min++

if(min

>

59)

{

min

=

0

}

dis_buf[3]

=

dis_code[min

/

10]

//

分十位

dis_buf[4]

=

dis_code[min

%

10]

//

分个位

}

EA

=

1

}

void

timer0()

interrupt

1

//

定时器0中断服务程序,

用于数码管的动态扫描

//

dis_index

---

显示索引,

用于标识当前显示的数码管和缓冲区的偏移量

//

dis_digit

---

位选通值,

传送到P2口用于选通当前数码管的数值,

如等于0xfe时,

//

选通P2.0口数码管

//

dis_buf

---

显于缓冲区基地址

{

TH0

=

0xFC

TL0

=

0x17

P2

=

0xff

//

先关闭所有数码管

P0

=

dis_buf[dis_index]

//

显示代码传送到P0口

P2

=

dis_digit

//

dis_digit

=

_crol_(dis_digit,1)

//

位选通值左移,

下次中断时选通下一位数码管

dis_index++

//

dis_index

&=

0x07

//

8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描

}

void

timer1()

interrupt

3

{

TH1

=

0xdc

sec100++

if(sec100

>=

100)

{

sec100

=

0

inc_sec()

}

}

void

inc_sec()

{

sec++

if(sec

>

59)

{

sec

=

0

inc_min()

}

dis_buf[6]

=

dis_code[sec

/

10]

//

秒十位

dis_buf[7]

=

dis_code[sec

%

10]

//

秒个位

}

void

inc_min()

{

min++

if(min

>

59)

{

min

=

0

inc_hour()

}

dis_buf[3]

=

dis_code[min

/

10]

//

分十位

dis_buf[4]

=

dis_code[min

%

10]

//

分个位

}

void

inc_hour()

{

hour++

if(hour

>

23)

{

hour

=

0

}

if(hour

>

9)

dis_buf[0]

=

dis_code[hour

/

10]

//

时十位

else

dis_buf[0]

=

0xff

//

当小时的十位为0时不显示

dis_buf[1]

=

dis_code[hour

%

10]

//

时个位

}

void

delayms(unsigned

char

ms)

//

延时子程序

{

unsigned

char

i

while(ms--)

{

for(i

=

0

i

<

120

i++)

}

}


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

原文地址:https://54852.com/yw/11267888.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存