资源描述
用51单片机测量周期,频率的方法及实现
-
用51单片机测量周期,频率的方法及实现
对于周期波频率的测量方法很多,但大多是通过测量间接计算频率。本文介绍了用目前应用比较广泛的MCS-51系列单片机对周期波频率进行测量,并通过LED以数字形式直观地示出频率,实现测量的智能化,省去间接对频率计算的麻烦与错误。文章对其测量原理,设计和实现作了说明,介绍了主要程序,并进行了误差分析。
引言
目前单片机广泛应用到国民经济建设和日常生话的许多领域,成为测控技术现代化不可缺少的重要工具。而本文适应这一发展趋势,把MCS-51系列单片机应用于对周期波频率的测量。并通过LED显示器自动显示出来,这对于频率的测量带来了极大的方便。
设计思想
利用施密特触发器将边缘缓慢变化的周期性信号如正弦波、三角波或任意形状的模拟信号变换成同频率的矩形脉冲。通过MCS-51系列单片机内部的两个十六位定时,计数器测量某段时间内的外加脉冲数,经过处理并通过LED直接显示出所加信号的频率。单片机内部的T0用来定时,T1用来计数(下降沿触发)。当来一个计数脉冲则计数一次。在T0开始定时的同时,T1开始计数;T0定时1s时间到时,T1停止计数。方框图如图1所示。
硬件设计
测量频率的硬件电路主要由计数脉冲形成电路和计数显示电路两大部分组成。计数脉冲形成电路用"555"定时器接成施密特触发器对外加的周期波进行变换,使之输出为矩形脉冲。电路如图2所示,计数显示电路如图3所示,主要包括:
(1)由INTEL公司生产、晶振频率为12MHz的89S02单片机。通过软件编程使它内部的定时器T0定时,T1对外部的所加脉冲计数。然后把测量结果值通过P0口输出。89S02自带8K闪存,可以有90—100个现场测量数据,供回放调检。
(2)4位七段共阴极的LED显示器。
(3)由于采用的是4位共阴极的动态扫描方式显示,段代码由89S02的P0口提供,位选线则由89S02P2口的P2.0~P2.3提供。由于89S02的输入,输出口不能提供足够的灌电流,因此用G1~G4提供给LED足够的显示电流。
软件设计
用MCS-51单片机测量频率的程序主要包括:初始化程序,定时计数程序、LED显示程序。初始化程序略。定时计数主要程序:
MOV R2,#14H ;定时20个0.05秒
ANL TMOD,#0FH;设置T0定时T1计数
ORL TMOD,#51H
MOV TH0,#3AH;置定时器初值
MOV TL0,#B1H
MOV TH1,#00H;置计数器初值
MOV TL1,#00H
SETB TR0 ;启动定时
SETB TR1 ;启动计数
XX:JBC TF0,LOOP ;定时溢出则转移
SJMP XX ;否则继续查询
LOOP:MOV TH0,#3AH ;置定时初值
MOV TL0,#B1H
DJNZ R2,XX ;R2不等于0则转移
CLR TR1 ;停止计数
LED显示程序
MOV A,0H
MOV A,TL1 ;TL1值送累加器A
MOV B,#100 ;处理计数结果
DIV AB
MOV R0,B ;余数放77H单元
MOV 77H,R0
MOV 7AH,A ;商放7AH单元
MOV A,0H
MOV A,77H ;77H送累加器A
MOV B,#10 ;处理计数结果
DIV AB
MOV R0,B ;余数放78H单元
MOV 78H,R0
MOV 79H,A ;商放79H单元
(测量数据存储程序略)
DPLOP1: MOV A,78H ;取出时间的个位数送A
MOVC A,@A+DPTR ;查表
MOV P0,A ;送P0口
CLR P2.3 ;开个位显示
ACALL D1MS ;延时0.1秒
SETB P2.3 ;关个位显示
MOV A,79H ;取出时间的十位数送A
MOVC A,@A+DPTR ;查表
MOV P0,A ;送P0口
CLR P2.2 ;开十位显示
ACALL D1MS ;延时0.1秒
SETB P2.2 ;关十位显示
MOV A,7AH ;取出时间的百位数送A
MOVC A,@A+DPTR ;查表
MOV P0,A ;送P0口
CLR P2.1 ;开百位显示
ACALL D1MS ;延时0.1秒
SETB P2.1 ;关百位显示
D1MS:MOV R5,#60
DJNZ R5,$
LJMP DPLOP1
RET
;段数码管各划的数字排列表
NUMTAB:DB
0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;
显示内容的对应代码
0 1 2 3 4 5 6 7 8 9;显示内容
测量范围
在上述程序下的最大测量频率为255Hz。适当调整程序后的最大测量频率可为89S02主频的1/12,但在保证测量精度的前提下最大测量频率宜安排在主频的1/100以下。
误差分析
上述程序的最大测量频率为255Hz,由于单片机在响应中断的时候有2—6个机器周期,按最大误差计算,6-2=4个机器周期,在1 s钟中断响应一共发生20次,最不利的累计误差时间为4×20=80微秒,因此在此程序下的最大误差为80/1000000=0.08/1000,这样的精度完全能满足现场检测的需要。
注:由于单片机自带计数器输入时钟的频率通常只能是系统时钟频率的几分之一甚至几十分之一,因此采用单片机的计数器直接测量信号频率就受到了很大的限制。
本实验电路采用方式2,使用一片74LS393四位双二进制计数器和Atmega8的 T1计数器组成了24位计数器,最大计数值为16777215。如果输入信号经过MB501分频器进行64分频后再进行测量,则固定1S时基下最高测量频率为1073.741760Mhz。
6位数字显示频率计数器电路及51单片机源程序
作者: | 出处:维库开发网 | 2010-09-01 14:45:52 | 阅读 1670 次
6位数字显示频率计数器电路及51单片机源程序,1.频率计算器功能利用AT89S51单片机的T0、T1的定时计数器功能,来完成对输入的信号进行频率计
1.频率计算器功能
利用AT89S51单片机的T0、T1的定时计数器功能,来完成对输入的信号进行频率计数,计数的频率结果通过8位动态数码管显示出来。要求能够对0-250KHZ的信号频率进行准确计数,计数误差不超过±1HZ。
2.电路原理图
3.程序设计内容
(1).定时/计数器T0和T1的工作方式设置,由图可知,T0是工作在计数状态下,对输入的频率信号进行计数,但对工作在计数状态下的T0,最大计数值为fOSC/24,由于fOSC=12MHz,因此:T0的最大计数频率为250KHz。对于频率的概念就是在一秒只数脉冲的个数,即为频率值。所以T1工作在定时状态下,每定时1秒中到,就停止T0的计数,而从T0的计数单元中读取计数的数值,然后进行数据处理。送到数码管显示出来。
(2).T1工作在定时状态下,最大定时时间为65ms,达不到1秒的定时,所以采用定时50ms,共定时20次,即可完成1秒的定时功能。
5.C语言源程序
C程序
#include <AT89X51.h>
unsigned CHAR code dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned CHAR code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x00,0x40};
unsigned CHAR dispbuf[8]={0,0,0,0,0,0,10,10};
unsigned CHAR temp[8];
unsigned CHAR dispcount;
unsigned CHAR T0count;
unsigned CHAR timecount;
bit flag;
unsigned long x;
void main(void)
{
unsigned CHAR i;
TMOD=0x15;
TH0=0;
TL0=0;
TH1=(6553*000)/256;
TL1=(6553*000)%6;
TR1=1;
TR0=1;
ET0=1;
ET1=1;
EA=1;
while(1)
{
if(flag==1)
{
flag=0;
x=T0count*65536+TH0*256+TL0;
for(i=0;i<8;i++)
{
temp[i]=0;
}
i=0;
while(x/10)
{
temp[i]=x;
x=x/10;
i++;
}
temp[i]=x;
for(i=0;i<6;i++)
{
dispbuf[i]=temp[i];
}
timecount=0;
T0count=0;
TH0=0;
TL0=0;
TR0=1;
}
}
}
void t0(void) interrupt 1 using 0
{
T0count++;
}
void t1(void) interrupt 3 using 0
{
TH1=(6553*000)/256;
TL1=(6553*000)%6;
timecount++;
if(timecount==250)
{
TR0=0;
timecount=0;
flag=1;
}
P0=dispcode[dispbuf[dispcount]];
P2=dispbit[dispcount];
dispcount++;
if(dispcount==8)
{
dispcount=0;
}
}
展开阅读全文