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

}

}

}

}

以下是四位数码管可调时带秒闪烁的c51单片机电子钟程序(c语言)。

/**** 本程序中,晶振为12MHz, ****/

/**** 时间控制采用定时中断控制方式。 ****/

/**** 模式和时间调整采用查询方式。 ****/

#include<reg52.h>

sbit P20=P2^0 //分个位控制端

sbit P21=P2^1 //分十位控制端

sbit P22=P2^2 //时个位控制端

sbit P23=P2^3 //时十位控制端

sbit led=P2^7 //second display led

sbit key0=P3^0 //模式设置

sbit key1=P3^1 //加

sbit key2=P3^2 //减

unsigned char hour,min,sec,T50ms

unsigned char modstate //模式状态

unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}//段码

void init() //初始化子程序声明

void delay500us(unsigned char X) //延时子程序声明

void display() //显示子程序声明

void display001() //显示子程序声明

void display002() //显示子程序声明

void keyscan() //按键识别子程序声明

void main()

{

init()

while(1)

{

keyscan()

}

}

void init() //初始化子程序

{

TMOD=0x01

TH0=(65536-49990)/256

TL0=(65536-49990)%256

ET0=1

EA=1

TR0=1

}

void delay500us(unsigned char X)

{

unsigned char i,j

for(i=Xi>0i--)

for(j=248j>0j--)

}

void timer0() interrupt 1 //timer0中断服务子程序,定时时间为50ms,本程序加了10us的时间修正量

{

TMOD=0x01

TH0=(65536-49990)/256

TL0=(65536-49990)%256

T50ms++

if(T50ms>=20)

{

T50ms=0

sec++

if(sec>=60)

{

sec=0

min++

if(min>=60)

{

min=0

hour++

if(hour>=24)hour=0

}

}

}

}

void display()

{

P20=1

P21=1

P22=1

P23=1

P0=table[hour/10]

P23=0

delay500us(5)

P20=1

P21=1

P22=1

P23=1

P0=table[hour%10]

P22=0

delay500us(5)

P20=1

P21=1

P22=1

P23=1

P0=table[min/10]

P21=0

delay500us(5)

P20=1

P21=1

P22=1

P23=1

P0=table[min%10]

P20=0

delay500us(5)

if(T50ms<=10)led=0

if(T50ms>10)led=1

}

void display001()

{

P20=1

P21=1

P22=1

P23=1

P0=table[hour/10]

P23=0

delay500us(10)

P20=1

P21=1

P22=1

P23=1

P0=table[hour%10]

P22=0

delay500us(10)

}

void display002()

{

P20=1

P21=1

P22=1

P23=1

P0=table[min/10]

P21=0

delay500us(10)

P20=1

P21=1

P22=1

P23=1

P0=table[min%10]

P20=0

delay500us(10)

}

void keyscan() //按键识别钟程序

{

while(modstate==0)

{

display()

if(key0==0)

{

display()

if(key0==0)modstate++ //这两句加在一起为延时10ms软件防抖设计。

while(key0==0)display001() //等待按键释放。

}

}

//****************************************************************************//

while(modstate==1)

{

display001()

if(key0==0)

{

display001()

if(key0==0)modstate++ //这两句加在一起为延时10ms软件防抖设计。

while(key0==0)display002() //等待按键释放。

}

if(key1==0)

{

display001()

if(key1==0)

{

hour++

if(hour>=24)hour=0

while(key1==0)display001()

}

}

if(key2==0)

{

display001()

if(key2==0)

{

hour--

if(hour>=24)hour=0

while(key2==0)display001()

}

}

}

//****************************************************************************//

while(modstate==2)

{

display002()

if(key0==0)

{

display002()

if(key0==0)modstate=0 //这两句加在一起为延时10ms软件防抖设计。

while(key0==0)display() //等待按键释放。

}

if(key1==0)

{

display002()

if(key1==0)

{

min++

if(min>=60)min=0

while(key1==0)display002()

}

}

if(key2==0)

{

display002()

if(key2==0)

{

min--

if(min>=60)min=0

while(key2==0)display002()

}

}

}

}


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

原文地址: https://outofmemory.cn/yw/7822585.html

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

发表评论

登录后才能评论

评论列表(0条)

保存