[原创分享]关于1ms精度的计时延时器的基本测试

bcrun 2013-10-31 03:25:20
加精
2013年11月30日补充
之前写这篇文章时,因为已经使用win7一段较长的时间,所以没针对API帮助提到的Period方面的精度控制,在WinXP系统下做测试,后来找时间测试了下,不加timeBeginPeriod的话,那两个API在XP下精度远不到1ms。当初写这篇文章的主要目的,是闲聊一下自己测试代码执行速度的一些办法。现在打算结帖了,考虑到确实还有不少程序需要在winxp和win2003下使用,而且即使只在WIN7以上系统中运行,按官方的API说明,加上timeBeginPeriod的设置,也更严谨些,毕竟我也没看到哪里说,在WIN7下这个调用是可以省去的,搞不好在有些地方没调用timeBeginPeriod就不够精度呢。唉,不废话了,直接贴补充的代码。对了,有趣的是,加了timeBeginPeriod(1)后,在xp下多次测试那段DoTestSleep的代码,返回值都是2,不像win7下那样是1.

Public Declare Function timeBeginPeriod Lib "winmm.dll" (ByVal uPeriod As Long) As Long
Public Declare Function timeEndPeriod Lib "winmm.dll" (ByVal uPeriod As Long) As Long

Private Sub Form_Initialize()
Call timeBeginPeriod(1)
End Sub

Private Sub Form_Terminate()
Call timeEndPeriod(1)
End Sub


注意:这里说的1ms精度,只是指在适当条件(比如说CPU占用率不太高)下,用下述代码实测时,一般能达到的时间上的分辨率。就好像说一个人视力2.0,是指的他在准备充分条件下,去光线等条件符合相关标准的视力测试表前能测到2.0的水准,并不是说他在睡眼矇眬或长时间盯着电脑屏幕,或其它平时常见的生活状态下都能测试出有这个成绩。绝不能理解为“MS的windows系统能保证这些API实际执行时,所有情况都能有1ms的精度”。如果有“准确率”方面的严苛要求,建议多了解实时操作系统(RTOS)方面的知识。本人那方面了解不多,也就不多讨论了。

刚发了篇小博文,特别适合小白,考虑到论坛里很多人不怎么上博客,在这里也宣传一下
http://blog.csdn.net/bcrun/article/details/13772257
关于1ms精度的计时延时器的基本测试

  一般来说,在平时编程中,出于优化代码运行速度等需求,常需要测算时间,这就需要对相关计时函数的精度做一番了解,不能老是糊里糊涂混日子。下面的测试由此而来

  首先,我们需要测出,常用的计时函数中哪个达到了1ms精度。先测GetTickCount

'声明:
Declare Function GetTickCount Lib "kernel32" Alias "GetTickCount" () As Long
'说明
用于获取自windows启动以来经历的时间长度(毫秒)
'返回值
Long,以毫秒为单位的windows运行时间


如果只100000次的话,因为工作量太小,一般会输出0。不过不用担心,我们逐步加大循环次数,多测几次就行了。注意循环次数的跨度不要太大了,可以200000,300000这样的依次增加。这样你会发现,到了某一次,比如说500000,输出值会突然从0跳到16左右。可见这个API的实际精度只有约16ms.



    Private Sub DoTestGetTickCount()  
Dim lTime1&, lTime2&
Dim i&
lTime1 = GetTickCount
For i = 1 To 400000

Next i
lTime2 = GetTickCount
Debug.Print lTime2 - lTime1
End Sub


写到这里时,可能已经有初学者急着要知道1ms精度的函数在哪了,别急,timeGetTime就是了:



    Private Declare Function timeGetTime Lib "winmm.dll" () As Long


测试代码几乎一样。测试结果为,在本人机器上,循环次数在100000时输出值就约为2-3了,次数增加1倍到200000的话,结果为4-5.如果减小到50000,则是1-2.可见,这个计时函数的精度为1ms.



Private Sub DoTestTimeGetTime()
Dim lTime1&, lTime2&
Dim i&
lTime1 = timeGetTime
For i = 1 To 100000

Next i
lTime2 = timeGetTime
Debug.Print lTime2 - lTime1
End Sub


