本章的内容就是上一章结束后留给大家的思考题,使用单片机定时器制作一个以00-00-00模式显示,可以通过四个独立按键进行时间修改的24小时制时钟。
在前面几张已经为大家介绍了定时器、中断、数码管、按键等功能的使用方法,本章我们就将使用这些工能制作一个简易的可调实时时钟,自己写不出可以抄代码,但是不要用复制粘贴的方式去完成程序,这是在为自己学习,在位比赛做准备,比赛的时候没有例程让你复制。
示例程序:
#include "stc15f2k60s2.h"
#define uchar unsigned char
#define uint unsigned
sbit key1=P3^0;
//定义端口参数
sbit key2=P3^1;
sbit key3=P3^2;
sbit key4=P3^3;
/*
key1用于小时 +1
key2用于小时 -1
key3用于分钟 +1
key4用于分钟 -1
*/
int
uchar code tab[] =
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0xbf,0x7f};
uchar strtab[8];
//定义缓冲区域
uchar hour = 10, minute = 25, second = 12;
//初始化起始时间10-25-12
void
display(
void
);
void
delayms(
int
ms);
void
Timer0Init(
void
);
void
Timer1Init(
void
);
void
main()
{
P2 = ((P2&0x1f)|0xa0);
P0 = 0x00;
Timer0Init();
Timer1Init();
ET0 = 1;
//开启定时器0
ET1 = 1;
//同上
EA = 1;
//定时器使能
display();
while
(1)
{
if
(!key1)
{
delayms(5);
//按键消抖
if
(!key1)
{
hour++;
if
(hour == 24)
hour = 0;
display();
while
(!key1);
//松手检测
}
}
//其余三个按键功能请自行编写,如遇问题请下载参考源程序
}
}
void
display(
void
)
{
strtab[0] = tab[hour / 10];
strtab[1] = tab[hour % 10];
strtab[2] = tab[10];
strtab[3] = tab[minute % 10];
strtab[4] = tab[minute % 10];
strtab[5] = tab[10];
strtab[6] = tab[second / 10];
strtab[7] = tab[second % 10];
}
void
delayms(
int
ms)
{
int
i,j;
for
(i=ms;i > 0;i--)
for
(j=845;j > 0;j--);
}
void
Timer0Init(
void
)
//5毫秒@11.0592MHz
//内容请自行计算
void
Timer1Init(
void
)
//1毫秒@11.0592MHz
//内容请自行计算
void
Timer1_int() interrupt 3
using
0
{
static
uchar num;
TH1 = 0xcd;
TL1 = 0xd4;
switch
(num)
//分别调用缓冲区的值进行扫描
{
case
0: P2 = ((P2&0x1f)|0xc0); P0 = 0x01;
P2 = ((P2&0x1f)|0xff); P0 = strtab[num];
break
;
case
1: P2 = ((P2&0x1f)|0xc0); P0 = 0x02;
P2 = ((P2&0x1f)|0xff); P0 = strtab[num];
break
;
case
2: P2 = ((P2&0x1f)|0xc0); P0 = 0x04;
P2 = ((P2&0x1f)|0xff); P0 = strtab[num];
break
;
case
3: P2 = ((P2&0x1f)|0xc0); P0 = 0x08;
P2 = ((P2&0x1f)|0xff); P0 = strtab[num];
break
;
case
4: P2 = ((P2&0x1f)|0xc0); P0 = 0x10;
P2 = ((P2&0x1f)|0xff); P0 = strtab[num];
break
;
case
5: P2 = ((P2&0x1f)|0xc0); P0 = 0x20;
P2 = ((P2&0x1f)|0xff); P0 = strtab[num];
break
;
case
6: P2 = ((P2&0x1f)|0xc0); P0 = 0x40;
P2 = ((P2&0x1f)|0xff); P0 = strtab[num];
break
;
case
7: P2 = ((P2&0x1f)|0xc0); P0 = 0x80;
P2 = ((P2&0x1f)|0xff); P0 = strtab[num];
break
;
default
:
break
;
}
num++;
if
(num == 8)
num = 0;
}
void
Timer0_int() interrupt 1
using
1
{
static
uchar count;
//定义内部静态变量
TL0 = 0x00;
//初始化初值
TH0 = 0x28;<
count++;
switch
(count);
{
case
0:
case
40:
case
80:
case
120:
case
160:display();
break
;
}
if
(count == 200)
{
count = 0;
second++;
//加一秒
if
(second == 60)
{
second = 0;
minute++;
//加一分
if
(minute == 60)
{
minute = 0;
hour++;
//加一小时
if
(hour == 24)
hour = 0;
}
}
}
}
本章的内容到这里就结束了,最后给大家留一个题目,可以回去思考,后面有时间也会更新讲解,使用单片机定时器制作一个以00-00-00为初始可以通过四个独立按键进行时间修改的24小时制时钟。
本章资料下载地址:
Bkoak’s blog http://www.bkoak.com
联系博主
邮箱:wjf418224424@aliyun.com
QQ交流群:693211073