基于STC89C52便携式多功能数字钟的设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
重庆三峡学院
电子课程设计
基于S T C89C52便携式多功能数字钟的设计
姓名: 唐川
学号:200907014227
班级:09级电信2班
院系:电子与信息工程学院
课程老师:谢小维
~~~~~~目录~~~~~~
一、概述 (3)
二、基本功能介绍 (3)
三、系统电路图 (3)
四、各功能模块简介 (4)
1、主控模块 (4)
2、D S1302时钟模块 (5)
3、D S18B20温度控制模块 (6)
4、L E D数码管显示模块 (6)
5、发光二极管模块 (8)
6、蜂鸣器电路 (8)
五、实物图及详细功能介绍 (9)
六、课程设计心得体会 (11)
附录:部分程序清单 (11)
一、概述
本次设计采用S T C89C52单片机作为主控制模块,单片机可把由D S18B20、D S1302中的数据利用软件来进行处理,进而把数据传输到L E D数码管显示模块,实现温度、日历的显示。
此次设计主要依靠按键来实现各种显示要求的选择与切换以及时间的调整,以L E D 数码管为显示模块,把单片机传来的的数据显示出来,并且显示多样化。
此外,还加入了L E D发光二极管组成花样流水灯,使这次设计更加具有观赏性,适合用来作为便携式时钟。
二、基本功能介绍
①具有年、月、日、星期、时、分、秒等功能;
②时间与日历能够自动关联;
③具有温度显示功能;
④具备年、月、日、星期、时、分调整功能;
⑤能够显示自己的名(考虑到设计的简洁性本次只显示名不显示姓)
⑥整点报时。
三、、系统电路图
四、各功能模块简介
1、主控模块
S T C89C52单片机作为主控制模块,它是一种带8K字节闪烁可编程可檫除只读存储器(F P E R O M-F l a s h P r o g r a m a b l e a n d E r a s a b l e R e a d O n l y M e m o r y)的低电压,高性能C O M O S8的微处理器。
掉电保护情况下,R A M内容被保存,不用担心重新下载程序。
详细资料可查询相关网站,其引脚及基本电路图1所示:
图1
2、D S1302时钟模块
D S1302是美国D A L L A S公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态R A M,采用S P I三线接口与C P U进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和R A M数据。
实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。
工作电压宽达2.5-5.5V采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力。
D S1302的外部引脚分配如图2(a)所示。
图中:V c c l:主电源;V c c2:备份电源。
当V c c2>V c c1+0.2V时,由V c c2向D S1302供电,当V c c2<V c c l时,由V c c1向D S1302供电。
S C L K:串行时钟,输入,控制数据的输入与输出。
I/0:三线接口时的双向数据线。
C E:输入信号,在读、写数据期间,必须为高。
该引脚有两个功能:第一,C E开始控制字访问移位寄存器的控制逻辑;其次,C E提供结束单字节或多字节数据传输的方法。
其基本连线如图2(b)所示。
图2(a) 图2(b)
3、D S18B20温度控制模块
如图3(a),D S18B20数字温度计以9位数字量的形式反映器件的温度值。
D S18B20通过一个单线接口发送或接收信息,因此在中央微处理器和D S18B20之间仅需一条连接线(加上地线)。
用于读写和温度转换的电源可以从数据线本身获得,无需外部电源。
因为每个D S18B20都有一个独特的片序列号,所以多只D S B1820可以同时连在一根单线总线上,这样就可以把温度传感器放在许多不同的地方,非常方便,其基本连线如图3(b)。
图3(a) 图3(b)
4、L E D数码管显示模块
L E D数码管的主要特点:能在低电压、小电流条件下驱动发光,并能与C M O S、T T L电路兼容;它不仅发光响应时间极短(<0.1μs)、高频特性好、单色性好、亮度高,而且体积小、重量轻、抗冲击性能好、使用寿命长(一般在10万小时以上,最高可达 100万小时)、成本低。
因此本次设计选它做为显示模块而不是选L C D液晶屏。
本次采用的是共
阴的8段数码管,考虑到端口问题,采用74H C595做为段控制,74L S138译码器做为位选控制,采用动态扫描,利用人眼的滞留效应显示时间,此外还加了限流电阻,同时,为了使实物更加小巧、方便,就只显示时间和温度,其它功能通过按键显示。
图4数码管引脚及内部框图
图5数码管连接图
5、发光二极管模块
采用16个3m m黄色发光二极管,为了节约端口,以及设计的简洁性,单片机的一个I/O口控制两个二极管,二极管的导通电流10m A左右,因此需要加限流电阻300欧姆左右即可,本次选的是330欧姆。
如图6所示:
图6发光二极管连接电路
6、蜂鸣器电路
图7蜂鸣器电路
五、实物图及详细功能介绍
由于数码管的P C B 布线相当复杂,故采用的万能版手工布局,最终产品如图8。
考虑到美观,将其装在一个手机盒子里面,如图9。
图8 图9 左侧视图
具体效果图如下面几幅图。
图10待机状态下显示图
图11按上键时显示年月日和星期 图12发光二极管点亮效果图 由于整点报时的效果无法展示出来,故省略了。
六、课程设计心得体会
经过一个周末的奋战,终于完成了这次实物的制作。
当然软件部分写的程序是以前慢慢积累下来的成果,最终经过一点点的组装,就集成了这些功能。
由于没有用雕刻机雕刻电路板,所以焊接起来就有了一定的难度,毕竟数码管多了之后导线就相当的复杂,稍不注意就会连错,一旦连错最后来检查的时候就难了,因此就要求我必须很仔细很仔细,最好是一次性就连成功。
于是我就一个模块一个模块的连,先确保每个模块都能连对。
最后,和预想的结果一样,时钟正常显示出来了,非常兴奋,总算没有白费付出的汗水。
附录:
其中“r s e t_t i m e.h”包含的是按键调整时间程序,“D s18b02.h”包含温度传感器驱动程序,“y i w e i595.h”
包含的是 74H C595驱动程序,“l i u s h u i d e n g.h”包含的是L E D发光二极管花样变化程序,“d s1302.h”包含的是D S1302驱动程序,以下是详细的主程序:
//原创----川流不息
#i n c l u d e<r e g52.h>
#i n c l u d e"r s e t_t i m e.h"
#i n c l u d e"d s18b02.h"
#i n c l u d e"y i w e i595.h"
#i n c l u d e"l i u s h u i d e n g.h"
#i n c l u d e"d s1302.h"
#d e f i n e u c h a r u n s i g n e d c h a r
#d e f i n e u i n t u n s i g n e d i n t
s b i t b e e p=P2^5;
u i n t a a;
u c h a r n u m1,f l a g1,f l a g2,t e m p e r a t u r e=0;//温度值
u c h a r d[11]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
0x00};
v o i d s h o w(u c h a r s h i,u c h a r f e n,u c h a r m i a o)//数码管显示时间及温度
{
//显示温度
a=0;
b=1;
c=1;//数码管位选择
d u a n=d[t
e m p e r a t u r e/10];
i n p u t_595();
o u t p u t_595();
d e l a y(1);
//消除阴影
d u a n=d[10];//数码管显示
i n p u t_595();
o u t p u t_595();
a=1;
b=1;
c=1;//数码管位选择
d u a n=d[t
e m p e r a t u r e%10];
i n p u t_595();
o u t p u t_595();
d e l a y(1);
d u a n=d[10];//数码管显示
i n p u t_595();
o u t p u t_595();
//显示时间
a=0;
b=0;
c=0;//数码管位选择
d u a n=d[s h i/10];//数码管显示
i n p u t_595();
o u t p u t_595();
d e l a y(1);
//消除阴影
d u a n=d[10];//数码管显示
i n p u t_595();
o u t p u t_595();
a=1;
b=0;
c=0;//数码管位选择
d u a n=d[s h i%10];//数码管显示
i n p u t_595();
o u t p u t_595();
d e l a y(1);
d u a n=d[10];//数码管显示
i n p u t_595();
o u t p u t_595();
a=0;
b=1;
c=0;//数码管位选择
d u a n=d[f
e n/10];//数码管显示
o u t p u t_595();
d e l a y(1);
d u a n=d[10];//数码管显示
i n p u t_595();
o u t p u t_595();
a=1;
b=1;
c=0;//数码管位选择
d u a n=d[f
e n%10];//数码管显示
i n p u t_595();
o u t p u t_595();
d e l a y(1);
d u a n=d[10];//数码管显示
i n p u t_595();
o u t p u t_595();
a=0;
b=0;
c=1;//数码管位选择
d u a n=d[m i a o/10];//数码管显示
i n p u t_595();
o u t p u t_595();
d e l a y(1);
d u a n=d[10];//数码管显示
i n p u t_595();
o u t p u t_595();
a=1;
b=0;
c=1;//数码管位选择
d u a n=d[m i a o%10];//数码管显示
i n p u t_595();
o u t p u t_595();
d e l a y(1);
d u a n=d[10];//数码管显示
i n p u t_595();
o u t p u t_595();
}
v o i d s h o w1(u c h a r n i a n,u c h a r y u e,u c h a r r i,u c h a r x i n g q i)//数码管显示时间及温度 {
d u a n=d[10];//数码管显示
o u t p u t_595();
//显示时间
a=0;
b=0;
c=0;//数码管位选择
d u a n=d[n i a n/10];//数码管显示
i n p u t_595();
o u t p u t_595();
d e l a y(1);
//消除阴影
d u a n=d[10];//数码管显示
i n p u t_595();
o u t p u t_595();
a=1;
b=0;
c=0;//数码管位选择
d u a n=d[n i a n%10];//数码管显示
i n p u t_595();
o u t p u t_595();
d e l a y(1);
d u a n=d[10];//数码管显示
i n p u t_595();
o u t p u t_595();
a=0;
b=1;
c=0;//数码管位选择
d u a n=d[y u e/10];//数码管显示
i n p u t_595();
o u t p u t_595();
d e l a y(1);
d u a n=d[10];//数码管显示
i n p u t_595();
o u t p u t_595();
a=1;
b=1;
c=0;//数码管位选择
d u a n=d[y u e%10];//数码管显示
i n p u t_595();
o u t p u t_595();
d e l a y(1);
d u a n=d[10];//数码管显示
i n p u t_595();
o u t p u t_595();
a=0;
b=0;
c=1;//数码管位选择
d u a n=d[r i/10];//数码管显示
i n p u t_595();
o u t p u t_595();
d e l a y(1);
d u a n=d[10];//数码管显示
i n p u t_595();
o u t p u t_595();
a=1;
b=0;
c=1;//数码管位选择
d u a n=d[r i%10];//数码管显示
i n p u t_595();
o u t p u t_595();
d e l a y(1);
d u a n=d[10];//数码管显示
i n p u t_595();
o u t p u t_595();
//显示x i n g q i
a=1;
b=1;
c=1;//数码管位选择
d u a n=d[x i n g q i];//数码管显示
i n p u t_595();
o u t p u t_595();
d e l a y(1);
d u a n=d[10];//数码管显示
i n p u t_595();
o u t p u t_595();
}
v o i d m a i n()
{
f l a g=0;
f l a g1=0;
f l a g2=0;
n u m=0;
n u m1=0;
w h i l e(1)//无限循环
{
t e m p e r a t u r e=r e a d t e m p e r a t u r e();//读温度
i f(f l a g==0)
g e t_t i m e();//读出时间
r s e t_t i m e();
i f(f l a g2==0)
s h o w(s h i,f e n,m i a o);
//整点报时
i f(f e n==0&&m i a o==0&&n i a n!=0)
{
b e e p=0;
r j l();//渐亮
b e e p=1;
r j a();//渐暗
f l a g2=1;
}
i f(f l a g2==1)
{
g e t_t i m e();
i f((m i a o<=6&&m i a o>=4)||(m i a o<=11&&m i a o>=9)||(m i a o<=16&&m i a o>=14)||(m i a o<=21&&m i a o>=19)||(m i a o<=26& &m i a o>=24))
s h o w1(n i a n,y u e,r i,x i n g q i);
e l s e
s h o w(s h i,f e n,m i a o);
i f(m i a o==27)
f l a g2=0;
}
w h i l e(f l a g1)
{
s h o w1(n i a n,y u e,r i,x i n g q i);
r s e t_t i m e();
}
//按上键显示日期
i f(k e y_u p==0&&n u m==0)
{
d e l a y(8);
w h i l e(!k e y_u p)
s h o w1(n i a n,y u e,r i,x i n g q i);
};
i f(k4==0)
{
d e l a y(5);
w h i l e(1)
{
r d l s z y();//倒流水左移
r j a();//渐暗
P0=0x f f;
y s1m s(300);//延时0.3秒
r z m y y();//走马右移
P0=0x f f;
y s1m s(300);
r z m z y();//走马左移
P0=0x f f;
y s1m s(300);
r j l();//渐亮
r j a();//渐暗
P0=0x f f;
y s1m s(300);
r z m n w y d();//走马内外移动
P0=0x f f;
y s1m s(300);
r l s z y();//流水左移
r j a();//渐暗
y s1m s(300);
r l s y y();//流水右移
r j a();//渐暗
y s1m s(300);
r s d z m y y();//3灯走马右移
P0=0x f f;
y s1m s(300);
r s d z m z y();//3灯走马右移
P0=0x f f;
y s1m s(300);
r l s n w y d();//流水内外移动
P0=0x f f;
y s1m s(300);
r t b y d();//跳变7种模式
P0=0x f f;
y s1m s(300);
}
}
}
}。