本帖最后由 jinglixixi 于 2017-3-24 17:02 编辑
先打个小广告,我做的是一个旋转型数字时钟,本想把电水壶拆了,无奈老婆不让,说天天还要那。没办法,只能向手头找得到的东西下手。先找到一个生日蛋糕的硬纸板,做了个表盘底板,然后用圆规画上圆并等分出放置发光二极管的位置,再将发光二极管装在硬纸板上并连好线形成了表盘。为在能在夜间也了识别出时间状态,又按5个LED的间隔加上了红色的LED进行标识。为了让作品能上些档次,又找到一个装巧克力的有机玻璃糖盒做外壳。线路是搭建在一块万能板上,并以软导线进行连接,部分导线是从旧鼠标的导线上分离出来的。之所以叫它旋转型数字时钟,是由于秒信号被接到了围成圆环型的LED上,每过一秒LED灯就向前移动一个位置,故能产生一种旋转效果。为了节省LED的数量和连线的复杂度,时钟的数字显示采用数码管来承担。 图1 特点介绍
图2 核心电路
图3 运行效果
图4 中间调试
一、制作背景 1.意义 数字式时钟在日常生活中已屡见不鲜了,制作样式新颖的具有旋转指示效果的数字时钟,可以为我们的生活增添色彩和情趣。 2.计时方式选择 在计时方式可分为两类,一类是使用计时芯片,另一类是使用CPU自带的内部的定时器。 在该制作中,是以为DS1302为计时核心,以单片机来提供秒信号来实现走秒效果的处理。 二、总体规划 1.总体结构 总体设计包括硬件的构建和软件的编程设计,在硬件上由单片机、键显模块、计时器模块、走秒旋转模块及蜂鸣提示模块等组成,软件上包括数码管显示函数、时钟芯片读写函数、键入分析函数、延时函数、闹钟处理函数及中断处理函数等。系统的硬件构成如图5所示。
2.开发工具 开发中以Keil软件进行程序编译、用C51编写单片机程序,用STC_ISP_V486软件向单片机写入程序。
三、计时功能的实现 1.计时电路 使用DS1302 作为系统的计时核心,辅以3V纽扣电池作断电后的维持计时电源,具体电路如图6所示。
2.时间值的读写 为了调整计时时间和显示计时值,为DS1302配置了写入程序和读取程序,其程序代码如下: // DS1302写入函数, 向DS1302的指定地址写入一个字节的数据 。
void write_ds1302(uchar cmd,uchar indata)
{
sclk=0;
reset=1;
write_byte(cmd);
write_byte(indata);
sclk=0;
reset=0;
}
// DS1302读取函数, 从DS1302的指定地址读取一个字节的数据。
uchar read_ds1302(uchar addr)
{
uchar backdata;
sclk=0;
reset=1;
write_byte(addr); //先写地址
backdata=read_byte(); //然后读数据
sclk=0;
reset=0;
return (backdata);
}
//读取时间函数,负责读取当前时间,并将读取的时间转换为10进制数
void get_time()
{
uchar sec,min,hour; //定义秒、分和小时变量
write_ds1302(0x8e,0x00); //控制命令,WP=0,允许写操作
write_ds1302(0x90,0xa0); //涓流充电控制
sec=read_ds1302(0x81); //读取秒
min=read_ds1302(0x83); //读取分
hour=read_ds1302(0x85); //读取时
time_buf[0]=sec/16*10+sec%16; //将读取到的16进制数转化为10进制
time_buf[1]=min/16*10+min%16; //将读取到的16进制数转化为10进制
time_buf[2]=hour/16*10+hour%16; //将读取到的16进制数转化为10进制
}
四、显示功能的设计与实现 显示功能是实现人机交互的桥梁,在该制作中用了两种显示形式。 时间值显示 采用四联数码管来作显示器件,并配以三极管9012来驱动显示。为了减少连线的数量,采用动态扫描的方式来显示,其电路如图7所示。
显示函数如下: uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
0xf8,0x80,0x90,0xff}; //0~9、熄灭符和字符"-"的显示码(字形码)
uchar disp_buf[6] ={0x00}; //定义显示缓冲区
void Display()
{
P0=tab[disp_buf[0]];
LED1=0;
Delay_ms(2);
LED1=1;
P0=tab[disp_buf[1]];
LED2=0;
Delay_ms(2);
LED2=1;
P0=tab[disp_buf[2]];
LED3=0;
Delay_ms(2);
LED3=1;
P0=tab[disp_buf[3]];
LED4=0;
Delay_ms(2);
LED4=1;
}
走秒旋转效果实现 走秒效果是建立在60个LED发光二极管和CD4017电路的基础上,通过秒信号来驱动LED指示灯向前移动以产生旋转效果。通过同步信号,可保证系统的有效运行,其电路如图8所示。 走秒旋转效果程序如下: sbit QQ=P1^4;
sbit ledd=P1^5;
//定时器T0初始化函数
void timer0_init()
{
TMOD = 0x11; // 定时器0工作模式1, 16位定时方式
TH0 = 0xf6;
TL0 = 0x50;
TH1=0X3C;
TL1=0XB0;
EA=1;ET0=1;ET1=1; //开总中断和定时器T0中断
TR0 = 1;TR1=1; //启动定时器T0
}
//T0中断处理函数,实现走秒显示效果。
void timer0() interrupt 1
{
uchar count;
TH0 = 0xf6; //ec78 2.48ms f6 50
TL0 = 0x50; //重装计数初值,定时时间为50ms 2.5MS -f6 3c
gaos++;
count++;
if(gaos==2)
{
gaos=0;
if(flag7==1)ledd=~ledd; //高速LED灯
else ledd=1;
}
if(count==200)
{
wss=~wss;
count=0;
if(flag7==0)QQ=~QQ; //旋转LDE灯
else QQ=1;
}
if(flag1!=0)
{
flag9++;
if(flag9==2000)
flag1=0;
}
}
五、功能验证 当制作完成后,应对制作功能进行检验。检验的步骤是,首先上电启动系统,然后使用K1键来激活时钟设置功能,再按K2键(+1)或K3键(-1)来调整时间值。再次触动K1键,可对分钟值进行设置。完成设置后,等待一段时间会自动结束设置。 当时钟运行一段时间后,可核对一下时间是否出现偏差,若未出现偏差则说明运行正常,否则说明存在异常,应进行修改。 经实际运行,证明计时无明显偏差符合制作目标。 由于该制作,拆的成分少,做的成分多,不知是否合要求,就权当积极参与吧。
在旋转型数字时钟的制作中,相应的工具是不可或缺的,如图9所示。其中有些大家可能不会用到,如输液用的小针头,它是为固定LED来穿孔的,如果没有也可用大号的缝衣针来代替。而圆规、半圆仪和直角尺则是为制作表盘而准备的;透明粘带或双面胶是为了固定走线和线路板的;钳子和螺丝刀则是为了拆解鼠标和**导线的;当然其他还要用到焊接工具等,这是大家都会遇到的。 图9 制作工具
除了制作工具外,制作材料也是必不可少的,不算电路及元器件,还需一下材料。 1)蛋糕盒中的硬纸板,原来制作表盘; 巧克力有机玻璃盒,为了不影响视觉效果,使用盒子的底面做前脸,而将盒子的正面放到底部来使用。其实如果不是表盘的话,还是盒子的正面跟漂亮。 图10 有机玻璃盒与硬纸板
3)鼠标,如今很少有人再用机械式鼠标,扔了可惜到不如拆成材料用,这里主要用的是连接电脑与鼠标的导线。其实鼠标中的微动开关也是可已使用的,由于没凑齐3个,故只好用了3个小按键来进行设置操作。 图11 机械式鼠标
在拆解鼠标时,本以为4个小白点是固定螺丝,去除后才知道是晃人的。真正的固定螺丝只有一个,却是在小的合格证下且很小。只好换个更小的螺丝刀来解决它。 图12 去除固定螺丝和鼠标球将其分为两部分
将连接线从插座上拔下,然后用钳子剪开缺口使内部导线与外皮保护层分离,则可做多股细导线来使用。在别的制作中,单线可能不是关键材料,这里它的使用量却很大,因为表盘没有制作在电路板上,故导线的用量很大。 图14 剥离出导线
在准备好基本材料后,就可以进行制作了,下面主要介绍一下表盘的制作过程: 1)按有机玻璃盒的尺寸对硬纸板进行裁剪,以充当面板,如图15所示。 2)为保证表盘的质量,这里尺寸的设置较为关键。这里是选取纸板的中心做一个半径为8厘米的圆,因为如果尺寸过小的话,最终将无法摆放下64个LED。 3)用6度为间隔画过圆心的线段来定位LED的摆放位置,如图16所示。 4)沿线段方向在直线与圆的焦点左右对称扎孔以放置LED,如图17所示。 5)为固定LED和简化线路连接,可按图18 所示。 图15 裁剪面板
图16 确定摆放位置
图17扎孔放置LED
图18 背面的连线方式
|