定时器中断—频率计程序
实验二定时器和中断应用程序设计与调试3页

实验二定时器和中断应用程序设计与调试3页一、实验目的1. 掌握定时器的工作原理和应用;2. 掌握中断的工作原理和应用;3. 结合定时器和中断设计应用程序。
二、实验器材1. 现成的定时器和中断资源(例如 STM32F103C8T6 单片机板);2. 电脑、USB 电缆、串口调试工具、杜邦线等。
三、实验原理与步骤1. 定时器首先,定时器是一种计时装置,它能够在设定的时间间隔内,发出一个固定的时钟脉冲信号,用于控制外部器件的时间。
定时器通常由计数器和时钟源两部分组成,计数器用于计数,时钟源则提供时钟脉冲。
在 STM32F103C8T6 单片机中,STM32F1 系列具有三个基本定时器,包括 TIM2、TIM3 和 TIM4,以及一个高级定时器 TIM1,这些定时器都是 16 位计数器。
下面以 TIM2 为例,介绍定时器的工作原理和使用方法。
STM32F103C8T6 的时钟系统图如下图所示:其中,HCLK(高速时钟)的频率为 72MHz。
TIM2 的时钟源为:TIM2 的计数器是一个 16 位的寄存器,它的计数范围为 0-65535。
当计数器计数到最大值 65535 后,会自动从 0 开始重新计数。
TIM2 的数据和控制寄存器如下表所示:TIM2 的工作模式有四种,分别为向上计数、向下计数、向上/向下计数和单脉冲模式。
在本次实验中,我们选择向上计数模式,即计数器从 0 开始计数,当计数器计数到设定的值时,触发中断。
2. 中断中断是指由外部事件、硬件故障或软件请求而引起 CPU 暂停正在执行的当前程序,并转去执行一个特殊函数的程序执行机制。
中断是实现系统交互的重要手段,能够提高系统的响应速度和可靠性。
STM32F103C8T6 支持多种类型的中断,包括外部中断、定时器中断、USART 中断和 DMA 中断等。
在 STM32F103C8T6 中,各个中断向量表的地址为 0x0800 0000,STM32F1 系列的中断向量表共有 61 个中断向量,如下图所示:当有中断事件触发时,会自动跳转到相应的中断向量表所存的中断服务函数。
用 单片机的外部中断来测频率

作者:佚名来源:本站原创点击数: 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)是单片机芯片中最基本的外围接口,它的用途非常广泛,常用于测量时间、速度、频率、脉宽、提供定时脉冲信号等。
用单片机的外部中断来测频率

