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

合集下载

STC单片机采集计算瞬时频率和总脉冲数

STC单片机采集计算瞬时频率和总脉冲数

STC单片机采集计算瞬时频率和总脉冲数首先,我们需要明确一些概念。

瞬时频率是指在其中一时间段内脉冲信号的频率,可以通过计算单位时间内的脉冲数来得到;总脉冲数是指在一段时间内脉冲信号的总数目。

为了进行这些测量,我们需要将脉冲信号连接到单片机的引脚上,并编写相应的程序进行采集和计算。

首先,我们需要配置STC单片机的引脚作为输入模式,并使能外部中断。

具体的配置方法可以参考STC单片机的数据手册。

接下来,我们需要编写中断服务例程,用于处理外部中断。

中断服务例程可以在每次触发外部中断时被调用,通过对计数器进行加减操作,来计算瞬时频率和总脉冲数。

中断服务例程的大致流程如下:1.中断服务例程被调用时,先保存当前的计数值。

2.计数器加一(或减一),表示接收到了一个脉冲信号。

3.判断是否超过了设定的时间段。

如果超过了,则将计数器的值保存到另一个变量中,并将计数器清零,表示开始下一个时间段的计数。

4.根据计数器的值和时间段的长度,计算瞬时频率。

5.将计数器的值加到总脉冲数中。

6.恢复计数值,以便下一次中断服务例程被调用时能够正确计数。

在主程序中,我们可以使用定时器来定时触发外部中断。

通过设置定时器的参数和中断相关的寄存器,可以实现定时触发中断的功能。

具体的方式可以参考STC单片机的数据手册。

通过以上的步骤,我们可以实现对脉冲信号的瞬时频率和总脉冲数的采集和计算。

可以将这些数据发送到显示屏上,或者保存到存储设备中,以便后续处理和分析。

总结起来,STC单片机可以通过配置引脚、使能外部中断,编写中断服务例程和设置定时器等步骤,实现对脉冲信号的瞬时频率和总脉冲数的采集和计算。

这是完成该任务的基本步骤,具体的实现方式可以根据实际需求和具体的单片机型号进行调整和优化。

51单片机外部脉冲计数程序

51单片机外部脉冲计数程序

51单片机外部脉冲计数程序51单片机外部脉冲计数程序是一种常见的嵌入式应用程序,它可以通过计数外部脉冲信号来实现各种功能,如测量速度、记录行程、控制电机等。

在本文中,我们将介绍如何编写一个简单的51单片机外部脉冲计数程序,供初学者参考。

一、程序框架```c#include <reg52.h>sbit PulsePin = P1^0; //定义脉冲信号输入引脚unsigned long cnt = 0; //计数器void ExternalInterrupt0() interrupt 0 //外部中断0的中断服务程序{cnt++; //计数器加一}```程序中定义了一个脉冲信号输入引脚PulsePin,一个计数器cnt,并在主程序中开启了全局中断和外部中断0,并设置外部中断0为下降沿触发。

在外部中断0的中断服务程序中,计数器cnt会加一。

二、程序解析1. 硬件连接将需要计数的脉冲信号输入引脚连接到单片机的P1.0引脚上,并连接好单片机的电源和地线。

2. 宏定义和全局变量首先定义了PulsePin引脚为输入模式,并定义了计数器cnt为无符号长整型变量。

3. 主程序在主程序中,首先开启了全局中断和外部中断0,然后设置外部中断0为下降沿触发。

最后加入一个无限循环,等待外部中断的触发。

4. 外部中断0的中断服务程序在外部中断0的中断服务程序中,计数器cnt会加一。

三、总结本文介绍了如何编写一个简单的51单片机外部脉冲计数程序。

通过外部中断0的中断服务程序,可以实现对外部脉冲信号的计数。

本程序只是一个简单的例子,读者可以根据自己的需求对其进行改进和优化。

STM32单片机测量方波频率方法总结

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. 频率测量应用定时器还可以用于频率测量。

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

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

作者:佚名来源:本站原创点击数: 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单片机的外部中断来测频率

用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; } }。

51单片机的边沿触发及电平触发简介及测量

51单片机的边沿触发及电平触发简介及测量

51单片机的边沿触发及电平触发简介及测量51单片机的外部中断有两种触发方式可选:电平触发和边沿触发。

选择电平触发时,单片机在每个机器周期检查中断源口线,检测到低电平,即置位中断请求标志,向CPU请求中断。

