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

上传人:新** 文档编号:563020683 上传时间:2023-11-27 格式:DOC 页数:8 大小:31.50KB
返回 下载 相关 举报
用51单片机的外部中断来测频率39550.doc_第1页
第1页 / 共8页
用51单片机的外部中断来测频率39550.doc_第2页
第2页 / 共8页
用51单片机的外部中断来测频率39550.doc_第3页
第3页 / 共8页
用51单片机的外部中断来测频率39550.doc_第4页
第4页 / 共8页
用51单片机的外部中断来测频率39550.doc_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《用51单片机的外部中断来测频率39550.doc》由会员分享,可在线阅读,更多相关《用51单片机的外部中断来测频率39550.doc(8页珍藏版)》请在金锄头文库上搜索。

1、用51单片机的外部中断来测频率39550作者:佚名 来源:本站原创 点击数: 302 更新时间:2010年08月08日 【字体:大 中 小】/晶振:12M/实验方法:首先要把51hei单片机开发板上的ne555的方波输出信号J7的第一脚用杜邦线/ 引入P3.2口,数码管即可显示ne555震荡电路当前的频率值,旋动PR1电位器可/ 发现数字有变化./原理:1秒钟内计数外部脉冲个数,如计数1000次,则表示频率为1000Hz/1秒钟定时采用51单片机定时器0实现,外部脉冲由外部中断0引脚接入 #include#include51hei.h#define uchar unsigned charuch

2、ar counter1;sbit duan=P26; /74HC573的LE端 U5 LED的段选端sbit wei=P27; /74HC573的LE端 U4 LED的位选端unsigned int counter2,tmp; uchar table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; / 共阳型数码管09显示 unsigned int dis6; uchar con=0xfe,0xfd,0xfb,0xf7,0xef; /共阳型数码管控制端 init();delay(uchar);display(); jishu();void

3、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;a0;a-) for(b=20;b0;b-);/外部中断0中断程序 void external0() interrupt 0 tmp+; /定时器0中断程序 void timer0() interrupt 1 TH0=0x3c; TL0=0xaf; counte

4、r1+; /显示程序 display() uchar i; dis0=counter2/10000; /获取计数值的万位 dis5=counter2%10000; dis1=dis5/1000; / 获取计数值的千位 dis5=dis5%1000; dis2=dis5/100; / 获取计数值的百位 dis5=dis5%100; dis3=dis5/10; / 获取计数值的十位 dis4=dis5%10; / 获取计数值的个位 for(i=0;i5;i+) /依次显示万、千、百、十、个位,动态显示 / P0=0xff; P0=coni; wei=1; wei=0; P0=tabledisi;

5、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

6、位,共4个定时/计数器,本小节重点对它的一些增强功能的应用做基本的介绍。 5.9.1 预分频器 定时/计数器最基本的功能就是对脉冲信号计数,当计数器计满后(8位为255,16位为65535),再来一个脉冲它就翻转到0,并产生中断信号。同其他单片机类似,AVR的定时/计数器的计数脉冲可以来自外部的引脚,也可以由从内部系统时钟获得;但AVR的定时/计数器在内部系统时钟和计数单元之间增加了一个预分频器,利用预分频器,定时/计数器可以从内部系统时钟获得不同频率的信号。表5-1为系统时钟为4MHz使用定时/计数器0的最高计时精度和时宽范围。 表5-1 T/C0计时精度和时宽(系统时钟4MHz) 分频系数

7、 计时频率 最高计时精度(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位的定时/计数器时,不需要辅助的软件计数器,就可以非常方便的设计一

8、个时间长达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)具有

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

10、时,再次触发中断,读取时间2;两次时间差既为脉冲宽度。这种实现方式不仅多占用了一个单片机的内部资源,而且精度也受到中断响应时间的限制。因为一旦中断发生,MCU响应中断需要时间,在中断中可能要进行适当的中断现场保护,才能读取时间值。而此时的时间值比中断发生的时间已经滞后了。 而使用ATmega128的1个定时/计数器,再配合其输入捕捉功能来测量脉冲的宽度就非常方便,下面是实现的程序示例。 #include #define ICP1 PIND.4 /脉冲输入由ICP1(Pind.4)输入 unsigned char ov_counter; unsigned int rising_edge,fall

11、ing_edge; unsigned long pulse_clocks; interrupt TIM1_OVF void timer1_ovf_isr(void) / T/C1溢出中断 ov_counter+; /记录溢出次数 interrupt TIM1_CAPT void timer1_capt_isr(void) / T/C1捕捉中断 if (ICP1) /上升沿中断 rising_edge = ICR1; /记录上升沿开始时间 TCCR1B = TCCR1B & 0xBF; /设置T/C1为下降沿触发捕捉 ov_counter = 0; /清零溢出计数器 else /下降沿中断 fa

12、lling_edge = ICR1; /记录下降沿时间 TCCR1B = TCCR1B | 0x40; /设置T/C1为上升沿触发捕捉 pulse_clocks = (unsigned long)falling_edge - (unsigned long)rising_edge + (unsigned long)ov_counter * 0x10000 / 500; /计算脉冲宽度 void main(void) TCCR1B=0x42; /初始化T/C1,1/8分频,上升沿触发捕捉 TIMSK=0x24; /允许T/C1溢出和捕捉中断 #asm(sei) while (1) ; 这段程序是在

13、CVAVR中实现的。在T/C1的捕捉中断中,先检查ICP1的实际状态,以确定是出现了上升沿还是下降沿信号。如果中断是由上升沿触发的(ICP1为高电平),程序便开始一次脉冲宽度的测量:记录下上升沿出现的时间,把T/C1的捕捉触发方式改为下降沿触发,并清空溢出计数器。如果中断由下降沿触发(ICP1为低电平),表示到达脉冲的未端,程序记录下降沿出现时间,计算出脉冲的宽度,再将T/C1的捕捉触发方式改为上升沿触发,以开始下一次的测量。 脉冲的实际宽度(毫秒格式)是根据T/C1的计数时钟个数来计算的。本例中T/C1的计数时钟是系统时钟(4MHz)的8分频,即500KHz,相应的计数脉冲宽度为2us。因此计算出从上升沿和下降沿之间总的计数脉冲个数,除以500个脉冲(为1ms)即得到以毫秒为单位的被测脉冲宽度了。 可以看到,使用定时/计数器以及配合它的捕捉功能测量脉冲宽度,不仅节省系统的硬件资源,编写程序简单,而且精度也高,因为读到的上升沿和下降沿的时间就是其

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号