51单片机设计数码管显示时钟的程序怎么写

51单片机设计数码管显示时钟的程序怎么写,第1张

#include<reg51.h>

#define uchar unsigned char

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

unsigned char sec=0,min=0,hour=12,scanled

unsigned char key,flashbit,mode,time 

unsigned char disdat[8]

sbit led=P1^0

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]=10

disdat[3]=min%10

disdat[4]=min/10

disdat[5]=10

disdat[6]=hour%10

disdat[7]=hour/10

}

void flash()

{

switch(flashbit)

{

case 0:break

case 1:

disdat[6]=0x10

disdat[7]=0x10

delay(50)

dischg()

delay(80)

break

case 2:

disdat[3]=0x10

disdat[4]=0x10

delay(50)

dischg()

delay(80)

break

case 3:

disdat[0]=0x10

disdat[1]=0x10

delay(50)

dischg()

delay(80)

break

default:break

}

}

void t0isr() interrupt 1 //秒计时

{

TH0=0x3c

TL0=0xb0

time++

switch(mode)

{

case 0:

if(time==20)

{

time=0

sec++

if(sec>59)

{

sec=0

min++

if(min>59)

{

min=0

hour++

if(hour>23)hour=0

}

}

}

break

case 1:

if(time==20)

{

time=0

if(sec>0)sec--

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

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

else {hour=0min=0sec=0}

}

break

}

dischg()

}

void t1isr() interrupt 3 //显示

{

TH1=0xec

TL1=0x78

switch(scanled)

{

case 0:

P2=0x01

P0=~ledtab[disdat[7]]

break

case 1:

P2=0x02

P0=~ledtab[disdat[6]]

break

case 2:

P2=0x04

P0=~ledtab[disdat[5]]

break

case 3:

P2=0x08

P0=~ledtab[disdat[4]]

break

case 4:

P2=0x10

P0=~ledtab[disdat[3]]

break

case 5:

P2=0x20

P0=~ledtab[disdat[2]]

break

case 6:

P2=0x40

P0=~ledtab[disdat[1]]

break

case 7:

P2=0x80

P0=~ledtab[disdat[0]]

break

default:break

}

scanled++

scanled%=8

}

main()

{

TMOD=0x11

TH0=0x3c

TL0=0xb0

TH1=0xec

TL1=0x78

TR1=1

TR0=1

ET0=1

ET1=1

EA=1

sec=55

min=59

hour=23

flashbit=0

scanled=0

time=0

mode=0

dischg()

while(1)

{

flash()//闪烁

if((P3&0x0f)!=0x0f){

key=P3&0x0f

while((P3&0x0f)!=0x0f)

led=0

delay(10)

key|=0xf0

switch(~key)

{

case 0x01: //p3.1选择调时、分、秒

TR0=0

flashbit+=1

if(flashbit>3){flashbit=0TR0=1}

break

case 0x02: //p3.2调数

if(flashbit==0)break

if(flashbit==1)

{

hour++

if(hour>99)hour=0

}

if(flashbit==2)

{

min++

if(min>59)min=0

}

if(flashbit==3)

{

sec++

if(sec>59)sec=0

}

break

case 0x04:  //选择正/倒

TR0=0

mode++

mode&=0x01

if(mode==0){sec=0min=0hour=0}

dischg()

break

case 0x08: //启动/暂停

TR0=~TR0

break

default:break

}

}

}

}

简易电子时钟,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++)

}

}

#include "reg52.h"

#define uint unsigned int

#define uchar unsigned char

uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}

uchar shi,fen,miao

uchar time

void delay(uint x)

{

uint y

for(x>0x--)

{

for(y=0y<124y++)

}

}

void display(uchar shi,uchar fen,uchar miao)

{

P2=0 //位码

P0=(tab[shi/10]) //段码

delay(2)

P2=1

P0=(tab[shi%10])

delay(2)

P2=2 //位码

P0=0x40 //段码

delay(2)

P2=3 //位码

P0=(tab[fen/10]) //段码

delay(2)

P2=4

P0=(tab[fen%10])

delay(2)

P2=5 //位码

P0=0x40 //段码

delay(2)

P2=6 //位码

P0=(tab[miao/10]) //段码

delay(2)

P2=7

P0=(tab[miao%10])

delay(2)

}

void main()

{

TMOD=0x01

TH0=(65536-50000)/256

TL0=(65536-50000)%256

EA=1

ET0=1

TR0=1

while(1)

{

if(time==20)

{

time=0

miao++

if(miao==60)

{

miao=0

fen++

if(fen==60)

{

fen=0

shi++

if(shi==24)

shi=0

}

}

}

display(shi,fen,miao)

}

}

void timer0() interrupt 1

{

TH0=(65536-50000)/256

TL0=(65536-50000)%256

time++

}

/*还有什么不明白继续追加*/


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存