选择边沿触发方式时,单片机在上一个机器周期检测到中断源口线为高电平,下一个机器周期检测到低电平,即置位中断标志,请求中断。

这个原理很好理解。

但应用时需要特别注意的几点:1)电平触发方式时,中断标志寄存器不锁存中断请求信号。

也就是说,单片机把每个机器周期的S5P2采样到的外部中断源口线的电平逻辑直接赋值到中断标志寄存器。

标志寄存器对于请求信号来说是透明的。

这样当中断请求被阻塞而没有得到及时响应时,将被丢失。

换句话说,要使电平触发的中断被CPU响应并执行,必须保证外部中断源口线的低电平维持到中断被执行为止。

因此当CPU正在执行同级中断或更高级中断期间,产生的外部中断源(产生低电平)如果在该中断执行完毕之前撤销(变为高电平)了,那么将得不到响应,就如同没发生一样。

同样,当CPU在执行不可被中断的指令(如RETI)时,产生的电平触发中断如果时间太短,也得不到执行。

2)边沿触发方式时,中断标志寄存器锁存了中断请求。

中断口线上一个从高到低的跳变将记录在标志寄存器中,直到CPU响应并转向该中断服务程序时,由硬件自动清除。

因此当CPU正在执行同级中断(甚至是外部中断本身)或高级中断时,产生的外部中断(负跳变)同样将被记录在中断标志寄存器中。

在该中断退出后,将被响应执行。

如果你不希望这样,必须在中断退出之前,手工清除外部中断标志。

3)中断标志可以手工清除。

一个中断如果在没有得到响应之前就已经被手工清除,则该中断将被CPU忽略。

就如同没有发生一样。

4)选择电平触发还是边沿触发方式应从系统使用外部中断的目的上去考虑,而不是如许多资料上说的根据中断源信号的特性来取舍。

比如,有的书上说(《Keil C51使用技巧及实战》),就有类似的观点。

单片机的频率计原理

单片机的频率计原理

单片机的频率计原理
频率计是一种测量信号频率的仪器,而单片机频率计则是利用单片机来实现频率计的原理。

单片机频率计的原理可以分为三个步骤:输入信号采样、计数和计算频率。

首先,需要对输入信号进行采样。

单片机频率计通常使用外部中断来采样输入信号。

外部中断允许单片机在检测到信号边沿时立即中断当前的任务并执行中断服务程序,以保证采样的准确性和实时性。

通过外部中断引脚,将输入信号连接到单片机的中断输入引脚。

在信号采样的同时,需要进行计数操作。

计数器是单片机内部的一个重要组件,它可以记录输入信号的脉冲数量。

在每次外部中断触发时,计数器会自动加一,从而实现对信号脉冲的计数。

计数器有不同的位数,可以根据需要选择合适的计数范围。

采样和计数之后,就可以通过计算来得到信号的频率。

频率是指在单位时间内发生的信号周期的次数。

以时间为单位,频率的计算公式为f=1/T,其中f为频率,T为周期。

在单片机中,周期可以通过计数器的值来表示。

假设计数器的位数为n,计数器的值为cnt,输入信号的周期为T,则频率f可以通过以下公式计算得到:
f = 1/(cnt * T)
计算出的频率可以通过串口或者LCD等输出设备来显示出来。

同时,可以使用按键来选择不同的计数范围和显示格式,以提高频率计的灵活性和便捷性。

总结起来,单片机频率计的工作原理是通过外部中断来采样输入信号,将采样到的信号脉冲数量记录在计数器中,然后根据计数器的值和输入信号的周期计算出频率,并将结果显示出来。

