目录第1章频率计数器设计………………………………………………1.1设计内容、要求及目的…………………………………………1.2 基本原理与总体方框图………………………………………第2章硬件系统设计……………………………………………2.1各部分方案及说明………………………………………………2.1.1 单片机部分…………………………………………………2.1.2 状态译码器…………………………………………………2.1.3数据显示电路………………………………………………………第3章软件系统设计……………………………………………3.1 应用系统的程序设计………………………………………………3.1.1 1s定时………………………………………………………………3.1.2 T1计数程序………………………………………………………3.1.3 进制转换………………………………………………………3.1.4 数码显示………………………………………………………3.2 程序调试………………………………………………………………第4章设计总结体会……………………………………………参考文献………………………………………………………………附录………………………………………………………………………………第1章频率计数器设计1.1 设计的内容、要求及目的设计内容:本课题以单片机为核心,设计和制作一个频率计数器,来完成对输入的信号进行频率计数,计数的频率结果通过6位动态数码管显示出来。
要求能够对0-250KHZ的信号频率进行准确计数,计数误差不超过±1HZ。
设计要求:1.设计方案要合理、正确;2.系统硬件设计;3.完成必要元器件选择;4.系统软件设计及调试;5.写出设计报告实验目的本应用系统实验的目的是通过在“单片机原理及应用”课堂上学习的知识,以及查阅资料,培养一种自学的能力。
并且引导一种创新的思维,把学到的知识应用到日常生活当中。
在设计的过程中,不断的学习,思考和同学间的相互讨论,运用科学的分析问题的方法解决遇到的困难,掌握单片机系统一般的开发流程,学会对常见问题的处理方法,积累设计系统的经验,充分发挥教学与实践的结合。
全能提高个人系统开发的综合能力,开拓了思维,为今后能在相应工作岗位上的工作打下了坚实的基础。
1.2 基本原理与总体方框图基本原理频率计数器的主要功能是测量周期信号的频率。
频率是单位时间( 1S )内信号发生周期变化的次数。
如果我们能在给定的 1S 时间内对信号波形计数,并将计数结果显示出来,就能读取被测信号的频率。
测量过程中定时/计数器T0和T1的工作方式设置,T1是工作在计数状态下,对输入的频率信号进行计数,在本次设计使用的98C51单片机,由于检测一个由“1”到“0”的跳变需要两个机器周期,前一个机器周期测出“1”,后一个周期测出“0”。
故输入时钟信号的最高频率不得超过单片机晶振频率的二十四分之一,最大计数值为f OSC/24,由于f OSC=12MHz,因此:T1的最大计数频率为0.5mHz。
对于频率的概念就是在一秒只数脉冲的个数,即为频率值。
所以T0工作在定时状态下,每定时1秒中到,就停止T1的计数,而从T1的计数单元中读取计数的数值,然后进行数据处理。
送到数码管显示出来。
总体方框图课题设计的是一种以单片机为主控制的频率计。
数字频率计主要由以下几部分组成:定时计数、采集数据、进制转换和数码显示。
本课题主要是以单片机AT89C51 为核心, 通过计数电路, 以及软件程序的编写, 实现脉冲频率的显示。
频率计系统总体框图如下:第2章硬件系统设计此次设计要求制作一频率计系统,需要使用的硬件主要包括51单片机芯片,74LS138译码器和数码管。
另外还是用到排线若干,下载线及电源线。
2.1 各部分方案选定、功能2.1.1 单片机部分本次设计采用了AT89C51 单片机, AT89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器。
如图2所示:图2 AT89C52引脚图AT89C51拥有五个中断源,当有外部脉冲到来时可实现中断的响应,另外AT89C51拥有定时/ 计数器(T0、T1),可实现定时与计数的功能。
单片机AT89C51的P0、P2的4个8位并行I/O口可进行外部存储设备扩展。
2.1.2 状态译码器(74LS138)图3 74LS138译码器74LS138译码器输出的状态控制数码管的亮与灭,它有6个状态,连接到数码管的位选,达到点亮数码管点亮的要求。
2.1.3 数据显示电路图4 显示电路图数据显示电路由限流电路和7段数码管组成,采用器件LED 显示器。
本设计中采用了六个七段数码管进行数据显示, 将五个数码管串接起来进行显示, 显示数据即是对频率计的测量结果。
系统板上硬件连线:(1)把“单片机系统”中的P0.0-P0.7口连接动态数码的段选ABCDEFGH 端口。
(2)把“单片机系统”中的P2.0-P2.2与译码器74LS138的A、B、C、引脚相连,再把译码器经“非门”与“动态数码显示”区域中的1、2、3、4、5、6端口用6芯排线连接。
(3)把“单片机系统”中的P3.5(T1)端子用导线连接到“频率源”的端子上。
(4) 把P3.2(/INT1)与按键连接。
第3章软件系统设计3.1 应用系统的程序设3.1.1 1s定时采用T0定时50ms,连续循环定时20次即可完成1s定时,用一个计数单元20H存放循环的次数,每一次循环20H单元自减1,当20H单元为零时则1s定时到时。
其程序流程图如图5所示。
图5 1s定时流程图3.1.2 T1计数程序设计中T1采用计数功能,思路是除了计数器T1的TH1和TL1用于计数外,再选用一个计数单元23H,每当计数器T1溢出回零时产生中断,中断程序执行23H单元自增1,这样,当一秒到时时采集的计数数据,23H单元存放的是数据的最高位,TH1存放的是数据的次高位,TL1存放的是数据的最低位。
当然,这里所说的“最高位”“次高位”以及“最低位”都是针对十六进制而言的。
T1计数程序的流程图如图6所示。
图6 T1计数流程图3.1.3 进制转换算法的基本思路是:第一步将最高位的高半字节提出来,除以10,把商存储起来,余数与最高位的低半字节组合成一个字节,再除以10,再存储商,余数以此类推,直到最后一次计算得到的余数即为十进制数的个位;第二步把第一步存储的商组合成一个字节,依次除以10,仍然把每次得到的商存储起来,以此类推最后一次得到的余数即为十进制数的十位;以后也是以此类推得到十进制数的百位、千位……以上算法必须要注意的一个为题是,每次得到的余数与低位的半字节组合成一个字节时,余数必须放在该字节的高半字节,否则计算错误。
该本次频率计系待测的时钟信号的最高频率为460800Hz,对应的十六进制数为70800H,这里就以70800H转换为十进制数为例来说明这种算法。
第一步:用7H除以10,商0H余7H,把商0存储在24H单元,余数7H与下一个字节08H的高半字节0H组合成一个字节70H。
70H除以10,商BH余2H,把商BH存储在25H单元,余数2H与8H组合成一个字节28H。
28H除以10,商4H余0H,把商4H存储在26H单元,余数0H与0H组合成一个字节00H。
00H除以10,商0H余0H,把商0H存储在27H单元,余数0H与0H组合成一个字节00H。
00H除以10,商0H余0H,把商0H存储在28H单元,余数0即为所需十进制数的个位。
第二步:把存储在24H与25H单元的商组合成一个字节0BH。
0BH除以10,同第一步,存储商,余数与下一个商组合成一个字节,再除以10,一次类推得到十进制数的十位0。
第三步:方法同第二步,得到十进制数的百位8。
第四步:方法同第三步,得到十进制数的千位0。
第五步:方法同第四步,得到十进制数的万位6和十万位4。
最后得到了十进制数460800。
3.1.4 数码显示将十进制数转换为相应的LED显示的代码,最容易实现的编程方法就是查表,因数码管最多只需要显示六位,只需要查六次表就可以了,图7是将十进制数对应的LED显示代码存入以60H为首单元的流程图。
图7 十进制数转换为显示代码流程图3.2 程序的调试编写的频率计总体程序编译成HEX文件,写入51单片机内,在观察数码管显示的时候,发现高位的“0”仍然能够显示,而通常十进制的高位的“0”通常是省略的。
为了解决这个问题,需要另外添加一段屏蔽高位的“0”的程序。
具体程序编写如下:PINGBI: MOV 20H,#06HMOV R1,#55HPANDUAN:MOV A,@R1JNZ SCANNUMDEC R1DEC 20HAJMP PANDUAN程序经过调试以后,数码管从高位第一位不为“0”的数开始显示。
参考文献1、《单片机原理与应用》王迎旭等编机械工业出版社2、《51系列单片机设计实例》楼然苗等编北京航空航天大学出版社3、《计算机硬件技术基础实验教程》黄勤等编重庆大学出版社4、《微型计算机接口技术及应用》刘乐善主编华中科技大学出版社5、《单片微型计算机原理及接口技术》陈光东等华中科技大学出版社附录1源程序清单:ADD A,25HMOV B,#0AHDIV ABMOV 24H,A ;存储第一位商MOV A,B M EQU 15N EQU 5ORG 0000HAJMP MAINORG 0003HAJMP CNINT0ORG 000BHAJMP T0INTORG 001BHAJMP T1INTORG 0030HMAIN:MOV SP,#70HMOV IE,#8BH ;开放EA、T1、T0中断MOV TMOD,#51H;初始化程序MOV TH0,#3DHMOV TL0,#71HMOV 20H,#20MOV TH1,#00HMOV TL1,#00HMOV 21H,#00HMOV 22H,#00HMOV 23H,#00HSETB IT0SJMP $CNINT0:SETB TR0SETB TR1RETIT0INT:DJNZ 20H,NEXT1;定时中断服务程序CLR TR1CLR TR0MOV 22H,TH1MOV 21H,TL1AJMP TRANSBDNEXT1:MOV TH0,#3CHMOV TL0,#0B0HEXIT:RETIT1INT:INC 23H;计数中断服务程序RETITRANSBD:MOV SP,#70H;将十六进制数转换成十进制数MOV A,23HMOV B,#0AHDIV ABMOV 24H,A ;存储第一位商MOV A,BMOV 30H,22HANL 30H,#0F0HADD A,30HSWAP AMOV B,#0AHDIV ABMOV 25H,A ;存储第二位商MOV A,BSWAP AADD A,22HMOV B,#0AHDIV ABMOV 26H,A ;存储第三位商MOV A,BMOV 30H,21HANL 30H,#0F0HADD A,30HSWAP AMOV B,#0AHDIV ABMOV 27H,A ;存储第四位商MOV A,BSWAP AANL 21H,#0FHADD A,21HMOV B,#0AHDIV ABMOV 28H,A ;存储第五位商MOV 50H,B ;存储十进制数个位MOV A,24HSWAP ASWAP AADD A,26HMOV B,#0AHDIV ABMOV 25H,A ;存储第二位商MOV A,BSWAP AADD A,27HMOV B,#0AHDIV ABMOV 26H,A ;存储第三位商MOV A,BSWAP AADD A,28HDIV ABMOV 27H,A ;存储第四位商MOV 51H,B ;存储十进制数十位MOV A,24HSWAP AADD A,25HMOV B,#0AHDIV ABMOV 24H,A ;存储第一位商MOV A,BSWAP AADD A,26HMOV B,#0AHDIV ABMOV 25H,A ;存储第二位商MOV A,BSWAP AADD A,27HMOV B,#0AHDIV ABMOV 26H,A ;存储第三位商MOV 52H,B ;存储十进制数百位MOV A,24HSWAP AADD A,25HMOV B,#0AHDIV ABMOV 24H,A ;存储第一位商MOV A,BSWAP AADD A,26HMOV B,#0AHDIV ABMOV 25H,A ;存储第二位商MOV 53H,B ;存储十进制数千位MOV A,24HSWAP AADD A,25HMOV B,#0AHDIV ABMOV 54H,B ;存储十进制数万位MOV 55H,A ;存储十进制数十万位DISPLAY:MOV R0,#60H;对60H-65H清零MOV R1,#06HNEXT2: MOV @R0,#00HINC R0DJNZ R1,NEXT2MOV R0,#50H;将数码管要显示的频率送到60H开头的内存MOV R1,#5FHMOV R2,#06HMOV DPTR,#TABNEXT3: MOV A,@R0MOVC A,@A+DPTRINC R0INC R1MOV @R1,ADJNZ R2,NEXT3PINGBI: MOV 20H,#06HMOV R1,#55HPANDUAN:MOV A,@R1JNZ SCANNUMDEC R1DEC 20HAJMP PANDUANSCANNUM:MOV R0,#60H;将60H开始的数送到数码管显示MOV R1,#00HMOV R2,20HLIGHT: MOV A,@R0MOV P0,AMOV A,R1MOV P2,AINC R0INC R1ACALL DELAYDJNZ R2,LIGHTAJMP SCANNUMDELAY:MOV R5,MWAIT:MOV R6,NWAITT:DJNZ R6,WAITTDEC R5DJNZ R5,WAITRETTAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H END附录2设计电路原理图:。