利用AT89C51单片机设计一个简易电子钟(六位),并通过一个8位LED数码管实现时间显示;该系统可以通过三个按钮实现计时。

编程思路:1。利用单片机内部定时器作为定时器,调用定时器函数;2.设计一套关键子程序;(3)设计一个数码管程序。下面提供一组程序供参考。

# include & ltIOM 16v . h & gt;

# include & ltmacros.h & gt

#定义uchar无符号字符

#定义uint无符号整数

const uchar table[10]= { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f };//0-9对应的字符

const uchar key _ value[16]= { 0,1,2,3,4,5,6,7,8,9,10,112,13,14,15 };

uchar data[4]= { 0 };//显示初始值为0

uint count = 0;?//初始计数值为0

uchar keynum

void port_init()?//端口初始化功能

{ DDRA = 0x ff;//端口A为推挽1输出。

PORTA = 0XFF?

PORTB = 0XFF?//端口B为推挽1输出。

DDRB = 0x ff;

DDRC = 0x ff;?//端口C是不带上拉电阻的输入。

PORTC = 0XFF

DDRD = 0x ff;?//输出端口D的低4位。

PORTD = 0X0F

}

无效延迟(uint j)?//延迟功能

{ uint k;

while(j -)

{ for(k = 1000;k & gt0;k-);}

}

void显示(uchar *p)?//显示功能

{uchar i,sel = 0x 01;

for(I = 0;我& lt4;i++)

{ PORTA = sel?//选通最右边的数码管

PORTB = table[p[I]];//发送字体代码

延时(1);

sel = sel & lt& lt1;//向左移动一个位置

}

}

uchar get_key(void)

{如果((PIND & amp;0X0F)!=0X0F)延迟(3);

{

PORTD = 0XEF

开关(PIND & amp;0X0F)

{ case 0x0e:keynum = key _ value[0];打破;

case 0x0d:keynum = key _ value[4];打破;

case 0x0b:keynum = key _ value[8];打破;

case 0x 07:keynum = key _ value[12];打破;

默认:break

}

PORTD = 0xdf

开关(PIND & amp;0X0F)

{ case 0x0e:keynum = key _ value[1];打破;

case 0x0d:keynum = key _ value[5];打破;

case 0x0b:keynum = key _ value[9];打破;

case 0x 07:keynum = key _ value[13];打破;

默认:break

}

PORTD = 0xbf

开关(PIND & amp;0X0F)

{ case 0x0e:keynum = key _ value[2];打破;

case 0x0d:keynum = key _ value[6];打破;

case 0x0b:keynum = key _ value[10];打破;

case 0x 07:keynum = key _ value[14];打破;

默认:break

}

PORTD = 0x7f

开关(PIND & amp;0X0F)

{ case 0x0e:keynum = key _ value[3];打破;

case 0x0d:keynum = key _ value[7];打破;

case 0x0b:keynum = key _ value[11];打破;

case 0x 07:keynum = key _ value[15];打破;

默认:break

}?

而((PIND & amp;0x0f)!= 0x0f);

}

返回keynum

}

Void process(uint i,uchar *q) //拆分BCD码函数并显示千、百、十、个位。

{ ?q[0]= I/1000;

I = I % 1000;

q[1]= I/100;

I = I % 100;

q[2]= I/10;

I = I % 10;

q[3]= I;

}

无效总管(无效)

{ port _ init();

PORTB = 0xff

PORTA = 0X00

延迟(50);

PORTA = 0xff

while(1)

{ get _ key();

count = keynum

过程(计数、数据);

显示(数据);

}

}