新年将至,研究所的其他同学已经到家了,作为外省的我还留在学校。父母在家倍是思念,因此,我也即将离去。寒假决定学习单片机,现在还在路上,回家后就不能像在所里面软硬件结合的学习了,除了看书还是看书,于是回家之际,结合郭天祥的单片机实验开发板,我自己设计了一个很简单的数字电子钟的C语言程序,以激励自己不断地学习单片机。
本程序采用数码管动态显示的方式,7段数码管分时选用,采用定时中断操作。其中定时器0作为秒的计时,定时器1作为数码管的扫描时间的定时,简单实现时间的按秒显示,在运行24个小时后,启动扬声器作为一个循环的信号,然后Keil 编译,烧写入单片机,实现程序的运行,源程序如下:
#include<reg52.h>
#define uint unsigned int
#define ucr unsigned char
sbit d1=P2^3;//扬声器的控制端
sbit d2=P2^6;
sbit d3=P2^7;
ucr code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
ucr shishi,shige,fenshi,fenge,miaoshi,miaoge;aa,bb;
unsigned long temp;
void innit(void);
void delay(uint);
void display(ucr,ucr,ucr,ucr,ucr,ucr);
unsigned long jiance(ucr,ucr,ucr,ucr,ucr,ucr);
void main()
{
innit();
while(1)
{
while(bb>=5);//不断地进行扫描
{
if(aa==20);//1秒定时到时
{
d1=1;
aa=0;
temp++;// 显示的数字加1
}
else //不断地进行扫描显示
{
bb=0;
shishi=temp/100000;
shige=temp%100000/10000;
fenshi=temp%10000/1000;
fenge=temp%1000/100;
miaoshi=temp%100/10;
miaoge=temp%10;
jiance(shishi,shige,fenshi,fenge,miaoshi,miaoge);
}
}
}
}
void innit() //初始化程序
{
d2=0;
d3=0;
temp=0;
TMOD=0x21;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TL1=200;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
}
void timer1() interrupt 3
{
TL1=220;
bb++;
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
unsigned long jiance(ucr shishi,ucr shige,ucr fenshi,ucr fenge,ucr miaoshi,ucr miaoge)//时间和十进制的转换
{
if(miaoshi==6)
{
miaoshi=0;
fenge++;
}
else if(fenshi==6)
{
fenshi=0;
shige++;
}
else if(shishi==2&&shige==4)
{
shishi=0;
shige=0;
fenge=0;
fenshi=0;
miaoshi=0;
miaoge=0;
d1=0; //当时间是凌晨00时扬声器鸣一次
}
display(shishi,shige,fenshi,fenge,miaoshi,miaoge);
temp=shishi*100000+shige*10000+fenshi*1000+fenge*100+miaoshi*10+miaoge;
return (temp);
}
void display(ucr shishi,ucr shige,ucr fenshi,ucr fenge,ucr miaoshi,ucr miaoge)//显示时间
{
d2=1;
P0=table[shishi];
d2=0;
d3=1;
P0=0xfe;
d3=0;
delay(1);
d2=1;
P0=table[shige];
d2=0;
d3=1;
P0=0xfd;
d3=0;
delay(1);
d2=1;
P0=table[fenshi];
d2=0;
d3=1;
P0=0xfb;
d3=0;
delay(1);
d2=1;
P0=table[fenge];
d2=0;
d3=1;
P0=0xf7;
d3=0;
delay(1);
d2=1;
P0=table[miaoshi];
d2=0;
d3=1;
P0=0xef;
d3=0;
delay(1);
d2=1;
P0=table[miaoge];
d2=0;
d3=1;
P0=0xdf;
d3=0;
delay(1);
}
小贝,记于2009年自动化研究所最后一晚(农历)
2010年2月7日