目录
摘要………………………………………………………………1
一、课设任务…………………………………………………2
二、实现方法………………………………………………2
三、新加功能及其实现…………………………………………2
四、系统框图………………………………………………….2
五、调试中遇到的问题及解决方法……………………3
六、程序设计内容……………………………………...7
七、程序……………………………………………………...7
八、程序框图………………………………………………9
九、总结………………………………………………..10
附录 I 元件清单……………………………………11
附录 II 原理图………………………………………12
附录 II PCB 及参考文献…………………………..13
0
摘要
课设题目:设计制作一个 00 到 99 秒的秒表
要求:
1)利用单片机设计实现一个 2 位 LED 数码显示“秒表”;
2)显示时间为 00-99,每秒自动加一 ;
3)要具有开始,复位和暂停功能。
本课设是实现 00 到 99 秒的计数,要求用单片机实现。则包含硬件和软
件的设计。硬件部分包含所学单片机原理等课程的知识,软件部分包含单片
机原理和 C 语言或者汇编语言编程等课程知识。本课设主要目的是检查学生
对所学知识的掌握情况和对学生动手能力情况的检验。所以这个课设对提高
学生动手实践能力和对所学知识的巩固提高很有帮助。
计数器可用 AT89c52 单片机及其外围电路驱动两位数码管显示数据实
现。数据的产生和计数这通过程序控制单片机的输出来达到控制数码管显示
的效果,从而实现数据的计数和输出。开始,复位和暂停功能则通过单片机
扫描按键来实现通过开关来控制。
本课设的计数器通过较简单的硬件电路和程序编程来实现提高学生动手
能力和理论知识应用于实际的能力,并提起学生对硬件制作和编程的兴趣和
能力。对学生的个人能力的提高具有重大意义。
1
一、课设任务:
题目:设计制作一个 00 到 99 秒的秒表
要求:1)利用单片机设计实现一个 2 位 LED 数码显示“秒表”;
2)显示时间为 00-99,每秒自动加一 ;
3)要具有开始,复位和暂停功能。
二、实现方法
用 AT98C51 单片机做一个最小系统板,计数器的复位功能通过单片机的
硬件复位来实现。秒表的显示用两位数码管显示,秒表的秒计数和循环通过
程序控制单片机的输出来显示在数码管上。秒表的复位和暂停通过开关控制
P2-0 口的高低电平来实现开始和暂停,P2-0 为高电平时是暂停,低电平时为
开始。
三、新加功能及其实现:
秒表的顺计时功能较简单,故使其加上到计时功能,计时最大计时时间
为 99 到 00 秒。其中,顺计时实现的功能有:从 00 到 99 秒计数,而且能从倒计
时跳到顺计时时的倒计时值开始进行顺计时。倒计时实现的功能有:从 99 到 00
秒计数,而且能从顺计时跳到倒计时时的顺计时值开始进行倒计时。
通过一个开关控制 p2-1 口的底高电平实现秒表的顺、倒计时功能,低电平为
顺计时,高电平为倒计时。
四、系统框图
2
单
片
机
系
统
数
码
管
显
示
开始、暂停、倒计时、顺计时、复位
按键系统
1、单片机最小系统板及程序下载端口
主要实现单片机的正常工作及下载程序。通过程序控制单片机端口的
不同电平输出和扫描端口的不同电平输入来控制数码管的显示。是秒表的
计数、循环、暂停、开始、复位等功能的控制所在。
2、硬件复位控制按钮
3
P
1
7
P
1
6
r
e
s
V
C
C
P
1
5
1
2
3
4
5
6
7
8
9
1
0
P
2
H
e
a
d
e
r
5
X
2
通过按键开关的断开与接通来给单片机复位端口提供不同的电平,但
输入高电平时,单片机实现硬件复位功能。当没有信号输入时,单片机照
常工作。这个按钮是实现秒表的复位功能要求。
3、开关控制开始、暂停、顺计时、倒计时
开关有两个,连接 p2-0 口的开关是实现开始、暂停功能,开关接通(低
电平)时为开始功能,开关断开(高电平)时为暂停功能,暂停是通过程
序的无限延时来实现。连接 P2-1 口的开关实现顺计时、倒计时功能,开
关接通(低电平)时为顺计时功能,开关断开(高电平)时为倒计时功能。
4、数码管显示
4
3
0
p
F
3
.
3
k
R
3
R
e
s
3
S
4
S
W
-
P
B
V
C
C
r
e
s
1
K
R
?
R
e
s
2
1
0
0
p
F
C
3
C
a
p
P
o
l
1
P
1
P
2
1
2
4
3
S
1
S
W
D
I
P
-
2
数码管用两位一体共阳数码管使用的是动态扫描的方法显示作为秒表
的显示。P0 口控制数码管的显示数值 P2.6 为高电平时选通个位的数码管
亮;P2.7 为高电平时选通个位的数码管亮。P2.6 和 P2.7 为低电平时数码
管不亮,切 P2.6 和 P2.7 电平相反。数码管的高电平输入端加 PNP 三极管
放大后能使数码管达到足够的亮度。
5、单片与各个电路的链接情况
5
P
9
g
1
D
P
2
a
3
f
4
e
7
b
9
d
6
c
8
D
I
G
1
D
I
G
2
A
1
1
0
A
2
5
D
S
?
H
D
S
M
-
5
7
7
G
P
1
0
D
S
1
D
S
2
D
S
3
D
S
4
D
S
5
D
S
6
D
S
7
D
S
1
D
S
2
D
S
3
D
S
4
D
S
5
D
S
6
D
S
7
1
2
3
4
5
6
7
8
9
P
9
H
e
a
d
e
r
9
H
Q
1
I
G
B
T
-
P
Q
2
I
G
B
T
-
P
1
K
R
6
R
e
s
1
1
K
R
7
R
e
s
1
3
1
3
1
P
1
.
0
/
T
2
1
P
1
.
1
/
T
2
E
X
2
P
1
.
2
3
P
1
.
3
4
P
1
.
4
5
P
1
.
5
6
P
1
.
6
7
P
1
.
7
8
R
S
T
9
P
3
.
0
/
R
x
D
1
0
P
3
.
1
/
T
x
D
1
1
P
3
.
2
/
I
N
T
0
1
2
P
3
.
3
/
I
N
T
1
1
3
P
3
.
4
/
T
0
1
4
P
3
.
5
/
T
1
1
5
P
3
.
6
/
W
R
1
6
P
3
.
7
/
R
D
1
7
X
T
A
L
2
1
8
X
T
A
L
1
1
9
V
S
S
2
0
P
2
.
0
/
A
8
2
1
P
2
.
1
/
A
9
2
2
P
2
.
2
/
A
1
0
2
3
P
2
.
3
/
A
1
1
2
4
P
2
.
4
/
A
1
2
2
5
P
2
.
5
/
A
1
3
2
6
P
2
.
6
/
A
1
4
2
7
P
2
.
7
/
A
1
5
2
8
P
S
E
N
2
9
A
L
E
3
0
E
A
/
V
P
P
3
1
P
0
.
7
/
A
D
7
3
2
P
0
.
6
/
A
D
6
3
3
P
0
.
5
/
A
D
5
3
4
P
0
.
4
/
A
D
4
3
5
P
0
.
3
/
A
D
3
3
6
P
0
.
2
/
A
D
2
3
7
P
0
.
1
/
A
D
1
3
8
P
0
.
0
/
A
D
0
3
9
V
C
C
4
0
U
1
P
8
0
C
3
1
S
B
P
N
1
2
Y
1
X
T
A
L
3
0
p
F
C
2
C
a
p
r
e
s
3
0
p
F
C
1
C
a
p
P
1
P
2
P
3
P
4
P
5
P
6
D
S
1
D
S
2
D
S
3
D
S
4
D
S
5
D
S
6
D
S
7
D
S
8
P
9
P
1
0
P
1
7
P
1
6
P
1
5
3
1
单片机晶振的作用是为系统提供基本的时钟信号。通常一个系统共用一个晶振,便于各部
分保持同步。有些通讯系统的基频和射频使用不同的晶振,而通过电子调整频率的方法保持
同步。
C1、C2 叫负载电容。一般单片机的晶振工作于并联谐振状态,也可以理解为谐
振电容的一部分。它是根据晶振厂家提供的晶振要求负载电容选值的,换句话说,
晶振的频率就是在它提供的负载电容下测得的,能最大限度的保证频率值的误
差。也能保证温漂等误差。两个电容的取值都是相同的,或者说相差不大,如果
相差太大,容易造成谐振的不平衡,容易造成停振或者干脆不起振
五、调试中遇到的问题及解决方法
硬件电路在做板前进行了仿真验证,故电路原理图部分没有问题,制作出来的电
路板也没有问题。主要遇到问题的是在烧入程序后数码管显示的数字跟预期的有
差别,不能正常显示 0 到 9 的数字,但数码管每个灯都能亮;故推断出是程序
数组部分出错。解决办法为:
编辑一个程序,分别输出 P0.0、P0.1、P0.2、P0.3、P0.4、P0.5、P0.6
P2=0xff;而且每个端口输出延时 5 秒;则判断出数码管与 P0 口的对应输
出情况为:P0={ 0x82,0xd7,0xa4,0x85,0xd1,0x89,0x88,0xc7,0x80,0x81}。
六、程序设计内容
(1)单片机对开关的识别的过程处理;
(2)单片机对正确识别的按钮进行计数,顺计数满时,又从零开始计数;倒计
时满时,又从 99 开始计数。如果是在顺计时(倒计时)跳到倒计时(顺计时),
则从跳转时的数值开始进行倒计时(顺计时)。
(3)单片机对计的数值要进行数码显示,记得的数是十进制数,含有十位和个
位,我们要把十位和个位拆开分别送出这样的十位和个位数值到对应的数码管上
显示。拆开十位和个位我们可以把所记得的数值对 10 求余,即可得到个位数字,
对 10 整除,即可得到十位数字了。
(4)通过查表方式,分别显示出个位和十位数字。
七、程序
6
#include
unsigned char table[]={0x82,0xd7,0xa4,0x85,0xd1,0x89,0x88,0xc7,0x80,0x81};
unsigned char i,j,k;
unsigned int Count;
unsigned int f,m,n,b;
void delay10ms()
{
for(i=0;i<20;i++)
for(j=248;j>0;j--);
}
void miao(int x,int y)
{
//十位的位选
{ P0=table[x];
P2=0x43;
delay10ms();
P2=0x03;
P0=table[y];
P2=0x83;
delay10ms();
P2=0x03; }
}
void zhongduan()
{
while(1)
{
if(P2_0==0) break;
miao(m,f)
;
}
}
void main()
{
while(1)
{ P1=0x00;
Count=0;
f=n=m=0;
m=Count%10;
if(P2_0==0)
{
if(P2_1==0)
{
Count=b;
while(1)
{ if(Count==100) Count=0;
f=Count/10;
m=Count%10;
7