用单片机的外部中断来测频率

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

用单片机的外部中断来测频率

用51单片机的外部中断来测频率

作者:佚名来源:本站原创点击数: 302 更新时间:2010年08月08日【字体:大中小】

//晶振:12M

//实验方法:首先要把51hei单片机开发板上的ne555的方波输出信号J7的第一脚用杜邦线

// 引入P3.2口,数码管即可显示ne555震荡电路当前的频率值,旋动PR1电位器可

// 发现数字有变化.

//原理:1秒钟内计数外部脉冲个数,如计数1000次,则表示频率为1000Hz

//1秒钟定时采用51单片机定时器0实现,外部脉冲由外部中断0引脚接入

#include<reg51.h>

#include"51hei.h"

#define uchar unsigned char

uchar counter1;

sbit duan=P2^6; //74HC573的LE端U5 LED的段选端

sbit wei=P2^7; //74HC573的LE端U4 LED的位选端

unsigned int counter2,tmp;

uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 共阳型数码管0—9显示

unsigned int dis[6];

uchar con[]={0xfe,0xfd,0xfb,0xf7,0xef}; //共阳型数码管控制端

init();

delay(uchar);

display();

jishu();

void main()

{guandz();

init();

while(1)

{

jishu();

}

}

//定时器0和外部中断0的初始化

init()

{

EA=1;

EX0=1;

ET0=1;

IT0=1;

TMOD=0x01;

TH0=0x3c;

TL0=0xaf;

TR0=1;

}

//延时程序

delay(uchar x)

{

uchar a,b;

for(a=x;a>0;a--)

for(b=20;b>0;b--);

}

//外部中断0中断程序

void external0() interrupt 0

{

tmp++;

}

//定时器0中断程序

void timer0() interrupt 1

{

TH0=0x3c;

TL0=0xaf;

counter1++;

}

//显示程序

display()

{

uchar i;

dis[0]=counter2/10000; //获取计数值的万位dis[5]=counter2%10000;

dis[1]=dis[5]/1000; // 获取计数值的千位dis[5]=dis[5]%1000;

dis[2]=dis[5]/100; // 获取计数值的百位

dis[5]=dis[5]%100;

dis[3]=dis[5]/10; // 获取计数值的十位

dis[4]=dis[5]%10; // 获取计数值的个位

for(i=0;i<5;i++) //依次显示万、千、百、十、个位,动态显示

{

// P0=0xff;

P0=con[i];

wei=1;

wei=0;

P0=table[dis[i]];

duan=1;

duan=0;

delay(1);

P0=0;

duan=1;

duan=0;

}

}

jishu()

{

if(counter1==20) //定时器定时50ms,故20次中断就表示1秒钟到达

{

counter2=tmp;

display();

tmp=0;

counter1=0;

}

else

display();

}

/计数器(Timer/counter)是单片机芯片中最基本的外围接口,它的用途非常广泛,常用于测量时间、速度、频率、脉宽、提供定时脉冲信号等。相对于一般8位单片机而言,AVR不仅配备了更多的定时/计数器接口,而且还是增强型的,功能非常强大。ATmega128一共配置了2个8位和2个16位,共4个定时/计数器,本小节重点对它的一些增强功能的应用做基本的介绍。

5.9.1 预分频器

定时/计数器最基本的功能就是对脉冲信号计数,当

计数器计满后(8位为255,16位为65535),再来一个脉冲它

就翻转到0,并产生中断信号。同其他单片机类似,AVR的定时/计数器的计数脉冲可以来自外部的引脚,也可以由从内部系统时钟获得;但AVR的定时/计数器在内部系统时钟和计数单元之间增加了一个预分频器,利用预分频器,定时/计数器可以从内部系统时钟获得不同频率的信号。表5-1为系统时钟为4MHz使用定时/计数器0的最高计时精度和时宽范围。

表5-1 T/C0计时精度和时宽(系统时钟4MHz)

分频系数计时频率最高计时精度(TCNT0=255)最宽时宽(TCNT0=0)

1 4MHz 0.25us 64us

8 500KHz 2us 512us

32 125KHz 8us 2.048ms

64 62.5KHz 16us 4.096ms

128 31.25KHz 32us 8.192ms

256 15.625KHz 64us 16.384ms

1024 3906.25Hz 256us 65.536ms

从表中看出,在系统时钟为4MHz时,8位的T/C0最高计时精度为0.25us,最长的时宽可达到65.536ms。而使用16位的定时/计数器时,不需要辅助的软件计数器,就可以非常方便的设计一个时间长达16.777216秒(精度为256us)的定时器,这对于其它的8位单片机是做不到的。

AVR单片机的每一个定时/计数器都配备独立的、多达10位的预分频器,由软件设定分频系数,与8/16位定时/计数器配合,可以提供多种档次的定时时间。使用时可选取最接近的定时档次,即选8/16位定时/计数器与分频系数的最优组合,减少了定时误差。所以,AVR定时/计数器的显著特点之一是:高精度和宽时范围,使得用户应用起来更加灵活和方便。此外,AVR的USART、SPI、I2C、WDT等都不占用这些定时/计数器。

5.9.2 输入捕捉功能

ATmega128的两个16位定时/计数器(T/C1、T/C3)具有输入捕捉功能,它是AVR定时/计数器的又一个显著的特点。其基本作用是当一个事件发生时,立即将定时/计数器的值锁定在输入捕捉寄存器中(定时/计数器保持继续运行)。利用输入捕捉功能,可以对一个事件从发生到结束的时间进行更加精确,如下面的示例中精确测量一个脉冲的宽度。测量一个脉冲的宽度,就是测量脉冲上升沿到下降之间的时间。不使用输入捕捉功能,一般情况往往需要使用两个外围部件才能完成和实现。如使用1个定时/计数器加1个外部中断(或模拟比较器):定时/计数器用于计时;而外部中断方式设置成电平变化触发方式,用于检测脉冲的上升和下降沿。当外部中断输入电平由低变高,触发中断,读取时间1;等到输入电平由高变低时,再次触发中断,读取时间2;两次时间差

既为脉冲宽度。这种实现方式不仅多占用了一个单片机的内部资源,而且精度也受到中断响应时间的限制。因为一旦中断发生,MCU响应中断需要时间,在中断中可能要进行适当的中断现场保护,才能读取时间值。而此时的时间值比中断发生的时间已经滞后了。

而使用ATmega128的1个定时/计数器,再配合其输入捕捉功能来测量脉冲的宽度就非

相关文档
最新文档