{ 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等都不 占用这些定时 / 计数器。
定时器中断程序设计实验

定时器中断程序设计实验定时器中断程序设计实验简介定时器中断是嵌入式系统中的常见应用之一,通过配置定时器的相关寄存器,可以定时产生中断信号,从而实现定时功能。
本文档将介绍定时器中断的基本概念和在实验中如何设计和实现定时器中断程序。
一、定时器中断的概念定时器中断是通过硬件定时器产生的中断信号,可以用于在嵌入式系统中实现定时功能。
定时器中断的原理是定时器内部的计数器自动递增,并在计数到一个特定值时产生中断信号。
通过配置定时器的相关寄存器,可以设置定时器的计数范围、计数速度和中断触发条件等参数。
二、定时器中断的实验设计步骤以下是一个基本的定时器中断程序设计实验的步骤:1. 确定定时器的类型和工作模式根据实际需求和硬件平台的支持情况,选择合适的定时器类型和工作模式。
常见的定时器类型包括定时器/计数器和看门狗定时器,常见的工作模式包括定时模式和计数模式。
2. 配置定时器的相关寄存器根据定时器的类型和工作模式,配置定时器的相关寄存器。
主要包括计数范围、计数速度和中断触发条件等参数的设置。
3. 初始化中断控制器如果使用的嵌入式系统具有中断控制器,需要初始化中断控制器,并使能相应的中断通道。
4. 编写中断服务程序通过注册中断处理函数,并在其中编写中断服务程序。
中断服务程序主要包括对中断标志位的清除、中断处理、中断函数返回等操作。
5. 启动定时器配置完成后,启动定时器开始计数。
定时器将根据配置的参数自动递增,并在计数到设定的特定值时产生中断信号。
6. 整合定时器中断功能到主程序在主程序中,可以使用定时器中断提供的功能来实现定时任务。
可以通过在中断服务程序中设置标志位,并在主循环中检测该标志位来执行相应的任务。
三、实验注意事项在设计和实现定时器中断程序时,需要注意以下事项:1. 根据实际需求进行定时器的配置,确保定时器的参数设置合理。
2. 在中断服务程序中应尽量减少对全局变量和共享资源的访问,以避免竞态条件和数据不一致等问题的发生。
定时器中断程序设计实验

资料范本本资料为word版本,可以直接编辑和打印,感谢您的下载定时器中断程序设计实验地点:__________________时间:__________________说明:本资料适用于约定双方经过谈判,协商而共同承认,共同遵守的责任与义务,仅供参考,文档可直接下载或修改,不需要的部分可直接删除,使用时请详细阅读内容实验一定时器/中断程序设计实验一、实验目的1、掌握定时器/中断的工作原理。
2、学习单片机定时器/中断的应用设计和调试二、实验仪器和设备1、普中科技单片机开发板 HC6800-EM3V3.0;2、Keil uVision4 程序开发平台;3、PZ-ISP 普中自动下载软件。
三、实验原理805l 单片机内部有两个 16 位可编程定时/计数器,记为 T0 和 Tl。
8052 单片机内除了 T0 和 T1 之外,还有第三个 16 位的定时器/计数器,记为 T2。
它们的工作方式可以由指令编程来设定,或作定时器用,或作外部脉冲计数器用。
定时器 T0 由特殊功能寄存器 TL0 和 TH0 组成,定时器 Tl 由特殊功能寄存器 TLl 和 TH1 组成。
定时器的工作方式由特殊功能寄存器 TMOD 编程决定,定时器的运行控制由特殊功能寄存器 TCON 编程控制。
T0、T1 在作为定时器时,规定的定时时间到达,即产生一个定时器中断,CPU 转向中断处理程序,从而完成某种定时控制功能。
T0、T1 用作计数器使用时也可以申请中断。
作定时器使用时,时钟由单片机内部系统时钟提供;作计数器使用时,外部计数脉冲由 P3 口的 P3.4(或 P3.5)即 T0(或 T1)引脚输入。
方式控制寄存器 TMOD 的控制字格式如下:低 4 位为 T0 的控制字,高 4 位为 T1 的控制字。
GATE 为门控位,对定时器/计数器的启动起辅助控制作用。
GATE=l 时,定时器/计数器的计数受外部引脚输入电平的控制。
由由运行控制位 TRX (X=0,1)=1 和外中断引脚(0INT 或 1INT)上的高电平共同来启动定时器/计数器运行;GATE=0时。
定时器中断程序设计实验

定时器中断程序设计实验定时器中断程序设计实验1. 实验目的本实验旨在通过设计一个定时器中断程序,实现定时触发某个操作的功能。
通过此实验,可以熟悉定时器中断的使用方法,了解中断程序设计的基本原理。
2. 实验原理定时器中断是一种常用的硬件中断方式,可以根据设定的时间间隔,在每次定时器溢出时触发一个中断请求。
在中断处理程序中,可以执行一系列操作,如更新计数器、处理数据、控制外设等。
3. 实验器材单片机开发板烧录软件4. 实验步骤步骤1:引入头文件,在程序中引入相应的头文件,包括中断相关的头文件以及需要使用的外设相关的头文件。
cinclude <reg51.h> //单片机寄存器定义include <intrins.h> //特殊函数检测//其他头文件步骤2:初始化定时器在主函数中,初始化定时器,设定定时器的工作模式、计数值等参数。
cvoid InitTimer(){TMOD = 0x01; //定时器工作在模式1,16位定时器自动重装TH0 = 0xff; //定时器初值设定为0xffffTL0 = 0xff; //定时器初值设定为0xffffTR0 = 1; //启动定时器}步骤3:编写中断处理程序编写中断处理程序,即定时器中断的具体操作。
在本实验中,我们将在定时器中断发生时,通过P1口输出一个脉冲信号。
cvoid TimerInterrupt() interrupt 1{P1 ^= 0x01; //P1口取反,输出脉冲信号}步骤4:主程序在主程序中,调用初始化函数,然后进入一个无限循环,保持程序不退出。
cvoid mn(){InitTimer(); //初始化定时器while (1){//其他程序}}5. 实验结果与分析通过上述操作,定时器中断程序设计已经完成。
在本实验中,我们通过定时器中断触发P1口的脉冲信号输出,以验证中断程序的正确性。
6. 实验本实验通过设计一个定时器中断程序,实现了定时触发某个操作的功能。
频率计程序

PT0=1;//T0优先
EA=1;ET1=1; ET0=1;//开总中断、定时器T1和T0中断
TR1=1;//启动定时器T1
TR0=1;//启动定时器T0
}
/********以下是主函数********/
void main(void)
{
if(disp_sel==8)
disp_sel=0;//如果8个数码管显示了一遍,则让其回0,重新再扫描
}
}
/********以下是频率数值转换函数,将测量的频率转换为适合LED数码管显示的数据********/
void convert()
{
frequency=T0_num*65536+T0_TH0*256+T0_TL0; //频率值计算
frequency=frequency%100000;
disp_buf[3]=frequency/10000;//万位
frequency=frequency%10000;
disp_buf[4]=frequency/1000;//千位
frequency=frequency%1000;
disp_buf[5]=frequency/100;//百位
{
uchar i;
uchar tmp;//定义显示暂存
static uchar disp_sel=0;//显示位选计数器,显示程序通过它得知现正显示哪个数码管,初始值为0
for(i=0;i<8;i++)//扫描8次,将8只数码管扫描一遍
{
tmp=bit_tab[disp_sel];//根据当前的位选计数值决定显示哪只数码管
c51单片机定时器中断的执行过程

c51单片机定时器中断的执行过程
C51单片机定时器中断的执行过程可以分为以下几个步骤:
1. 初始化定时器:首先需要对定时器进行初始化,设置定时器的计数模式、计数值、溢出方式等参数。
这些参数可以通过编程实现,也可以通过硬件电路进行调整。
2. 启动定时器:初始化完成后,需要启动定时器。
启动定时器后,定时器开始按照预设的参数进行计数。
当计数值达到预设的溢出值时,定时器会产生一个溢出信号。
3. 设置中断服务程序:为了在定时器溢出时执行特定的操作,需要设置一个中断服务程序 ISR)。
中断服务程序是一段特殊的代码,它会在定时器溢出时被自动调用。
4. 开启中断:在中断服务程序设置完成后,需要开启相应的中断。
开启中断后,当定时器溢出时,CPU会自动跳转到中断服务程序执行。
5. 执行中断服务程序:当定时器溢出时,CPU会暂停当前任务,跳转到中断服务程序执行。
在中断服务程序中,可以执行一些特定的操作,如更新显示、读取传感器数据等。
6. 返回主程序:中断服务程序执行完成后,CPU会自动返回到主程序继续执行。
这样,通过定时器中断,可以实现对单片机的周期性控制和数据采集等功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*注:定时器中断的例子,简单的频率计,初学者留意各引脚电压极性和电压值,不可超出5V,我们只是做学习实验,不要
超出51hei单片机学习板的承受范围,否则要求对电子非常熟悉,不然会烧坏芯片, 版权:,注意:P1.3与P1.7要相连接
如果是测量外部频率要共地.
*/
#include<reg52.h> //头文件
#include<intrins.h>
#define uchar unsigned char//宏定义
#define uint unsigned int
sbit Fin=P1^3; //测量频率管脚
sbit Fout=P1^7; //发生频率管脚
uchar code table[]={0x3f,0x06,0x5b,//数码管显示的数值
0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,};
void display(uchar *lp,uchar lc); //显示子函数
void delay(); //延时子函数
void mee_F(); //测频率子函数
void mee_T(); //测周期子函数
void Fry_mee(); //测频测周选择的子函数
uchar l_tmpdata[8]; //程序显示的缓冲区
bit int_flag; //中断事件相应的标志
uint fry; //保存的频率值
void init() ;
void main() //主函数
{
init(); // 调用初始化函数
}
void init() //初始化函数
{
uint tmp; //数据转换缓冲区
uint i=2000;//显示延时,提高亮度
EA=1; //打开总中断
TMOD=0x11;//工作方式3
TH0=256-(50000/256); //装入初值
TL0=256-(50000%256);
TH1=256-500/256;
TL0=256-500%256;
ET0=1; //定时器0开
ET1=1; //定时器1开
TR1=1; //启动定时器1
while(1)
{
Fry_mee();//开始测量
l_tmpdata[0]=tmp/10000; //测量完后将整数分离出来 tmp=tmp%10000; //进行显示
l_tmpdata[1]=tmp/1000;
tmp=tmp%1000;
l_tmpdata[2]=tmp/100;
tmp=tmp%100;
l_tmpdata[3]=tmp/10;
l_tmpdata[4]=tmp%10;
while(i--) //显示延时,提高亮度
{
display(l_tmpdata,5); //用数字显示频率
}
i=2000; //从新装入初值
}
}
void time0() interrupt 1 //定时器0的中断函数
{
int_flag=1; //中断标志
}
void time1() interrupt 3 //定时器1的中断函数,用来产生频率{
TH1=(65536-1000)/256; //从新赋值
TL1=(65536-1000)%256;
Fout=!Fout; //?反,产生频率,即频率发生器
}
void Fry_mee()
{
if(fry<2000) //?于2k的,侧周
mee_T();
else if(fry>=2000) //大于2k的,测频
mee_F();
}
//测频原理:用一个标准的50ms计数中断,对被测信号计数void mee_F() //测频子函数
{
bit lhj_old=1,lhj_new=1; //定义起始状态
uint f_count=0;//计数变量
int_flag=0;
TH0=(65536-50000)/256;//定时器,初值50ms
TL0=(65536-50000)%256;
TR0=1; //启动定时器0
while(1) //死循环,测频
{
lhj_new=Fin; //?现在频率引脚的状态
if(lhj_old!=lhj_new) //与前一刻的值比较
f_count++;
lhj_old=lhj_new; //将新值赋给旧值
if(int_flag) //如果到了定时时间
{
TR0=0; //关闭定时器0
fry=f_count*10; //计算频率,f_count=f_count*20/2
//一个周期有2个跳变,20个周期为1s
return; //返回
}
}
}
//测周原理:以被测信号的一个周期为中断源,对单片机及其//周期进行计数读?定时器的值为计数值
void mee_T() //测周子函数
{
bit lhj_old=0,lhj_new=0; //定义初始状态
uchar temp_flag=0;
uint t_count; //计数变量
TH0=0; //赋初始值
TL0=0;
while(1) //死循环,测周
{
lhj_new=Fin; //取现在的频率发声引脚的状态
if(lhj_old&&!lhj_new) //当下降沿来临时,启动定时器{
temp_flag++;
TR0=1; //启动定时器并开始计数
}
if(temp_flag==2)
{
TR0=0; //停止计数
t_count=TH0*256+TL0;//取得当前的计数值
fry=1000000/t_count;//计算频率,这个1000000是 //晶振12M经12分频的计数脉冲
return; //返回
}
lhj_old=lhj_new;
}
}
void display(uchar *lp,uchar lc) //显示子函数{
uchar i;
P2=0;
P1=0xf8;
for(i=0;i<lc;i++)
{
P2=table[lp[i]];
delay();
if(i==7)
break;
P2=0;
P1++;
}
}
void delay() //延时子函数
{
_nop_();_nop_();_nop_();_nop_();_nop_();
}。