急求一个89c51设计的电子时钟,有原理图和C程序

急求一个89c51设计的电子时钟,有原理图和C程序,第1张

请访问 http://www.51dz.com/index.asp?i=kjf888

数字电子钟的设计(由数字IC构成)

一、设计目的

1. 熟悉集成电路的引脚安排。

2. 掌握各芯片的逻辑功能及使用方法。

3. 了解面包板结构及其接线方法。

4. 了解数字钟的组成及工作原理。

5. 熟悉数字钟的设计与制作。

二、设计要求

1.设计指标

时间以24小时为一个周期;显示时、分、秒;有校时功能,可以分别对时及分老闷进行单独校时,使其校正到标准时间;计时过程具有报时功能,当时间到达整点前5秒进行蜂鸣报时;为了保证计时的稳定及准确须由晶体振荡器提供表针时间基准信号。

2.设计要求

画出电路原理图(或仿真电路图);元器件及参数选择;电路仿真与调试;PCB文件生成与打印输枝含颂出。

3.制作要求 自行装配和调试,并能发现问题和解决问题。

4.编写设计报告 写出设计与制作的全过程,附上有关资料和图纸,有心得体会。

三、设计原理及其框图

1.数字钟的构成

数字钟实际上是一个对标准频率(1HZ)进行计数的计数电路。由于计数的起始时间不可能与标准时间(如北京时间)一致,故需要在电路上加一个校时电路,同时标准的1HZ时间信号必须做到准确稳定。通常使用石英晶体振荡器电路构成数字钟。图 3-1所示为数字钟的一般构成框图。图3-1 数字钟的组成框图

⑴晶体振荡器电路

晶体振荡器电路给数字钟提供一个频率稳定准确的32768Hz的方波信号,可保证数字钟的走时准确及稳定。不管是指针式的电子钟还是数字显示的电子钟都使用了晶体振荡器电路。⑵分频器电路

分频器电路将32768Hz的高频方波信号经32768( )次分频后得到1Hz的方波信号供秒计数器进行计数。分频器实际上也就是计数器。

⑶时间计数器电路

时间计数电路由秒个位和秒十位计数器、分个位和分十位计数器及时个位和时十位计数器电路构成,其中秒个位和秒十位计数器、分个位和分十位计数器为60进制计数器,而根据设计要求,时个位和时十位计数器为12进制计数器。

⑷译码驱动电路

译码驱动电路将计数器输出的8421BCD码转换为数码管需要的逻辑状态,并且为保证数码管正常工作提供足够的工作电流。

⑸数码管

数码管通常有发光二极管(LED)数码管和液晶(LCD)数码管,本设计提供的为LED数码管。

2.数字钟的工作原理

1)晶体振荡器电路

晶体振荡器是构成数字式时钟的核心,它保证了时钟的走时准确及稳定。

图3-2所示电路通过CMOS非门构成的输出为方波的数字式晶体振荡电路,这个电路中,CMOS非门U1与晶体、电容和电阻构成晶体振荡器电路,U2实现整形功能,将振荡器输出的近似于正弦波的波形转换为较理想的方波。输出反馈电 阻R1为非门提供偏置,使电路工作于放大区域,即非门的功能近似于一个高增益的反相放大器。电容C1、C2与晶体构成一个谐振型网络,完成对振荡频率的控制功能,同时提供了一个180度相移,从而和非门构成一个正反馈网络,实现了振荡器的功能。由于晶体具有较高的频率稳定性及准确性,从而保证了输出频率的稳定和准确。

晶体XTAL的频率猛郑选为32768HZ。该元件专为数字钟电路而设计,其频率较低,有利于减少分频器级数。

从有关手册中,可查得C1、C2均为30pF。当要求频率准确度和稳定度更高时,还可接入校正电容并采取温度补偿措施。

由于CMOS电路的输入阻抗极高,因此反馈电阻R1可选为10MΩ。较高的反馈电阻有利于提高振荡频率的稳定性。

非门电路可选74HC00。

