设计一个基于51单片机的电子小时钟
基础知识:
1.利用38译码器来控制哪一个数码管显示
管脚如下
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
2.P0口显示数码管的数字
3.用中断来控制时间每一秒增加一个数字
void Tim0() interrupt 1
{
TH0=0xfc;
TL0=0x66;
n++;
if(n==1000)
{
n=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
}
}
}
}
代码如下:
#include <reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
u16 shi=0; //时
u16 fen=0; //分
u16 miao=0; //秒
u16 n=0; //计数
//u16 date[6]={0,0,0,0,0,0};//定义一个有6个地址的数组,分别存时,分,秒的个位和十位
void delay(u8 i)
{
while(i--);
}
void display()
{
u8 i;
for(i=0;i<6;i++)
{
switch(i)
{
case 0 :LSA=1;LSB=1;LSC=1;P0=table[shi/10];break; //7
case 1 :LSA=0;LSB=1;LSC=1;P0=table[shi%10];break; //6
case 2 :LSA=0;LSB=0;LSC=1;P0=table[fen/10];break; //4
case 3 :LSA=1;LSB=1;LSC=0;P0=table[fen%10];break; //3
case 4 :LSA=1;LSB=0;LSC=0;P0=table[miao/10];break; //1
case 5 :LSA=0;LSB=0;LSC=0;P0=table[miao%10];break; //0
}
}
delay(100);
P0=0x00;
}
void Tim0() interrupt 1
{
TH0=0xfc;
TL0=0x66;
n++;
if(n==1000)
{
n=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
}
}
}
}
void main()
{
TMOD |= 0x01;
TH0 = 0xfc;
TL0 = 0x66;
ET0 = 1;
EA = 1;
TR0 = 1;
while(1)
{
display();
}
}
效果如下: