课程设计单片机控制的数字钟.docx
- 文档编号:25383806
- 上传时间:2023-06-07
- 格式:DOCX
- 页数:13
- 大小:278.78KB
课程设计单片机控制的数字钟.docx
《课程设计单片机控制的数字钟.docx》由会员分享,可在线阅读,更多相关《课程设计单片机控制的数字钟.docx(13页珍藏版)》请在冰豆网上搜索。
课程设计单片机控制的数字钟
课程设计--单片机控制的数字钟
单片机课程设计
单片机控制的数字钟
专业:
自动化
班级:
姓名:
学号:
指导老师:
二〇〇七年七月十六日
一、绪论
20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。
忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。
但是,一旦重要事情,一时的耽误可能酿成大祸。
例如,许多火灾都是由于人们一时忘记了关闭煤气或是忘记充电时间。
尤其在医院,每次护士都会给病人作皮试,测试病人是否对药物过敏。
注射后,一般等待5分钟,一旦超时,所作的皮试试验就会无效。
手表当然是一个好的选择,但是,随着接受皮试的人数增加,到底是哪个人的皮试到时间却难以判断。
所以,要制作一个定时系统。
随时提醒这些容易忘记时间的人。
钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。
诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、定时启闭电路、定时开关烘箱、通断动力设备,甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。
因此,研究数字钟及扩大其应用,有着非常现实的意义。
因为是一个初学者,所以本次通过设计一个比较简单的数字钟,来加强对单片机的认识,并通过此次设计学习一些基本的单片机理论知识及其实际应用。
二、设计思路
本设计采用8051单片机直接控制LED数码管显示来实现数字钟(采用12MHz晶振,中断方式采用定时器0方式2,定时250微妙,则循环4000次为1秒),所设计时钟可以随时对时间进行调整(调整采用分别对“时”“分”“秒”进行调整,且互不干扰),调整后按调整的时间往后按秒计时,时间格式采用24小时进制,显示范围为00:
00:
00到23:
59:
59。
三、设计所达到的目标
1)开机时,显示12:
00:
00的时间并开始运行,数字钟采用24小时进制;
2)P0.0/AD0控制“秒”的调整,每按一次加1秒;
3)P0.1/AD1控制“分”的调整,每按一次加1分;
4)P0.2/AD2控制“时”的调整,每按一次加一个小时;
四、程序流程图
五、电路原理图
六、系统板上硬件连线
1)把“单片机系统”区域中的P1.0-P1.7端口用8芯排线连接到“动态数码显示”区域中的A-H端口上,控制显示对应时间值;
2)把“单片机系统:
区域中的P3.0-P3.7端口用8芯排线连接到“动态数码显示”区域中的S1-S8端口上,其中P3.2,P3.5控制显示“:
”,其余六口分别选通显示“秒”、“分”、“时”的显示数码管;
3)把“单片机系统”区域中的P0.0/AD0、P0.1/AD1、P0.2/AD2端口分别用导线连接到“独立式键盘”区域中的SP3、SP2、SP1端口上,键盘另一端接地;
七、相关基本知识
1)数码管工作原理:
共阳极数码管中8个发光二极管的阳极(二极管正端)连接一起。
通常,公共阳极接高电平(一般接电源),其它管脚接段驱动电路输出端。
当某段驱动电路的输入端为低电平时,
该端所连接的字段导通并点亮。
根据发光字段的不同组合可显示出各种数字或字符。
此时,要求段驱动电路能吸收额定的段导通电流,还需根据外接电源及额定段导通电流来确定相应的限流电阻。
共阴极数码管中8个发光二极管的阴极(二极管负端)连接在一起。
通常,共阴极接低电平(一般接地),其它管脚接段驱动电路输出端。
当某段驱动电路的输出端为高电平时,该端所连接的字符导通并点亮,根据发光字段的不同组合可显示出各种数字或字符。
同样,要求段驱动电路能提供额定的段导通电流,还需根据外接电源及额定段导通电流来确定相应的限流电阻。
(a)外型结构(b)共阴极(c)共阳极
图1.1数码管结构图
2)独立式按键识别过程:
本设计使用独立按键扫描低电平有效,但是可能有抖动现象,所以要用软件延时的方法来消除抖动的影响,使每一次按键均有效;
3)“时”,“分”,“秒”数据送出显示处理方法:
要使数码管显示出相应的数字或字符,必须使段数据口输出相应的字码编码。
对照图1.1(a),字型码各位定义如表1.1
表1.1数码管各段与输出口各位的对应关系
输出口各位
D7
D6
D5
D4
D3
D2
D1
D0
数码管各段
Dp
g
F
e
d
c
b
a
如使用共阳极数码管,数据为0表示对应字段亮,数据为1表示对应字段暗;如使用共阴极数码管,数据为0表示对应字段暗,数据为1表示对应字段亮。
如要显示“0”,共阳极数码管的字型编码应为:
11000000B(即C0H);共阴极数码管的字型编码应为:
00111111B(3FH)。
依次类推,可求得数码管字型编码如表1.2所示。
时分秒的显示都采用除十取整和除十取余的方法来控制显示十位和个位数字。
表1.2数码管字型编码表
显示
字符
字型
共阳极
共阴极
dp
g
F
e
D
c
b
a
字型码
dp
g
f
e
d
c
b
a
字型码
0
0
1
1
0
0
0
0
0
0
C0H
0
0
1
1
1
1
1
1
3FH
1
1
1
1
1
1
1
0
0
1
F9H
0
0
0
0
0
1
1
0
06H
2
2
1
0
1
0
0
1
0
0
A4H
0
1
0
1
1
0
1
1
5BH
3
3
1
0
1
1
0
0
0
0
B0H
0
1
0
0
1
1
1
1
4FH
4
4
1
0
0
1
1
0
0
1
99H
0
1
1
0
0
1
1
0
66H
5
5
1
0
0
1
0
0
1
0
92H
0
1
1
0
1
1
0
1
6DH
6
6
1
0
0
0
0
0
1
0
82H
0
1
1
1
1
1
0
1
7DH
7
7
1
1
1
1
1
0
0
0
F8H
0
0
0
0
0
1
1
1
07H
8
8
1
0
0
0
0
0
0
0
80H
0
1
1
1
1
1
1
1
7FH
9
9
1
0
0
1
0
0
0
0
90H
0
1
1
0
1
1
1
1
6FH
A
A
1
0
0
0
1
0
0
0
88H
0
1
1
1
0
1
1
1
77H
B
B
1
0
0
0
0
0
1
1
83H
0
1
1
1
1
1
0
0
7CH
C
C
1
1
0
0
0
1
1
0
C6H
0
0
1
1
1
0
0
1
39H
D
D
1
0
1
0
0
0
0
1
A1H
0
1
0
1
1
1
1
0
5EH
E
E
1
0
0
0
0
1
1
0
86H
0
1
1
1
1
0
0
1
79H
F
F
1
0
0
0
1
1
1
0
8EH
0
1
1
1
0
0
0
1
71H
H
H
1
0
0
0
1
0
0
1
89H
0
1
1
1
0
1
1
0
76H
L
L
1
1
0
0
0
1
1
1
C7H
0
0
1
1
1
0
0
0
38H
P
P
1
0
0
0
1
1
0
0
8CH
0
1
1
1
0
0
1
1
73H
R
R
1
1
0
0
1
1
1
0
CEH
0
0
1
1
0
0
0
1
31H
U
U
1
1
0
0
0
0
0
1
C1H
0
0
1
1
1
1
1
0
3EH
Y
Y
1
0
0
1
0
0
0
1
91H
0
1
1
0
1
1
1
0
6EH
—
—
1
0
1
1
1
1
1
1
BFH
0
1
0
0
0
0
0
0
40H
.
.
0
1
1
1
1
1
1
1
7FH
1
0
0
0
0
0
0
0
80H
熄灭
灭
1
1
1
1
1
1
1
1
FFH
0
0
0
0
0
0
0
0
00H
八、C语言源程序
#include
unsignedcharcodedispcode[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00};
unsignedchardispbitcode[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
unsignedchardispbuf[8]={0,0,16,0,0,16,0,0};
unsignedchardispbitcnt;
unsignedcharsecond;
unsignedcharminute;
unsignedcharhour=12;
unsignedinttcnt;
unsignedcharmstcnt;
unsignedchari,j;
sbitP0_0=P0^0;
sbitP0_1=P0^1;
sbitP0_2=P0^2;
voidmain(void)
{
TMOD=0x02;//定时器0工作方式2
TH0=0x06;//定时250微秒
TL0=0x06;
TR0=1;//定时器0允许中断
ET0=1;
EA=1;//开放总中断
while
(1)
{
if(P0_0==0)
{
for(i=5;i>0;i--)//消抖动
for(j=248;j>0;j--);
if(P0_0==0)
{
second++;
if(second==60)
{
second=0;
}
dispbuf[0]=second%10;
dispbuf[1]=second/10;
while(P0_0==0);
}
}
if(P0_1==0)
{
for(i=5;i>0;i--)//消抖动
for(j=248;j>0;j--);
if(P0_1==0)
{
minute++;
if(minute==60)
{
minute=0;
}
dispbuf[3]=minute%10;
dispbuf[4]=minute/10;
while(P0_1==0);
}
}
if(P0_2==0)
{
for(i=5;i>0;i--)//消抖动
for(j=248;j>0;j--);
if(P0_2==0)
{
hour++;
if(hour==24)
{
hour=0;
}
dispbuf[6]=hour%10;
dispbuf[7]=hour/10;
while(P0_2==0);
}
}
}
}
voidt0(void)interrupt1using0
{
mstcnt++;
if(mstcnt==8)
{
mstcnt=0;
P1=dispcode[dispbuf[dispbitcnt]];
P3=dispbitcode[dispbitcnt];
dispbitcnt++;
if(dispbitcnt==8)
{
dispbitcnt=0;
}
}
tcnt++;
if(tcnt==4000)
{
tcnt=0;
second++;
if(second==60)
{
second=0;
minute++;
if(minute==60)
{
minute=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
dispbuf[0]=second%10;
dispbuf[1]=second/10;
dispbuf[3]=minute%10;
dispbuf[4]=minute/10;
dispbuf[6]=hour%10;
dispbuf[7]=hour/10;
}
}
九、实验总结与心得体会
本实验虽然简单,但仍使我对单片机有了进一步的了解,因为对汇编语言不是很了解,用汇编实现单片机程序的设计对我来说有点困难,以前学习过C语言编程,比较熟悉,又因为C程序比较容易读懂读通,所以程序的设计实现采用了C语言编程,今后还要努力学习单片机知识,学好汇编语言以及C语言,争取开发出比较复杂实用可行的系统。
十、参考文献
A.《8051C语言彻底应用》赖麒文编著科学出版社2002;
B.《MCS——51单片机原理与应用》闫玉德俞红编机械工业出版社2003;
C.《单片机原理及其接口技术》胡汉才北京:
清华大学出版社2000
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 单片机 控制 数字
![提示](https://static.bdocx.com/images/bang_tan.gif)