这种原理使得单片机频率计具有了高精度和高可靠性的特点,在实际应用中得到了广泛的应用。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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--)
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等都不 占用这些定时 / 计数器。
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;
作者 : 佚名 来源 : 本站原创 【字体:大 中 小】
点击数 : 302
更新时间: 2010 年 08 月 08 日
// 晶振 :12M
// 实验方法 : 首先要把 51hei 单片机开发板上的 ne555 的方波输出信号 J7 的第一脚
用杜邦线
//
引入 P3.2 口, 数码管即可显示 ne555 震荡电路当前的频率值 , 旋动 PR1
// 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; } }
获取计数值的百位
获取计数值的十位 获取计数值的个位 依次显示万、千、百、十、个位,动态显示
测量一个脉冲的宽度,就是测量脉冲上升沿到下降之间的时间。不使用输入捕捉 功能,一般情况往往需要使用两个外围部件才能完成和实现。如使用 1 个定时 / 计 数器加 1 个外部中断(或模拟比较器):定时 / 计数器用于计时;而外部中断方式 设置成电平变化触发方式,用于检测脉冲的上升和下降沿。当外部中断输入电平由 低变高,触发中断,读取时间 1;等到输入电平由高变低时,再次触发中断,读取 时间 2;两次时间差既为脉冲宽度。这种实现方式不仅多占用了一个单片机的内部 资源,而且精度也受到中断响应时间的限制。因为一旦中断发生, MCU响应中断需 要时间,在中断中可能要进行适当的中断现场保护,才能读取时间值。而此时的时 间值比中断发生的时间已经滞后了。
上升沿中断
rising_edge = ICR1; //
记录上升沿开始时间
TCCR1B = TCCR1B & 0xBF; // 设置 T/C1 为下降沿触发捕捉
ov_counter = 0; // 清零溢出计数器
}
else
{ //
下降沿中断
falling_edge = ICR1; //
记录下降沿时间
TCCR1B = TCCR1B | 0x40; // 设置 T/C1 为上升沿触发捕捉
初始化 T/C1,1/8 分频,上升沿触发捕捉 允许 T/C1 溢出和捕捉中断
while (1) { ………
}; }
这段程序是在 CVAVR中实现的。在 T/C1 的捕捉中断中,先检查 ICP1 的实际状 态,以确定是出现了上升沿还是下降沿信号。如果中断是由上升沿触发的( ICP1 为高电平),程序便开始一次脉冲宽度的测量:记录下上升沿出现的时间,把 T/C1 的捕捉触发方式改为下降沿触发,并清空溢出计数器。如果中断由下降沿触 发( ICP1 为低电平),表示到达脉冲的未端,程序记录下降沿出现时间,计算出 脉冲的宽度,再将 T/C1 的捕捉触发方式改为上升沿触发,以开始下一次的测量。
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}; //
interrupt [TIM1_OVF] void timer1_ovf_isr(void) // T/C1
{
ov_counter ; //
记录溢出次数
}
溢出中断
interrupt [TIM1_CAPT] void timer1_capt_isr(void) // T/C1
{
if (ICP1)
{ //
表 5-1 T/C0 计时精度和时宽(系统时钟 4MHz)
分频系数 计时频率 最高计时精度( TCNT0=25)5
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
泛,常用于测量时间、速度、频率、脉宽、提供定时脉冲信号等。相对于一般
8位
单片机而言, AVR不仅配备了更多的定时 / 计数器接口,而且还是增强型的,功能
非常强大。 ATmega128一共配置了 2 个 8 位和 2 个 16 位,共 4 个定时 / 计数器,本
小节重点对它的一些增强功能的应用做基本的介绍。
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 ) // {
256 15.625KHz 64us
16.384ms
1024 3906.25Hz 256us
65.536ms
最宽时宽( TCNT0=)0
从表中看出,在系统时钟为 4MHz时, 8 位的 T/C0 最高计时精度为 0.25us ,最长 的时宽可达到 65.536ms。而使用 16 位的定时 / 计数器时,不需要辅助的软件计数 器,就可以非常方便的设计一个时间长达 16.777216 秒(精度为 256us)的定时 器,这对于其它的 8 位单片机是做不到的。

阳型数码管 0—9 显示
unsigned int dis[6];
uchar con[]={0xfe,0xfd,0xfb,0xf7,0xef}; //
共阳型数码管控制端
init();
delay(uchar);
display();
jishu();
void main() {guandz(); init(); while(1) {
pulse_clocks = (unsigned long)falling_edge - (unsigned long)rising_edge
(unsigned long)ov_counter * 0x10000 / 500; //
计算脉冲宽度
}
}
捕捉中断
void main(void) { TCCR1B=0x42; // TIMSK=0x24; // #asm("sei")
脉冲的实际宽度(毫秒格式)是根据 T/C1 的计数时钟个数来计算的。本例中 T/C1 的计数时钟是系统时钟( 4MHz)的 8 分频,即 500KHz,相应的计数脉冲宽度 为 2us。因此计算出从上升沿和下降沿之间总的计数脉冲个数,除以 500 个脉冲 (为 1ms)即得到以毫秒为单位的被测脉冲宽度了。
而使用 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;
相关文档
最新文档