《led旋转显示器.docx》由会员分享,可在线阅读,更多相关《led旋转显示器.docx(24页珍藏版)》请在课桌文档上搜索。
1、题目:基于51单片机的1.ED旋转显示器1.ED旋转显示器的设计摘要1.ED旋转显示器时基于视觉智留原理,开发的一种旋转式1.ED显示屏。其在具有肯定转速地数体上安装16个1.ED发光泯件,各1.ED发光管等间距持位一条直线,随着旋转速度的加快,在计算机软件精确的时序限制3不断扫描出预设的文字,图案等。运用一个光耦(U型槽的红外对管)作为定位传感器,当旋转一周时,挡光板遮挡光源,光敏三极管的集电极输出高电平,当离开挡光板时,集电极再次输出低电平,从而给单片机一个下降沿的跳变型号,产生一个中断,从而更新显示。供电部分,因为整个装置是在不停的高速旋转当中,所以我们做了一个简洁的电刷装置,把220V
2、的沟通电通过变压器变成12V的沟通电,再由柝式整流电路,和漉波电路,变为平滑的直流电,最终通过7805芯片输出我们须要的5V直流电源,通过电刷把电源和指针板上的单片机连接为其供电.而旋转载体因为须耍12V的电压源,所以采纳分别供电的方式.关键字I1.ED,视觉笆留,直流电机,桥式整潦,旋转。MIi1 1.EDlt转显示实际中的意义I2显示理23系或硬件电路的设计31.1 系统便件假图31.2 系统硬件原理图31.3 光耦传IMk模块的设计41.4 量控模块的设计41.5 显示球的设计71.6 电源球的设计71.7 指针板的制作94程序的设计104.1 期设计的分析104.2 各模块程序的流程图
3、及功能说明Il函数部分Il4.2.2.外部中断0服务程序部分(voidINTOO(void)interrupt0)Il,定时器TO中断服务程序(VOidkjp_tcst(void)interrupt1)12.定时器TI中断服务程序(voidTieUOjiointerrUPt3)1243完叠的C程序135作品的改进216.1迷拄舞部分215.2时芯片的部分2111.ED旋转显示器在实际中的意义1.ED的特点特别明显,寿命长、光效高、无辐射及低功耗.1.ED的光谱几乎全部集中于可见光频段,其发光效率可达8090%.将1.ED及一般白炽灯、螺旋节能灯及T5三基色荧光灯进行对比,结果显示:般白炽灯的光
4、效为12E/W,寿命小于2000小时,螺旋节能灯的光效为60hnIT,寿命小于8000小时,T5荧光灯则为961m八,寿命大约为】OoOO小时,而直径为5亳米的白光1.ED为20281mW,寿命可大于100oOO小时。有人还预料,将来的1.ED寿命上限将无穷大.由于1.ED的种种优势,使得其在现在的各个领域里运用越来越广泛,我们设计的旋转1.ED显示屏幕,具有结构新奇,节约材料的特点,列16个1.ED灯旋转显示之后,可以代替显示近似于16x180像素的显示宽度和内容,我想以后不断完善和改进之后应当可以在灯箱广告和儿童玩具方面有肯定的发展空间。2显示原理旋转时钟是利用视觉暂留效应设计出来的,物体
5、在快速运动时,当人眼所看到的影像消逝后,人眼仍能接着保留其影像0.10.4秒左右的图像,这种现象被称为视觉暂留现象。是人眼具有的一种性质。人眼观看物体时,成像于视网膜上,并由视神经输入人脑,感觉到物体的像。但当物体移去时,视神经对物体的印象不会马上消逝,而要持续OJ-0.4秒的时间,人眼的这种性质被称为“眼睹的视觉暂留”。假设我们设定我们的眼睛的暂留时间是0.4杪,假如我们的16个1.ED旋转一周的时间快过0.4杪,那么我们看到的图像就是这一列1.ED在各个位置显示的图像的叠加,如右图,假如我们用定时器把1.ED旋转一周的各个位置分割出180分,让它在相应的位置显示相应的图像,那么我们就可以得
6、到一个累加的图像效果了。3.1系统硬件框图系统硬件框图右图所示。3.2系统硬件原理图系统硬件原理如卜图所示。3.3光耦传感器模块的设计输出高电平,当光敏:.极管再次感应到红外光源的时候,集电极再次输出低电平,从而给单片机一个中断信号。3.4遥控模块的设计3.4.1.遥控接收硬件部分遥控模块部分,我们选择了一个市面上最常见的一种红外遥控接收头,把它的信号引脚干脆接在单片机的外部中断1的借口上(P3.3),然后,遥控器,我们用了一个以前用的Q)播放器的个遥控器。接收头如图3.4.2.遥控编码特点我们采纳的遥控器是脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合
7、表示二进制的“0”:以脉宽为0.565ms、间隔1.685ms、周期为2.25InS的组合表示二进制的“1”,其波形如图2所示。1.125msbk-4rjj56msgi-,:2.25ms图2遥控码的“0”和“1”上述“0”和“1”组成的32位二进制码经38kHz的载频进行二次调制以提高放射效率,达到降低电源功耗的目的。然后再通过红外放射二极管产生红外线向空间放射,如图3所示,连发波形如图4所示。引9“IJHPwart:jMrws:*np然他科(应3)3遥桂信号编码波形用OB4逡依信号的mIlV怜波影hiITD6121G产生的遥控编码是连续的32位二进制码组,其中前16位为用户识别码,能区分不同
8、的电器设饴,防止不同机种遥控码相互干扰。该芯片的用户识别码固定为十六进制01H:后16位为8位操作码(功能码)及其反码。UPD6I21G最多额128种不同组合的编码。当遥控器在按键按下后,周期性地发出同一种32位二进制码,周期约为108ms。一组码本身的持续时间随它包含的二进制“0”和“1”的个数不同而不同,大约在4563ms之间,图4为放射波形图.当一个键按下超过36ms,振荡罂使芯片激活,将放射组108ms的编码脉冲,这108ms放射代码由一个起始码(9ms),一个结果码(4.5ms),低8位地址码(9ms18ns),高8位地址码(9ms18三s),8位数据码(9ms18ms)和这8位数据
9、的反码(9ms18ms)组成.假如键按下超过108ms仍未松开,接下来放射的代码(连发代码)将仅由起始码(9ms)和结束码(2.5ms)组成。代码格式(以接收代码为准,接收代码及放射代码反向)位定义:yMg单发代码格式连发代码格式2Jm3.4.3.遥控解码解码的关键是如何识别“0”和un,从位的定义我们可以发觉“0”、“1”均以0.56InS的低电平起先,不同的是高电平的宽度不同,“0”为0.56ms,“1”为1.68ms,所以必需依据高电平的宽度区分“0”和“1”。假如从0.56ms低电平过后,起先延时,0.56ms以后,若读到的电平为低,说明该位为“0”,反之则为“1”,为了牢靠起见,延时
10、必需比0561ns长些,但又不能超过1.12ms,否则假如该位为“0”,读到的已是卜.一位的高电平,因此取(1.12ms+0.56ms)/2=0.84ms最为牢靠,一般取0.84ns左右均可。依据码的格式,应当等待9ms的起始码和4.5ms的结果码完成后才能读码。3.5显示模块的设计1.ED显示器具有功耗低,接口限制便利等优点,而且模块的接口信号和操作指令具有广泛的兼容性,并能干脆及单片机接口,可便利地实现各种不同的操作,在各类测量及限制仪表中被广泛的应用。当在1.ED上显示汉字时,应先取得汉字的点阵构成数据,然后珞其写入显示存储器中进行显示.旋转1.ED显示器是一种通过同步限制发光二极位置和
11、点亮状态来实现图文显示的新型显示器,其结构新奇,成本低廉,可视角度达360。本设计采纳16个并排发光二极管,利用人眼的“视觉暂留效应”显示文字及图案。显示模块如图1.8所示。图1.8显示模块框图3.6电源模块的设计电网供应的沟通电源经过整流、港波,可得到直流电压,但此电压仍旧存在水纹.同时,由于沟通电网电压的波动,负载的改变和温度的影响等,使输出电压纹波会更大,即输出电流电压不稳定。为了得到稳定的输出电压,在港波电路及负载之间经常加入稳压电路,以使负载得稔定的输出电压.通过上面的分析可知,直流稳压电源主要由变压器、整流电路、港波电路和检压电路四大部分组成。直流稳压电路组成框图如图1.lO所示。
12、再经过泄波电路成为比较平稳的直流电压,最终通过7805稳压成辘出稔定的5V直潦电.7805引脚图如图1.12所示。O_)OUPu1-JGROUXD/UittjUI图1.127805引脚图对于7805三端,稳压IC,它和其它78XX一样,都属于+V电压稳压输出链路.其I脚为输入端,2脚接地,3脚稳压输出。7805是正电压三端固定朝K器集成电路,属于线性稳压器件。7806应用特别广泛,在各种稔压电源、充电器、家电等产品中均有运用.主要参数:最高输入电压:36V最大输出电流:1.5A1.输出电压偏差:典型=5V:最低=4.75V:最高=5.25V0工作温度范围:070t。3.7指针板的制作3.7.1
13、.指针板,由于为了使指针板的体积减小,削减飞线的发生,所以指针板,我们选择用PoRTE1.99SE设计,然后用手工制作PCB板的方式制作。首先我们在PORTE1.99SE软件上设计出原理图的PCB文件,然后,把它的顶层信号层和底乂信号层分别打印到光华的不干胶纸上面,如图A.3.7.2.将打印好的不干胶纸两面的各个过孔对齐,然后把清洗干净且剪裁大小合理的双面覆铜板夹在两张不干胶纸之间,然后用电熨斗压在上面加热转印,让附着在不干胶纸上面的碳粉完全受热溶化后转印到双面覆铜板上面。如图瓦3.7.3.然后把转印好的覆铜板放入:.氯化铁溶液中腐蚀,三纸化铁溶液会把没有碳粉的全部铜箔都腐蚀掉,留下仃碳粉的部
14、分,就是PCB的信号线路图了,腐蚀过程图如图Q3.7.4.等待的时候可以不停的摇撰容器,加速腐蚀过程,等到把全部没有被铜的部分全部腐蚀之后,不覆铜板拿出溶液清洗,然后剪裁掉多余的部分,打孔之后就可以焊接元件r见D图.4程序的设计4.1程序设计的分析程序部分刚刚起先想了很久都没有想到上面好的方法,后来,还是确定去网络上找找资料,看了许多程序后,终于有了点自己的感悟,最让人头疼的是,用上面方法把电机转一周的各个位置分成360分来送显示,看到有的人说“先测得电机转一周的时间,然后除以360就行了”,但是我觉得这样做苜先在程序上比较难实现,而且这样还有一个问期就是,假如这样,那么我们显示的标准总是以前
15、面一周的转速为基准的。不太科学,放弃了。后来又看到个方法,他们是把程序写好之后不停的拆卸调试,知道用来限制显示的总段服务程序的初值也许让其显示稳定就把初值固定下来,这样做,首先我想到,假如电机转速时快时慢,那么显示的字或者图案就会被拉长或者压段,而且这样我也不能!正很精确的吧一周分成360个显示单位,还是不科学,再次放弃了。后来反复思索,终于找到一个解决这个问题的好方法。通过思索.我发觉须要让1.ED的闪亮频率及旋转的频率同步,所以采纳了自适应的算法,自适应调整的算法的思想就是在外部中断处理程序里,先给定时潘TO一个合适的初始值,通过定时器TO处理程序给To的中断的次数计数,当旋转一周完成后,
16、依据实际中断次数及硕设的N比较,依据比较结果,在外部中断处理程序中对TO的初设值进行修正,直到定时器TO的中断次数达到N为止。如此来就犹如有一个反馈信号样,在不停的反馈的调整定时器的初值,旋转一周所产生的终端次数始终保持在我设定的一个值里面,这样我就可以很便利的设定在某一个位置显示上面类容了,而且整个调整过程是动态的,程序中并不须要知道旋转一周的具体时间值。算法用了个很简洁的数学公式:D=D+(S-N)其中N为预设的固定值.当SN时,修正值D增大,使定时器TO的时间倘增大,随之N值减小。当SN时,修正值D减小,使定时器TO的时间值减小,随之N值增大。当S=N时,修正值不产生改变。附上也许的自适
17、应算法的框架:/*外部中断0处理函数*/voidintersvrO(voil)interruptOusing1D=D+(S-N)*2:Pt=Pt+D;S=0;修正值得到定时器TO的初设值/计数曙清零,将重新计数/*定时中断0处理函数*/voidtimerO(void)interruptIusingI(THO=-Pt/256:T1.0=-Pt%256;/设置定时器TO的初设值S+:计数这样一来,显示稳定的问题解决了,但是这个定时器TO因为初值时不确定的,所以不能再用它作为时间跳动的定时器计数了,因此时间的逻辑要用Tl单独来实现。4.2各模块程序的流程图及功能说明4.2.1.MAIN函数部分Mai
18、n函数主要是用来初始化件个函数,然后进入空指令的死循环,这样来等待其他中断的来临,显示部分在中断服务程序中实现,参看右流程图K=K-(S-180)?e芟际一周尸IfcaORWt次数%位on匕蚊.Je21.E建gnBif*Iw因为上面的To的初值不是固定的,所以我们不能再运用TO用做时间运行的标准,要时常间会时快是慢,所以这里我们运用了Tl作为时间的运行标准,我们给Tl的定时为20亮秒,当产生50个中断,就是秒钟,所以50个中断,时间秒的值加1.具体参看流程图.4.3完整的C程序rtincludeunsignedcharcodeshuzi_08=0x82,Ox7C,0x7C,0x7C,0x7C,
19、Ox7C,Ox82,Oxfe*0,10*/unsignedcharcodeshuzi-l8=0xfe,0x7e,0x7a,0x00,0x7e,0x7e,Oxfe,Oxfe!:/*!*,1*/unsignedcharcodeShUZi_28=0x3a,0x3c,0x5c,0x5c,0x6c,0x6c,0x72,Oxfe*2,2*/unsignedcharcodeshuzi_38=0xba,0x7c,0x7c,0x6c,0x6c,0x6c,0x92,Oxfe*3*,3*/unsignedcharcodeshuzi48=0x9e,Oxae10xb6,Oxbu,0x00,Oxbe,Oxbe,Oxei*
20、4*,4*/unsignedcharcodeShUZi_58=0xa0,0x6c,0x6c,0x6c,0x6c,0x6c,0x9c,Oxfe*5,5*/unsignedcharcodeShUZi_68:0x82,0x6c,0x6c,0x6c,0x6c,0x6c,0x9a,Oxfej*6*,6*/unsignedcharcodeShUZi78三0xfc,Oxfc,Oxfc,OxOc,0xf4,0xf8,Oxfc,Oxfe*1,7*/unsignedcharcodeshuzi_88=0x92,0x6c.0x6c,0x6c,0x6c,0x6c,0x92,0xfe8*/unsignedcharcode
21、ShUZi_9=0xb2,0x6c,0x6c,0x6c,Oxc,0x6c,0x82,Oxfej*9*,9*/unsignedcharcodefuhaoA8=0xfe,Oxfe,Oxbb1Oxbb1Oxfe,Oxfe,Oxfe1OXfe:/*:”,10*/*1M:*W*W*!f*/unsignedcharcodehanzia216(0xf7,0x37,0x47,0x70,0x17,0x73,0xb7,Oxbd1Oxdd,Oxdd,Oxod,OXC5,0xc9,Oxld,Oxbf,Oxff10xf7,0xe7,0xf7,0xf7,0x00,Oxfb,Oxbb1Oxbd,Oxbd1Oxbd,0x81
22、,Oxbd1Oxbc10x9d,Oxbf10xff):/*轻*/unsignedcharcodehanzib216=(0xff,Oxfb,Oxfb1Oxfb1Oxfb1Oxfb,Oxfb10x03,Oxfb,Oxfb,Oxfb,OxfblOxfb,Oxfb,Oxff,Oxff,Oxdf1Oxdf,Oxdf1Oxdf1Oxdf,Oxdf,Oxdf,OxcO1Oxdf,Oxdf,Oxdf,Oxdf1Oxdf1Oxdf,Oxdf,Oxff):/*1*/unsignedcharcodehanzic216=(Oxfb,Oxcb,0x3d,Oxfb10x3b,0xc3,Oxdf,Oxef1OxfO10x1
23、7,0xf7,0xf7,0xd7,0xe7,Oxff,OxCf1Oxef,Oxf7,Oxf9,Oxfcl0x7d,0x73,Oxbf1Oxcf1Oxf3,Oxfc,0xf3,Oxcf10x9f,0x3f,Oxbf10xff)*50C*/unsignedcharcodehanzid216=(Oxbf,Oxbd,Oxbb,0x37,Oxff10x03,Oxfb1Oxfd10x7d,0x03,Oxfb.Oxfb1Oxfb,0x01,Oxfb,Oxff,Oxff1Oxbf,Oxdf,OxeO1Oxdf,0xb8,Oxbd1Oxbe1Oxbf10x80,Oxbf,OxbdlOxbb10x9cfOxdf,
24、Oxff:/*迎*/unsignedcharcodehanzie216=(Oxbf,Oxdf,Oxef,0x03,Oxdc,Oxef,0x73,0x98,Oxfb1OxOb,Oxfb,Oxbb10x6b,0x73,Oxff,Oxff,Oxb,Oxc,Oxff,0x88,0x7,0x7e,0x77,0x6d,0x4b,0x7c,0x7f,Oxlf,Oxff1Oxee,0x9f,Oxff)*/unsignediniTCZ,s=0,bl=O;s表示中断次数.TCZ表示定时器TO的初值unsignedchariDex=O1hiDex=O:限制字母和汉字的码值具体位数unsignedcharHour=I
25、O,Minute_15,Second=45,HourFlag_0,buffei-O:voidhanziShow(unsignedcharm);voidTimeShow(unsignedcharm):/数字0-9加:显示函数VOidTimeAmendO:时间逻辑限制函数voidHourDisplay();小时显示函数voidMinUte.Display。;分钟显示函数voidSecondDisplayO;秒钟显示函数voidDisplayO:/“:”显示函数voidInit();初始化函数intI=8)iDex=0jif(s=16三s=24Ms=40Ss-48三s=64)推断位置.PO=Oxfe
26、P20xff:关闭全部1.ED说明:因为用了校正初值的方法,所以行旋转稳定下来的时候,旋转一周的中断次数就是我预设的180次,这样一来,旋转的位置就和我中断的次数是同步的,他们是正比的关系,显示的角度也就是中断次数乘以2的值,及“显示角度=S*2因此,这里可以用中断的当前次数来推断显示的位置。if(buffer=i)/推断buffer的值,确定显示内容,1为显示“轻工欢迎您”调用显示“分钟值”的子函数if(hiDex=16)hiDex=O;if(s=16ts=32&s=486s=64&s=80)(PO=Oxff:P2=0xff:)s+;)voidTimeIuoji()interrupt3(TH
27、l=(65535-20000)/256:推断位置是否在0-32度之间调用显示“轻”的子函数推断位置是否在32-64度之间调用显示“工的子函数推断位置是否在64-96度之间调用显示“欢”的子函数/推断位置是否在96-128度之间调用显示迎”的了函数推断位置是否在128-160度之间/调用显示“您”的子函数推断位置是否大于160度关闭全部显示定时器To中断次数加1定时器Tl中断服务程序,用于限制秒钟的跳动。给定时器TI赋初值,定时20亮秒T1.l=(65535-20000)%256:bt+;定时器中断次数加1if(bt=50)推断Tl中断次数是否到50,及推断一秒定时到了没有(bt=O;定时器TI
28、中断次数清零,为下一秒做打算Second+;秒钟值加1Time_Aniend();调用时间限制的逻辑子函数,让秒钟到60分钟加1。类推)voidTimeShow(unsignedcharm)显示数字子函数,用来显示某个数字或“:”编码表中的某一个编码值,调FM一SWilCh(m)次显示一个编码然后itcx自加1.为下一次网用依次显示下一个编码做打(算;case0:PO=Oxff:P0=shuzi0iDx:iDex+jP2=0xff;break:显示1case1:P(M)Xff;P0shuzi_liDex;iDex+;P20xff;break:显示2case2:PO=Oxff;P0=shuzi_
29、2iDex:iDex+;P2=0xff;break:显示3case3:PO=Oxff;PO=ShUZi3i)ex;ilkx+jP2=0xff;break:显示4case4:PO=Oxff;PO=shuzi_4iDexJiiDex+;P2=0xff;break;显示5case5:POOxff;P0shuzi5iDex;iDex+:P20xff;break:显示6case6:PO=Oxff;P0=shuzi6iDex:iDex+;P2=0xff;break;显示7case7:PO=Oxff;P0=shuzi_7iDcx:iDex+:P2=0xff;break:显示8case8:PO=Oxff:P0
30、=shuzi_8iDex;iDex+:P2=0xff;break:/显示9case 9 :PO=Oxff;P0=shuzi_9iDex;iDex+;P2=0xff;break;/显示0voidhanziShow(unsignedcharin)switch(m)case 10 :PO=Oxff;P0=fuhaoiDex:iDex+:P2=0xff:break:显示:显示汉字子函数,用来显示某一汉字在汉字端码表中的某个编码值,谓用一次叔示一个编码,然后hiDex自加1,为下次调用依次显示后一个编码做打算caseO:P(M)Xff;PO=hanzi_aOhiDex:P2=Oxff:P2=hanzia
31、lhiDcx;hiDex+:break:/轻case1:PO=Oxff;P0三hanzi-b0hiDex;P2=0xff;P2=hanziblhiDexjhiDex+:break:/Icase2:PO=Oxff:PO=hanzi_c0hiDex;P2=0xff;P2=hanziclhiDex:hiDex+:break:欢case3:PO-Oxff:PO=hanzi-dOhiDex:P2=0xff:P2=hanzidlhiDex:hiDcx+;break:/迎case4:PO=OXff;PO=hanzie0hiDex;P2=0xff;P2=hanzielhiDexIhiDex+:break;您)
32、voidDisplay()(Time_Show(10);)voidHour_Display()(unsignedcharn=O,n=0;m-Hour/IO;n=Hour%10;if(s8)Time_ShoWm);elseTime_ShOW(n);)显示“:”的子函数调用显示数字了函数,显示“小时值”的了程序把hour值求模,得到十位值把hour值求余,得到各位值调用显示数字子函数,显示十位。voidMinuteDisplayO显示“分钟值”的子程序unsignedchar11r,n-0;调用显示数字子函数,显示个位11三Minute10;n-Mi11ute%10;if(s32)把MinUIe值
33、求模,得到十位值把MinUte值求余,得到各位值Time_ShoWGn);调用显示数字子函数,显示十位。elseTime_ShOW(n);1调用显示数字子函数,显示个位voidSecondDisplayO/显示“秒钟值”的子程序Iunsignedcharm_0,n=0:m=Second10;把Second值求模,得到H立值n=Second%10:把SeCOnd值求余,得到各位值if(s=60)I/推断Second值是否到60,Second=O;/Second值清零Minute+;/Minute自加1if(Minute=60)(推断MinUIe是否到了60IMinute=O;Minute清零Ho
34、ur+;/Hour自加1if(Hour=24)推断H。Ur是否到了24Hour=O;/Hour归零voidInit()(TMOD-OxII:定时器/计数器的方式限制.将TO设为方式2,将Tl设为方式2EA=I;中断允许限制ETO=I:定时器/计数器TO的中断允许位ETl=I:定时器/计数器TI的中断允许位THO=(65535-600)/256:定时初值,5MST1.O=(65535-600)%256;THl=(65535-50000)/256:定时器1初值T1.l=(65535-50000)%256:TRO=I;定时器/计数器TO的启动TRl-I;EXO=I;INTO中断允许限制位ITO=I;
35、ITl=I;/限制寄存器TCONPT1-1:设置定时器Tl中断光级为高,防止TO中出现,不处理Tl中断服务程序voidmain()/main函数,初始化各数据,然后进入死循环等待各个中断InitO:初始化函数while(l)进入死循环5作品的改进5.1 遥控器部分由丁在设计初考虑的不周全,我们在调试的时候发觉遥控器不能运用,后来我们在静止状态下调试了一下遥控器部分,结果是可以接收到信号的,最终我们发觉遥控器接收头,安装在了单片机的背面,当每次当装置运行起来的时候,总有段时间单片机的凸起部分会拦住红外接收头,从而影响红外信号的接收,导致我们遥控器部分的失败,但是由丁时间的限制,导致没有方法再重新做新的硬件,所以这里特殊指出改进的地方。5.2 时钟芯片的部分我们的旋转时钟没有安装时钟芯片,掉电后时间就要回到程序设计之初的值,严格的说不能算是一个时钟,只能把是一个旋转的1.ED显示屏幕,假如要完成完整的旋转时钟功能必需在硬件中添加时钟芯片,程序也须要相应的改动