导航:首页 > 操作系统 > 32单片机定时器中断频率

32单片机定时器中断频率

发布时间:2022-07-11 08:32:29

单片机定时中断

跟你理清一下思路,你的问题就解决了。首先,你的程序很简单,就是让发光二极管1秒亮1秒灭。因此,你前提是要定时1秒,但51单片机无法定时1秒,因此,你的程序就要定时50毫秒,每到了50毫秒,你就让num自加1,当num加到20时,换句话说,已经定时50毫秒20次了,那就是1秒咯,所以此有led1=~led1; //让发光管状态取反,达到程序目的。另外,定时50毫秒你要给TH0和TL0赋给初值,因此 TH0=(65536-45872)/256; //重新装载初值TL0=(65536-45872)%256;才会有这两句,但定时50毫秒后,你的初值也会随之消失,因此才会在void T0_time()这个函数中重新赋初值。的确像你所说的初值是装满了开始执行中断,其实从你TMOD=0x01; //设置定时器0位工作模式1(M1,M0位0,1)这句已经开始定时了,而赋初值是为了准确的定时50毫秒罢了。明白了没有?

(其实你可以这样理解,定时计数器就好比一个空的瓶子,当你给TMOD=0x01时,水就开始一滴一滴的往瓶子你滴,当瓶子满了的时候,中断就发生了。假如从一个空的瓶子滴到满的瓶子定时是80毫秒的话,可你只需要定时50毫秒就够了,所以就要一开始往瓶子里倒水,使滴水的起点不是空瓶子,这就是赋初值的作用。当瓶子满了后,瓶子就会自动清空,重新从零开始。而第二次你再想定时50毫秒,你就必须从新再往瓶子里倒水,这就是第二次赋初值的作用)

② 单片机定时器中断问题!

因为当闪烁频率大于10Hz,人眼基本就不能分辨了

添加一个分频器即可,程序如下:

#include<12c5a.h>
sbitLED=P10;
unsignedcharTimes;
voidInit_Timer0()
{
TMOD=0X01;
TH0=0x00;
TL0=0x00;
EA=1;
ET0=1;
TR0=1;
}
voidmain()
{
Times=0;
Init_Timer0();
while(1);
}
voidTimer0_isr(void)interrupt1using1
{
//TH0=0x00;
//TL0=0x00;
if(--Times==0)
{
Times=20;//分频数,可根据需要自行设置
LED=~LED;
}
}


如果时钟为12M则20分频后大约是1.3秒变换一下,


还有就是你的时钟频率是否和样例相同??

③ STM32定时器如何设置一个1000ms的中断

有无限多种组合啊,但要使误差尽量小的话,那就要重装值尽量大,可以推荐:时钟2000分频,即TIMx->PSC=1999;分频过后时钟频率为72000000/(1999+1)=36000Hz则装载值TIMx->ARR=1.75/(1/36000)=63000;完事!

④ 单片机怎么用定时中断来控制蜂鸣器的发声时间和调出不同的频率

