用单片机的外部中断来测频率
用单片机的外部中断来测频率用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 charuchar 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;}elsedisplay();}/计数器(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 64us8 500KHz 2us 512us32 125KHz 8us 2.048ms64 62.5KHz 16us 4.096ms128 31.25KHz 32us 8.192ms256 15.625KHz 64us 16.384ms1024 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个定时/计数器,再配合其输入捕捉功能来测量脉冲的宽度就非常方便,下面是实现的程序示例。
#include <mega128.h>#define ICP1 PIND.4 //脉冲输入由ICP1(Pind.4)输入unsigned char ov_counter;unsigned int rising_edge,falling_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{ //下降沿中断falling_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){………};}这段程序是在CVAVR中实现的。
在T/C1的捕捉中断中,先检查ICP1的实际状态,以确定是出现了上升沿还是下降沿信号。
如果中断是由上升沿触发的(ICP1为高电平),程序便开始一次脉冲宽度的测量:记录下上升沿出现的时间,把T/C1的捕捉触发方式改为下降沿触发,并清空溢出计数器。
如果中断由下降沿触发(ICP1为低电平),表示到达脉冲的未端,程序记录下降沿出现时间,计算出脉冲的宽度,再将T/C1的捕捉触发方式改为上升沿触发,以开始下一次的测量。
脉冲的实际宽度(毫秒格式)是根据T/C1的计数时钟个数来计算的。
本例中T/C1的计数时钟是系统时钟(4MHz)的8分频,即500KHz,相应的计数脉冲宽度为2us。
因此计算出从上升沿和下降沿之间总的计数脉冲个数,除以500个脉冲(为1ms)即得到以毫秒为单位的被测脉冲宽度了。
可以看到,使用定时/计数器以及配合它的捕捉功能测量脉冲宽度,不仅节省系统的硬件资源,编写程序简单,而且精度也高,因为读到的上升沿和下降沿的时间就是其实际发生的时间。
5.9.3 比较匹配输出和脉冲宽度调制PWM(见已发表的主题)。
stm32f4上升沿触发计算频率
stm32f4上升沿触发计算频率
在STM32F4微控制器上,要计算上升沿触发的频率,你可以通过配置定时器来实现。
首先,你需要选择一个定时器来捕获输入信号的上升沿。
然后,你可以使用定时器的捕获功能来记录上升沿触发的时间戳。
接着,你可以计算连续两个上升沿之间的时间差,然后通过这个时间差来计算频率。
具体步骤如下:
1. 配置定时器为输入捕获模式,选择触发时钟源和边沿触发。
2. 在捕获中断服务程序中,读取捕获寄存器的数值,该数值记录了上升沿触发时的定时器计数值。
3. 当下一个上升沿到来时,再次读取捕获寄存器的数值,然后计算两次捕获之间的时间差。
4. 最后,通过时间差来计算频率,频率等于1除以时间差。
需要注意的是,由于STM32F4系列微控制器的定时器可以工作
在不同的时钟频率下,因此在计算频率时需要考虑定时器的时钟频率和分频因子,以确保准确的频率计算。
除了使用定时器捕获功能,你还可以考虑使用外部中断来检测上升沿触发,然后在中断服务程序中进行频率的计算。
这种方法同样可以实现对上升沿触发频率的计算。
总之,通过配置定时器的捕获功能或者外部中断,你可以在STM32F4微控制器上实现对上升沿触发频率的准确计算。
希望这些信息能够帮助到你。
【精编完整版】基于单片机的数字频率计的设计毕业论文
目录1频率计的概要和发展动态 (1)2 单片机介绍 (1)2.1单片机的简介和发展 (1)2.2 AT89C51的原理 (2)2.2.1主要特性 (3)2.2.2管脚说明 (3)2.2.3振荡器特性 (4)2.2.4芯片擦除 (4)3 仿真软件protuse的介绍 (5)4系统模块设计 (6)5硬件部分 (6)5.1整形电路 (6)5.2控制电路 (7)5.3显示电路 (8)5.3.1 LCD1602引脚 (8)5.3.2 LCD1602的指令介绍 (8)5.4总体电路图 (9)6仿真结果 (11)6.1仿真结果 (11)6.2结果分析 (11)7 结论 (11)8参考文献 (12)附录 (12)1 keil C51软件介绍 (12)2 程序流程图 (13)3系统源程序 (14)1频率计的概要和发展动态在电子技术中,频率作为基本的参数之一,它与许多电参量的测量方案、测量结果密切相关,因此,频率的测量十分的重要。
在许多情况下,要对信号的频率进行精确测量,就要用到数字频率计。
数字频率计作为一种基础测量仪器,它被用来测量信号(方波、正弦波、锯齿波等)频率,并且用十进制显示测量结果。
它具有测量精度高、测量省时、使用方便等特点。
随着微电子技术和计算机技术的不断发展,单片机被广泛应用到大规模集成电路中,使得设计具有很高的性价比和可靠性。
所以,以单片机为核心的简易数字频率计设计,改善了传统的频率计的不足,充分体现了新一代数字频率计的优越性。
2 单片机介绍2.1单片机的简介和发展单片机微型计算机是微型计算机的一个重要分支,也是颇具生命力的机种。
单片机微型计算机简称单片机,特别适用于控制领域,故又称为微控制器。
通常,单片机由单块集成电路芯片构成,内部包含有计算机的基本功能部件:中央处理器、存储器和IO接口电路等。
因此,单片机只需要和适当的软件及外部设备相结合,便可成为一个单片机控制系统。
单片机经过1、2、3、3代的发展,正朝着多功能、高性能、低电压、低功耗、低价格、大存储容量、强IO功能及较好的结构兼容性方向发展。
STC单片机采集计算瞬时频率和总脉冲数
STC单片机采集计算瞬时频率和总脉冲数首先,我们需要明确一些概念。
瞬时频率是指在其中一时间段内脉冲信号的频率,可以通过计算单位时间内的脉冲数来得到;总脉冲数是指在一段时间内脉冲信号的总数目。
为了进行这些测量,我们需要将脉冲信号连接到单片机的引脚上,并编写相应的程序进行采集和计算。
首先,我们需要配置STC单片机的引脚作为输入模式,并使能外部中断。
具体的配置方法可以参考STC单片机的数据手册。
接下来,我们需要编写中断服务例程,用于处理外部中断。
中断服务例程可以在每次触发外部中断时被调用,通过对计数器进行加减操作,来计算瞬时频率和总脉冲数。
中断服务例程的大致流程如下:1.中断服务例程被调用时,先保存当前的计数值。
2.计数器加一(或减一),表示接收到了一个脉冲信号。
3.判断是否超过了设定的时间段。
如果超过了,则将计数器的值保存到另一个变量中,并将计数器清零,表示开始下一个时间段的计数。
4.根据计数器的值和时间段的长度,计算瞬时频率。
5.将计数器的值加到总脉冲数中。
6.恢复计数值,以便下一次中断服务例程被调用时能够正确计数。
在主程序中,我们可以使用定时器来定时触发外部中断。
通过设置定时器的参数和中断相关的寄存器,可以实现定时触发中断的功能。
具体的方式可以参考STC单片机的数据手册。
通过以上的步骤,我们可以实现对脉冲信号的瞬时频率和总脉冲数的采集和计算。
可以将这些数据发送到显示屏上,或者保存到存储设备中,以便后续处理和分析。
总结起来,STC单片机可以通过配置引脚、使能外部中断,编写中断服务例程和设置定时器等步骤,实现对脉冲信号的瞬时频率和总脉冲数的采集和计算。
这是完成该任务的基本步骤,具体的实现方式可以根据实际需求和具体的单片机型号进行调整和优化。
STM32单片机测量方波频率方法总结
STM32单片机测量方波频率方法总结一、测周法:通过一个方波的两个上升沿或下降沿触发中断,然后定时器计数,计数的总个数乘以计数单位时间即该方波的周期,具体可通过单片机输入捕获功能实现,以下为参考代码//输入捕获初始化函数void input_frequent_init(void) //采用TIM4的Channel_1通道作为输入捕获通道{//声明结构体变量,用来初始化定时器TIM_TimeBaseInitTypeDef TIM4_TimeBaseInitStructure;TIM_ICInitTypeDef TIM4_ICInitStructure;NVIC_InitTypeDef TIM4_NVIC_InitStructure;/* 开启定时器4时钟 */RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);TIM_ClearITPendingBit(TIM4,TIM_IT_Update|TIM_IT_CC1); //清除捕获和中断标志位TIM4_TimeBaseInitStructure.TIM_Period = 0xffff;//设定计数器自动重装值(设置为最大)TIM4_TimeBaseInitStructure.TIM_Prescaler = 1; //设置分频系数TIM4_TimeBaseInitStructure.TIM_ClockDivision = TIM_C KD_DIV1; //设置时钟分割:TDTS = Tck_timTIM4_TimeBaseInitStructure.TIM_CounterMode = TIM_Cou nterMode_Up; //TIM向上计数模式TIM_TimeBaseInit(TIM4,&TIM4_TimeBaseInitStructure);/ /根据结构体参量初始化定时器TIM4_ICInitStructure.TIM_Channel = TIM_Channel_1; //选择输入捕获的输入端,IC1映射到TI1上TIM4_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity _Rising; //设置为上升沿捕获TIM4_ICInitStructure.TIM_ICSelection = TIM_ICSelecti on_DirectTI; //映射到TI1上TIM4_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV 1; //配置输入分频,不分频TIM4_ICInitStructure.TIM_ICFilter = 0x00; //IC1F=000 0 配置输入滤波器,此处不滤波TIM_ICInit(TIM4, &TIM4_ICInitStructure); //初始化TIM 4通道1//中断分组初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);TIM4_NVIC_InitStructure.NVIC_IRQChannel=TIM4_IRQn;//打开TIM4的全局中断TIM4_NVIC_InitStructure.NVIC_IRQChannelPreemptionPri ority=1; //抢占优先级配置为1TIM4_NVIC_InitStructure.NVIC_IRQChannelSubPriority=1; //响应优先级配置为1TIM4_NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能NVIC_Init(&TIM4_NVIC_InitStructure); //初始化中断TIM_Cmd(TIM4,ENABLE); //使能中断TIM_ITConfig(TIM4, TIM_IT_Update|TIM_IT_CC1, ENABLE ); //使能捕获和更新中断}需要注意的是,如果所测信号中存在尖峰干扰信号,则TIM4_ICInitStructure.TIM_ICFilter = 0x00; //IC1F=0000 配置输入滤波器,此处不滤波这一行应根据干扰信号的高电平时间来赋予合适的滤波器的值,具体计算方法参考芯片手册或自行百度。
单片机中的中断与定时器的原理与应用
单片机中的中断与定时器的原理与应用在单片机(Microcontroller)中,中断(Interrupt)和定时器(Timer)是重要的功能模块,广泛应用于各种嵌入式系统和电子设备中。
本文将介绍中断和定时器的基本原理,并探讨它们在单片机中的应用。
一、中断的原理与应用中断是指在程序执行过程中,当发生某个特定事件时,暂停当前任务的执行,转而执行与该事件相关的任务。
这样可以提高系统的响应能力和实时性。
单片机中的中断通常有外部中断和定时中断两种类型。
1. 外部中断外部中断是通过外部触发器(如按钮、传感器等)来触发的中断事件。
当外部触发器发生状态变化时,单片机会响应中断请求,并执行相应的中断服务程序。
外部中断通常用于处理实时性要求较高的事件,如按键检测、紧急报警等。
2. 定时中断定时中断是通过定时器来触发的中断事件。
定时器是一种特殊的计时设备,可以按照设定的时间周期产生中断信号。
当定时器倒计时完成时,单片机会响应中断请求,并执行相应的中断服务程序。
定时中断常用于处理需要精确计时和时序控制的任务,如脉冲计数、PWM波形生成等。
中断的应用具体取决于具体的工程需求,例如在电梯控制系统中,可以使用外部中断来响应紧急停车按钮;在家电控制系统中,可以利用定时中断来实现定时开关机功能。
二、定时器的原理与应用定时器是单片机中的一个重要模块,可以用于计时、延时、频率测量等多种应用。
下面将介绍定时器的工作原理和几种常见的应用场景。
1. 定时器的工作原理定时器是通过内部时钟源来进行计时的。
它通常由一个计数器和若干个控制寄存器组成。
计数器可以递增或递减,当计数值达到设定值时,会产生中断信号或触发其他相关操作。
2. 延时应用延时是定时器最常见的应用之一。
通过设定一个合适的计时器参数,实现程序的精确延时。
例如,在蜂鸣器控制中,可以使用定时器来生成特定频率和持续时间的方波信号,从而产生不同的声音效果。
3. 频率测量应用定时器还可以用于频率测量。
51单片机中断程序例子
51单片机中断程序例子
1. 外部中断:当外部信号引脚检测到高电平时,单片机会触发外部中断服务程序。
可以利用外部中断实现按键扫描功能,当按键按下时,触发中断程序对按键进行处理。
2. 定时器中断:利用定时器中断可以实现精确的时间控制。
例如,我们可以设置定时器中断为1秒,当定时器溢出时,触发中断程序,实现1秒钟执行一次的任务。
3. 串口中断:当接收到串口数据时,单片机会触发串口中断服务程序,可以利用串口中断实现串口通信功能。
4. ADC中断:当模数转换器完成一次转换时,单片机会触发ADC中断服务程序,可以利用ADC中断实现模拟信号的采集和处理。
5. 看门狗中断:看门狗定时器溢出时,单片机会触发看门狗中断服务程序,可以利用看门狗中断实现系统复位或其他相关功能。
6. 外部中断优先级:当多个外部中断同时触发时,可以通过设置外部中断的优先级来确定触发的顺序和优先级。
7. 定时器中断优先级:当多个定时器中断同时触发时,可以通过设置定时器中断的优先级来确定触发的顺序和优先级。
8. 中断嵌套:单片机支持中断嵌套,即在一个中断服务程序中触发
另一个中断服务程序,可以通过中断嵌套实现复杂的任务处理。
9. 中断屏蔽:单片机支持对中断的屏蔽,即可以通过设置中断屏蔽标志位来屏蔽某些中断,使其暂时不被触发。
10. 中断标志位:单片机提供中断标志位,用于标识中断是否被触发。
在中断服务程序中,可以通过读取和清除中断标志位来判断中断是否发生。
以上是根据51单片机中断程序的例子进行的描述,这些例子涵盖了常见的中断类型和相关功能。
通过学习和理解这些例子,可以更好地掌握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 charuchar 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]=counter2000;dis[1]=dis[5]/1000; // 获取计数值的千位 dis[5]=dis[5]00;dis[2]=dis[5]/100; // 获取计数值的百位dis[5]=dis[5]0;dis[3]=dis[5]/10; // 获取计数值的十位dis[4]=dis[5]; // 获取计数值的个位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;}elsedisplay();}/计数器(Timer/counter)是单片机芯片中最基本的外围接口,它的用途非常广泛,常用于测量时间、速度、频率、脉宽、提供定时脉冲信号等。
用51单片机的外部中断来测频率
用51单片机的外部中断来测频率//晶振:12M//实验方法:首先要把51hei单片机开发板上的ne555的方波输出信号J7的第一脚用杜邦线//引入P3.2口,数码管即可显示ne555震荡电路当前的频率值,旋动PR1电位器可//发现数字有变化.//原理:1秒钟内计数外部脉冲个数,如计数1000次,则表示频率为1000Hz//1秒钟定时采用51单片机定时器0实现,外部脉冲由外部中断0引脚接入#includereg51.h#include51hei.h#define uchar unsigned charuchar counter1;sbit duan=P2 ;//74HC573的LE端U5 LED的段选端sbit wei=P2 ;//74HC573的LE端U4 LED的位选端unsigned int counter2,tmp; uchar table[] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 共阳型数码管09显示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;a0;a--) for(b=20;b0;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;i5;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; } }。
用单片机的外部中断来测频率
{ 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--)
5.9.2 输入捕捉功能 ATmega128 的两个 16 位定时 / 计数器( T/C1、T/C3)具有输入捕捉功能,它是
AVR定时 / 计数器的又一个显著的特点。其基本作用是当一个事件发生时,立即将 定时 / 计数器的值锁定在输入捕捉寄存器中(定时 / 计数器保持继续运行)。利用输 入捕捉功能,可以对一个事件从发生到结束的时间进行更加精确,如下面的示例中 精确测量一个脉数字有变化 .
// 原理: 1 秒钟内计数外部脉冲个数,如计数 1000 次,则表示频率为 1000Hz
//1 秒钟定时采用 51 单片机定时器 0 实现,外部脉冲由外部中断 0 引脚接入
#include<reg51.h>
#include"51hei.h"
#define uchar unsigned char
可以看到,使用定时 / 计数器以及配合它的捕捉功能测量脉冲宽度,不仅节省系 统的硬件资源,编写程序简单,而且精度也高,因为读到的上升沿和下降沿的时间 就是其实际发生的时间。
5.9.3 比较匹配输出和脉冲宽度调制 PWM (见已发表的主题)
AVR 单片机的每一个定时 / 计数器都配备独立的、多达 10 位的预分频器,由软件 设定分频系数,与 8/16 位定时 / 计数器配合,可以提供多种档次的定时时间。使用 时可选取最接近的定时档次,即选 8/16 位定时 / 计数器与分频系数的最优组合,减 少了定时误差。所以, AVR定时 / 计数器的显著特点之一是:高精度和宽时范围, 使得用户应用起来更加灵活和方便。此外, AVR的 USAR、T SPI、I2C、WDT等都不 占用这些定时 / 计数器。
单片机的频率计原理
单片机的频率计原理
频率计是一种测量信号频率的仪器,而单片机频率计则是利用单片机来实现频率计的原理。
单片机频率计的原理可以分为三个步骤:输入信号采样、计数和计算频率。
首先,需要对输入信号进行采样。
单片机频率计通常使用外部中断来采样输入信号。
外部中断允许单片机在检测到信号边沿时立即中断当前的任务并执行中断服务程序,以保证采样的准确性和实时性。
通过外部中断引脚,将输入信号连接到单片机的中断输入引脚。
在信号采样的同时,需要进行计数操作。
计数器是单片机内部的一个重要组件,它可以记录输入信号的脉冲数量。
在每次外部中断触发时,计数器会自动加一,从而实现对信号脉冲的计数。
计数器有不同的位数,可以根据需要选择合适的计数范围。
采样和计数之后,就可以通过计算来得到信号的频率。
频率是指在单位时间内发生的信号周期的次数。
以时间为单位,频率的计算公式为f=1/T,其中f为频率,T为周期。
在单片机中,周期可以通过计数器的值来表示。
假设计数器的位数为n,计数器的值为cnt,输入信号的周期为T,则频率f可以通过以下公式计算得到:
f = 1/(cnt * T)
计算出的频率可以通过串口或者LCD等输出设备来显示出来。
同时,可以使用按键来选择不同的计数范围和显示格式,以提高频率计的灵活性和便捷性。
总结起来,单片机频率计的工作原理是通过外部中断来采样输入信号,将采样到的信号脉冲数量记录在计数器中,然后根据计数器的值和输入信号的周期计算出频率,并将结果显示出来。
这种原理使得单片机频率计具有了高精度和高可靠性的特点,在实际应用中得到了广泛的应用。
