三個定時器的使用的C程序和匯編程序 ,用到的請拿走
單片機源程序如下:
- /************* 功能說明 **************
- 本程序演示3個定時器的使用, 本例程均使用16位自動重裝.
- 下載時, 選擇時鐘 24MHZ (用戶可自行修改頻率).
- 定時器0做16位自動重裝, 中斷頻率為1000HZ,中斷函數從P1.7取反輸出500HZ方波信號.
- 定時器1做16位自動重裝, 中斷頻率為2000HZ,中斷函數從P1.6取反輸出1000HZ方波信號.
- 定時器2做16位自動重裝, 中斷頻率為3000HZ,中斷函數從P4.7取反輸出1500HZ方波信號.
- ******************************************/
- #define MAIN_Fosc 24000000UL //定義主時鐘
- #include "STC15Fxxxx.H"
- #define Timer0_Reload (MAIN_Fosc / 1000) //Timer 0 中斷頻率, 1000次/秒
- #define Timer1_Reload (MAIN_Fosc / 2000) //Timer 1 中斷頻率, 2000次/秒
- #define Timer2_Reload (MAIN_Fosc / 3000) //Timer 2 中斷頻率, 3000次/秒
- void Timer0_init(void);
- void Timer1_init(void);
- void Timer2_init(void);
- //========================================================================
- // 函數: void main(void)
- // 描述: 主函數.
- // 參數: none.
- // 返回: none.
- // 版本: V1.0, 2015-1-12
- //========================================================================
- void main(void)
- {
- P0M1 = 0; P0M0 = 0; //設置為準雙向口
- P1M1 = 0; P1M0 = 0; //設置為準雙向口
- P2M1 = 0; P2M0 = 0; //設置為準雙向口
- P3M1 = 0; P3M0 = 0; //設置為準雙向口
- P4M1 = 0; P4M0 = 0; //設置為準雙向口
- P5M1 = 0; P5M0 = 0; //設置為準雙向口
- P6M1 = 0; P6M0 = 0; //設置為準雙向口
- P7M1 = 0; P7M0 = 0; //設置為準雙向口
- EA = 1; //打開總中斷
-
- Timer0_init();
- Timer1_init();
- Timer2_init();
- while (1)
- {
- }
- }
- //========================================================================
- // 函數: void Timer0_init(void)
- // 描述: timer0初始化函數.
- // 參數: none.
- // 返回: none.
- // 版本: V1.0, 2015-1-12
- //========================================================================
- void Timer0_init(void)
- {
- TR0 = 0; //停止計數
- #if (Timer0_Reload < 64) // 如果用戶設置值不合適, 則不啟動定時器
- #error "Timer0設置的中斷過快!"
- #elif ((Timer0_Reload/12) < 65536UL) // 如果用戶設置值不合適, 則不啟動定時器
- ET0 = 1; //允許中斷
- // PT0 = 1; //高優先級中斷
- TMOD &= ~0x03;
- TMOD |= 0; //工作模式, 0: 16位自動重裝, 1: 16位定時/計數, 2: 8位自動重裝, 3: 16位自動重裝, 不可屏蔽中斷
- // TMOD |= 0x04; //對外計數或分頻
- TMOD &= ~0x04; //定時
- // INT_CLKO |= 0x01; //輸出時鐘
- INT_CLKO &= ~0x01; //不輸出時鐘
- #if (Timer0_Reload < 65536UL)
- AUXR |= 0x80; //1T mode
- TH0 = (u8)((65536UL - Timer0_Reload) / 256);
- TL0 = (u8)((65536UL - Timer0_Reload) % 256);
- #else
- AUXR &= ~0x80; //12T mode
- TH0 = (u8)((65536UL - Timer0_Reload/12) / 256);
- TL0 = (u8)((65536UL - Timer0_Reload/12) % 256);
- #endif
- TR0 = 1; //開始運行
- #else
- #error "Timer0設置的中斷過慢!"
- #endif
- }
- //========================================================================
- // 函數: void Timer1_init(void)
- // 描述: timer1初始化函數.
- // 參數: none.
- // 返回: none.
- // 版本: V1.0, 2015-1-12
- //========================================================================
- void Timer1_init(void)
- {
- TR1 = 0; //停止計數
- #if (Timer1_Reload < 64) // 如果用戶設置值不合適, 則不啟動定時器
- #error "Timer1設置的中斷過快!"
- #elif ((Timer1_Reload/12) < 65536UL) // 如果用戶設置值不合適, 則不啟動定時器
- ET1 = 1; //允許中斷
- // PT1 = 1; //高優先級中斷
- TMOD &= ~0x30;
- TMOD |= (0 << 4); //工作模式, 0: 16位自動重裝, 1: 16位定時/計數, 2: 8位自動重裝
- // TMOD |= 0x40; //對外計數或分頻
- TMOD &= ~0x40; //定時
- // INT_CLKO |= 0x02; //輸出時鐘
- INT_CLKO &= ~0x02; //不輸出時鐘
- #if (Timer1_Reload < 65536UL)
- AUXR |= 0x40; //1T mode
- TH1 = (u8)((65536UL - Timer1_Reload) / 256);
- TL1 = (u8)((65536UL - Timer1_Reload) % 256);
- #else
- AUXR &= ~0x40; //12T mode
- TH1 = (u8)((65536UL - Timer1_Reload/12) / 256);
- TL1 = (u8)((65536UL - Timer1_Reload/12) % 256);
- #endif
- TR1 = 1; //開始運行
- #else
- #error "Timer1設置的中斷過慢!"
- #endif
- }
- //========================================================================
- // 函數: void Timer2_init(void)
- // 描述: timer2初始化函數.
- // 參數: none.
- // 返回: none.
- // 版本: V1.0, 2015-1-12
- //========================================================================
- void Timer2_init(void)
- {
- AUXR &= ~0x1c; //停止計數, 定時模式, 12T模式
- #if (Timer2_Reload < 64) // 如果用戶設置值不合適, 則不啟動定時器
- #error "Timer2設置的中斷過快!"
- #elif ((Timer2_Reload/12) < 65536UL) // 如果用戶設置值不合適, 則不啟動定時器
- // IE2 &= ~(1<<2); //禁止中斷
- IE2 |= (1<<2); //允許中斷
- // INT_CLKO |= 0x04; //輸出時鐘
- INT_CLKO &= ~0x04; //不輸出時鐘
- // AUXR |= (1<<3); //對外計數或分頻
- // INT_CLKO |= 0x02; //輸出時鐘
- INT_CLKO &= ~0x02; //不輸出時鐘
- #if (Timer1_Reload < 65536UL)
- AUXR |= (1<<2); //1T mode
- T2H = (u8)((65536UL - Timer2_Reload) / 256);
- T2L = (u8)((65536UL - Timer2_Reload) % 256);
- #else
- T2H = (u8)((65536UL - Timer2_Reload/12) / 256);
- T2L = (u8)((65536UL - Timer2_Reload/12) % 256);
- #endif
- AUXR |= (1<<4); //開始運行
- #else
- #error "Timer2設置的中斷過慢!"
- #endif
- }
- //========================================================================
- // 函數: void timer0_int (void) interrupt TIMER0_VECTOR
- // 描述: timer0中斷函數.
- // 參數: none.
- // 返回: none.
- // 版本: V1.0, 2015-1-12
- //========================================================================
- void timer0_int (void) interrupt TIMER0_VECTOR
- {
- P17 = ~P17;
- }
- //========================================================================
- // 函數: void timer1_int (void) interrupt TIMER1_VECTOR
- // 描述: timer1中斷函數.
- // 參數: none.
- // 返回: none.
- // 版本: V1.0, 2015-1-12
- //========================================================================
- void timer1_int (void) interrupt TIMER1_VECTOR
- {
- P16 = ~P16;
- }
- //========================================================================
- // 函數: void timer2_int (void) interrupt TIMER2_VECTOR
- // 描述: timer2中斷函數.
- // 參數: none.
- // 返回: none.
- // 版本: V1.0, 2015-1-12
- //========================================================================
- void timer2_int (void) interrupt TIMER2_VECTOR
- {
- P47 = ~P47;
- }
復制代碼
所有資料51hei提供下載:
02-Timer0-Timer1-Timer2(三個定時器)測試程序.zip
(28.32 KB, 下載次數: 61)
2019-2-14 12:43 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|