1、1 前言 2 一、 总体设计 .3 二、 硬件设计 .5 AT89C51 单片机及其引脚说明: 5 显示原理 .7 技术参数 .8 电参数表 .8 时序特性表 .9 模块引脚功能表 .9 三、 软件设计 .10 四、 调试说明 .11 五、 使用说明 .13 结论 13 参考文献 13 2 附录 14 、系统电路图 14 、程序清单 .15 3 前言 单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的 踪迹。导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传 输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能 IC 卡,民用 豪华轿车的安全保障系统,录像机、摄
2、像机、全自动洗衣机的控制,以及程控 玩具、电子宠物等等,这些都离不开单片机。更不用说自动控制领域的机器人、 智能仪表、医疗器械以及各种智能机械了。因此,单片机的学习、开发与应用 在生活中至关重要。 随着电子信息产业的不断发展,信号频率的测量在科技研究和实际应用中 的作用日益重要。传统的频率计通常是用很多的逻辑电路和时序电路来实现的, 这种电路一般运行缓慢,而且测量频率的范围比较小。考虑到上述问题,本论 文设计一个基于单片机技术的数字频率计。首先,我们把待测信号经过放大整 形;然后把信号送入单片机的定时计数器里进行计数,获得频率值;最后把测 得的频率数值送入显示电路里进行显示。本文从频率计的原理
3、出发,介绍了基 于单片机的数字频率计的设计方案,选择了实现系统得各种电路元器件,并对 硬件电路进行了仿真。 4 1、总体设计 用十进制数字显示被测信号频率的一种测量装置。它以测量周期的方法对 正弦波、方波、三角波的频率进行自动的测量。 所谓“频率”,就是周期性信号在单位时间(1s)内变化的次数。若在一 定时间间隔 T 内测得这个周期性信号的重复变化次数 N,则其频率可表示为 f=N/T。其中脉冲形成电路的作用是将被测信号变成脉冲信号,其重复频率等于 被测频率 fx。时间基准信号发生器提供标准的时间脉冲信号,若其周期为 1s, 则门控电路的输出信号持续时间亦准确地等于 1s。闸门电路由标准秒信号
4、进行 控制,当秒信号来到时,闸门开通,被测脉冲信号通过闸门送到计数译码显示 电路。秒信号结束时闸门关闭,计数器停止计数。由于计数器计得的脉冲数 N 是在 1 秒时间内的累计数,所以被测频率 fx=NHz。 本系统采用测量频率法,可将频率脉冲直接连接到 AT89C51 的 T0 端,将 T/C1 用做定时器。T/C0 用做计数器。在 T/C1 定时的时间里,对频率脉冲进行 计数。在 1S 定时内所计脉冲数即是该脉冲的频率。见图 1: 图 1 测量时序图 由于 T0 并不与 T1 同步,并且有可能造成脉冲丢失,所以对计数器 T0 做一 定的延时,以矫正误差。具体延时时间根据具体实验确定。 根据频率
5、的定义,频率是单位时间内信号波的个数,因此采用上述各种方 5 案都能实现频率的测量。但是本论文设计的是一个用单片机做为电路控制系统 的数字式频率计,采用脉冲定时测频法,则在低频率的测量时误差会大一些。 采用脉冲周期测频法则测高频率时精度无法保证;采用脉冲数倍频测频法和脉 冲数分频测频法则精度有所提高,但控制电路较复杂;采用脉冲平均周期测频 法则很难兼顾低频信号的测量;而采用多周期同步测频法,闸门时间与被测信 号同步,消除了对被测信号计数产生的1 误差,测量精度大大提高,且测量 精度与待测信号的频率无关,达到了在整个测量频段等精度测量。本次设计由 于个人水平有限,因此,本次设计根据需要,采用脉冲
6、定时测频法。 基本设计原理是首先把待测信号通过放大整形,变成一个脉冲信号,然后 通过控制电路控制计数器计数,最后送到译码显示电路里进行显示,其基本构 成框图如图 2 所示。 图 2 由上图可以看出,待测信号经过放大整形电路后得到一个待测信号的脉冲 信号,然后通过计数器计数,可得到需要的频率值,最后送入译码显示电路中 显示出来。但是控制部分才是最重要的,它在整个系统的运行中起至关重要的 作用。 为了得到一个高性能的数字频率计,本次设计采用单片机来做为数字频率 计的核心控制电路,辅之于少数的外部控制电路。因此本此设计的系统包括信 号放大整形电路、分频电路、单片机 AT89C51 和显示电路等。本系
7、统让被测信 号经过放大整形后,进入单片机开始计数,利用单片机内部定时计数器定时,在 6 把所记得的数经过相关处理后送到显示电路中显示。其系统原理框图将在下面 介绍。 根据上述的基于单片机的数字频率计的设计原理,我们可设计一个由 放大整形电路、分频电路、多路数据选择器、AT89C51 以及显示电路来构成的 数字式频率计,其系统框图如图 3 所示。 图 3 2、硬件设计 AT89C51 单片机及其引脚说明: 89C51 是一种高性能低功耗的采用 CMOS 工艺制造的 8 位微控制器,它提 供下列标准特征:4K 字节的程序存储器, 128 字节的 RAM,32 条 I/O 线,2 个 16 位定时器
8、/ 计数器 , 一个 5 中断源两个优先级的中断结构,一个双工的串行口, 片上震荡器和时钟电路。 引脚说明: VCC:电源电压 GND:地 P0 口:P0 口是一组 8 位漏极开路型双向 I/O 口,作为输出口用时,每个 引脚能驱动 8 个 TTL 逻辑门电路。当对 0 端口写入 1 时,可以作为高阻抗输入 端使用。 7 当 P0 口访问外部程序存储器或数据存储器时,它还可设定成地址数据总线 复用的形式。在这种模式下,P0 口具有内部上拉电阻。 在 EPROM 编程时,P0 口接收指令字节,同时输出指令字节在程序校验时。 程序校验时需要外接上拉电阻。 P1 口:P1 口是一带有内部上拉电阻的
9、8 位双向 I/O 口。P1 口的输出缓 冲能接受或输出 4 个 TTL 逻辑门电路。当对 P1 口写 1 时,它们被内部的上拉电 阻拉升为高电平,此时可以作为输入端使用。当作为输入端使用时,P1 口因为 内部存在上拉电阻,所以当外部被拉低时会输出一个低电流(IIL)。 P2 口:P2 是一带有内部上拉电阻的 8 位双向的 I/O 端口。P2 口的输出 缓冲能驱动 4 个 TTL 逻辑门电路。当向 P2 口写 1 时,通过内部上拉电阻把端口 拉到高电平,此时可以用作输入口。作为输入口,因为内部存在上拉电阻,某 个引脚被外部信号拉低时会输出电流(IIL)。 P2 口在访问外部程序存储器或 16
10、位地址的外部数据存储器(例如 MOVX DPTR)时,P2 口送出高 8 位地址数据。在这种情况下,P2 口使用强 大的内部上拉电阻功能当输出 1 时。当利用 8 位地址线访问外部数据存储器时 (例 MOVX R1),P2 口输出特殊功能寄存器的内容。 当 EPROM 编程或校验 时,P2 口同时接收高 8 位地址和一些控制信号。 P3 口:P3 是一带有内部上拉电阻的 8 位双向的 I/O 端口。P3 口的输出 缓冲能驱动 4 个 TTL 逻辑门电路。当向 P3 口写 1 时,通过内部上拉电阻把端口 拉到高电平,此时可以用作输入口。作为输入口,因为内部存在上拉电阻,某 个引脚被外部信号拉低时
11、会输出电流(IIL)。 P3 口同时具有 AT89C51 的多种特殊功能,具体如下表 1 所示: 端口引脚 第二功能 P3.0 RXD(串行输入口) 8 P3.1 TXD(串行输出口) P3.2 INT0(外部中断 0) P3.3 INT1(外部中断 1) P3.4 T0(定时器 0) P3.5 T1(定时器 1) P3.6 WR(外部数据存储器写选通道) P3.7 RD(外部数据存储器都选通道) 表 1 RST:复位输入。当振荡器工作时,RST 引脚出现两个机器周期的高电平将 使单片机复位。 EA/VPP:外部访问允许。为了使单片机能够有效的传送外部数据存储器从 0000H 到 FFFH 单
12、元的指令,EA 必须同 GND 相连接。需要主要的是,如果加密 位 1 被编程,复位时 EA 端会自动内部锁存。 ALE/RPOG:当访问外部存储器时,地址锁存允许是一输出脉冲,用以锁存 地址的低 8 位字节。当在 Flash 编程时还可以作为编程脉冲输出(RPOG )。 一般情况下,ALE 是以晶振频率的 1/6 输出,可以用作外部时钟或定时目 的。但也要注意,每当访问外部数据存储器时将跳过一个 ALE 脉冲。 PSEN:程序存储允许时外部程序存储器的读选通信号。当 AT89C52 执行 外部程序存储器的指令时,每个机器周期 PSEN 两次有效,除了当访问外部数 据存储器时,PSEN 将跳过
13、两个信号。 显示原理 我们测量的频率最终要显示出来。八段 LED 数码管显示器基本电路如图 4 9 所示。 图 4 八段 LED 数码管显示器由 8 个发光二极管组成。基中 7 个长条形的发光管排列 成“日”字形,另一个圆点形的发光管在数码管显示器的右下角作为显示小数 点用,它能显示各种数字及部份英文字母。LED 数码管显示器有两种形式:一 种是 8 个发光二极管的阳极都连在一起的,称之为共阳极 LED 数码管显示器; 另一种是 8 个发光二极管的阴极都连在一起的,称之为共阴极 LED 数码管显示 器。如下图所示。共阴和共阳结构的 LED 数码管显示器各笔划段名和安排位置 是相同的。当二极管导
14、通时,对应的笔划段发亮,由发亮的笔划段组合而显示 的各种字符。8 个笔划段 hgfedcba 对应于一个字节(8 位)的 D7、D6、D5 、D4、D3、D2、D1 、D0,于是用 8 位二进制码就能表示欲显示字 符的字形代码。 10 技术参数 标 准 值名 称 符 号 MIN TYPE MAX 单 位 电路电源 VDD - VSS -0.3 7.0 V LCD 驱动电压 VDD - VEE VDD - 13.5 VDD + 0.3 V 输入电压 VIN -0.3 VDD + 0.3 V 静电电压 - - 100 V 工作温度 -20 +70 C 储存温度 -30 +80 C 表 2 极限参数
15、表 电参数表 标 准 值名 称 符 号 测 试 条 件 MIN TYPE MAX 单位 输入高电平 VIH - 2.2 VDD V 输入低电平 VIL - -0.3 0.6 V 输出高电平 VOH IOH = 0.2mA 2.4 - V 输出低电平 VOL IOL = 1.2mA - 0.4 V 工作电流 IDD VDD = 5.0V 2.0 mA 11 Ta = 0C 4.9 Ta = 25C 4.7液晶驱动电压 VDD- VEE Ta = 50C 4.5 V 表 3 电参数表 时序特性表 标 准 值项 目 符 号 测试 条件 MIN TYPE MAX 单位 允许时间周期 TCYCE 100
16、0 ns 允许脉冲宽度,高电平 PWEH 450 - - ns 允许上升和下降时间 tEr tEf - - 25 ns 地址建立时间 tAS 140 - - ns 数据延迟时间 tDDR - - 320 ns 数据建立时间 tDSW 195 - - ns 数据保持时间 tH 10 - - ns DATA HOLD TIME tDHR 20 - - ns 地址保持时间 tAH 5.1a 5.1b 10 - - ns 表 4 时序特性表 12 模块引脚功能表 引 线 号 符 号 名 称 功 能 1 Vss 接地 0V 2 VDD 电路电源 5V10% 3 VEE 液晶驱动电压 保证 VDD-VEE
17、=4.55V 电压差 4 RS 寄存器选择信号 H:数据寄存器 L:指令寄存器 5 R/W 读/写信号 H:读 L:写 6 E 片选信号 下降沿触发,锁存数据 7 | 14 DB0 | DB7 数据线 数据传输 表 5 模块引脚功能表 3、软件设计 测频软件的实现是基于电路系统来进行设计的。本次设计采用的是脉冲定 时 测频法,所以在软件实现上基本遵照系统的设计原理,进行测频。本次软 件设计语言采用 C 语言,在电脑上编译通过后即可下载到电路上的实际电路中, 即可实现频率的测量。 开始 13 NO 初始化 P2=0xf,status_F=0 初始化 T0,T1 开定时器 T1,计数器 T0 aa
18、=19? aa=0,status_F=0 关闭 T1 定时器,定时 1S 延时矫正误差 delay(46) 关闭 T0 计数器 显示所测得频率 display 结束 14 结束 15 4、调试说明 当输入频率为 1HZ 时,测得频率为 1HZ. 当输入频率为 987HZ 时,测得频率为 987HZ。 16 但是当输入频率为 5KHZ 时,测得频率为 5001HZ。误差为 0.02%。 当输入频率大到 100kHZ 时,测得频率为 10015HZ,误差为 0.15%。 17 误差分析:因为定时和计数都是由单片机本身来完成的,在计数的时候会产生 误差。这个误差的大小是用单片机的内部时钟决定的,采用
19、高频率的晶振来为 单片机提供内部时钟,则能减少此误差。本次设计我们用的是 12MHz 的晶振, 而测频的范围是 1Hz1MHz。所以定时计数的误差在本系统基本可以忽略不计。 5、使用说明 该设计主要是能够测量外部周期信号的频率值,并且通过数码管进行显示。 把编译好得到的 hex 程序文件载入到单片机里,就可以对整体电路进行仿 真了。经过对上述电路的仿真,我们可以看出,电路所要完成的功能都能基本 实现。 结论 基于单片机的频率计的设计涉及到计算机的硬软件知识,通过对系统的设 计和调试,本次设计主要完成了以下工作: 1、提出基于单片机的数字频率计设计的基本方案; 2、完成了电路设计; 3、编译了软
20、件程序; 4、对硬件电路进行了仿真,进行了误差分析。 参考文献 1 李雷等编.集成电路应用实验. 国防工业出版社 2003 2 李雷等编.电子技术应用实验教程. 电子科技大学出版社,2006 18 3 朱红等编.电子技术综合实验. 电子科技大学出版社,2005 4 冯熙昌编.电子电话机集成电路手册. 人民邮电出版社,1996 5 李华等编.MCS-51 系列单片机实用接口技术 .北京航空航天大学出版社, 1993 6 徐惠民,安德宁等编. 单片微型计算机原理接口及应用 .北京邮电大学出版社, 2000 7 张毅坤,陈善久,单片微型计算机原理及应用.西安电子科技大学出版社, 2002. 8 张友
21、德,赵志英,徐时亮.单片微机原理应用与实验.复旦大学出版社,2000. 19 附录 、系统电路图 20 、程序清单 #include #include #define uchar unsigned char #define uint unsigned int sfr16 DPTR=0x82; bit status_F=1; uint aa, qian, bai,shi,ge,bb,wan,shiwan; uchar cout; unsigned long temp; uchar code table=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x
22、90,0xff; void delay(uint z); void init(); void display(uint shiwan,uint wan,uint qian,uint bai,uint shi,uint ge); void xtimer0(); void xtimer1(); void main() 21 P0=0XFF; init(); while(1) if(aa=19) aa=0; status_F=1; TR1=0; delay(46); TR0=0; DPL=TL0; DPH=TH0; temp=DPTR+cout*65535; shiwan=temp%1000000/
23、100000; wan=temp%100000/10000; qian=temp%10000/1000; bai=temp%1000/100; shi=temp%100/10; ge=temp%10; 22 if(shiwan=0) shiwan=10; if(wan=0) wan=10; if(qian=0) qian=10; if(bai=0) bai=10; if(shi=0) shi=10; display(shiwan,wan,qian,bai,shi,ge); 23 void init() temp=0; aa=0; cout=0; IE=0X8A; TMOD=0x15; TH1=
24、0x3c; TL1=0xb0; TH0=0; TL0=0; TR1=1; TR0=1; void display(uint shiwan,uint wan,uint qian,uint bai,uint shi,uint ge) P0=0x20; P2=tableshiwan; 24 delay(5); P0=0x10; P2=tablewan; delay(3); P0=0x08; P2=tableqian; delay(3); P0=0x04; P2=tablebai; delay(3); P0=0x02; P2=tableshi; delay(3); P0=0x01; P2=tablege; delay(3); void xtimer1() interrupt 3 TH1=0x3c; 25 TL1=0xb0; aa+; void xtimer0() interrupt 1 cout+; void delay(uint z) uint i,j; for(i=0;iz;i+) for(j=0;j110;j+);