接下来,因为确认了timeGetTime的精度可以达到1ms,我们可以放心测算延时函数sleep的实际精度了,先公布结果,1ms.


    Private Sub DoTestSleep()  
Dim lTime1&, lTime2&
Dim i&
lTime1 = timeGetTime

Sleep 1 'delay 1 ms
lTime2 = timeGetTime
Debug.Print lTime2 - lTime1
End Sub



最后补充说明一下,获取UTC时间的GetSystemTime和相应的SystemTimeToFileTime,实际精度也是1ms
...全文
3498 64 打赏 收藏 转发到动态 举报
写回复
用AI写文章
64 条回复
切换为时间正序
请发表友善的回复…
发表回复
东方之珠 2013-11-07
  • 打赏
  • 举报
回复
我一般用高精度频率计数器的2个API。
一如既往哈 2013-11-06
  • 打赏
  • 举报
回复
斑竹辛苦了.........
边走边瞧 2013-11-05
  • 打赏
  • 举报
回复
引用 56 楼 PctGL 的回复:
看了好几个帖子,也不知道你们到底在争论什么 这个什么也证明不了,sleep不是用来计时的,用sleep测试时钟精确性非常不恰当 这种测试结果,大概只能表示为系统的繁忙程度 用sleep会导致线程切换,估计那样代码每次的测试结果都不相同,而不相同的原因也有很多种,其中之一是timegettime的精度,另外就是系统内的线程环境,还有就是系统对线程调度的算法问题 总之。。。 这个题目,lz的到底怎么想的用 sleep 测试精度。。。。
是的,你说得没错,俺也是说LZ测试方法有问题。最前面几帖已经有哥们说过Sleep不准,可LZ觉得Sleep(1)在他机器上测试没问题。 后来LZ意识到问题,赶紧修改了首帖,可惜首帖没有说测试方法只具备参考价值,不能作为真实值来用。 所以,建议LZ继续修改首帖,对测试方法进行说明。
zp_any 2013-11-05
  • 打赏
  • 举报
回复
看不是很明白,我是菜鸟。
PctGL 2013-11-05
  • 打赏
  • 举报
回复
引用 55 楼 go_and_see 的回复:
[quote=引用 53 楼 bcrun 的回复:] Re: 52 楼: MS的windows系统不能保证所有情况都能有1ms的精度 我啥时说过“MS的windows系统能保证所有情况都能有1ms的精度”了?我甚至连在"大多数机器"上这种描述都没写。而且我也明确说明了只是在我自己笔记本测试得结果。哈哈,为了防止技术问题的讨论转移到“面子问题”上去,这个就不单独回复了。
首帖改得真快,俺就不多说啥了。 既然讨论技术,那咱不扯面子了。针对下面代码,俺给出测试结论:xp和win7结果不同,不同的硬件配置返回值也不同。修改首帖吧,赶紧的。

    Private Sub DoTestSleep()  
        Dim lTime1&, lTime2&  
        Dim i&  
        lTime1 = timeGetTime  
       
        Sleep 1 'delay 1 ms  
        lTime2 = timeGetTime  
        Debug.Print lTime2 - lTime1  
    End Sub
[/quote] 看了好几个帖子,也不知道你们到底在争论什么 这个什么也证明不了,sleep不是用来计时的,用sleep测试时钟精确性非常不恰当 这种测试结果,大概只能表示为系统的繁忙程度 用sleep会导致线程切换,估计那样代码每次的测试结果都不相同,而不相同的原因也有很多种,其中之一是timegettime的精度,另外就是系统内的线程环境,还有就是系统对线程调度的算法问题 总之。。。 这个题目,lz的到底怎么想的用 sleep 测试精度。。。。
china_jeffery 2013-11-05
  • 打赏
  • 举报
回复
引用 59 楼 zl373946618289 的回复:
[quote=引用 10 楼 china_jeffery 的回复:] Sleep精度可以达到1ms吗?
打cs开个变速齿轮啊,拿刀啊。各种刀杀啊[/quote]
zl289kkk 2013-11-05
  • 打赏
  • 举报
回复
引用 10 楼 china_jeffery 的回复:
Sleep精度可以达到1ms吗?
打cs开个变速齿轮啊,拿刀啊。各种刀杀啊
bcrun 2013-11-04
  • 打赏
  • 举报