图3-2 COMS晶体振荡器

2)分频器电路

通常,数字钟的晶体振荡器输出频率较高,为了得到1Hz的秒信号输入,需要对振荡器的输出信号进行分频。

通常实现分频器的电路是计数器电路,一般采用多级2进制计数器来实现。例如,将32768Hz的振荡信号分频为1HZ的分频倍数为32768(215),即实现该分频功能的计数器相当于15极2进制计数器。常用的2进制计数器有74HC393等。

本实验中采用CD4060来构成分频电路。CD4060在数字集成电路中可实现的分频次数最高,而且CD4060还包含振荡电路所需的非门,使用更为方便。

CD4060计数为14级2进制计数器,可以将32768HZ的信号分频为2HZ,其内部框图如图3-3所示,从图中可以看出,CD4060的时钟输入端两个串接的非门,因此可以直接实现振荡和分频的功能。

图3-3 CD4046内部框图

3)时间计数单元

时间计数单元有时计数、分计数和秒计数等几个部分。

时计数单元一般为12进制计数器计数器,其输出为两位8421BCD码形式;分计数和秒计数单元为60进制计数器,其输出也为8421BCD码。

一般采用10进制计数器74HC390来实现时间计数单元的计数功能。为减少器件使用数量,可选74HC390,其内部逻辑框图如图 2.3所示。该器件为双2-5-10异步计数器,并且每一计数器均提供一个异步清零端(高电平有效)。

图3-4 74HC390(1/2)内部逻辑框图

秒个位计数单元为10进制计数器,无需进制转换,只需将QA与CPB(下降沿有效)相连即可。CPA(下降没效)与1HZ秒输入信号相连,Q3可作为向上的进位信号与十位计数单元的CPA相连。

秒十位计数单元为6进制计数器,需要进制转换。将10进制计数器转换为6进制计数器的电路连接方法如图3-5所示,其中Q2可作为向上的进位信号与分个位的计数单元的CPA相连。

图3-5 10进制--6进制计数器转换电路分个位和分十位计数单元电路结构分别与秒个位和秒十位计数单元完全相同,只不过分个位计数单元的Q3作为向上的进位信号应与分十位计数单元的CPA相连,分十位计数单元的Q2作为向上的进位信号应与时个位计数单元的CPA相连。

时个位计数单元电路结构仍与秒或个位计数单元相同,但是要求,整个时计数单元应为12进制计数器,不是10的整数倍,因此需将个位和十位计数单元合并为一个整体才能进行12进制转换。利用1片74HC390实现12进制计数功能的电路如图3-6所示。

另外,图3-6所示电路中,尚余-2进制计数单元,正好可作为分频器2HZ输出信号转化为1HZ信号之用。 图3-6 12进制计数器电路

4)译码驱动及显示单元

计数器实现了对时间的累计以8421BCD码形式输出,选用显示译码电路将计数器的输出数码转换为数码显示器件所需要的输出逻辑和一定的电流,选用CD4511作为显示译码电路,选用LED数码管作为显示单元电路。

5)校时电源电路

当重新接通电源或走时出现误差时都需要对时间进行校正。通常,校正时间的方法是:首先截断正常的计数通路,然后再进行人工出触发计数或将频率较高的方波信号加到需要校正的计数单元的输入端,校正好后,再转入正常计时状态即可。

根据要求,数字钟应具有分校正和时校正功能,因此,应截断分个位和时个位的直接计数通路,并采用正常计时信号与校正信号可以随时切换的电路接入其中。图3-7所示即为带有基本RS触发器的校时电路,

图3-7 带有消抖动电路的校正电路

6)整点报时电路

一般时钟都应具备整点报时电路功能,即在时间出现整点前数秒内,数字钟会自动报时,以示提醒。其作用方式是发出连续的或有节奏的音频声波,较复杂的也可以是实时语音提示。

根据要求,电路应在整点前10秒钟内开始整点报时,即当时间在59分50秒到59分59秒期间时,报时电路报时控制信号。报时电路选74HC30,选蜂鸣器为电声器件。

