[51单片机] 纯手工打造摇摆LED时钟
- 格式:doc
- 大小:313.50 KB
- 文档页数:14
利用51单片机制作的电子时钟最近研究起来了单片机,用的是国产STC98C52 芯片。
STC89C52 是STC公司生产的一种低功耗、高性能CMOS8 位微控制器,具有8K 在系统可编程Flash 存储器。
STC89C52 使用经典的MCS-51 内核,但做了很多的改进使得芯片具有传统51 单片机不具备的功能。
在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52 为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
买了很长时间了可是一直在那里放着,今天重新拿出来写了一段电子时钟的C++程序,利用充电宝供电,当作电子时钟挺不错的。
功能:4 个七段数码管作为时钟显示的主体两个显示小时,两个显示分钟,8 个LED 灯作为秒数的闪烁,4 个独立按键分别为hour+1,hour+10,minute+1,minute+10。
查询LED 电路,接入端为P1到P1。
数码管采用了驱动芯片,接入端为P2到P2。
按键的接入端如图所示。
有了各种电路的接入端,我们利用keil 进行编程。
/* * Copyright (c) 2015,烟台大学计算机学院* All right reserved. * 作者:邵帅* 文件:temp.c* 完成时间:2015 年05 月29 日*/ #include #define uchar unsigned char sbit P2_0 = P2;sbit P2_1 = P2;sb it P2_2 = P2 ;sbit P2_3 = P2;sb it key1=P3 ;//按键sbit key2=P3;sb it key3=P3;sb it key4=P3 ;static unsigned char second,minute,hour;unsigned int tcount;unsigned char m;uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};void delay(uchar。
摘要这个设计时基于AT89C2051设计的电子时钟,通过对硬件资源和软件的编写,初步了解设计的思路以及实现过程。
电子闹钟是采用电子电路实现对时、分、秒进行数字显示的装置,广泛应用于个人家庭、医院、车站、码头、办公室等公共场所,成为人们日常生活中不可缺少的必需品。
本设计基于单片机技术原理,以AT89SC2051作为核心控制器,通过硬件电路的制作及软件程序的编制,设计制作了一种利用四位LED数码管动态扫描显示时间的电子闹钟系统。
整个电子闹钟系统主要由时间显示模块、时间设置、闹铃模块、闹钟响应模块。
可实现时间显示、时间调整、闹钟设置和整点闹铃功能,具有制作简单、调整方便、稳定性好、便于扩展等特点。
电子时钟还通过对比实际的数字电子时钟,来校正和调整,从而找出误差的来源,尽可能的减少误差,是系统可以达到实际数字电子时钟允许的误差范围内。
关键词:单片机AT89SC2051、电子闹钟、LED动态显示目录摘要 (I)1.引言 (1)2 系统设计 (1)2.1设计要求 (1)2.2总设计方案 (1)2.2.1 系统实现 (2)3系统硬件电路设计 (2)3.1时钟电路设计 (3)3.2显示模块的设计 (4)3.3按键模块的设计 (5)3.4复位电路设计 (5)3.5闹铃的设计 (6)3.6发光二极管闪烁电路设计 (6)4 软件设计 (7)4.1程序流程 (7)4.1.1主程序 (8)4.1.2 时钟走时模块 (9)4.1.3时间设置模块 (10)4.1.4闹钟设置模块 (11)4.1.5 奏乐模块 (11)5 系统测试 (15)5.1硬件调试 (15)5.2软件调试 (15)6 结论 (15)附录 (15)附录1器件清单 (15)附录2调试仪器 (16)附录3原理图和PCB图 (16)附录4实物 ............................................... 错误!未定义书签。
附录5程序清单 ........................................... 错误!未定义书签。
学校电子钟,有闹钟功能,按键可调时间,可调打铃时间,打铃时间长短显示,每个模块有功能注释。
其中正常时间显示和闹钟时间显示可用一个开关来调整。
芯片选择STC89C52程序:#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//定义显示段码uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};uchar codebbtime[]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; uchar clock[]={0,0,0,0};uchar clock1[]={12,30,0};uchar weikong[6];uchar bbduration=4;uchar lingtime=9;//学校打铃时间组uchar shangwu1[]={8,30};uchar shangwu2[]={10,0};uchar shangwu3[]={10,20};uchar shangwu4[]={11,50};uchar xiawu1[]={13,30};uchar xiawu2[]={15,00};uchar xiawu3[]={15,15};uchar xiawu4[]={16,45};//按键定义sbit mode=P1^7;sbit sec_clr=P1^0;sbit min_set_add=P1^3;sbit min_set_sub=P1^4;sbit hour_set_add=P1^1;sbit hour_set_sub=P1^2;sbit bb_set_add=P1^5;sbit bb_set_sub=P1^6;sbit speaker=P2^6;//延时函数void delay(unsigned int t){while(t--);//时钟进位函数void clockjinwei(){clock[0]++;if(clock[0]==20){clock[1]++;clock[0]=0;if(clock[1]==60){clock[2]++;clock[1]=0;if(clock[2]==60){clock[3]++;clock[2]=0;if(clock[3]==24)clock[3]=0;}}}}//定时器0中断服务函数void timer0(void) interrupt 1 using 1 {TMOD=0x01;TH0=0x3c;TL0=0xb0;clockjinwei();}//时钟分位显示函数void fenwei(){weikong[0]=clock[3]/10;weikong[1]=clock[3]%10;weikong[2]=clock[2]/10;weikong[3]=clock[2]%10;weikong[4]=clock[1]/10;weikong[5]=clock[1]%10;}//闹钟分位显示函数void naofen(){weikong[0]=clock1[0]/10;weikong[1]=clock1[0]%10;weikong[2]=clock1[1]/10;weikong[3]=clock1[1]%10;weikong[4]=clock1[2]/10;weikong[5]=clock1[2]%10; }//闹钟定时显示函数void naozhongdisplay(){uchar z,s;uchar x=0x01;naofen();for(z=0;z<6;z++){P2=0;P0=table[weikong[z]];P2=x;x=_crol_(x,1);for(s=0;s<255;s++);}}//时钟显示函数void display(){uchar i,j;uchar x=0x01;fenwei();for(i=0;i<6;i++){P2=0;P0=table[weikong[i]];P2=x;x=_crol_(x,1);for(j=0;j<255;j++);}}//总显示函数void zhongxian(){if(mode==1)delay(100);if(mode==1)display();if(mode==0)delay(100);if(mode==0)naozhongdisplay();}//按键处理程序void key_set(){zhongxian();P1=0xff;if(min_set_add==0){delay(100);if(min_set_add==0){if(mode==1){clock[2]++;if(clock[2]==60){clock[2]=0;}while(min_set_add==0)zhongxian();}}if(mode==0){clock1[1]++;if(clock1[1]==60){clock1[1]=0;}while(min_set_add==0)zhongxian();}}//if(min_set_sub==0){delay(100);if(min_set_sub==0){if(mode==1){clock[2]--;if(clock[2]==0)clock[2]=59;}while(min_set_sub==0)zhongxian();if(mode==0){clock1[1]--;if(clock1[1]==0)clock1[1]=59;}while(min_set_sub==0)zhongxian();}}//if(hour_set_add==0){delay(100);if(hour_set_add==0){if(mode==1){clock[3]++;if(clock[3]==24){clock[3]=0;}while(hour_set_add==0)zhongxian();}if(mode==0){clock1[0]++;if(clock1[0]==24){clock1[0]=0;}while(hour_set_add==0)zhongxian();}}}//if(hour_set_sub==0){delay(100);if(hour_set_sub==0){if(mode==1){clock[3]--;if(clock[3]==0)clock[3]=23;}while(hour_set_sub==0)zhongxian();if(mode==0){clock1[0]--;if(clock1[0]==0)clock1[0]=23;}while(hour_set_sub==0)zhongxian();}}//if(sec_clr==0){delay(100);if(sec_clr==0){clock[1]=0;}while(sec_clr==0)zhongxian();}}//闹钟响铃函数void bb(){if(clock[1]<=bbduration){speaker=1;delay(100);speaker=0;}else speaker=0;}//打铃函数void daling(){if(clock[1]<=lingtime){speaker=1;delay(100);speaker=0;}else speaker=0;}//时间比较函数void bijiao(){if(clock[3]==shangwu1[0]){if(clock[2]==shangwu1[1])daling();}if(clock[3]==shangwu2[0]){if(clock[2]==shangwu2[1])daling();}if(clock[3]==shangwu3[0]){if(clock[2]==shangwu3[1])daling();}if(clock[3]==shangwu4[0]){if(clock[2]==shangwu4[1])daling();}if(clock[3]==xiawu1[0]){if(clock[2]==xiawu1[1])daling();}if(clock[3]==xiawu2[0]){if(clock[2]==xiawu2[1])daling();}if(clock[3]==xiawu3[0]){if(clock[2]==xiawu3[1])daling();}if(clock[3]==xiawu4[0]){if(clock[2]==xiawu4[1])daling();}}//闹钟比较void naobijiao(){if(clock[3]==clock1[0]){if(clock[2]==clock1[1]||clock[2]==clock1[1]+1||clock[2]==clock1[1]+2) bb();}}//响铃时长显示函数void bbtimeshow(){P3=bbtime[bbduration];if(bbduration>15)bbduration=0;}//响铃按键处理函数void bbtime_set(){bbtimeshow();if(bb_set_add==0){delay(100);if(bb_set_add==0)bbduration++;while(bb_set_add==0)bbtimeshow();}if(bb_set_sub==0){delay(100);if(bb_set_sub==0)bbduration--;while(bb_set_sub==0)bbtimeshow();}}//主程序void main(){EA=1;ET0=1;TR0=1;while(1){key_set();bijiao();bbtime_set();naobijiao();}}电路图:分四部分显示:如果在学习这个程序过程中有什么问题,可以发邮件到******************询问。
基于51单片机的简易电子钟设计一、设计目的现代社会对于时间的要求越来越精确,电子钟成为家庭和办公场所不可缺少的设备之一、本设计基于51单片机,旨在实现一个简易的电子钟,可以显示当前的时间,并且能够通过按键进行时间的调整和设置闹钟。
二、设计原理本设计主要涉及到51单片机的IO口、定时器、中断、LCD显示技术等方面知识。
1.时钟模块时钟模块采用定时器0的中断进行时间的累加和更新。
以1秒为一个时间单位,每当定时器0中断发生,就将时间加1,并判断是否需要更新小时、分钟和秒的显示。
同时,根据用户按键的操作,可以调整时间的设定。
2.显示模块显示模块采用16x2字符LCD显示屏,通过51单片机的IO口与LCD连接。
可以显示当前时间和设置的闹钟时间。
初次上电或者重置后,LCD显示时间为00:00:00,通过定时器中断和键盘操作,实现时间的更新和设定闹钟功能。
3.键盘模块键盘模块采用矩阵键盘连接到51单片机的IO口上,用于用户进行时间的调整和设置闹钟。
通过查询键盘的按键状态,根据按键的不同操作,实现时间的调整和闹钟设定功能。
4.中断模块中断模块采用定时器0的中断,用于1秒的定时更新时间。
同时可以添加外部中断用于响应用户按键操作。
三、主要功能和实现步骤1.系统初始化。
2.设置定时器,每1秒产生一次中断。
3.初始化LCD显示屏,显示初始时间00:00:00。
4.查询键盘状态,判断是否有按键按下。
5.如果按键被按下,根据不同按键的功能进行相应的操作:-功能键:设置、调整、确认。
-数字键:根据键入的数字进行时间的调整和闹钟设定。
6.根据定时器的中断,更新时间的显示。
7.判断当前时间是否与闹钟设定时间相同,如果相同,则触发闹钟,进行提示。
8.循环执行步骤4-7,实现连续的时间显示和按键操作。
四、系统总结和改进使用51单片机设计的简易电子钟可以显示当前时间,并且实现时间的调整和闹钟设定功能。
但是由于硬件资源有限,只能实现基本的功能,不能进行其他高级功能的扩展,例如闹铃的音乐播放、温度、湿度的显示等。
基于51单片机的简易电子时钟设计摘要今天,电子时钟是生活中不可或缺的一部分。
电子时钟通过数码管显示,具有整点报时等功能,可以使得我们的生活变得更加有序。
电子时钟也通过不断地改进,变得功能越来越强大。
本次设计的电子时钟利用单片机STC89C5进行控制的,利用单片机1自身的定时器功能,采用数码管显示,可对电子时钟进行调整校准。
此设计具有相当重要的现实意义和实用价值。
基于单片机STC89C5的电子时钟,采用数码管显示“时“分“秒”1而且可用按键进行调整校准。
此次设计与传统的机械表相比,它具有走的更精准,显示更直观等特点,而且单片机的数字时钟具有灵活编程,便于功能扩充等特点。
本次所设计主要有三个模块:显示模块,按键模块,闹铃模块。
该时钟采用STC89C5单片机自身定时器进行计时,按键模块采用独立式键1盘(4个按键),闹铃部分由8550三极管和蜂鸣器构成,显示时、分、秒用两个四位共阴极数码管显示,具有可调整时间功能和设定闹钟功能,在设计过程中硬件和软件应同时进行。
关键词:电子时钟,单片机,闹钟,蜂鸣器SIMPLE ELECTRONIC CLOCK DESIGN BASED ON 51MCUABSTRACTToday, the electronic clock is an integral part of life. Through the digital display electronic clock, with the whole point timekeeping function, can make our life more orderly. The electronic clock also through continuous improvement, has become more and more powerful.The design of the electronic clock using STC89C51 MCU to control the use of single-chip, self timer function, the use of digital tube display, can adjust the calibration of the electronic clock. Has very important realistic significance and practical value of this design.The electronic clock based on MCU STC89C51, using digital tube display "when""seconds" and the button can be used to adjust the calibration. And the design of the traditional mechanical watch, it has to go more accurate, more intuitive display characteristics, and the digital clock has flexible programming, easy to function expansion and so on.This design has three main modules: the display module, keyboard module, alarm module. The clock uses STC89C51 microcontroller timer timing, key module with separate keyboard (4 buttons), the alarm is composed of 8550 transistors and a buzzer, when the display is divided by two seconds, four common cathode digital display, which can adjust the time and set the alarm function, hardware and software in the design process should be carried out at the same time.Key Words: electronic clock, microcontroller, alarm clock, a buzzer第一章绪论.......................................................... - 1 -1.1课题背景及意义................................................1.2课题内容....................................................1.2.1题目及要求..............................................1.2.2主要部分...................................................第二章方案.......................................................... - 2 -2.1 功能要求.....................................................2.3 数码管显示方案 ...............................................第三章电子时钟的硬件设计........................................ - 4 -3.1电子时钟的组成................................................3.2单片机最小系统图...........................................3.3STC89C51引脚功能.............................................3.4数码管显示模块................................................3.5闹铃部分 .....................................................3.6按键模块 .....................................................第四章电子时钟的软件设计........................................ - 8 -4.1电子时钟程序流程框图 .....................................4.2按键调整流程图................................................4.3子程序的设计 ................................................4.3.1数码管显示模块 ......................................4.3.2按键子模块..............................................4.3.3主程序 ..................................................第五章硬件的制作与测试分析 ................................... - 13 -5.1电子时钟的硬件制作........................................5.2硬件测试 .....................................................5.3软件调试 .....................................................5.4测试结果分析与结论........................................5.4.1数码管测试结果分析 .................................5.4.2按键测试结论...........................................5.4.3测试结论.............................................总结与致谢........................................................ - 16 -参考文献............................................................ - 18 -附录 ................................................................. - 20 -附录一分组表 .................................................附录二程序 ......................................................-1 --1 --1 --2 --2 --3 --4 --5 --6 --7 --7 --8 --8 --20 --21附录三电子时钟实物图........................................微机原理与单片机接口技术课程设计报告第一章绪论1.1课题背景及意义二十一世纪的今天,电子时钟已经融入到千千万万户家庭中,它已经成为了人们生活中不可或缺的一部分。
51单片机电子时钟设计电子时钟是一种非常实用的电子设备,它可以准确地显示时间,并拥有一系列的功能,如闹钟、日历等。
使用51单片机设计电子时钟,可以实现这些功能,同时还能够进行功能扩展,更好地满足用户需求。
首先,我们需要硬件上的准备工作。
51单片机需要与时钟(晶振)和显示器(LCD模块)进行连接。
晶振是提供单片机时钟脉冲的源头,LCD模块用于显示时间和各种功能。
同时,在电路中还需要进行一些扩展,如实时时钟模块(RTC模块)、按键模块等。
在软件设计方面,主要需要考虑以下几个方面:1.时钟脉冲:通过配置晶振的频率,可以生成单片机所需的时钟脉冲。
这个脉冲控制了单片机的运行速度,从而影响到时钟的准确性。
需要根据晶振频率进行相关配置。
2.时间的获取和计算:通过RTC模块可以获取当前的时钟数据(包括年、月、日、时、分、秒)。
在程序中,需要通过相应的接口获取这些数据,并进行计算。
比如,在显示时钟的时候,可以通过获取秒数、分钟数和小时数,并将其转换为相应的字符串进行显示。
3.菜单和按键功能:为了实现更多的功能,我们可以通过按键来实现菜单切换和功能选择。
在程序中,需要对按键进行扫描,判断按键的状态,然后进行相应的操作。
比如,按下菜单键可以进入菜单界面,通过上下键选择不同的功能,再通过确定键进行确认。
4.闹钟功能:闹钟功能是电子时钟中常见的功能之一、通过设置闹钟时间,并进行闹钟的开启或关闭,可以在指定的时间点触发相应的报警动作。
在程序中,需要编写逻辑判断闹钟是否到达指定的时间,然后触发报警。
5.日历功能:除了显示时间,电子时钟还可以显示当前的日期,包括年、月、日。
在程序中,需要编写相关的逻辑来获取日期数据,并进行显示。
通过以上的步骤,我们可以基本实现一个简单的电子时钟功能。
当然,根据用户的需求,还可以进行更多的功能扩展,比如添加温湿度监测、自动调光等功能。
总结起来,51单片机电子时钟的设计主要包括硬件和软件两个方面。
纯手工打造摇摆LED时钟来源:网友推荐作者:周正华字号:[大中小]看到市场上正在流行的时尚商品——摇摆LED 时钟,感觉非常新颖独特,正在玩单片机的我,激起了自己也想DIY 一个的冲动。
不就是一个流水灯吗?有什么难的?!于是,一个单片机项目就这样开始了。
然而动手以后才知道问题并非想象那样简单,因没有任何现成的资料,机械的、电子的和编程的问题一大堆,一个一个需要自己来解决。
经历二十多天的苦战和无数次的修改与调试,作品终于完成,基本达到预先要求。
现将制作资料整理出来,与广大DIY 爱好者分享。
一. 整体方案本制作是根据视觉暂留原理, 让一排8 只LED作往复运动, 在空中呈现八个字符的显示屏,可显示数字或英文字符。
开机后先显示“Welcome!”欢迎字符(见图1), 再进入时钟显示状态。
显示屏同时显示“时” 、“分” 、“秒”信息,用“:”分隔(见图2)。
图1 开机画面图2 运行状态显示分“正常运行”、“调分”和“调时” 三种状态。
当处于调整状态时,调整的项会闪现,以便识别。
为此,设置三个调整按键,一个为“状态键”,一个为“加法键”,一个为“减法键”。
(见图3)图3 按键的设置图4 音圈电机组件摇棒的动力部分采用从废旧硬盘拆下的音圈电机(见图4),驱动采用直流电机驱动方式。
结构方面,将音圈电机直接安装在万用板上,将万用板的四周用四根螺柱与一透明有机板结合成一体,构成支撑摇棒底座。
(见图5, 图6)。
图5 万用板与有机板构成底座图6 底座侧面二. 实作要点1.主板的结构布局见图7。
图7 主板布局图8 摇棒上的LED2.LED 的焊接,将LED 两脚跨接在电路板两端的方式进行焊接。
使LED 紧密排列在一起。
3.摇棒上的LED 与主板上的信号用柔性排线连接,音圈电机供电占2 位,LED 信号传输占9 位,所以至少要11 位的排线。
(见图9)图9 排线与拉簧图10 拉簧4.为保持摇棒的平衡, 在摇棒接近旋转轴的两端加装两只拉簧,这两只拉簧的规格尽量保持一致,弹性强弱要适中,最好可多找几种规格的试试。
[DIY]二十四小时的感动(现代版) 自制LED点阵电子时钟十六楼已经上传全部电路图和PCB板图文件,以及全套C语言源代码,包括工程文件。
十八年前的我,每次路过学校门卫室的时候,总要驻留一刻,瞄一眼墙上那个会发着红光的电子钟,那时,我一直不知道它是怎么做到的...到现今,这个会发光的可以显示数字的,名叫LED数码管的东东,遍地皆是......算是圆自己的一个小小梦想吧,自己动手做一个点阵LED电子时钟。
先来一组靓照:最喜欢这个夜晚朦胧的感觉......并且亮度可以根据环境光线的强弱自动调节,就像我们的液晶电视,或者汽车仪表盘的背景灯光一样。
放在客厅,让每天每分每秒,都感动着......=============================================================================== ==制作这个点阵LED电子钟,一共使用了30个5x7方形点阵的LED点阵模块。
采用的是我比较熟悉的C8051F系列的MCU,51内核,但CPU速度能到50M。
时钟芯片当然采用的是较常用的DS1302,要想准,晶振是问题。
所以千方百计找精度高的32.768kHz晶体。
后来功夫不负有心人,弄到了几颗精度在±5ppm的西铁城原装晶体。
并且安装了一颗备份锂电池的安装座,掉电情况下时钟一样会接着走,不用重新对时。
LED店镇模块可以显示三行,每行10个字符。
按照我的规划,要可以同时显示日期、时间、星期内容。
注意,是方形点阵哦,比我们平时视觉疲劳的圆形点阵感觉要好看很多。
并且还集成了高精度温度传感器18B20,也是大家最常用的一款1WIRE操作方式的温度传感器,可以实时显示当前环境温度。
但是使用18B20要注意,最好把管脚接长一点,避免电路板附近元器件发热后通过管脚将传感器的温度拉高,那样就不准啦。
由于这个电路板板面尺寸很大,有很多利用的价值,所以我在上面还集成了SIEMENS 的GSM模块安装位置和接口,以后可以基于这个模块,显示SMS等等信息或者短信控制等。
用51单片机和1602液晶做的数字钟数字钟是人们日常生活中常见的时间显示设备,它能够精确显示当前的时间,并且兼具简约和实用性。
本文将介绍使用51单片机和1602液晶屏幕制作自己的数字钟的方法。
所需材料在开始制作之前,我们需要准备以下材料: - 51单片机开发板 - 1602液晶屏幕 - 数字时钟芯片RTC(Real-Time Clock) - 面包板和导线 - 电阻和电容 - 编程器和烧录器硬件连接首先,我们需要将51单片机、1602液晶屏幕和RTC芯片连接起来。
根据硬件接口的定义和引脚功能的规定,我们可以进行以下连接: - 将51单片机的VCC 引脚连接到1602液晶屏幕的VCC引脚,用于提供电源。
- 将51单片机的GND引脚连接到1602液晶屏幕的GND引脚,用于地线连接。
- 将51单片机的P0口连接到1602液晶屏幕的数据线D0-D7,用于数据传输。
- 将51单片机的P2口连接到1602液晶屏幕的RS引脚,用于选择数据和命令传输。
- 将51单片机的P3口连接到1602液晶屏幕的EN引脚,用于启用LCD。
此外,还需要将RTC芯片连接到51单片机上,以实现时间的准确显示。
具体的连接方式可以参考RTC芯片的规格说明书。
软件编程完成硬件连接后,我们需要进行软件编程,以便控制51单片机、1602液晶屏幕和RTC芯片的功能。
初始化首先,我们需要对51单片机和1602液晶屏幕进行初始化设置。
这包括设置引脚的功能模式、初始化1602液晶屏幕的显示模式和清空显示区域。
读取时间接下来,我们需要通过RTC芯片来读取当前的时间。
这通常包括读取RTC芯片存储的年、月、日、时、分和秒的数据。
显示时间读取时间后,我们可以将其显示在1602液晶屏幕上。
这可以通过更新特定的LCD显示区域来实现。
我们可以在指定的位置、特定的行和列上显示时间。
更新时间为了实现实时的时间显示,我们需要定期更新显示的时间。
可以使用定时器中断来定期更新时间,并根据需要刷新液晶屏幕上的显示。
现将制作资料整理出来,与广大DIY 爱好者分享。
一. 整体方案本制作是根据视觉暂留原理, 让一排8 只LED作往复运动, 在空中呈现八个字符的显示屏,可显示数字或英文字符。
开机后先显示“Welcome!”欢迎字符(见图1), 再进入时钟显示状态。
显示屏同时显示“时” 、“分” 、“秒”信息,用“:”分隔(见图2)。
图1 开机画面图2 运行状态显示分“正常运行”、“调分”和“调时” 三种状态。
当处于调整状态时,调整的项会闪现,以便识别。
为此,设置三个调整按键,一个为“状态键”,一个为“加法键”,一个为“减法键”。
(见图3)图 3 按键的设置图 4 音圈电机组件摇棒的动力部分采用从废旧硬盘拆下的音圈电机(见图4),驱动采用直流电机驱动方式。
结构方面,将音圈电机直接安装在万用板上,将万用板的四周用四根螺柱与一透明有机板结合成一体,构成支撑摇棒底座。
(见图5, 图6)。
图5 万用板与有机板构成底座图6 底座侧面二. 实作要点1.主板的结构布局见图7。
图7 主板布局图8 摇棒上的LED2.LED 的焊接,将LED 两脚跨接在电路板两端的方式进行焊接。
使LED 紧密排列在一起。
3.摇棒上的LED 与主板上的信号用柔性排线连接,音圈电机供电占2 位,LED 信号传输占9 位,所以至少要11 位的排线。
(见图9)图9 排线与拉簧图10 拉簧4.为保持摇棒的平衡, 在摇棒接近旋转轴的两端加装两只拉簧,这两只拉簧的规格尽量保持一致,弹性强弱要适中,最好可多找几种规格的试试。
(图9,图10)5.采用驱动直流电机正反转的方式,驱动音圈电机来回摆动。
让电机正、反转的方法很多,最典型的是H 桥电路驱动,H 桥电路原理见图11,常见的是用三级管代替图中的开关。
图11 H 桥驱动原理为了简化电路,最好采用H 桥功能的集成电路。
这种IC 很多,比如象TA7257,TA8429H,L6203 等,这里用的是三菱公司的M54544AL(见图12)。
IC 各脚定义见图13。
图12 电机驱动IC图13 M56544AL 各脚定义6.电原理图见图14。
图14 电原理图7.完成图见图15。
图15 完成图三. 软件设计1.摇棒的启动为了使摇棒从静止状态过度到正常运行状态,在正式显示前加一启动程序。
其实质就是逐渐加快驱动的频率,一直到摇棒正常摆动为止。
通过下面的代码实现do {mm++;Delay(120+mm);put1=~put1; put2=~put2;}while(mm<60);Delay(20); //根据实际情况确定延时值2.秒闪现的实现:数字或字符的闪现是通过变量Ms 和数组w[]实现的,如需要八位字符中的间的第4 位闪现,则w[3]=1。
这是通过全局变量Ms 在void timer0(void)函数中每隔一秒改变一次状态(0 或1),打开或关闭显示。
if(Ms*w[ii-3]==1) P2=0xff; else P2=~ASCIIDOC[v[ii]*6+jj]; //正向显示if(Ms*w[10-ii]==1) P2=0xff; else P2=~ASCIIDOC[v[13-ii]*6+5-jj]; //反向显示3.调试中发现,显示屏上的字符并不是一样宽的(见图16),仔细分析是由于摇棒在运动中,一直受力,而且所受的力是随时变化的。
为方便精确调整显示,特别作了一个显示中断表Tr[],改变显示LED 的时间段,协调显示效果。
图16 调整前的显示4.按键去抖程序按键的去抖采用软件编程实现,其方法是当检测到按键的接口出现低电平后,隔一段时间再检测,如还是低电平,则确认为有效,否则无效。
具体的程序是通过函数unsigned char ChKey(bit Key)完成的。
5.显示同步因没有位置传感器,显示同步完全靠时钟中断来确定。
这样就有一个问题,音圈电机的驱动信号在什么时刻改变,显示才能保持在中间,并能保证正反显示能很好地重合。
经实际观察, 音圈电机的驱动信号在显示中部, 要根据具体情况细调。
由程序中的变量Ta 调试确定。
6.完整C51 程序代码6.完整C51 程序代码/*POV 摇摆显示LED 钟C51 程序2008.3.19*/#include <reg52.h>/*硬件端口定义*/sbit set0=P0^1;sbit set1=P0^0;sbit set2=P0^2;sbit put1=P3^6;sbit put2=P3^7;/*时钟用数组*/unsigned char BUFFER[]={0,0,0,0};unsigned char maxnum[]={59,23};/*显示数组*/unsigned int v[14];unsigned int w[8];/*显示中断表*/int code Tr[]={2000,2000,2000,2000,2000,2000, 2000,2000,2000,2000,2000,2000, 2000,2000,2000,2000,2000,2000, 2550,2500,2450,2400,2350,2300, 2250,2200,2150,2100,2050,2000, 1950,1900,1850,1800,1750,1700, 1650,1600,1550,1500,1450,1400, 1400,1450,1500,1550,1600,1650, 1700,1750,1800,1850,1900,1950, 2000,2050,2100,2150,2200,2250, 2300,2350,2400,2450,2500,2550, 2000,2000,2000,2000,2000,2000, 2000,2000,2000,2000,2000,2000, 2000,2000,2000,2000,2000,2000,};/*字符字模*/unsigned char code ASCIIDOC[] = // ASCII {0x7C,0x8A,0x92,0xA2,0x7C,0x00, // -0-00 0x00,0x42,0xFE,0x02,0x00,0x00, // -1-01 0x46,0x8A,0x92,0x92,0x62,0x00, // -2-02 0x84,0x82,0x92,0xB2,0xCC,0x00, // -3-03 0x18,0x28,0x48,0xFE,0x08,0x00, // -4-04 0xE4,0xA2,0xA2,0xA2,0x9C,0x00, // -5-05 0x3C,0x52,0x92,0x92,0x8C,0x00, // -6-06 0x80,0x8E,0x90,0xA0,0xC0,0x00, // -7-07 0x6C,0x92,0x92,0x92,0x6C,0x00, // -8-08 0x62,0x92,0x92,0x94,0x78,0x00, // -9-09 0x00,0x00,0x00,0x00,0x00,0x00, // - -10 0x00,0x00,0xFA,0x00,0x00,0x00, // -!-11 0x04,0x08,0x10,0x20,0x40,0x00, // -/-12 0x00,0x6C,0x6C,0x00,0x00,0x00, // -:-13 0x3E,0x48,0x88,0x48,0x3E,0x00, // -A-14 0xFE,0x92,0x92,0x92,0x6C,0x00, // -B-15 0x7C,0x82,0x82,0x82,0x44,0x00, // -C-16 0xFE,0x82,0x82,0x82,0x7C,0x00, // -D-17 0xFE,0x92,0x92,0x92,0x82,0x00, // -E-18 0xFE,0x90,0x90,0x90,0x80,0x00, // -F-19 0x7C,0x82,0x8A,0x8A,0x4E,0x00, // -G-20 0xFE,0x10,0x10,0x10,0xFE,0x00, // -H-210x00,0x82,0xFE,0x82,0x00,0x00, // -I-22 0x04,0x02,0x82,0xFC,0x80,0x00, // -J-23 0xFE,0x10,0x28,0x44,0x82,0x00, // -K-24 0xFE,0x02,0x02,0x02,0x02,0x00, // -L-25 0xFE,0x40,0x30,0x40,0xFE,0x00, // -M-26 0xFE,0x20,0x10,0x08,0xFE,0x00, // -N-27 0x7C,0x82,0x82,0x82,0x7C,0x00, // -O-28 0xFE,0x90,0x90,0x90,0x60,0x00, // -P-29 0x7C,0x82,0x8A,0x84,0x7A,0x00, // -Q-30 0xFE,0x90,0x98,0x94,0x62,0x00, // -R-31 0x64,0x92,0x92,0x92,0x4C,0x00, // -S-32 0x80,0x80,0xFE,0x80,0x80,0x00, // -T-33 0xFC,0x02,0x02,0x02,0xFC,0x00, // -U-34 0xF8,0x04,0x02,0x04,0xF8,0x00, // -V-35 0xFE,0x04,0x18,0x04,0xFE,0x00, // -W-36 0xC6,0x28,0x10,0x28,0xC6,0x00, // -X-37 0xC0,0x20,0x1E,0x20,0xC0,0x00, // -Y-38 0x86,0x8A,0x92,0xA2,0xC2,0x00, // -Z-39 0x24,0x2A,0x2A,0x1C,0x02,0x00, // -a-40 0xFE,0x14,0x22,0x22,0x1C,0x00, // -b-41 0x1C,0x22,0x22,0x22,0x10,0x00, // -c-42 0x1C,0x22,0x22,0x14,0xFE,0x00, // -d-43 0x1C,0x2A,0x2A,0x2A,0x10,0x00, // -e-44 0x10,0x7E,0x90,0x90,0x40,0x00, // -f-45 0x19,0x25,0x25,0x25,0x1E,0x00, // -g-46 0xFE,0x10,0x20,0x20,0x1E,0x00, // -h-47 0x00,0x00,0x9E,0x00,0x00,0x00, // -i-48 0x00,0x01,0x11,0x9E,0x00,0x00, // -j-49 0xFE,0x08,0x14,0x22,0x02,0x00, // -k-50 0x00,0x82,0xFE,0x02,0x00,0x00, // -l-51 0x1E,0x20,0x1E,0x20,0x1E,0x00, // -m-52 0x20,0x1E,0x20,0x20,0x1E,0x00, // -n-53 0x1C,0x22,0x22,0x22,0x1C,0x00, // -o-54 0x3F,0x24,0x24,0x24,0x18,0x00, // -p-55 0x18,0x24,0x24,0x24,0x3F,0x00, // -q-56 0x20,0x1E,0x20,0x20,0x10,0x00, // -r-57 0x12,0x2A,0x2A,0x2A,0x24,0x00, // -s-58 0x20,0xFC,0x22,0x22,0x24,0x00, // -t-59 0x3C,0x02,0x02,0x3C,0x02,0x00, // -u-60 0x38,0x04,0x02,0x04,0x38,0x00, // -v-61 0x3C,0x02,0x3C,0x02,0x3C,0x00, // -w-62 0x22,0x14,0x08,0x14,0x22,0x00, // -x-63 0x39,0x05,0x05,0x09,0x3E,0x00, // -y-64 0x22,0x26,0x2A,0x32,0x22,0x00, // -z-65};unsigned int Ti;unsigned char ii,jj,mm, ff ,TZ ,Ms ,Ta;/*延时程序*/void Delay(unsigned int msec){unsigned int x,y;for(x=0; x<=msec;x++){for(y=0;y<=110;y++);}}/*键盘去抖处理函数*/unsigned char ChKey(bit Key){if(Key==0){Delay(100);if(Key==0) return(1);}}/*定时中断1 处理(时钟)函数*/void timer0(void) interrupt 1 using 1{TH0=-(50000/256);TL0=-(50000%256);TR0=1;BUFFER[0]=BUFFER[0]+1;}/*定时中断2 处理(LED 驱动和音圈驱动)函数*/void timer1(void) interrupt 3 using 1{TH1=Ti/256; TL1=Ti%256;if((ii*6+jj)==Ta) {put1=~put1;put2=~put2;}; //音圈电机驱动输出if(ff==1){if(Ms*w[ii-3]==1) P2=0xff; else P2=~ASCIIDOC[v[ii]*6+jj]; //正向显示}else {if(Ms*w[10-ii]==1) P2=0xff; else P2=~ASCIIDOC[v[13-ii]*6+5-jj]; //反向显示}jj++;if(jj>5) {ii++; jj=0;}if(ii>13) {ii=0;ff=!ff;}Ti=-Tr[ii*6+jj]; //读显示中断表}void main(void){//变量初始化Ms=0;ff=0;Ta=46; //正反显一致性调整, 取值范围在42~50 之间, 根据实际确定put1=0;put2=1;//中断初始化TMOD=0x11;TH0=-5000/256; TL0=-5000%256;TR0=1;ET0=1;TH1=-2000/256; TL1=-2000%256;TR1=1;ET1=1;//十四个字符中前三个和后三个不显(不用)v[0]=10;v[1]=10;v[2]=10;v[11]=10;v[12]=10;v[13]=10;/*摇摆棒初始启动*/do {mm++;Delay(120+mm);put1=~put1; put2=~put2;}while(mm<60);Delay(20);/*启动显示*/ii=0;jj=0;EA=1;/*正式运行*/for(;;){v[3]=36;v[4]=44;v[5]=51;v[6]=42;v[7]=54;v[8]=52;v[9]=44;v[10]=11; //显示欢迎Delay(6000);v[3]=10;v[4]=10;v[5]=10;v[6]=10;v[7]=10;v[8]=10;v[9]=10;v[10]=10; //关闭显示Delay(600);v[3]=0;v[4]=0;v[5]=13;v[6]=0;v[7]=0;v[8]=13;v[9]=0;v[10]=0; //显示时钟初始状态/*进入时钟状态*/while(1){//时钟处理if (BUFFER[0]>21){ //进位到秒BUFFER[0]=0; BUFFER[1]=BUFFER[1]+1;if (BUFFER[1]==60){ //进位到分BUFFER[1]=0;BUFFER[2]=BUFFER[2]+1;if (BUFFER[2]==60){BUFFER[2]=0;BUFFER[3]=BUFFER[3]+1; //进位到时if (BUFFER[3]==24) BUFFER[3]=0;}}}//将显示内容送显示缓冲区v[9]=BUFFER[1]/10;v[10]=BUFFER[1]-v[9]*10;v[6]=BUFFER[2]/10;v[7]=BUFFER[2]-v[6]*10;v[3]=BUFFER[3]/10;v[4]=BUFFER[3]-v[3]*10;//键盘处理if(ChKey(set0)==1){ //模式键Ms=1; //秒闪开if(TZ<2) TZ++; else TZ=0; //三种状态循环转换switch(TZ){case 0:w[0]=0;w[1]=0;w[2]=0;w[3]=0;w[4]=0;w[5]=0;w[6]=0;w[7]=0;break; case 1:w[0]=0;w[1]=0;w[2]=0;w[3]=1;w[4]=1;w[5]=0;w[6]=0;w[7]=0;break; case 2:w[0]=1;w[1]=1;w[2]=0;w[3]=0;w[4]=0;w[5]=0;w[6]=0;w[7]=0;break; }Ms=0; //秒闪关};Delay(80);if(ChKey(set1)==1){ if(BUFFER[TZ+1]<maxnum[TZ-1]) BUFFER[TZ+1]++; else BUFFER[TZ+1]=0;Delay(300);};//键盘"+"if(ChKey(set2)==1){ if(BUFFER[TZ+1]>0) BUFFER[TZ+1]--; elseBUFFER[TZ+1]=maxnum[TZ-1];Delay(300);};//键盘"-"Delay(80);}}}四.调试方法虽说是个机电一体的制作,但调试过程并不复杂。