一、实验现象
1.利用开发板设计数字钟,并显示在数码管上。
2.利用开发板设计带按键调整时钟的数字钟。
3.四个按键(S1—小时加 1,S2—小时减 1,S3—分加 1,S4—分减 1。)
二、实验目的
1.掌握数码管显示原理以及程序编写方法
2.理解定时计数器的功能和工作原理
3.掌握定时器中断方式实现定时功能的程序编写方法
三、实验原理
1.为了使 LED 数码管显示不同的数字或符号,需要把某些段的发光二极管点亮,这样就
要为 LED 数码管提供代码,因为这些代码可使 LED 相应的段发光,从而显示不同字型,因此
该代码也称为段码(或称字型码)。 LED 数码管共有 8 个笔画段,因此提供给 LED 数码管的
段码(或字型码)正好是一个字节。在使用中,习惯上是以“a”段对应段码字节的最低位。
各段与字节中各位对应关系见表 1。
2. LED 数码管有静态显示和动态显示两种显示方式。
(1)静态显示
静态显示指无论多少位 LED 数码管,都同时处于显示状态。
(2)动态显示
当显示位数较多,静态显示所需的 I/O 口太多,这时常采用动态显示方式。动态显示
方式是将所有数码管的段码端的相应段并接在一起,由一个 8 位 I/O 口控制,而各位显示位
的公共端分别由相应的 I/O 线控制,称为位选端。
四、实验代码
经过上一篇的学习,想必大家对定时计数器已经有了一定的了解,时钟的设计离不开他,秒针的跳动就是靠他实现的,所有,我们先配置一下定时计数器。
void init()
{
P2=0xff;
P0=0xff;
hour=20;min=56;sec=0;ms=0;
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;
ET0=1;
TR0=1;
}
到这里,只是初步配置了定时计数器,他需要实现什么功能还需要进行下一步的代码编写
void time_init() interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
if(K4==0){
delay(7);
if(K4==1){
mos=0;
if(hour==24){
hour=0;
}
else{hour+=1;}
}
}
display();
if(K5==0){
delay(7);
if(K5==1){
mos=0;
if(min==60){
min=0;
}
else{min+=1;}
}}
display();
if(K1==0){
mos=1;
}
if(K2==0){
mos=0;
}
if(K3==0){
mos=2;
}
switch(mos){
case 0:break;
case 1:ms++;pd();break;
case 2:hour=0;min=0;sec=0;ms=0;break;
}
秒针的跳动利用定时计数器来完成,接下来,我们看一下时和分的实现代码
void pd(){
if(ms==100){
ms=0;
sec++;
if(sec==60)
{
sec=0;
min++;
if(min==60)
{
min=0;
hour++;
if(hour==24){
hour=0;
}
}}}
}
这样,时钟的数据我们已经完成了,那如何让他显示到数码管上呢
void display()
{
uchar i;
if(min==60)
{
min=0;
}
if(hour==24){
hour=0;
}
shu[0]=hour/10;
shu[1]=hour%10;
shu[2]=min/10;
shu[3]=min%10;
shu[4]=sec/10;
shu[5]=sec%10;
shu[6]=ms/10;
shu[7]=ms%10;
for(i=0;i<8;i++){
if(i==1||i==3||i==5){
P2=xs_wei[i];
P0=xs_shud[shu[i]];
}
else{
P2=xs_wei[i];
P0=xs_shu[shu[i]];
}
delay(1);
}
}
这样,我们的主函数调用以下这些函数即可。
五、资源连接