用定时器T0的中断实现"渴望"主题曲的播放
#include<reg51.h> //包含51单片机寄存器定义的头文件
sbit sound=P3^7; //将sound位定义为P3.7
unsigned int C; //储存定时器的定时常数
//以下是C调低音的音频宏定义
#define l_ 262 //将“l_”宏定义为低音“1”的频率262Hz
#define l_re 286 //将“l_re”宏定义为低音“2”的频率286Hz
#define l_mi 311 //将“l_mi”宏定义为低音“3”的频率311Hz
#define l_fa 349 //将“l_fa”宏定义为低音“4”的频率349Hz
#define l_sao 392 //将“l_sao”宏定义为低音“5”的频率392Hz
#define l_la 440 //将“l_a”宏定义为低音“6”的频率440Hz
#define l_xi 494 //将“l_xi”宏定义为低音“7”的频率494Hz
//以下是C调中音的音频宏定义
#define 523 //将“”宏定义为中音“1”的频率523Hz
#define re 587 //将“re”宏定义为中音“2”的频率587Hz
#define mi 659 //将“mi”宏定义为中音“3”的频率659Hz
#define fa 698 //将“fa”宏定义为中音“4”的频率698Hz
#define sao 784 //将“sao”宏定义为中音“5”的频率784Hz
#define la 880 //将“la”宏定义为中音“6”的频率880Hz
#define xi 987 //将“xi”宏定义为中音“7”的频率523H
//以下是C调高音的音频宏定义
#define h_ 1046 //将“h_”宏定义为高音“1”的频率1046Hz
#define h_re 1174 //将“h_re”宏定义为高音“2”的频率1174Hz
#define h_mi 1318 //将“h_mi”宏定义为高音“3”的频率1318Hz
#define h_fa 1396 //将“h_fa”宏定义为高音“4”的频率1396Hz
#define h_sao 1567 //将“h_sao”宏定义为高音“5”的频率1567Hz
#define h_la 1760 //将“h_la”宏定义为高音“6”的频率1760Hz
#define h_xi 1975 //将“h_xi”宏定义为高音“7”的频率1975Hz
/*******************************************
函数功能:1个延时单位,延时200ms
******************************************/
void delay()
{
unsigned char i,j;
for(i=0;i<250;i++)
for(j=0;j<250;j++)
;
}
/*******************************************
函数功能:主函数
******************************************/
void main(void)
{
unsigned char i,j;
//以下是《渴望》片头曲的一段简谱
unsigned int code f[]={re,mi,re,,l_la,,l_la, //每行对应一小节音符
l_sao,l_mi,l_sao,l_la,,
l_la,,sao,la,mi,sao,
re,
mi,re,mi,sao,mi,
l_sao,l_mi,l_sao,l_la,,
l_la,l_la,,l_la,l_sao,l_re,l_mi,
l_sao,
re,re,sao,la,sao,
fa,mi,sao,mi,
la,sao,mi,re,mi,l_la,,
re,
mi,re,mi,sao,mi,
l_sao,l_mi,l_sao,l_la,,
l_la,,re,l_la,,re,mi,
re,
l_la,,re,l_la,,re,mi,
re,
0xff}; //以0xff作为音符的结束标志
//以下是简谱中每个音符的节拍
//"4"对应4个延时单位,"2"对应2个延时单位,"1"对应1个延时单位
unsigned char code JP[ ]={4,1,1,4,1,1,2,
2,2,2,2,8,
4,2,3,1,2,2,
10,
4,2,2,4,4,
2,2,2,2,4,
2,2,2,2,2,2,2,
10,
4,4,4,2,2,
4,2,4,4,
4,2,2,2,2,2,2,
10,
4,2,2,4,4,
2,2,2,2,6,
4,2,2,4,1,1,4,
10,
4,2,2,4,1,1,4,
10
};
EA=1; //开总中断
ET0=1; //定时器T0中断允许
TMOD=0x00; // 使用定时器T0的模式1(13位计数器)
while(1) //无限循环
{
i=0; //从第1个音符f[0]开始播放
while(f[i]!=0xff) //只要没有读到结束标志就继续播放
{
C=460830/f[i];
TH0=(8192-C)/32; //可证明这是13位计数器TH0高8位的赋初值方法
TL0=(8192-C)%32; //可证明这是13位计数器TL0低5位的赋初值方法
TR0=1; //启动定时器T0
for(j=0;j<JP[i];j++) //控制节拍数
delay(); //延时1个节拍单位
TR0=0; //关闭定时器T0
i++; //播放下一个音符
}
}
}
/***********************************************************
函数功能:定时器T0的中断服务子程序,使P3.7引脚输出音频的方波
************************************************************/
void Time0(void ) interrupt 1 using 1
{
sound=!sound; //将P3.7引脚输出电平取反,形成方波
TH0=(8192-C)/32; //可证明这是13位计数器TH0高8位的赋初值方法
TL0=(8192-C)%32; //可证明这是13位计数器TL0低5位的赋初值方法
}

改吧改吧 就是你的了

⑤ STM32单片机使用定时器中断产生1khz的方波

STM32有硬件PWM功能,但应用比较复杂,我也刚学,不知是否能产生1KHZ
用时器中断比较简单,但你要知道要添加哪些头文件
int main(void)
{
LED_GPIO_Config();/* led 端口配置,也就是配置哪个管脚输出方波这里以LED代替,这可是最基本 的操作,方法略 */
TIM2_Configuration(); /* TIM2 定时配置 */
TIM2_NVIC_Configuration();/* 定时器的中断优先级配置 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE); /* TIM2 重新开时钟,开始计时 */
while(1);
}

void TIM2_NVIC_Configuration(void)();/* 定时器的中断优先级配置 */
{
NVIC_InitTypeDef NVIC_InitStructure;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/*
void TIM2_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

/* 设置TIM2CLK 为 72MHZ */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);
//TIM_DeInit(TIM2);

/* 自动重装载寄存器周期的值(计数值) */
TIM_TimeBaseStructure.TIM_Period=1000; //这里改成500就是0.5ms中断一次了
/* 累计 TIM_Period个频率后产生一个更新或者中断 */
/* 时钟预分频数为72 */
TIM_TimeBaseStructure.TIM_Prescaler= 71;