四、元器件

1.实验中所需的器材:

5V电源。面包板1块。示波器。万用表。镊子1把。剪刀1把。网络线2米/人。

共阴八段数码管6个。CD4511集成块6块。CD4060集成块1块。74HC390集成块3块。

74HC51集成块1块。74HC00集成块5块。74HC30集成块1块。10MΩ电阻5个。

500Ω电阻14个。30p电容2个。32.768k时钟晶体1个。蜂鸣器。

2.芯片内部结构图及引脚图

图4-1 7400 四2输入与非门图4-2 CD4511BCD七段译码/驱动器

图4-3 CD4060BD 图4-4 74HC390D

图4-5 74HC51D图4-6 74HC30 3.面包板内部结构图

面包板右边一列上五组竖的相通,下五组竖的相通,面包板的左边上下分四组,每组中X、Y列(0-15相通,16-40相通,41-55相通,ABCDE相通,FGHIJ相通,E和F之间不相通。

五、个功能块电路图

1. 一个CD4511和一个LED数码管连接成一个CD4511驱动电路,数码管可从0---9显示,以次来检查数码管的好坏,见附图5-1。

图5-1 4511驱动电路

2. 利用一个LED数码管,一块CD4511,一块74HC390,一块74HC00连接成一个十进制计数器,电路在晶振的作用下数码管从0-9显示,见附图5-2。

图5-2 74390十进制计数器

3. 利用一个LED数码管,一块CD4511,一块74HC390,一块74HC00和一个晶振连接成一个六进制计数器,数码管从0-6显示,见附图5-3。

图5-3 74390六进制计数器

4. 利用一个六进制电路和一个十进制连接成一个六十进制电路,电路可从0-59显示,见附图5-4。

图5-4 六十进制电路

5. 利用两个六十进制的电路合成一个双六十进制电路,两个六十进制之间有进位,见附图5-5。

图5-5 双六十进制电路

6. 利用CD4060、电阻及晶振连接成一个分频--晶振电路,见附图5-6。

图5-6 分频-晶振电路

7. 利用74HC51D和74HC00及电阻连接成一个校时电路,见附图5-7。

图5-7 校时电路8. 利用74HC30和蜂鸣器连接成整点报时电路。见附图5-8。

图5-8 整点报时电路

9. 利用两个六十进制和一个十二进制连接成一个时、分、秒都会进位的电路总图,见附图5-9。 用ttl集成电路构成的"二十四小时数字钟",具有校时和整点报时功能,555定时器接成多谐振荡器产生秒脉冲信号,调节rw即可校准秒信告,计数器7416 i、ii组成60进制"秒"计数电路,iii、iv组成"分"计数电路,v、vi组成24进制"时"计数电路,校时电路由与非门7400构成的双稳态触发路构成,可消除开关抖动的影响,整点报时 电路 由与非门7430和d触发器7474构成 ,1秒钟响一声、直至整点为止。

有关用晶振电路产生秒脉冲电路的"12小时数字钟,请看下回贴 数字电子钟参考电路(24小时数字钟)

[upload=jpg,325.83,450,915,822]/58474-1-2-9489.

上面的电路图是用ttl集成电路构成的"二十四小时数字钟",具有校时和整点报时功能,555定时器接成多谐振荡器产生秒脉冲信号,调节rw即可校准秒信告,计数器7416 i、ii组成60进制"秒"计数电路,iii、iv组成"分"计数电路,v、vi组成24进制"时"计数电路,校时电路由与非门7400构成的双稳态触发路构成,可消除开关抖动的影响,整点报时 电路 由与非门7430和d触发器7474构成 ,1秒钟响一声、直至整点为止。

有关用晶振电路产生秒脉冲电路的"12小时数字钟,请看下回贴图。

采用AT89C2051兼容芯片制作六位数显多路定时电子钟

采用at89c2051兼容芯片制作六位数显多路定时电子钟电路特点这里介绍的电子钟,电路可称得上极简,它仅使用单片的20引脚单片机完成电子钟的全部功能,而笔者见到的其它设计方案均采用二片以上的多片ic实现。电路见图1。一片20引脚的单片机stc2032(引脚排列与at89c2051完全相同)为电子钟主体,其显示笔画数据从p1口分时输出,p3口则输出对应的六位选通信号。由于led数码管点亮时耗电较大,故不能使用at89c2051单片来完成,但是可以可以用stc89c2032来完成。另外,本站制作时用超高亮的发光二极管代替昂贵的大数码管,成本低,效果独特。本电子钟设计有三个轻触式按键,这里我们分别命名为:模式设定键k1、加调整键k2、减调整键k3。由于stc89c2032内部已经集成有复位电阻,所裕�次唤胖恍枰�右恢坏缛菁纯伞1镜缱又硬捎昧艘恢籒pn型的三极管及蜂鸣器为闹时讯响电路。本图采用电池供电,电路板上有桥式整流、滤波和三端稳压器7805的安装位置,可以用交流电压供整个系统工作。此电子钟可与任何6~12v/100ma的交直流电源适配器配合工作,适应性强。电子钟功能1.走时:默认为走时状态,按24小时制分别显示"时时:分分:秒秒",有四个秒点动态显示,时间会按实际时间以秒为最少单位变化。2.走时调整:长按k1(或k2、k3)两秒钟以上,时位、分位、秒位会有其一快速闪动,按k1会循环,按k2和k3可以分别对闪动的数字进行加或者减,从而达到快速设定时间的目的。20秒以上长时间没有任何按键*作时,自动按变为正常走时状态。3.闹时调整:再次长按k1(或k2、k3)两秒钟以上,时位、分位、秒位会有其一慢速闪动,按k1会循环,按k2和k3可以分别对闪动的数字进行加或者减,从而达到快速设定闹时的目的。20秒以上长时间没有任何按键*作时,自动按变为正常走时状态。注意:闹时状态下时位会在01-64变化,表示64路定时时间;分位只能在00-24变化,表示24个小时,其中默认显示为24,表示不闹;秒位在00-59变化,表示60个分钟。因此,本电子钟以分钟为最小单位可以设定多路闹时。(由于64路太多,基本上没有什么用,用起来反而不方便,所以,本站出售的是16路定时的。)4.误差修正状态:大家知道,即便是世界上最优良正统的石英晶振,频率也会有偏差,需要电容微调校正频率,不同的电容和负载会影响到频率偏移。这种情况可能会使日误差达到几十秒。当然,配备优质正品元件会使走时误差小到几秒,如果设计微调电容的话,就可以使每天的走时误差小到1秒以内。但是,对于业余制作来说,没有更标准的测量设备来证明你的调试是刚刚好,不能测周期,不能测频率(普通的测量会改变电路工作参数带来更大的测量误差)。而我们一般都会按电视台的时间来做对比,经过了24小时,我的电子钟究竟是快了??还是慢了??现在不用怕了,本电子钟设计了误差校正程序:如果你的电子钟走一天会快1.6秒(或者慢0.8秒),那么,通过本电子钟的误差校正设置,可以在一天中不知不觉的减慢1.6秒(或者加快0.8秒)。因此,本电子钟理论上可以做到日误差小于0.2秒,当然,具体的过程和效果还需要大家去*作和证明。误差校正方法:在闹时调整状态下,再长按k1(或k2、k3)两秒钟以上,时位、分位会变成"一一一一"或者"三三三三",表示变慢或者变快的意思,按k1选择;秒位会变成00,按k2、k3会在00-80中变化,数字越大,表示校正越大,00等于即不校正变快也不校正变慢,例如2+0=2-0这样的情况。20秒以上长时间没有任何按键*作时,自动按变为正常走时状态。其它功能:1、如果是在走时状态,正逢到在闹铃响(会长响20秒)中,按k1、k2、k3任意键停止发声。2、在走时状态,按k3可以让电子钟每秒都发出短短的"嘀"声,这有点类似机械指针式的电子钟(或者机械手表)的声音,当然,声音要大得多。这个功能很有用,例如,我们有些特殊情况时不能去看着钟,但是可以闭上眼睛听声音在心中默默数数经过了多少秒再去*作某某。再按可以关掉秒发声。3、整点报时功能:按k2可以开启和关闭整点报时功能。开启后每逢整点就会听到长响两秒"嘀"声。4、闹时开关功能:按k1可以开启和关闭定时闹铃功能。关闭闹铃后,以前设置的数据不会丢失。由于电路设计得极其简单,因此丰富的功能只能由软件完成,这里软件设计成为了关键。下面介绍软件设计中采用的一些要点。本电子钟程序设计时只使用了一个定时数t0,其它的中断全部关断,定时器工作在两个8位自动加载初始值状态。这是保证走时精确稳定的重要方法。站长看到很多书本教材上都让大家用定时器中断来执行动态显示程序和按键扫描程序,这是一种很不好的方法,除了浪费硬件资源以外,还会增加程序复杂性,还会影响其它程序运行。站长认为,越是中断程序,就要越写得简短,最好几条指令就立即结束,对于动态扫描显示、按键功能等等可以写在主程序中让程序不停的反复运行,如果中断多,最大的坏处就是影响到主程序运行时间不够,扫描显示会出现闪烁,或者按键反应变慢(一般觉察不出),可是,这又有另一好处,你可以随时改良程序并且立即看到结果。led动态扫描显示是分时点亮各个led,利用人的视觉暂留特性,让人觉得是连续点亮。当点亮的频率高时,说明单片机有充足的时间运行主程序 http://www.guangdongdz.com/club/details_48632.html「该帖子被 zdr 在 2006-9-27 10:15:48 编辑过

六位数显多路定时电子钟

大小[2444] 更新时间[] 阅读[7822]次/评论[64]次

电路特点

这里介绍的电子钟,电路可称得上极简,它仅使用单片的20引脚单片机完成电子钟的全部功能,而笔者见到的其它设计方案均采用二片以上的多片ic实现。

电路见图1。

一片20引脚的单片机stc2032(引脚排列与at89c2051完全相同)为电子钟主体,其显示笔画数据从p1口分时输出,p3口则输出对应的六位选通信号。由于led数码管点亮时耗电较大,故不能使用at89c2051单片来完成,但是可以可以用stc89c2032来完成。另外,本站制作时用超高亮的发光二极管代替昂贵的大数码管,成本低,效果独特。

本电子钟设计有三个轻触式按键,这里我们分别命名为:模式设定键k1、加调整键k2、减调整键k3。由于stc89c2032内部已经集成有复位电阻,所以,复位脚只需要接一只电容即可。本电子钟采用了一只npn型的三极管及蜂鸣器为闹时讯响电路。本图采用电池供电,电路板上有桥式整流、滤波和三端稳压器7805的安装位置,可以用交流电压供整个系统工作。此电子钟可与任何6~12v/100ma的交直流电源适配器配合工作,适应性强。

电子钟功能

1.走时:默认为走时状态,按24小时制分别显示"时时:分分:秒秒",有四个秒点动态显示,时间会按实际时间以秒为最少单位变化。

2.走时调整:长按k1(或k2、k3)两秒钟以上,时位、分位、秒位会有其一快速闪动,按k1会循环,按k2和k3可以分别对闪动的数字进行加或者减,从而达到快速设定时间的目的。20秒以上长时间没有任何按键*作时,自动按变为正常走时状态。

3.闹时调整:再次长按k1(或k2、k3)两秒钟以上,时位、分位、秒位会有其一慢速闪动,按k1会循环,按k2和k3可以分别对闪动的数字进行加或者减,从而达到快速设定闹时的目的。20秒以上长时间没有任何按键*作时,自动按变为正常走时状态。

注意:闹时状态下时位会在01-64变化,表示64路定时时间;分位只能在00-24变化,表示24个小时,其中默认显示为24,表示不闹;秒位在00-59变化,表示60个分钟。因此,本电子钟以分钟为最小单位可以设定多路闹时。(由于64路太多,基本上没有什么用,用起来反而不方便,所以,本站出售的是16路定时的。)4.误差修正状态:大家知道,即便是世界上最优良正统的石英晶振,频率也会有偏差,需要电容微调校正频率,不同的电容和负载会影响到频率偏移。这种情况可能会使日误差达到几十秒。当然,配备优质正品元件会使走时误差小到几秒,如果设计微调电容的话,就可以使每天的走时误差小到1秒以内。

但是,对于业余制作来说,没有更标准的测量设备来证明你的调试是刚刚好,不能测周期,不能测频率(普通的测量会改变电路工作参数带来更大的测量误差)。而我们一般都会按电视台的时间来做对比,经过了24小时,我的电子钟究竟是快了??还是慢了??

现在不用怕了,本电子钟设计了误差校正程序:如果你的电子钟走一天会快1.6秒(或者慢0.8秒),那么,通过本电子钟的误差校正设置,可以在一天中不知不觉的减慢1.6秒(或者加快0.8秒)。因此,本电子钟理论上可以做到日误差小于0.2秒,当然,具体的过程和效果还需要大家去*作和证明。

误差校正方法:在闹时调整状态下,再长按k1(或k2、k3)两秒钟以上,时位、分位会变成"一一一一"或者"三三三三",表示变慢或者变快的意思,按k1选择;秒位会变成00,按k2、k3会在00-80中变化,数字越大,表示校正越大,00等于即不校正变快也不校正变慢,例如2+0=2-0这样的情况。20秒以上长时间没有任何按键*作时,自动按变为正常走时状态。

其它功能:

1、如果是在走时状态,正逢到在闹铃响(会长响20秒)中,按k1、k2、k3任意键停止发声。

2、在走时状态,按k3可以让电子钟每秒都发出短短的"嘀"声,这有点类似机械指针式的电子钟(或者机械手表)的声音,当然,声音要大得多。这个功能很有用,例如,我们有些特殊情况时不能去看着钟,但是可以闭上眼睛听声音在心中默默数数经过了多少秒再去*作某某。再按可以关掉秒发声。

3、整点报时功能:按k2可以开启和关闭整点报时功能。开启后每逢整点就会听到长响两秒"嘀"声。

4、闹时开关功能:按k1可以开启和关闭定时闹铃功能。关闭闹铃后,以前设置的数据不会丢失。由于电路设计得极其简单,因此丰富的功能只能由软件完成,这里软件设计成为了关键。下面介绍软件设计中采用的一些要点。

本电子钟程序设计时只使用了一个定时数t0,其它的中断全部关断,定时器工作在两个8位自动加载初始值状态。这是保证走时精确稳定的重要方法。站长看到很多书本教材上都让大家用定时器中断来执行动态显示程序和按键扫描程序,这是一种很不好的方法,除了浪费硬件资源以外,还会增加程序复杂性,还会影响其它程序运行。

站长认为,越是中断程序,就要越写得简短,最好几条指令就立即结束,对于动态扫描显示、按键功能等等可以写在主程序中让程序不停的反复运行,如果中断多,最大的坏处就是影响到主程序运行时间不够,扫描显示会出现闪烁,或者按键反应变慢(一般觉察不出),可是,这又有另一好处,你可以随时改良程序并且立即看到结果。

led动态扫描显示是分时点亮各个led,利用人的视觉暂留特性,让人觉得是连续点亮。当点亮的频率高时,说明单片机有充足的时间运行主程序,

详情请访问 http://www.51dz.com/index.asp?i=kjf888

#include<reg52.h>

#include<absacc.h>

#include<intrins.h>

#define unit unsigned int

#define uchar unsigned char

//#define HZ 12

sbit key0=P0^0 // 分钟调整

sbit key1=P0^1 // 小时调整

sbit P2_0=P2^7 //秒 指示灯

sbit MN_RXD=P3^6

sbit MN_TXD=P3^7

uchar data CLOCK[4]={0,0,0,12}//存放时钟时间(百分秒,秒,分,和时位)

//数码管显示表0-f 灭

uchar code TABLE[]={0xBE,0x06,0xEA,0x6E,0x56,0x7C,0xFC,0x0E,0xFE,0x7E,0x00}

//**********************************

//模拟串口发送一个字节数据 函数

//**********************************

void SendData(unsigned char senddata)

{

unsigned char i

for(i=0i<8i++)

{

if((senddata&0x01)==0)

MN_RXD=0

else

MN_RXD=1

_nop_()

MN_TXD=0

_nop_()

MN_TXD=1

senddata=senddata>>1

}

}

//**********************************

//显示程序函数

//**********************************

void display(void)

{

// unsigned int n

uchar temp

temp=CLOCK[1]temp=temp%10 SendData(TABLE[temp])

temp=CLOCK[1]temp=temp/10 SendData(TABLE[temp])

temp=CLOCK[2]temp=temp%10 SendData(TABLE[temp])

temp=CLOCK[2]temp=temp/10 SendData(TABLE[temp])

temp=CLOCK[3]temp=temp%10 SendData(TABLE[temp])

temp=CLOCK[3]temp=temp/10 SendData(TABLE[temp])

/*

for(n=0n<5000n++)

for(n=0n<6n++)

{

SendData(TABLE[10])

}

*/

}

//**********************************

//按键控制函数

//**********************************

void keycan()

{

unsigned int n

EA=0

if(key0==0) // 分钟调整

{

for(n=0n<判侍没10000n++) //延时去抖动

while(key0==0)

CLOCK[2]=CLOCK[2]+1

if(CLOCK[2]==60) //到一时

{

CLOCK[2]=0

}

display()

}

if(key1==0) /掘纳/ 小时调整

{

for(n=0n<10000n++) //延时去抖动

while(key1==0)

CLOCK[3]=CLOCK[3]+1

if(CLOCK[3]==24)

{

CLOCK[3]=0

}

display()

}

EA=1

}

//**********************************

//T0中断服务函数

//**********************************

void time0() interrupt 1 //using 1

{

TH0=0xD8TL0=0xF0 //重置初值

// TH0=0xB1 TL0=0xE0

//时钟处谈宴理

CLOCK[0]=CLOCK[0]+1

}

//**********************************

//主函数

//**********************************

void main()

{

EA=1

ET0=1

TMOD=0x01 //T0方式1定时

TH0=0xD8TL0=0xF0 //D8F0 定时10ms

// TH0=0xB1 TL0=0xE0 //定时 20ms

TR0=1

for()

{

if(CLOCK[0]==100) //到一秒 10ms*100

{

CLOCK[0]=0

P2_0=~P2_0

CLOCK[1]=CLOCK[1]+1

if(CLOCK[1]==60) //到一分

{

CLOCK[1]=0

CLOCK[2]=CLOCK[2]+1

if(CLOCK[2]==60) //到一时

{

CLOCK[2]=0

CLOCK[3]=CLOCK[3]+1

if(CLOCK[3]==24)

{

CLOCK[3]=0

}

}

}

display()

}

keycan()

}

}

////////////////////////////////////////////

// 程序名称:钟表模拟程序(表针形式)

// 编译环境:Visual C++ 6.0,EasyX 2011惊蛰版

// 程序编写:BestAns <BestAns@qq.com>

// 最后更新:2010-10-30

//

#include

 

<graphics.h>

#include

 

<conio.h>

#include

 

<math.h>

#define

PI

3.1415926536

void

 

DrawHand

(

int

 hour

,

 

int

 minute

,

 

int

 second

)

{

double

 a_hour

,

 a_min

,

 a_sec

// 时、分、秒针的弧度值

int

 x_hour

,

 y_hour

,

 x_min

,

 y_min

,

 x_sec

,

 y_sec

// 时、分、秒针的末端位置

// 计算时、分、秒针的弧度值

a_sec 

=

 second 

*

 

2

 

*

 PI 

/

 

60

a_min 

=

 minute 

*

 

2

 

*

 PI 

/

 

60

 

+

 a_sec 

/

 

60

a_hour

=

 hour 

*

 宏丛

2

 

*

 PI 

/

 

12

 

+

 a_min 

/

 

12

// 计算时、分、秒针的末端位置改码

x_sec 

=

 

int

(

120

 

*

 

sin

(

a_sec

))

y_sec 

=

 

int

(

120

 

*

 

cos

(

a_sec

))

x_min 

=

 

int

(

100

 

*

 

sin

(

a_min

))

y_min 

=

 

int

(

100

 

*

 

cos

(

a_min

))

x_hour

=

 

int

(

70

 

*

 

sin

(

a_hour

))

y_hour

=

 

int

(

70

 

*

 

cos

(

a_hour

))

// 画时针

setlinestyle

(

PS_SOLID

,

 NULL

,

 

10

)

setcolor

(

WHITE

)

line

(

320

 

+

 x_hour

,

 

240

 

-

 y_hour

,

 

320

 

-

 x_hour 

/

 

7

,

 

240

 

+

 y_hour 

/

 

7

)

// 画分针

setlinestyle

(

PS_SOLID

,

 NULL

,

 

6

)

setcolor

(

LIGHTGRAY

)

line

(

320

 

+

 x_min

,

 

240

 

-

 y_min

,

 

320

 

-

 x_min 

/

 

5

,

 

240

 

+

 y_min 

/

 

5

)

// 画秒针

setlinestyle

(

PS_SOLID

,

 NULL

,

 

2

)

setcolor

(

RED

)

line

(

320

 

+

 x_sec

,

 

240

 

-

 y_sec

,

 

320

 蔽歼樱

-

 x_sec 

/

 

3

,

 

240

 

+

 y_sec 

/

 

3

)

}

void

 

DrawDial

()

{

// 绘制一个简单的表盘

circle

(

320

,

 

240

,

 

2

)

circle

(

320

,

 

240

,

 

60

)

circle

(

320

,

 

240

,

 

160

)

outtextxy

(

296

,

 

310

,

 

"BestAns"

)

// 绘制刻度

int

 x

,

 y

for

 

(

int

 i

=

0

 i

<

60

 i

++)

{

=

 

320

 

+

 

int

(

145

 

*

 

sin

(

PI 

*

 

2

 

*

 i 

/

 

60

))

=

 

240

 

+

 

int

(

145

 

*

 

cos

(

PI 

*

 

2

 

*

 i 

/

 

60

))

if

 

(

%

 

15

 

==

 

0

)

bar

(

-

 

5

,

 y 

-

 

5

,

 x 

+

 

5

,

 y 

+

 

5

)

else

 

if

 

(

%

 

5

 

==

 

0

)

circle

(

x

,

 y

,

 

3

)

else

putpixel

(

x

,

 y

,

 WHITE

)

}

}

void

 

main

()

{

initgraph

(

640

,

 

480

)

// 初始化 640 x 480 的绘图窗口

DrawDial

()

// 绘制表盘

setwritemode

(

R2_XORPEN

)

// 设置 XOR 绘图模式

// 绘制表针

SYSTEMTIME

 

ti

// 定义变量保存当前时间

while

(!

kbhit

())

// 按任意键退出钟表程序

{

GetLocalTime

(&

ti

)

// 获取当前时间

DrawHand

(

ti

.

wHour

,

 ti

.

wMinute

,

 ti

.

wSecond

)

// 画表针

Sleep

(

1000

)

// 延时 1 秒

DrawHand

(

ti

.

wHour

,

 ti

.

wMinute

,

 ti

.

wSecond

)

// 擦表针(擦表针和画表针的过程是一样的)

}

closegraph

()

// 关闭绘图窗口

}

其了就是用了easyx


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12439303.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存