① 單片機定時中斷
跟你理清一下思路,你的問題就解決了。首先,你的程序很簡單,就是讓發光二極體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;
}