|
網(wǎng)上發(fā)現(xiàn)一個(gè)很好的軟件定時(shí)器程序。有移植示例,略加修改,在普中開發(fā)板上實(shí)現(xiàn)。但是相差很大,不準(zhǔn),請(qǐng)?jiān)囼?yàn)后發(fā)表意見(jiàn)。
單片機(jī)源程序如下:
- #include <reg51.h>
- #include "multi_timer.h"
- /*定義3個(gè)定時(shí)器*/
- Timer timer1 ;
- Timer timer2 ;
- Timer timer3;
- /*用于定時(shí)10s的計(jì)數(shù)器*/
- int Counter = 0 ;
- /*根據(jù)板子原理圖,燈位于P0^0,P0^1*/
- sbit LED = P0^0 ;
- sbit LED2 = P0^1;
- /*晶振頻率為12M*/
- #define FOSC 12000000L
- /*指令速度為12T*/
- #define command_speed 12
- /*用multi_timer創(chuàng)建的定時(shí)器1定時(shí)時(shí)間 單位:ms*/
- #define TIMER_TIMEOUT_500MS 500
- /*用multi_timer創(chuàng)建的定時(shí)器2定時(shí)時(shí)間 單位:ms*/
- #define TIMER_TIMEOUT_1S 1000
- #define TIMER_TIMEOUT_10S 10000
- void timer0_init(void);
- void timer1_callback(void);
- void timer2_callback(void);
- void timer3_callback(void);
- void main(void)
- {
- LED = 0;
- timer0_init(); //系統(tǒng)定時(shí)器0初始化
- /*判斷是否到達(dá)定時(shí)時(shí)間(timeout參數(shù)),如果到達(dá)了定時(shí)時(shí)間,沒(méi)有指定循環(huán)定時(shí)觸發(fā)時(shí)間(repeat參數(shù))的時(shí)候,
- 這時(shí)就會(huì)把當(dāng)前定時(shí)器句柄給移除,如果指定了循環(huán)定時(shí)觸發(fā)時(shí)間(repeat參數(shù)),則定時(shí)時(shí)間會(huì)被重新賦值,
- 直到下一個(gè)定時(shí)到來(lái),接下來(lái)會(huì)一直循環(huán)觸發(fā)。*/
- timer_init(&timer1, timer1_callback, TIMER_TIMEOUT_500MS, TIMER_TIMEOUT_500MS);
- timer_init(&timer2, timer2_callback, TIMER_TIMEOUT_1S, TIMER_TIMEOUT_1S);
- timer_init(&timer3, timer3_callback, TIMER_TIMEOUT_10S,TIMER_TIMEOUT_10S);
- timer_start(&timer1);
- timer_start(&timer2);
- timer_start(&timer3);
- while(1)
- {
- timer_loop();
- }
- }
- /*multi_timer回調(diào)函數(shù)1調(diào)用*/
- void timer1_callback(void)
- {
- /*LED燈電平翻轉(zhuǎn)*/
- LED = !LED ;
- }
- /*multi_timer回調(diào)函數(shù)2調(diào)用*/
- void timer2_callback(void)
- {
- /*當(dāng)計(jì)數(shù)器到達(dá)10次以后刪除所有創(chuàng)建的軟件定時(shí)器
- 計(jì)數(shù)器清0,將LED電平置為1,常亮
- */
- ++Counter ;
- if(10 == Counter )
- {
- Counter = 0 ;
- LED = 1 ;
- timer_stop(&timer1);
- timer_stop(&timer2);
- }
- }
- /*multi_timer回調(diào)函數(shù)3調(diào)用*/
- void timer3_callback(void)
- {
- /*LED燈電平翻轉(zhuǎn)*/
- LED2 = !LED2 ;
- }
- /*硬件定時(shí)器初始化*/
- void timer0_init(void)
- {
- TMOD = 0x00;
- TH0 = (65536-FOSC/command_speed/1000) >> 8;
- TL0 = (65536-FOSC/command_speed/1000);
- EA = 1;
- ET0 = 1;
- TR0 = 1;
- }
- /*利用系統(tǒng)定時(shí)器產(chǎn)生1ms的定時(shí)中斷*/
- void timer0() interrupt 1
- {
- TH0 = (65536-FOSC/command_speed/1000) >> 8;
- TL0 = (65536-FOSC/command_speed/1000);
- /*multi_timer計(jì)數(shù)器自增*/
- timer_ticks(); //系統(tǒng)滴答
- }
復(fù)制代碼
Keil代碼下載:
Ok-普中多定時(shí)器multi_timer.rar
(3.52 MB, 下載次數(shù): 15)
2021-12-16 20:56 上傳
點(diǎn)擊文件名下載附件
|
|