日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

九齐NY8B072A单片机使用笔记(二)TIMER1/2/3定时器

發(fā)布時(shí)間:2023/12/1 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 九齐NY8B072A单片机使用笔记(二)TIMER1/2/3定时器 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

先上代碼

volatile unsigned long g_timer0_delay_conut = 0;void main(void) {DISI(); //Disable all unmasked interruptsNy8b072a_Gpio_Init();//Ny8b072a_Timer1_Init();//Ny8b072a_Timer2_Init();Ny8b072a_Timer3_Init();ENI(); // Enable all unmasked interrupts while(1){//CLRWDT(); // Clear WatchDog/*LED1 = ~LED1;LED2 = ~LED2;LED3 = ~LED3;LED4 = ~LED4;*/App_Delay_Ms(1000);} }//10bit count down , max 0x3FF void Ny8b072a_Timer1_Init(void) {//1MSTMRH = 0x30; // TIMER1 higt 2bit in TMRH bit4~5 msb TMR1 = 0xE8; // Load 0xFF to TMR1 (Initial Timer1 register) low 8bitT1CR1 = C_TMR1_Reload | C_TMR1_En; // Enable Timer1, Initial value reloaded from TMR1, Non-stop mode T1CR2 = C_TMR1_ClkSrc_Inst | C_PS1_Div2; // Enable Prescaler1, Prescaler1 dividing rate = 1:2// Timer1 clock source is instruction clockINTE |= C_INT_TMR1; // Enable Timer1 overflow interrupt }//10bit count down , max 0x3FF void Ny8b072a_Timer2_Init(void) {//500usTMRH = 0x40; //TIMER2 higt 2bit in TMRH bit6~7 msb TMR2 = 0xF4; // Load 0xFF to TMR2 (Initial Timer2 register) low 8bitT2CR1 = C_TMR2_Reload | C_TMR2_En; // Enable Timer2, Initial value reloaded from TMR2, Non-stop mode T2CR2 = C_TMR2_ClkSrc_Inst | C_PS2_Div2; // Enable Prescaler2, Prescaler2 dividing rate = 1:2// Timer2 clock source is instruction clockINTE |= C_INT_TMR2; // Enable Timer2 overflow interrupt }//10bit count down , max 0x3FF void Ny8b072a_Timer3_Init(void) {//50usTM3RH = 0; //TIMER3 higt 2bit in TM3RH bit4~5 msb TMR3 = 50; // Load 0xFF to TMR3 (Initial Timer3 register) low 8bitT3CR1 = C_TMR3_Reload | C_TMR3_En; // Enable Timer3, Initial value reloaded from TMR3, Non-stop mode T3CR2 = C_TMR3_ClkSrc_Inst | C_PS3_Div2; // Enable Prescaler3, Prescaler3 dividing rate = 1:2// Timer3 clock source is instruction clock//這里用 |= 會(huì)報(bào)錯(cuò):如果其他中斷訊號(hào)剛好在此時(shí)產(chǎn)生的話,使用 'BSR' 指令清除中斷旗標(biāo)有機(jī)會(huì)誤清其他的中斷旗標(biāo)。 (201)INTE2 = C_INE_TMR3; // Enable Timer3 overflow interrupt }//! interrupt service routine void isr(void) __interrupt(0) { if(INTFbits.T1IF){g_timer0_delay_conut ++;if(500 == g_timer0_delay_conut ) //1MS * 500 = 500ms{LED1 ^= 1;g_timer0_delay_conut= 0;}INTF= (unsigned char)~(C_INT_TMR1); // Clear T1IF flag bit }if(INTFbits.T2IF){ g_timer0_delay_conut ++;if(1000 == g_timer0_delay_conut ) //500us * 1000 = 500ms{LED1 ^= 1;g_timer0_delay_conut = 0;}INTF= (unsigned char)~(C_INT_TMR2); // Clear T2IF flag bit }if(INTE2bits.T3IF){ g_timer0_delay_conut ++;if(10000 == g_timer0_delay_conut )//50us * 10000 = 500ms{LED1 ^= 1;g_timer0_delay_conut = 0;}INTE2= (unsigned char)~(C_INF_TMR3); // Clear T3IF flag bit } } 時(shí)鐘頻率指令周期定時(shí)器分頻TMRHTMR1中斷計(jì)數(shù)IO翻轉(zhuǎn)周期
8M4TC_PS1_Div205010 000500ms
8M4TC_PS1_Div405010 0001000ms

表中第一行,定時(shí)器1的時(shí)間計(jì)算如下:
8 000 000 / 4 / 2 = 1 000 000,1 / 1 000 000 = 1us;
定時(shí)器1的初值計(jì)數(shù)50需要50us,這就是定時(shí)器1每次進(jìn)中斷的時(shí)間;
中斷里10000 == g_time0_delay_conut需要的時(shí)間為 50 * 10 000 = 500 000us = 500ms。

表中第二行,定時(shí)器1的分頻為4,驗(yàn)證時(shí)間為2分頻的一倍,說明時(shí)間計(jì)算正確。

個(gè)人不建議把定時(shí)器初值設(shè)置過低(1us),太頻繁的中斷容易引起意想不到的BUG,根據(jù)自己實(shí)際使用需求來設(shè)置一個(gè)合理的值。

總結(jié)

以上是生活随笔為你收集整理的九齐NY8B072A单片机使用笔记(二)TIMER1/2/3定时器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。