/* 对外部时钟进行采样的时钟分频,这里没有用到 */
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;

TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

TIM_ClearFlag(TIM2, TIM_FLAG_Update);

TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);

TIM_Cmd(TIM2, ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , DISABLE); /*先关闭等待使用*/

中断程序:
void TIM2_IRQHandler(void)
{
if ( TIM_GetITStatus(TIM2 , TIM_IT_Update) != RESET )
{
LED1_TOGGLE; //对LED1管脚取反0.5ms一次
TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);
}
}

还是把GPIO配置也帖出来吧,这里是3个引脚接3个LED,你可以只设一个引脚就可以了
void LED_GPIO_Config(void)
{
/*定义一个GPIO_InitTypeDef类型的结构体*/
GPIO_InitTypeDef GPIO_InitStructure;
/*开启LED的外设时钟*/
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
/*选择要控制的GPIOB引脚*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
/*设置引脚模式为通用推挽输出*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
/*设置引脚速率为50MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/*调用库函数,初始化GPIOB0*/
GPIO_Init(GPIOB, &GPIO_InitStructure);

/*选择要控制的引脚*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_3;

GPIO_Init(GPIOC, &GPIO_InitStructure);

/* 关闭所有led灯 */
GPIO_SetBits(GPIOB, GPIO_Pin_0);

/* 关闭所有led灯 */
GPIO_SetBits(GPIOC, GPIO_Pin_4|GPIO_Pin_3);
}

⑥ 怎么用stm32单片机编写一个定时器中断程序使灯亮一秒暗一秒

先配置单片机的时钟,然后配置LED的IO,然后配置定时器完成1秒定时,

⑦ 51单片机占空比为32%,定时器中断时间为0.1ms 频率是多少

这个条件海贼王无法确定频率的。要看看采样数是多少,比如如果是100,那么频率就是10Hz,如果是50,那么就是20Hz。

⑧ 单片机定时器中断

定时器中断后,需要响应中断,才会自动清除中断标志位TF1,这是由中断系统完成的。
而你用查询方式,并不响应中断,也就是中断系统并没有工作,所以,就不会自动清除标志位啦。
这样设计才是合理的,假如,查询也可以清除标志位,那么一查询就清除了,那就永远也不会使TF1=1了,定时器就永远也不会查询到 定时器定时到了。
所以,学习要理解其原理,不要看表面。

⑨ 单片机定时器溢出中断是什么意思,单片机定时器中断为什么还要向数据寄存器重装初始值

楼上,这个真是你的专业?
我说是51哈。别的不清楚。
看我来个标准的: 1 定时器是怎样工作的:当你启动启动定时器,定时器就会在每个机器周期加1.当加到所有为都为1时,再加一就会让定时器所有位都为0.此时如果中断是被允许的,就会进入中断。 2 由上面可知产生中断所经历的时间是(全为1的二进制+1-初值)×机器周期;这样我样通过赋初值地方式,就可以改变产生中断经历的时间。这就是这时器为什么要给初值。当然你不给初始值的话,初值其实就是0 3 我说的对不对

⑩ 单片机定时计数器中断问题

计时器肯定计时不了2分钟,可让其100ms中断一次,变量a加1
主程序判断a是否等于或大于1200即得到2分钟0.5s也一样
void init()//初始化设置
{
TMOD=0x10;//定时器1作为定时器用
TH1==(65535-50000)/256;
TL1=(65535-50000)%256;
TR1=1;//启动定时器
ET1=1;//允许定时器1中断
EA=1;//开总中断
}

中断程序
void timer1()interrupt 3//注意:定时器1的中断序号为3
{
a++;
TH1==(65535-50000)/256;
TL1=(65535-50000)%256;
}

阅读全文

与32单片机定时器中断频率相关的资料

热点内容
服务器地址和ip地址一样不 浏览:662
php中括号定义数组 浏览:600
php打印堆栈 浏览:514
华为adb命令行刷机 浏览:963
人像摄影pdf 浏览:755
解压文件密码怎样重新设置手机 浏览:999
高考指南pdf 浏览:693
爬虫python数据存储 浏览:240
u盘怎么取消加密 浏览:429
567除以98的简便算法 浏览:340
pdf手机如何解压 浏览:15
python描述器 浏览:60
战地联盟3解压密码 浏览:805
s型命令 浏览:25
php年薪5年 浏览:71
如何上网上设个人加密账户 浏览:44
linux打开ssh服务 浏览:78
微信位置可以加密吗 浏览:470
算法蛮力法 浏览:438
随机排练命令 浏览:147