回复
引用 26 楼 go_and_see 的回复:
同样觉得不太可能:MS自己都说了它的操作系统不是RTOS,也许你的验证结果在某些场合下是准确的,换个场合就错了。
你的意思是,要是RTOS才会有1ms精度的延时?
边走边瞧 2013-11-04
  • 打赏
  • 举报
回复
引用 37 楼 clever101 的回复:
参考: VC获取精确时间的做法
感谢分享。
边走边瞧 2013-11-04
  • 打赏
  • 举报
回复
引用 33 楼 bcrun 的回复:
[quote=引用 26 楼 go_and_see 的回复:] 同样觉得不太可能:MS自己都说了它的操作系统不是RTOS,也许你的验证结果在某些场合下是准确的,换个场合就错了。
你的理解很成问题,有个1ms的sleep就算RTOS了?也差太远了吧。[/quote] 你的理解能力,呵呵。RTOS在任何场合都能保证时间精度,至于保证多高的精度则是另外一个问题,这个没啥争论吧。你再读一遍俺的原话:也许你的验证结果在某些场合下是准确的,换个场合就错了。 没有歧义吧?真不知道你怎么得出“1ms的时间精度==RTOS”的推论。
边走边瞧 2013-11-04
  • 打赏
  • 举报
回复
引用 53 楼 bcrun 的回复:
Re: 52 楼: MS的windows系统不能保证所有情况都能有1ms的精度 我啥时说过“MS的windows系统能保证所有情况都能有1ms的精度”了?我甚至连在"大多数机器"上这种描述都没写。而且我也明确说明了只是在我自己笔记本测试得结果。哈哈,为了防止技术问题的讨论转移到“面子问题”上去,这个就不单独回复了。
首帖改得真快,俺就不多说啥了。 既然讨论技术,那咱不扯面子了。针对下面代码,俺给出测试结论:xp和win7结果不同,不同的硬件配置返回值也不同。修改首帖吧,赶紧的。

    Private Sub DoTestSleep()  
        Dim lTime1&, lTime2&  
        Dim i&  
        lTime1 = timeGetTime  
       
        Sleep 1 'delay 1 ms  
        lTime2 = timeGetTime  
        Debug.Print lTime2 - lTime1  
    End Sub
nvip 2013-11-04
  • 打赏
  • 举报
回复
RTX是Windows XP的硬实时扩展套件 精确的 clock & timer 确定性的调度for real确定性的调度for real-time threads BUS和 直接访问 I/O, BUS和 内存 注:RTX的应用软件继续执行即使Windows崩溃 RTX的应用软件继续执行即使 的应用软件继续执行即使Windows崩溃
bcrun 2013-11-04
  • 打赏
  • 举报
回复
引用 51 楼 vbvcde 的回复:
1ms精度只有实时系统才有 桌面系统没有 或者安装一个RTOS子系统才可以 windows有实时子系统的软件
能否介绍一下这个“实时子系统的软件” ? Re: 52 楼: MS的windows系统不能保证所有情况都能有1ms的精度 我啥时说过“MS的windows系统能保证所有情况都能有1ms的精度”了?我甚至连在"大多数机器"上这种描述都没写。而且我也明确说明了只是在我自己笔记本测试得结果。哈哈,为了防止技术问题的讨论转移到“面子问题”上去,这个就不单独回复了。
边走边瞧 2013-11-04
  • 打赏
  • 举报
回复
引用 50 楼 bcrun 的回复:
[quote=引用 26 楼 go_and_see 的回复:] 同样觉得不太可能:MS自己都说了它的操作系统不是RTOS,也许你的验证结果在某些场合下是准确的,换个场合就错了。
你的意思是,要是RTOS才会有1ms精度的延时?[/quote] MS的windows系统不能保证所有情况都能有1ms的精度,俺的原话没有歧义,你还是看原话吧。 BTW,掐头去尾得出个武断的推论让俺回答,然后你再找漏洞反击,以便挽回面子,是这个意思吗?你不觉得无聊?
nvip 2013-11-04
  • 打赏
  • 举报
