




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
旋转时钟的设计与实现项目研究报告指导教师:项目组成员:王银铃讲师自动化专业1003班级尚云龙电气专业1003班级吴宝泉电子专业1002班级阎欢“智能机器人”创新实践班2013年1月23日II摘要旋转显示是利用机械转动动态扫描代替传统逐行扫描方式,显示屏其实质就是与机械转动配合起来的动态扫描显示技术。本设计方案旋转时钟的设计与实现是以STC12C5A32S2单片机和LED发光二级管为核心,辅以必要的电路,构成一个靠电路板旋转来显示时间的旋转时钟。与传统机械表相比,它具有走时精确,显示直观等特点。电路板旋转时钟由八部分组成,首先由电源给电机供电,从而可以使电动机带动一排LED发光管绕电机轴高速旋转,这样可以让绕线圈耦合产生感应电压,给旋转板供电,与此同时通过STC12C5A32S2单片机和能够提供时钟信号脉冲的时钟芯片DS1302组合控制各个LED发光管在旋转平面相应的位置上点亮,构成一幅点阵图,由于人的视觉暂留效果,看到一个指针式时钟,实现时间显示功能,可替代传统挂钟显示时间,达到节能又美观的效果。该这个时钟具有两种显示模式:一种是字符式数字显示模式,可在一个屏上显示年月日和时分秒信息;另一种是指针式模拟显示模式,可仿真指针式钟表显示时分秒信息。同时还设有红外遥控功能,可通过遥控器改变显示模式和调整时钟的时值。此电子钟严格按照要求设计,最终达到预期的效果,能够正确显示分秒的计时。
关键词:旋转时钟STC12C5A32S2单片机时钟芯片DS1302LED灯目录TOC\o"1-3"\h\u4020摘要 I51931绪论 1168441.1项目研究背景及意义 126631.2项目主要研究内容 2297862总体设计方案 314462.1系统总体方案设计 3192172.1.1电路结构图的设计 3129642.1.2电路原理图的设计 4317932.2总体方案设计及硬件指标 5180242.2.1方案论证 5153862.2.2方案比较与论证 5171983硬件设计 615113.1旋转指针板的设计 6175533.2时钟芯片DS1302 720543.3电源基板的硬件设计 10172754软件设计 11130674.1算法设计 1192814.2系统主程序设计 11245395系统调试 12211315.1硬件调试 12205905.2软件调试 12167956总结 13101156.1项目完成情况 1370886.2项目过程中心得体会 135870附录 15PAGEPAGE491绪论1.1项目研究背景及意义20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。但是,一旦重要事情,一时的耽误可能酿成大祸。目前,单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。下面是单片机的主要发展趋势。单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法。从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次革命。单片机模块中最常见的是数字钟,数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。数字钟是采用数字电路实现对时,分,秒数字显示的计时装置,广泛用于个人家庭,车站,码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。因此,研究数字钟及扩大其应用,有着非常现实的意义。1.2项目主要研究内容红外遥控器控制红外接收管,红外接收管接收信号,传给单片机处理信号,可以达到单片机对旋转时钟调时和复位。对类似旋转广告屏等装置进行调研,实现旋转时钟的设计与实现,并最终能够在班级应用。当它工作时,电机带动一排高亮LED绕电机轴旋转,LED灯在单片机控制下进行一定规则的显示,从而形成时钟的时针、分针和时间刻度,并按每分每小时走动,模拟出一个炫彩的时钟。2总体设计方案2.1系统总体方案设计旋转LED显示屏是通过一个旋转的电路板,电路板上排列的24个LED灯受单片机控制在特定的位置(传感器感应位置)亮或灭,从而显示出特定的字符或图形。本作品主要是根据人的视觉暂留原理设计的。采用高速旋转的电机带动电路板高速旋转,从视觉效果上就会产生一种圆盘状的LED显示屏的状态。旋转显示屏是利用机械转动动态扫描代替传统逐行扫描方式,是一种新型的显示屏,具有成本低,可视范围大的特点,是LED显示屏的一个新的发展方向。其实质就是与机械转动配合起来的动态扫描显示技术。本次“旋转LED显示屏”的制作用于提高我们的实践能力和创新能力,激发学生学习兴趣,引导自主学习及培养创新能力、协作精神、工程实践素质。本设计利用高速旋转中控制LED的亮灭,进行字符的显示,控制器采用单片机,完成显示内容的传输、字库的转换、显示等功能。动态扫描原理是利用人眼具有视觉暂留的特性,当画面以一定的速度刷新时,我们看到的就是连续的图像。例如:传统的逐点扫描方式,采用逐行换位的扫描方式,每一行都必须要有LED显示器件,这使显示屏成本偏大,功耗增加。旋转扫描采用了不同的形式,其显示器件只有一列,由机械旋转运行到某一位置时就显示该位置的状态,到下一位置后又显示下一位置的状态,即一列图像要完成全部图像的显示,扫描过程由机械转动更换位置来实现的。旋转LED显示的旋转显示,可采用机械旋转的扫描方式。2.1.1电路结构图的设计系统总体由软件和硬件两部分构成。硬件部分由单片机、DS1302时钟芯片、LED阵列、电源、旋转电机、绕线圈、红外接收管、红外遥控器组成。总体框图如下:图2-1系统整体方框图旋转时钟设计方案有八部分基本组成,首先由电源给电机供电,从而可以使电机旋转,这样可以让绕线圈耦合产生感应电压,就可以给旋转板供电,旋转板是以单片机为核心,有DS1302提供时钟信号脉冲。红外遥控器控制红外接收管,红外接收管接受信号,传给单片机处理信号,可以达到单片机对旋转时钟调时和复位。2.1.2电路原理图的设计图1.2.1主控板原理图2.2总体方案设计及硬件指标2.2.1方案论证人眼在观察景物时,光信号传人大脑神经,需经过一段短暂的时间,光的作用结束后,视觉形象并不立即消失,这种残留的视觉称“后像”,视觉的这一现象则被称为“视觉暂留”,其原因是由视神经的反应速度造成的,其时值是二十四分之一秒,通常情况下,视觉残留会保持0.1至0.4秒。也就是说以0.1至0.4秒间隔闪烁的图像,被人眼观察会被认为是连续的图像。视觉残留是动画、电影等视觉媒体形成和传播的根据。本次旋转LED可以归纳为动态扫描和机械旋转两部分其实质就是与机械转动配合起来的动态扫描显示技术。2.2.2方案比较与论证单片机、LED等电路必须安装在高速旋转的电动机上面,无法采用电线进行供电,使系统供电变得极为麻烦,常见的方法有2种。方案一:用电动机电刷的方法,简单有效;请注意:这样寿命很短,必要时请自行在电路板上加焊一层耐磨导电层,如果电刷触点不够光洁以及接触压力大,几小时就可以将线路板上的铜皮磨穿。方案二:直接用电池给主板供电,电池装在主板上随主板转动,成本高,寿命短,影响转速。综合以上2种方案的优缺点,我们选择了用电刷供电的方法,而DS1302芯片则用普通纽扣电池供电即可。电源基板主要负责为电机提供稳定的直流电,并通过电刷给指针板送电,是能源中心。虽然结构简单,但也是必不可少的一个环节,必须要保证电源稳定可靠。直接由+12V的变压器通过插孔给电路板送电,经电容及电位器后接直流电机。再经过7805降压稳压成+5V输出电压。3硬件设计3.1旋转指针板的设计指针板是旋转时钟的关键部分,负责显示功能,指针板上有一排超高亮的LED灯。它们就是显示部件了,亮点所在。为了制作方便,我们把单片机、时钟芯片、发光二极管、一体化红外接收头等器件焊接在一块指针型的电路板上,这样可以使旋转的电路成为一个独立的系统,只需要外部送电进来就可以正常运作。电路板中心钻一个电机轴插孔,插孔为半圆并且半径与电机轴相等,电机轴插入其中带动指针板旋转。该电路板越轻越好,LED灯可用贴片式。LED灯数目根据不同用处可选多选少,我们设计的时钟需要能显示“12、3、6、9”这四个整点数字和秒针、分针、时针,这样我们用6支LED灯显示数字,18支用来显示秒、分、时三针,另外再加一支内框一支外框灯,总共25支LED灯,也足够用来显示汉字和英文。在这个项目中,一共采用了25支LED。也就是说每一列上可以分辨的显示点有25个点。当然,这只是视觉上的显示效果。但为了节省单片机I/O管脚,并不是每支LED灯都由一个I/O管脚控制的。通过分析,发现靠近内圈的那十几支LED,除了用做显示时钟指针外,并不适合用来显示字符。而在显示指针时,这部分LED的亮灭是同时发生的,这样就可以用一个I/O口来控制这组LED,让它们是同时亮或者同时灭。除了以上几点外,需要考虑的还有显示稳定问题:比如指针板旋转扫描一圈完成了数字“12”的显示,如果电机速度因为各种原因而不稳定,转下一圈所用的时间多于(或少于)上一圈的,那么数字“12”将会移到上一次显示位置的左侧(或右侧)。为了解决这个问题,在指针板上加装一个红外接收管。当接收到与之配对的红外发光二极管(红外发光二极管安装在电机外壳上,并与接收管对齐)发出的红外线后,就会反向导通,接到单片机外部中断,将会触发外部中断。指针板每旋转一周,就会产生这样一个中断信号,这个信号被称为“过零信号”。有了这个信号,单片机就可以在指针板旋转过程中实时检测计算指针板的角度位置,并根据指针板所处的不同位置,点亮相应的LED,这样每转一圈就能消除一圈的误差,使得显示内容保持稳定。3.2时钟芯片DS1302大多数的单片机没有实时时钟部件,一旦系统掉电时钟就不能运行,下次再运行,时间就不准确了。即便使用备用电池,但要维持单片机系统的较大功耗也是坚持不了多久的。而我所做的旋转时钟用到的单片机主要是来准确显示时间的,因此实时时钟部件必不可少,这里我用了MAXIM公司的DS1302时钟芯片作为实时时钟部件,保证时间的长久准确性。DS1302有着很强的功能。包括时钟/日历寄存器和31字节(8位)的数据暂存寄存器,数据通信仅通过一条串行输入输出口。实时时钟/日历提供包括秒、分、时、日期、月份和年份信息。闰年可自行调整,可选择AM/PM的12小时制或24小时制。只通过三根线进行数据的控制和传递:CE(输入信号,在读、写数据期间,必须为高。该引脚有两个功能:第一,CE开始控制字访问移位寄存器的控制逻辑;其次,CE提供结束单字节或多字节数据传输的方法。);I/O(三线接口时的双向数据线);SCLK(串行时钟输入)。通过备用电源可以让芯片在小于1MW的功率下运作。对时钟寄存器初始化可以设定当前时间,控制芯片的运行,时间是用BCD码保存的,RAM可以用来存取用户数据,在用了备用电池后RAM内的数据在系统掉电时能够保持不丢失。芯片采用了简单的I2C三线通信方式,便于节省芯片资源和与之接口的MCU的引脚。芯片有着2.0~5.5V的宽供电电压范围,在5V供电时其接口与TTL电平兼容。并且有着很低的功耗,在2.0V供电时仅耗300nA的电流。引脚X1和X2连接32.768kHz晶体,与内部振荡器组成时钟。晶体的精度直接影响着芯片时间的准确与否。DS1302有两个电源引脚VCC1和VCC2,分别连接备用电池和电源VCC。VCC2与主电源连接,VCC1接备用电池。当VCC2低于VCC1时,芯片由VCC1供电;当VCC2-VCC1≥0.2V时,备用电池为芯片供电。在VCC2供电时芯片能够对接在VCC1的备用电池充电,并且是否充电和充电电流都可以由芯片内地址为08H的时钟寄存 器进行控制。DS1302与单片机的硬件接线图如下图所示。图3.2.1DS1302硬件接线图在进行任何数据传输时,CE必须被制高电平(虽然CE被置为高电平,但内部时钟还是在晶振作用下不停地计时的),在每个SCLK上升沿时读入数据,下降沿时写出数据。每个字节的传输都是由控制字节(如表1所示)指定的,控制字节的最高位Bit7必须是“1”,否则读写将会被禁止。bit6为“0”则指定对时钟/日历寄存器进行读写操作,为“1”则对RAM区的数据进行读写操作,bit1-bit5指定相关寄存器进行输入输出操作,最低位bit0指定是输入还是输出,为“0”则为写,相反则为读,输入输出根据脉冲的上升沿和下降沿串行进行。765432101RAM/用来表示相关寄存器的地址RD/表3.2.2DS1302控制字节控制字总是从最低位开始输出。在控制字指令输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从最低位(0位)开始。同样,在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据,读出的数据也是从最低位到最高位。数据读写时序如图3.2.3所示。图3.2.3DS1302数据读写时序通过8个脉冲便可读取一个字节,从而实现串行输入与输出。最初通过8个时钟周期载入控制字节到移位寄存器。如果控制指令选择的是单字节模式,连续的8个时钟脉冲可以进行8位数据的读写操作。8个脉冲便可读写一个字节。载入控制字节后就可以对时钟/日历寄存器进行相应操作,时钟/日历寄存器如下表所示。读寄存器写寄存器BIT7BIT6BIT5BIT4BIT3BIT2-BIT0范围81h80hCH16-59秒0-15秒00-5983h82h16-59分0-15分00-5985h84h12020-2315-19时0-15时1-12/0-23/PM87h86h00016-31日0-15日1-3189h88h00010月月1-128Bh8Ah000001-7周1-78Dh8Ch015-99年0-15年00-998Fh8EhWP0—秒寄存器(81h、80h)的位7定义为时钟暂停标志(CH)。当该位置1时,时钟振荡器停止,DS1302处于低功耗状态;当该位置为0时,时钟开始运行。小时寄存器(85h、84h)的位7用于定义DS1302是运行于12小时模式还是24小时模式。当为高时,选择12小时模式。在12小时模式下,位5为1时,表示PM。在24小时模式时,位5是第二个10小时位(20-23时)。控制寄存器(8Fh、8Eh)的位7是写保护位(WP),其它7位均置为0。在任何的对时钟和RAM的写操作之前,WP位必须为0。当WP位为1时,写保护位防止对任一寄存器的写操作。3.3电源基板的硬件设计电源基板主要负责为电机提供稳定的直流电,并通过无线供电技术给指针板送电,是能源中心,如图3.3.1所示。虽然结构简单,但也是必不可少的一个环节,必须要保证电源稳定可靠。图3.3.1电源基板硬件4软件设计4.1算法设计本项目的算法设计主要分5大独立模块,即:DS1302时钟配置及显示模块、红外一体化接收模块、字模存储模块以及串口传输模块和EEPROM模块(接收串口发送的字模)。4.2系统主程序设计主程序的设计是为了完成系统的初始化,建立各个独立模块间的相互调用和配合使用,实现LED旋转时钟设计的功能。主程序的设计可用下图遥控器各按键功能来形象地描述。5系统调试 经过详细地理论分析和设计后,开始制作硬件电路,边制作边进行硬件调试,这样有利于问题的分析和解决,不会积累错误,也不会因为一个小问题而大动干戈。软件编程中,首先对单元功能模块进行调试,然后再对整个系统进行调试,基本和硬件调试差不多。5.1硬件调试1.发光二极管的调试。焊好36支LED灯和对应电阻,给板子上电,分别使每个LED的阴极接地,发现36支LED灯都能正常点亮和熄灭。2.红外对管的调试。给发射管接限流电阻并上电,去对准焊在板子上的红外接收管,用电压表测试其阴极,为低电平,移开后为高电平,工作正常。3.电源驱动调试。电刷制作完成后,将LED灯都接地,并给电机和电刷都上电,指针板开始旋转,并且LED灯都能点亮,电刷供电成功。4.红外接收管调试。调用红外按键程序,若LED灯能按预先设置的按键对应配置显示,说明红外接收管工作正常。5.2软件调试基本上排除了系统硬件故障后,就进入软件的调试阶段,这个阶段主要完成排除软件编程上的错误,同时也能发现硬件遗留的问题,本系统采用C语言编程,主要有DS1302时钟配置及显示模块、红外一体化接收模块、字模存储模块以及串口传输模块和EEPROM模块(接收串口发送的字模),每一部分都独立调试。调试过程充分利用了调试软件中单步、断点、设置观察项等调试手段,主要针对程序跳转错误、变量声明及函数调用错误等,具体调试不在此说明。6总结6.1项目完成情况1.立体显示旋转字(通过“暂停按键”进行静态与移动显示,读取的EEPROM中数据)
2.平面显示数字时钟年月日星期(时钟可调时钟芯片用DS1302带后备电池掉电时钟继续走)
3.平面显示模拟表盘时钟(如果表盘不全或者过多显示请按配套的遥控器"快进"或者"快退"来调整单列显示时间设置后参数保存到DS1302RAM)
4.平面显示字体模式通过“暂停按键”进行静态与移动显示(读取的EEPROM中数据)
5.立体加平面显示(代码中配置的数组存放的固定字模)
6.两颗心闪动
7.一颗心填满效果
8.笑脸动画
9.打印字效果
上述9种效果对应遥控器按键1、2、3、4、5、6、7、8、9时钟复位按键“Meun”6.2项目过程中心得体会以上的设计只是实现了利用旋转的LED和视觉残留的作用,完成时钟的显示部分。除此以外,还有许多部分需要改进和补充,才能实现一个最基本的时钟功能。例如,精确的时间计算的功能没有被加入到设计中,也就是说,该时钟无法保证输出时间的可靠性,时间误差可能达到数分钟之久。由于制作的这个旋转LED时钟只是实验性质,目的是实现旋转LED的显示功能,所以没有对这个细节进行考虑,但是在实际应用中这个缺陷对于时钟来说是一个致命的缺陷。此设计也可使用无线通信的方式,会在时钟高速旋转时进行时间的设定和调整。方案的优点是,操作方便,缺点是需要在原系统中增加无线通信模块,大大增加了整个时钟的成本和设计的复杂性。因此我在该设计中采用的是在电机旋转轴附近增加电刷,把设定和调整时间的数据线通过电刷引导到高速旋转的电路板上。该方案同样操作方便,但是缺点也很明显,增加了额外的电刷,整个系统噪音增加,摩擦的电刷容易损坏,而且传递的数据无法保证信号能够良好的传导至单片机,很容易出现错误信号。时间的设定和调整问题还没有比较好的解决方案,尚待进一步考虑。通过这段时间的设计,终于完成了旋转电子钟的设计,虽然在做的时候遇到一些困难,但经过一翻很大的努力也完全达到设计要求的。 这次设计真的让我长进了很多,单片机的设计重点就在于软件程序的设计,需要有很巧妙的编程方法,在编程时,由于粗心大意马虎,有些语句看似没问题,可就是不出效果,经仔细揣摩修改后,程序才正常运行。学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高。 从这次的设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,理论指导实践,在实践中对理论知识加以理解。我所设计的这个旋转时钟仅仅是显示了要求的功能,尚有很多不足的地方,以后我可以考虑改进一下,使它的功能更加完善。在此感谢老师和同学们的帮助和指导!附录附录一:项目源代码#include"NEW_8051.H"#include"task.h"#include<stddef.h>sbitLed1=P3^0;//最里面LEDsbitLed2=P3^1;sbitLed3=P3^4;ucharDelay=1;bitBIT_timeout=0;uintuitime=0;datauintuiicount=0;uintuiCountFontNumber=0;ucharucMode=2;datauintuiicountTwo=0;ucharBuffCount=0;ucharucPCA0_TimeCount;datauintuiBaseAddress=0;datauintuiFontNumber=0;datauintuiFontNumber_P=0;dataucharucNumRows=224;//定义一周显示字个数一个字16列224/16=13个字dataucharucNumRows_p=128;ucharDelayTimeCount=0;bitStop_move=0;ucharMod=0;ucharBuff[448]=0xFF;ucharucLine_count=0;ucharRow;uchari=0;ucharj=0;uchark;ucharStop_time=0;ucharucline=0;bitbDot=0;ucharcodesw[8]={0XFE,0XFC,0XF8,0XF0,0XE0,0XC0,0X80,0X00};//ucharcodesw2[8]={0X01,0XC0,0XE0,0XF0,0XF8,0XFC,0XFE,0XFF};/***************模拟表盘变量**************/uintDISP_LINE=0;ucharDISP_LINE_ADJ=0;ucharDISP_TIME_ADJ=0;//ucharTime0_count=0;//====参数初始化ucharDISP_TIME_SET;//单列显示时间设置值/********************************************//*********延时子程序**********/voiddelay(unsignedcharn) //每列显示的时间{ unsignedchara,b,c; c=2;//+DelayTimeCount; for(;n>0;n--) { for(b=65;b>0;b--)for(a=c;a>0;a--); }}/*********PCA中断子程序**********/voidPCA()interrupt7 //PCA定时器{ if(CCF0) { CCF0=0; CL=0; CH=0; ucPCA0_TimeCount++; if(ucPCA0_TimeCount>12) { ucPCA0_TimeCount=0; //调时闪烁 if(ucMode==2) { flag=~flag; } elseif(ucMode==3) { du1302();//获取时间 Sec=59-(Sec/16*10+Sec%16);//由于电机反转所以需要用最大值减去当前值 Cent=59-(Cent/16*10+Cent%16); Hour=Hour/16*10+Hour%16; if(Hour>11) { Hour=Hour-12; } Hour=12-Hour; Sec=Sec*3;//秒针定位="秒"*3 Hour=(Hour*15)+(Cent/4);//时针定位="时"*15+"分"/4 Cent=Cent*3;//分针定位="分"*3 } } }}/************************************/voidTimer0Interrupt(void)interrupt1{ ucharDISP_TIME; TF0=0; TR0=0; DISP_TIME=DISP_TIME_SET; TH0=(65536-DISP_TIME)/256; TL0=(65536-DISP_TIME)%256; TR0=1;//if(++Time0_count>250)Time0_count=250;//溢出计数器+1,>最大值,=最大值if(++DISP_LINE>180)DISP_LINE=0;//显示列计数器+1,>最大值,=0 /***********清空显示************/ P1=0XFF; P0=0XFF; Led1=0; Led2=1; Led3=1; /*************形成表盘*******************/ switch(DISP_LINE){ case180*1/12://1点 case180*2/12://2点 case180*4/12://4点 case180*5/12://5点 case180*7/12://6点 case180*8/12://7点 case180*10/12://10点 case180*11/12://11点 P1=0x7F; break; case180*3/12://3点 case180*6/12://6点 case180*9/12://9点 P1=0x3F; break; case0://12点 P1=0x1F; break;}/****************************************/ //显示指针"时" if(((Hour-3)<=DISP_LINE)&&((Hour+3)>=DISP_LINE)) { if(((Hour-2)==DISP_LINE)||((Hour+2)==DISP_LINE)) P0=0XFB; elseif(((Hour-3)==DISP_LINE)||((Hour+3)==DISP_LINE)) P0=0XFD; } if(Hour==DISP_LINE)//||(DISP_LINE==i)||(DISP_LINE==j{P1=P1|0X1F;P0=0XF0; Led1=0; Led2=0; Led3=0;}//显示指针"分" if(((Cent-2)<=DISP_LINE)&&((Cent+2)>=DISP_LINE)) { if(((Cent-1)==DISP_LINE)||((Cent+1)==DISP_LINE)) P0=0XBF; elseif(((Cent-2)==DISP_LINE)||((Cent+2)==DISP_LINE)) P0=0XDF; } if(Cent==DISP_LINE){P1=P1|0X1F;P0=0X00;Led1=0; Led2=0; Led3=0; } //显示指针"秒" if(((Sec-2)<=DISP_LINE)&&((Sec+2)>=DISP_LINE)) { if(((Sec-1)==DISP_LINE)||((Sec+1)==DISP_LINE)) P1=P1&0XF7; elseif(((Sec-2)==DISP_LINE)||((Sec+2)==DISP_LINE)) P1=P1&0XFB; }if(Sec==DISP_LINE){P1=P1&0XE0;P0=0X00; Led1=0; Led2=0; Led3=0;} //}}/*********中断子程序**********/voidint0()interrupt0 //使用外部中断0{ EX0=0; BIT_timeout=1; if(ucMode==0x03) { DISP_LINE=0;//DISP_LINE_ADJ;//DISP_LINE_ADJ;//显示列计数器(0~179)=校正值 } EX0=1; }/********************************/voidstart(void){ P1=0XFF; P2=0XFF; P0=0XFF; P3=0XFF; P4=0XFF; P5=0XFF;// uiFontNumber=(byte_read(0x0100)<<8)+byte_read(0x0101); uiFontNumber=((byte_read(0)<<8)+byte_read(1))*16;//读取EEP立体数据总数 uiFontNumber_P=((byte_read(0x3600)<<8)+byte_read(0x3601))*16;//读取EEP平面数据总数}/***************************************/voidOS_ALLRun(void){ //BIT_timeout=1; if(BIT_timeout)//起始点 { BIT_timeout=0; if(new_code)//有红外按键 { new_code=0; //Send_data(key_code); switch(key_code)//根据不同的按键值执行不同的动作 { case0x07: if(ucMode==3) { if(DISP_TIME_SET<250) { DISP_TIME_SET++; //write_1302Data(DISP_TIME_adder,DISP_TIME_SET);//写入DS1302RAM中保存 } } else { DelayTimeCount++;//单列延时时间+ } break; case0x09:// if(ucMode==3) { if(DISP_TIME_SET>80) { DISP_TIME_SET--; //write_1302Data(DISP_TIME_adder,DISP_TIME_SET);//写入DS1302RAM中保存 } } else { if(DelayTimeCount>0)//单列延时时间- DelayTimeCount--; } break; /*********************************/ case0x0C: ucMode=0x01;//立体显示字移动效果+静态显示 CR=0; TR0=0; uiCountFontNumber=0; break; case0x1C: ucMode=0x05;//立体显示字下拉效果+静态显示 CR=0; TR0=0; Led3=1; uiCountFontNumber=0; break; case0x5A: ucMode=0x06;//立体显示简单动画 CR=0; TR0=0; uiCountFontNumber=0; break; case0x42: ucMode=0x07;//立体显示心型变化 CR=0; TR0=0; uiCountFontNumber=0; break; case0x52: ucMode=0x08;//笑脸变化 CR=0; TR0=0; uiCountFontNumber=0; break; case0x4A: CR=0; TR0=0; uiCountFontNumber=0; ucMode=0x09;//打印字效果 ucLine_count=0; break; case0x18: TR0=0; CR=0; Auto_Set1302(starts_time); ucMode=0x02;//数字钟模式 break; case0x5E: DISP_TIME_SET=R1302(DISP_TIME_adder+1);//读取单列显示时间 if((DISP_TIME_SET>250)||(DISP_TIME_SET<80))//防止值过大 过小 { DISP_TIME_SET=170; } ucMode=0x03;//指针时钟模式 TR0=1; CR=1; Led1=0; break; case0x08: ucMode=0x04;//平面显示字模式 CR=0; TR0=0; break; /*********************************/ case0x40: //调时加 if(ucMode==0x02) { Set(id,1); } elseif(ucMode==0x03) { if(++DISP_LINE_ADJ>179) //盘面校正值 { DISP_LINE_ADJ=0; } write_1302Data(LINE_ADJ_adder,DISP_LINE_ADJ);//写入DS1302RAM中保存 } break; case0x19://调时减 if(ucMode==0x02) { Set(id,0); } elseif(ucMode==0x03) { if(--DISP_LINE_ADJ==0)//盘面校正值 { DISP_LINE_ADJ=179; } write_1302Data(LINE_ADJ_adder,DISP_LINE_ADJ);//写入DS1302RAM中保存 } break; case0x15://调时切换 if(ucMode==2) { id++; //CCAPM1=0x49;//开PCA0中断 //CCAPM0=0x00;//关PCA1中断 CR=1;//启动PCA计数 if(id>5) { id=0; CR=0;//关闭PCA计数 // CCAPM0=0x00;//关PCA0中断 } }// elseif(ucMode==3)// {// write_1302Data(DISP_TIME_adder,DISP_TIME_SET);//写入DS1302RAM中保存 // } elseif((ucMode==4)||(ucMode==5)||(ucMode==1)) { Stop_move=~Stop_move; } break; case0x47://时钟初始化 Set1302(starts_time);//初始化 W1302(0x8e,0x00);//控制命令,WP=0,写操作 W1302(0x90,0xa5);//打涞二级?一个二级管串联一个2K玷 write_1302Data(DISP_TIME_adder,170); break; default:break; } key_code=0; } //DelayTime=TimeCount/(ucNumRows+60); //TimeCount=0; //延时周期计数清零 switch(ucMode) { case0x01://立体显示字移动模式 //uiCountFontNumber++; Led3=1; if(Stop_move==0)//是否暂停移动 { uiCountFontNumber++; } if(uiCountFontNumber>uiFontNumber)//uiFontNumber { uiCountFontNumber=0; } for(uiicount=uiCountFontNumber;uiicount<ucNumRows+uiCountFontNumber;uiicount++) { P2=byte_read(2+uiicount*2);//读取内部EEPROM字幕数据数据在2地址后所以要加上2 P4=byte_read(2+uiicount*2+1); P5=byte_read(2+uiicount*2+1)>>4; delay(1); P2=P4=P5=0XFF; if(BIT_timeout) { break; } } break; case0x05: j++; if(j>448)//根据显示的字数定义改数值768/16=48个字显示完48个字后重新开始 { j=0; } //由于半径问题平面显示一列立体要显示两列才够平衡不然立体的字很宽 for(i=j;i<112+j;i++)//每转一圈前进一列这里定义一圈中同时显示96/16=6个字, {//在这个程序中如果此参数设置过大会造成头吃尾的后果,如果过少盲点又会太大 //所以比较麻烦要根据电机速度来调整此参数 P1=love[i*2];//字幕数据低位送显示 P0=love[i*2+1]; //字幕数据高位送显示//这里行和列都是IO口独立驱动的LED P2=zimo[i*4];//送数据低位显示 P4=zimo[i*4+1];//送数据高位显示 这里用了单片机P4和P5口是LQFP48脚才有的 P5=zimo[i*4+1]>>4;//这里行和列都是IO口独立驱动的LED delay(1); //延时让LED亮起来每列延时的时间 P4=P5=0XFF; P2=zimo[i*4+2];//送数据低位显示 P4=zimo[i*4+3];//送数据高位显示 这里用了单片机P4和P5口是LQFP48脚才有的 P5=zimo[i*4+3]>>4;//这里行和列都是IO口独立驱动的LED delay(1); //延时让LED亮起来每列延时的时间 P2=0XFF; P4=P5=0XFF; P1=0XFF; P0=0XFF; } break; case0x06://立体显示两颗心动画 for(k=0;k<4;k++) { for(uiicount=0;uiicount<32;uiicount++) { P2=Buff[uiicount*2]; P4=Buff[uiicount*2+1]; P5=Buff[uiicount*2+1]>>4; delay(2); P2=P4=P5=0XFF; if(BIT_timeout) { break; } } } for(k=0;k<32;k++) { Buff[k*2]=flash[uiCountFontNumber+k*2]; Buff[k*2+1]=flash[uiCountFontNumber+k*2+1]; } if(++Row>=8) { Row=0; uiCountFontNumber+=64; if(uiCountFontNumber>=192) {uiCountFontNumber=0;} } break; case0x07://立体显示心形动画 for(k=0;k<4;k++) { for(uiicount=0;uiicount<32;uiicount++) { P2=Buff[uiicount*2]; P4=Buff[uiicount*2+1]; P5=Buff[uiicount*2+1]>>4; delay(2); P2=P4=P5=0XFF; if(BIT_timeout) { break; } } } for(k=0;k<32;k++) { Buff[k*2]=xinxing[uiCountFontNumber+k*2]; Buff[k*2+1]=xinxing[uiCountFontNumber+k*2+1]; } if(++Row>=8) { Row=0; uiCountFontNumber+=64; if(uiCountFontNumber>=576) {uiCountFontNumber=0;} } break; case0x08://立体显示笑脸动画 for(k=0;k<4;k++) { for(uiicount=0;uiicount<32;uiicount++) { P2=Buff[uiicount*2]; P4=Buff[uiicount*2+1]; P5=Buff[uiicount*2+1]>>4; delay(2); P2=P4=P5=0XFF; if(BIT_timeout) { break; } } } for(k=0;k<32;k++) { Buff[k*2]=xiaolian[uiCountFontNumber+k*2]; Buff[k*2+1]=xiaolian[uiCountFontNumber+k*2+1]; } if(++Row>=15) { Row=0; uiCountFontNumber+=64; if(uiCountFontNumber>=256) {uiCountFontNumber=0;} } break; case0x09://打印字效果 for(uiicount=0;uiicount<176;uiicount++) { P2=Buff[uiicount*2]; P4=Buff[uiicount*2+1]; P5=Buff[uiicount*2+1]>>4; delay(1); P2=P4=P5=0XFF; if(BIT_timeout) { break; } } ucline=0; for(k=0;k<176;k++) { if(k<ucLine_count) { Buff[k*2]=qinaide[uiCountFontNumber+k*2]; Buff[k*2+1]=qinaide[uiCountFontNumber+k*2+1]; } elseif(k<(ucLine_count+16)) { if((bDot==1)&&(ucLine_count==160)) { Buff[k*2]=0XFF; Buff[k*2+1]=0XFF; } else { Buff[k*2]=line[ucline++]; Buff[k*2+1]=line[ucline++]; } } else { Buff[k*2]=0XFF;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 六一活动校庆活动方案
- 六一社区特色活动方案
- 六一童谣活动方案
- 六一自助餐活动方案
- 六一节活动小糖果活动方案
- 六一诗词小班活动方案
- 六一送小神兽活动方案
- 六一黏土手工活动方案
- 六安全民健身活动方案
- 医师考试试题及答案
- DB33T 2320-2021 工业集聚区社区化管理和服务规范
- CISA国际注册信息系统审计师认证备考试题库(600题)
- 突发事件应急预案管理办法
- 骨与关节感染 邱贵兴-教学课件幻灯
- 建筑施工与组织 江苏开放大学考试资料
- DB4403T508-2024生产经营单位锂离子电池存储使用安全规范
- iso28000-2022供应链安全管理手册程序文件表单一整套
- 校园开展安全生产课件
- 成都市绿色建筑施工图设计与审查技术要点及附表(2024版)
- 2024年广东省广州市中考化学真题卷及答案解析
- 乳腺超声检查和乳腺癌筛查
评论
0/150
提交评论