用数码管(8位)显示的数字时钟程序

  • 格式:docx
  • 大小:13.92 KB
  • 文档页数:6

用数码管(8位)显示的数字时钟程序

用数码管(8位)显示的数字时钟,由于是在开发板上写的程序,所以51单片机的一些I/O口设定并不完全一样,以下程序仅供参考

#include

sbit dula=P2^6; //段选锁存器

sbit wela=P2^7; //位选锁存器

sbit key1=P3^2; //INT0 选择键

sbit key2=P3^4; //T0 时间增加

sbit key3=P3^6; //S4 时间减少

char a=0,hour=0,minute=0,seconed=0;

char h1,h2,m1,m2,s1,s2;

char num=0;

char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void delay(char z)

{

char x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

void display_hour(char h) //显示小时

{

h1=h/10;

h2=h%10;

wela=1;

P0=0xfe; //1111 1110

wela=0;

P0=0xff;

dula=1;

P0=table[h1];

dula=0;

delay(5);

wela=1;

P0=0xfd; //1111 1101

wela=0;

P0=0xff;

dula=1;

P0=table[h2]; dula=0;

delay(5);

}

void display_minute(char m) //显示分钟

{

m1=m/10;

m2=m%10;

wela=1;

P0=0xf7; //1111 0111

wela=0;

P0=0xff;

dula=1;

P0=table[m1];

dula=0;

delay(5);

wela=1;

P0=0xef; //1110 1111

wela=0;

P0=0xff;

dula=1;

P0=table[m2];

dula=0;

delay(5);

}

void display_seconed(char s) //显示秒

{

s1=s/10;

s2=s%10;

wela=1;

P0=0xbf; //1011 1111

wela=0;

P0=0xff;

dula=1;

P0=table[s1];

dula=0;

delay(5);

wela=1;

P0=0x7f; //0111 1111 wela=0;

P0=0xff;

dula=1;

P0=table[s2];

dula=0;

delay(5);

}

void init() //初始化函数

{

TMOD=0x01; //定时器0工作方式1

TH0=(65536-45872)/256; //装初值晶振11.0592 50ms为45872

TL0=(65536-45872)%256;

EA=1; //开总中断

ET0=1; //开定时器0中断

TR0=1; //开启定时器0

}

void key() //按键函数,功能为对时间进行调整

{

if(key1==0) //key1键按下进入选择并停止定时器

{

delay(10);

while(!key1); //松手检测

TR0=0;

num++; //没按一次key1 num自加1

}

if(num==1) //key1按一次进行“小时”调整

{

if(key2==0) //key2按下时间增加

{

delay(10);

while(!key2);

hour++;

if(hour==24)

hour=0;

}

if(key3==0) //key3按下时间减少

{

delay(10); while(!key3);

hour--;

if(hour<0)

hour=23;

}

}

if(num==2) //按下key1两次进行“分钟调整”

{

if(key2==0)

{

delay(10);

while(!key2);

minute++;

if(minute==60)

minute=0;

}

if(key3==0)

{

delay(10);

while(!key3);

minute--;

if(minute<0)

minute=59;

}

}

if(num==3) //key1按下三次对“秒”进行调节

{

if(key2==0)

{

delay(10);

while(!key2);

seconed++;

if(seconed==60)

seconed=0;

}

if(key3==0)

{

delay(10); while(!key3);

seconed--;

if(seconed<0)

seconed=59;

}

}

if(num==4) //key1按下四次认为调节完毕开启定时器并将num清0

{

num=0;

TR0=1;

}

}

void main()

{

init();

while(1)

{

display_seconed(seconed); //显示“秒,分,时”

display_minute(minute);

display_hour(hour);

if(a==20) //判断定时器是否到1s

{

a=0;

seconed++;

if(seconed>59)

{

seconed=0;

minute++;

if(minute>59)

{

minute=0;

hour++;

if(hour>23)

{

hour=0;

}

}

} }

key();

}

}

void time() interrupt 1

{

TH0=(65536-45872)/256;

TL0=(65536-45872)%256;

a++;

}