回复
1ms精度只有实时系统才有 桌面系统没有 或者安装一个RTOS子系统才可以 windows有实时子系统的软件
PctGL 2013-11-03
  • 打赏
  • 举报
回复
引用 41 楼 Chen8013 的回复:
... 感觉你没理解我的意思 我是说,在某些情况下 , 他跟精度就没关系, 也就是根本挨不上边,说不上话.... 放一起不合适... 说sleep 的时候最好不要说精度... .
Sarify 2013-11-03
  • 打赏
  • 举报
回复
不错,挺有用的
PctGL 2013-11-03
  • 打赏
  • 举报
回复
引用 43 楼 Chen8013 的回复:
n... 说的是有点过分了,但是目前我对sleep的认识也就到那了。。。 对错与否还待验证,但好在你终于理解我的意思了哈
无主之城 2013-11-03
  • 打赏
  • 举报
回复
非常不错,很好很实用
舉杯邀明月 2013-11-03
  • 打赏
  • 举报
回复
晕,错了一个字。上面的“真实运行机会”应为“真实运行机制”。
加载更多回复(38)
课 程 设 计 报 告 课程名称 单片机原理与应用 课题名称 倒计时器设计 专 业 电子信息工程技术 班 级 学 号 姓 名 指导教师 2011-12-22 设计内容及要求 (1)设计一个倒计时器,由单片机接收小键盘阵列设定倒计时时间,倒计时范围最大为 60分钟,由LED 显示模块显示剩余时间,显示格式为 XX(分):XX(秒).X,精确到0.1s的整数倍。倒计时时间到,由蜂鸣器发出报警。 (2)绘制系统硬件接线图,并进行系统仿真。 (3)画出程序流程图并编写程序实现上述功能 2、设计方案 (1)单片机定时系统工作原理 我们知道单片机的外接石英体振荡器能提供稳定、准确的频率,并经12分频后向内部定 时器提供实时基准频率信号,我们设定定时工作在中断方式下,连续对此频率信号进行 分频计数,便可得到秒信号,在对秒信号进行计数便可得到分、时、实时时钟信息。石 英晶体振荡频率为6MHz,设定定时器工作在方式1下,定时常数为3CB0H,则定时器每10 0ms产生1次中断,在定时器的中断定时处理中,每10次中断,则向秒计数器减1,秒计数 器计数到00时则向分计数器退位(并建立退位标志),分计数器计数到00时则向时计数 器退位,计数器退位······如此周而复始地连续计数,便可获得时、分、秒的信号,建 立一个实时时钟,接下来便可以进行报警输出,当主程序检测到有分退位标志时,便开 始比较当前时间(小时与分,存放在RAM中)与规定时间(小时与分及秒,存放在ROM中 )是否有相同者,则进行蜂鸣器报警,如无相同者则返回主程序,如此便实现了定时控 制的要求。要准确到秒,则时、分、秒三者均需参与比较,并且建立秒进位标志位,即 每秒钟的偶也要对定时设定值比较一遍。 (2)电路原理 定时电路的核心是AT89C51单片机,其内部带有4KB的FLASH ROM,无须外扩程序存储器。电脑时钟没有大量的运算和短暂缓存数据,现有的128B片内 RAM亦能满足要求,也不必外扩片外RAM。系统配备5位LED显示和3*4键盘,用P3口作为减 排接口电路,P2口作为5位LED显示的位选通口,P0口则作为字形码输出口。采用共阳极 LED数码管,PO口、P2口和数码管之间传接了驱动芯片74LS245,因此P2口输出高电平选 中相应的位,而对P0口输出低电平点亮相应的段。 (3)系统工作流程 1. 进入主程序。 2. 设置各中断的入口地址。 3. 把相关的寄存器清零。 4. 设置数码管显示的初始状态。 5. 对键盘进行扫描。 6. 显示下一个数字。 7. 进行倒计时。 8. 判断计时是否到了。 9. 到了清零处理。 10. 没到继续倒计时知道清零为止。 3、程序设计 根据上述工作流程,软件设计可分为以下几个功能模块: 1. 主程序:初始化与键盘监控。 2. 计时:未定时器0中断服务子程序,完成刷新计时缓冲区的功能。 3. 显示:完成5位LED动态显示。 4. 键盘扫描:判断是否有键按下,并求取键号。 5. 其他辅助功能程序,如键盘设置、拆字、合字、等。 下面分模块进行软件设计: 计时程序模块。如前所述,系统定时采用定时器与软件循环相结合的方法。定时器0每隔 100ms溢出中断一次,则循环中断10次延时时间为1秒,上述过程重复60次为1分钟,分计 时60次为1小时。 设系统使用6MHz的晶振,定时器0工作方式1,则100ms定时对应的定时器初值可以下计算 得到 定时时间=(216-定时器0初值)*(12/fosc) 如果定时器0初值为3CB0H,则TH0=3CH,TL0=0B0H。   当系统使用其他频率的晶振时,可以由上式计算相应的定时器0初值,也可以改变定时时 间。例如当系统晶振为12MHz时,同样的初值对应的设定时间为50ms,则循环中断次数为 20次时,延时为1秒。 这里有两个问题要特别重视。 . 定时器溢出产生中断请求,CPU并不一定立即响应中断,而可能需要延迟一定的中断响应 时间之后才能响应中断,中断响应时间大约为3~8个机器周期。显然,这将在定时时间中 加入额外的延时时间,导致即计时误差。为了保证计时精度,必须采取措施进行补偿。 我们采用增大重装的定时器0初值的方法来减少定时器0 的定时时间。具体应调整为多大,一般需要通过调试来确定。经测试,定时器0重装初值 设为3CB7H~3CBFH可以满足精度要求。 . 时间是按十进制递增,而MCS- 51系列单片机只有二进制加法指令,因此用加法指令计时必须进行二——十进制转换。 , 时间校时对设置程序和定时报时程序模块。将键盘输入的5位时间值合并为3位压缩BCD码 (时、分、秒)送入即使缓冲区,作为当前倒计时起始时间。该模块的入口为即使缓冲 区或报时值寄存区的首地址。程序调用一个键盘设置子程序将键入的5位时间值送入键盘 缓冲区,
20 20 光电信息综合设计报告 多功能秒表设计 院(系)名称 信息工程学院 专 业 名 称 光电信息科学与工程 姓 名 学 号 0 指 导 教 师 基于单片机的多功能秒表设计全文共23页,当前为第1页。2018年 5 月 20日 基于单片机的多功能秒表设计全文共23页,当前为第1页。 摘 要 近年来随着科技的飞速发展,单片机的应用正在不断的走向深入。本文阐述了基于单片机的多功能电子秒表设计。本设计主要特点是具有倒计时功能,还可以按圈计时,而且误差在0.01s,是各种体育竞赛的必备设备之一,另外硬件部分设置了查看按键,还具备有定时提醒功能,让你时时刻刻都掌握时间。 本设计的数字电子秒表系统采用STC89C52单片机为中心器件,利用其定时器/计数器定时和记数的原理,结合显示电路、数码管以及外部中断电路来设计计时器。将软、硬件有机地结合起来,使得系统能够实现4位LED显示,显示时间99s内,能正确地进行计时,同时能记录10组时间,并在暂停是对时间进行查询。其中软件系统采用C语言编写程序,包括显示程序,定时中断服务延时程序等,并在KEIL中调试运行,硬件系统利用PROTEUS强大的功能来实现,简单切易于观察,在仿真中就可以观察到实际的工作状态。 关键字:单片机;数字电子秒表;提醒 基于单片机的多功能秒表设计全文共23页,当前为第2页。 目 录 基于单片机的多功能秒表设计全文共23页,当前为第2页。 1 总体设计方案 1 2 硬件设计 3 2.1 单片机的选择 3 2.2 显示电路的选择与设计 5 2.3 按键电路的选择与设计 6 2.4 时钟电路的选择与设计 6 2.5 系统总电路的设计 7 3 软件设计 9 3.1 程序设计思想 9 3.2 主程序设计 9 3.3 中断程序设计 10 3.4程序模块设计: 11 主程序 11 (2)停止子程序 14 (3)复位子程序 14 (4)按键消抖程序 15 4 多功能秒表的安装与调试 16 4.1 软件的仿真与调试 16 4.2 硬件的安装与调试 16 4.3 实物调试 17 结 论 19 基于单片机的多功能秒表设计全文共23页,当前为第3页。 基于单片机的多功能秒表设计全文共23页,当前为第3页。 1 总体设计方案 多功能秒表具有显示直观、读取方便、精度高等优点,在计时中广泛使用。本设计用单片机组成数字电子秒表,力求结构简单、精度高为目标。 设计中包括硬件电路的设计和系统程序的设计。其硬件电路主要有主控制器,时钟功能,倒计时计时与显示电路和回零、启动和停表电路等。主控制器采用单片机STC89C52,显示电路采用共阳极LED数码管显示计时时间。 本设计利用STC89C52单片机的定时器/计数器定时和记数的原理,使其能精确计时。利用中断系统使其能实现开始暂停的功能。P0口输出段码数据,P2口作位扫描输出,P1^0,P1^1,P1^2,P1^3,P1^4口接5个按钮开关,分别实现开始、记录、清除,方向和调整。电路原理图设计最基本的要求是正确性,其次是布局合理,最后在正确性和布局合理的前提下力求美观。硬件电路图按照图1-1进行设计。 STC89C52单片机控制系统四位数码管 灯光提示系统控制开关 STC89C52 单片机控制系统 四位数码管 灯光提示系统 控制开关 图1-1 智能秒表显示硬件电路基本原理图 根据要求知道秒表设计主要实现的功能是倒计时计时和时钟显示。因此设置了五个按键和四位数码管显示时间,五个按键中,按键1是开始按钮:可控制系统的开关;按键2为记录按键:在秒表模式运行时,可保存数据,在其他状态时还有复用功能;按键3为清除键:在系统计时时可以复位时间,在查看数据、调整时间时,还有其他功能;按键4为方向键,调节时间计时时的正反向;按键5为调整按键:调整和设置时间。利用这五个建来实现秒表的全部功能,而四个位数码管则能显示最多99秒内的计时。 基于单片机的多功能秒表设计全文共23页,当前为第4页。计时采用定时器T0中断完成,定时溢出中断周期为10ms,当一处中断后向CPU发出溢出中断请求,每发出一次中断请求就对毫秒计数单元进行加一,达到2次就对十毫秒位进行加一,就是进位0.01,然后按时钟的取值范围进行进位。 基于单片机的多功能秒表设计全文共23页,当前为第4页。 再看按键的处理。这六个键可以采用中断的方法,也可以采用扫描的方法来识别。 设计中包括硬件电路的设计和系统程序的设计。其硬件电路主要有主控制器,显示电路和回零、启动、查看、停表电路等。主控制器采用单片机STC89C52,显示电路采用共阳极LED数码管显示计时时间,五个按键均采用触点式按键。 基于单片机的多功能秒表设计全文共23页,当前为第5页。 2 硬件设计 基于单片机的多功能秒表设计全文共23页,当前为第5页。 2.1 单
单片机课程动静态显示设计方案 一、设计任务与要求 1.1 设计背景 随着科学技术的发展和电子技术产业结构调整,单片机开始迅速发展,由于家用电器逐 渐普及,市场对于智能时钟控制系统的需求也越来越大。单片机以其芯片集成度高、处 理功能强、可靠性高等优点,成功应用于工业自动化、智能仪器仪表、家电产品等领域 。 近些年,人们对数字钟的要求也越来越高,传统的时钟已不能满足人们的需求。多功能 数字钟不管在性能还是在样式上都发生了质的变化,有电子闹钟、数字闹钟等等。单片 机在多功能数字钟中的应用已是非常普遍的,人们对数字钟的功能及工作顺序都非常熟 悉。但是却很少知道它的部结构以及工作原理。由单片机作为数字钟的核心控制器,可 以通过它的时钟信号进行计时实现计时功能,将其时间数据经单片机输出,利用显示器 显示出来。通过键盘可以进行定时、校时功能。输出设备显示器可以用液晶显示技术和 数码管显示技术。 单片机系统作为一种典型的嵌入式系统,其系统设计包括硬件设计和软件编程设计两个 方面,其调试过程一般分为软件调试、硬件测试、系统调试。 1.2 课程设计目的 通过《单片机原理与应用》课程设计,使学生掌握单片机及其扩展系统设计的方法和设 计原则及相应的硬件调试的方法。进一步加深单片机及其扩展系统设计和应用的理解 1.3 设计要求 1、主电路系统由秒信号发生器、"时、分、秒"计数器、译码器及显示器、校时电路 、整点报时电路组成 2、秒信号产生器是整个系统的时基信号,它直接决定计时系统的精度,一般用石英 晶体振荡器加分频器来实现。将标准秒信号送入"秒计数器","秒计数器"采用60进制计 数器,每累计60秒发出一个"分脉冲"信号,该信号将作为"分计数器"的时钟脉冲。"分计 数器"也采用60进制计数器,每累计60分钟,发出一个"时脉冲"信号,该信号将被送到" 时计数器"。"时计数器"采用24进制计时器,可实现对一天24小时的累计 3、译码显示电路将"时"、"分"、"秒"计数器的输出状态菁七段显示译码器译码,通 过六位LED七段显示器显示出来 4、校时电路时用来对"时"、"分"、"秒"显示数字进行校对调整的 二、总体方案设计 2.1 电路的总体原理框图 根据以上的电子时钟的设计要求可以分为以下的几个硬件电路模块:单片机模块、数 码显示模块与按键模块,模块之间的关系图如下面得方框电路图1所示 单片机 图1 硬件电路方框图 2.2 实现时钟计时基本方法 利用STC系列单片机的可编程定时/计数器、中断系统来实现时钟计数。 (1) 计数初值计算: 把定时器设为工作方式1,定时时间为50ms,则计数溢出20次即得时钟计时最小单位 秒,而100次计数可用软件方法实现。 假设使用T/C0,方式1,50ms定时,fosc=12MHz。 则初值X满足(216-X)×1/12MHz×12μs =50000μs X=15536 10000 3CB0H (2) 采用中断方式进行溢出次数累计,计满20次为秒计时(1秒); (3) 从秒到分和从分到时的计时是通过累加和数值比较实现。 2.3 电子钟的时间显示 电子钟的时钟时间在六位数码管上进行显示,因此,在部RAM中设置显示缓冲区共8个 单元。 LED8 LED7 LED6 LED5 LED4 LED3 LED2 LED1 37H 36H 35H 34H 33H 32H 31H 30H 时十位 时个位 分隔 分十位 分个位 分隔 秒十位 秒个位 2.4 电子钟的时间调整 电子钟设置3个按键通过程序控制来完成电子钟的时间调整。 A键按一次调整时,按第二次调整分钟,第三次推出时间调整; B键对小时或分钟进行加一; C键对小时或分钟进行减一; 2.5 总体方案介绍 2.5.1 计时方案 利用STC89C52单片机部的定时/计数器进行中断时,配合软件延时实现时、分、秒的 计时。该方案节省硬件成本,且能使读者在定时/计数器的使用、中断及程序设计方面得 到锻炼与提高,对单片机的指令系统能有更深入的了解,从而对学好单片机技术这门课 程起到一定的作用。 2.5.2 控制方案 STC89C52的P0口和P1口外接由八个LED数码管(LED8~LED1)构成的显示器,用P0口作 LED的段码输出口,P1口作八个LED数码管的位控输出线,P3口外接四个按键A、B、C构成 键盘电路。 STC89C52 是一种低功耗,高性能的CMOS 8位微型计算机。它带有8K Flash 可编程和擦除的只读存储器(EPROM),该器件采用ATMEL的高密度非易失性存储器技术 制造,与工业上标准的80C51和80C52的指令系统及引脚兼容,片Flash 集成在一个芯片上,可用与解决复杂的问题,且成本较低。简易电子钟的功能不复杂, 采用其现有的I/O便可完成,所以本设计中采用此的设计
课 程 设 计 任 务 书 课程设计题目 三位数电容表 功能 技术指标 设计一个电路简洁、精度高及测量范围宽的电容表,将待测电容的电容值显示到数码管,可显示 三位数字 工作量 适中 工作计划 3月8日 查资料,分析原理 3月9日 画原理图,列元器件表 3月11日 购买元器件 3月12日 安装电路 3月14日 电路调试 3月19日 结题验收 3月20日 撰写说明书 3月25日 交说明书并准备答辩 3月26日 答辩 指导教师评语 指导教师: 2010年3月 23日 目录 第1章 绪论 1 1.1设计要求 1 1.2 设计功能 1 第2章 电路的方框图 2 2.1 电路的方框图 2 第3章 单元电路设计和参数计算 3 3.1 单元电路设计 3 3.1.1 双时基电路 3 3.1.2 控制电路 5 3.1.3 计数电路 5 3.1.4 译码电路 7 3.1.5 显示电路 8 3.1.6 8550型号三极管 9 3.1.7 电容的作用 9 3.2 参数计算 11 第4章 整机电路的工作原理 13 4.1 三位数字电容表原理图 13 4.2 电路工作原理 13 第5章 电路的组装与调试 15 5.1合理布局 15 5.2调试 15 结论 16 收获与体会 17 致谢 18 参考文献 19 附录1 元器件清单 20 第1章 绪论 课程设计是运用自己所学的数字电子技术、模拟电子技术知识,根据老师所给课程设计题目,自行分组(每组3-4人)来设计、搭接、调试电路,使其实现所给题目要求的功能、量化指标等参数,三周内上交电路,老师通过对电路的完成情况、出勤情况、说明书制作情况以及课程设计答辩情况对每位同学进行评分。 1.1设计要求 1.被测电容范围:1PF-10000uF; 2.测试误差<10%; 3.电容值用三位数码管显示。 1.2 设计功能 设计一个电路简洁、精度高及测量范围宽的电容表,将待测电容的电容值显示到数码管可显示三位数。 实际上就是,待测电容容量时间转换器将待测电容的容量转换成与其成正比的单稳态时间。闸门控制器的开通时间及为单稳时间。当闸门控制器开通,由基准脉冲发生器产生的标准计数脉冲被输入到计数器计数,然后再通过译码器对其译码,使BCD码转换成十进制数字笔段码,最后在共阴极数码管上直接显示测量结果。 第2章 电路的方框图 2.1 电路的方框图 三位数字电容表是由基准脉冲发生器、待测电容容量时间转换器、闸门控制器、计数器、译码器及显示器等组成,其方框图如图2-1所示。 基准脉冲发生器是用来产生标准的计数脉冲。待测电容容量时间转换器是把待测电容的容量转换成与容量成正比的单稳态时间td。闸门控制器的开通时间就是单稳态时间td。在to时间内,计数脉冲通过闸门被送往计数器计数,计数的多少直接反映出被测电容的容量。 图2-1 三位数字电容表电路结构框图 第3章 单元电路设计和参数计算 3.1 单元电路设计 3.1.1 双时基电路 双时基电路主要由NE556组成,其芯片引脚与外围电路如图3-1所示。 图3-1 NE556芯片管脚图 由于NE556是两个NE555组成。故这里只简单介绍一下NE555,见图3-2所示。 图3-2 NE555内部结构图 NE555是属于555系列的计时IC的其中的一种型号,555系列IC的接脚功能及运用都是相容的,只是型号不同的因其价格不同其稳定度、省电、可产生的振荡频率也不大相同;而555是一个用途很广且相当普遍的计时IC,只需少数的电阻和电容,便可产生数位电路所需的各种不同频率之脉冲信号。 NE555具体如下的特点: 只需简单的电阻器、电容器,即可完成特定的振荡延时作用。其延时范围极广,可由几微秒至几小时之久。 它的操作电源电压范围极大,可与TTL,CMOS等逻辑电路配合,也就是它的输出准位及输入触发准位,均能与这些逻辑系列的高、低态组合。 其输出端的供给电流大,可直接推动多种自动控制的负载。 它的计时精确度高、温度稳定度佳,且价格便宜。 NE555内部功能框图如图3-3所示。其功能说明如下: 图3-3 NE555内部功能框图 Pin 1 (接地) -地线(或共同接地) ,通常被连接到电路共同接地。 Pin 2 (触发点) -这个脚位是触发NE555使其启动它的时间周期。触发信号上缘电压须大于2/3 VCC,下缘须低于1/3 VCC 。 Pin 3 (输出) -当时间周期开始555的输出输出脚位,移至比电源电压少1.7伏的高电位。周

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