|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机定时器T0被四次调用,控制led灯
9 Y2 ~: e" E' ^7 T
7 u& s$ }8 U. S* {3 i8 h& I& `5 n: ?* Z' I
定时器T0被四次调用,控制led灯
: m O/ d m. s- G" h![]()
0 t, P9 d9 I* Y7 R#include<reg52.h> //头文件( b, U, o* K* }% |+ Z9 K3 x
#define MY_TIMER_MAX (4) //最多四个定时器
0 Q0 A2 W6 Q4 ^3 M9 A' M2 q#define NULL (0). g- D0 l. |$ O) v6 z
4 w7 u# Q. v/ i1 s% x! M9 E$ I' W. J
typedef void (*pFun)(void); //callback 函数指针类型/ m5 n5 U% e1 m7 d( }0 D
typedef struct myTimer
$ Y6 w: V9 {' ]- e3 L d7 |. m/ o{0 T( Y1 l6 H9 x+ Z
char on; //开关8 W" l* d3 _! O1 T* T+ e
char is_period; //是否周期循环& H. m2 {( g/ c; Q. j
unsigned short int time_out; //定时时间,单位ms
5 B2 k$ u' U+ E \6 s% @: f5 _ unsigned short int count; //定时计数用
* ~6 W. @7 B/ v C( f4 |}* C4 g" f! K$ ?4 [7 \
MY_TIMER;
1 k7 d. K: D! x9 q u7 |+ ^
9 s0 b" ?: r; \# ?pFun callback[MY_TIMER_MAX] = {NULL}; //定时器回调函数数组+ h0 R8 B# k* J3 p
MY_TIMER myTimerList[MY_TIMER_MAX] = {0}; //定时器结构数组
8 R5 x( L! [+ h" r+ B8 G# gint gMyTimerMessage[MY_TIMER_MAX] = {0}; //定时器消息数组& f$ x* T$ z& b4 Z5 W" E
0 l3 W9 P* n% ^, Hsbit LED1=P1^0;
' j# E6 [' K3 A9 |sbit LED2=P1^1;' e6 j7 b* X. [" Q& F4 H
sbit LED3=P1^2;* F1 Z5 R$ q1 ~# H- j5 b* E
sbit LED4=P1^3;
, m6 v- n! `' M/ ]! a8 @$ U2 ]" H* v3 J8 J9 r8 |
#define ALL_ON {LED1=0;LED2=0;LED3=0;LED4=0;} //灯全开& u N' e2 X; _* n
7 H0 r6 l/ \$ U t5 @
//创建定时器,简化版本。
+ i; e9 X8 @$ H6 Y, _int CreatTimer(int index,unsigned short int time_out,char is_period,pFun callbackFun)
5 U* W4 n1 b: R9 N{
, j, M, M& i+ |/ ~9 G if(index >= MY_TIMER_MAX) return -1;
; R( C5 L$ p2 a: `+ L! |4 T myTimerList[index].on = 1;
' l" t6 c' c% S) V# D* ~ myTimerList[index].is_period = is_period;
( N4 Y6 g# E4 {) x1 @2 W: ^ myTimerList[index].time_out = time_out;
6 ?9 l0 t9 X G6 U A! }8 C E myTimerList[index].count = 0;
' e% E4 F9 T" N0 J6 f' m! M0 s callback[index] = callbackFun;/ p- `& h+ }' r$ U' a4 J' {* v
return index;9 [3 F8 T% H/ }) D( B- A
}8 U: H) a: z8 _
" z, S" i. P8 X3 {2 v( Z
//四个LED控制函数,on初始是0,第一次调用on变为1,是关灯。3 p, n9 L2 _5 n9 U/ Y
void led_1_ctrl(void)
, q; t- K# Q) Y6 r' z9 i6 a{
4 X' u( H! _$ R+ x! k static char on = 0;: c w, Q- Y3 ]
on = !on;2 _" ?# a: s& _: p/ @/ P
LED1 = on;; E) p. s" O: b1 v9 j$ I x
}, g% R7 ]4 e' B+ [; D- ^8 s
void led_2_ctrl(void)
& W; ?% U# S5 V; K4 }" ?; A6 `{
! H- l s, t9 m$ K5 ? static char on = 0;
; C7 H# d4 t& Y, r5 V5 r. _ on = !on;& z) ^* }; A0 Z, x7 H! z. `
LED2 = on;
4 q! k2 {/ w* B/ X$ ]% n} `* [1 e, h( t0 m+ ]1 [1 j# R
void led_3_ctrl(void): l6 u' a/ U/ N* _
{& l5 f5 B) w; q, P' c
static char on = 0;
0 z: w0 f4 d1 X- x* V! o on = !on;
: M% O5 w; m. a1 b0 [- V LED3 = on;) A! z4 g& q, [* j$ Z( V
}( P2 t2 K) u( J& R
void led_4_ctrl(void)/ e+ S# w8 d. v/ T. Q2 d
{
" J. s2 w0 r0 G static char on = 0;, {8 I: v6 H$ F
on = !on;, r2 H- Z7 u, r( z0 K
LED4 = on;
& ]1 [' ~5 u% W# P/ ?. T}; x) N4 t9 T) w
/ a3 @0 M2 a) Lvoid Init_Timer0(void) //初始化定时器0/ Y# a5 ?! ?$ s# b1 k8 ]
{) f7 O+ I: A3 T" C; a
TMOD=0x01; //定时器0,使用模式1,16位定时器
9 T$ \1 R6 J3 o: m TH0=(65536-1000)/256; //给定初值
/ l, N, N" ?2 ]& u8 N TL0=(65536-1000)%256;# G7 W/ W* H/ K2 L
EA=1; //打开总中断: @0 O3 q: c: F3 x1 ^* k; g% q7 y
ET0=1; //打开定时器中断) l1 K6 h7 e* I$ I* _
TR0=1; //开定时器( V4 x r' h) k! z
}
0 g* A1 ?9 a! v; ?' \/ P a' }, L3 h; v8 B
void main() //主函数
+ F9 f) c3 z. r$ Q. i* q0 }{
) o# u# Z& B: C/ Q* q8 v unsigned int i;! o% h+ Q0 H) ]! A X' ?7 F. S4 i) ~
0 j* U) W: B/ \3 |$ v' K P9 [ ALL_ON;
: J9 h% [2 E1 A9 z V9 V7 }) p CreatTimer(0,250,1,led_1_ctrl);8 P) Q O$ |5 ^( L4 ^. n: c! n
CreatTimer(1,500,1,led_2_ctrl);) U$ H, ]# Y; g3 ~7 Y7 n
CreatTimer(2,1000,1,led_3_ctrl);' ~% e: {8 C5 U2 u( B. p/ s, y. ^
CreatTimer(3,2000,1,led_4_ctrl);
$ v+ `$ T) |/ h3 |/ s7 K1 y
+ S, k/ h' `' x% P Init_Timer0();//初始化定时器0
+ _7 b, x0 S7 P while(1)4 o9 X$ u" x5 Z% |* `, M
{
) E; x' e$ L% S, J2 `: C for(i = 0; i<MY_TIMER_MAX; ++i)7 z+ ]0 X+ B+ \9 T; _" Y7 j/ a
{
* P1 c8 D$ j3 p2 p if(gMyTimerMessage) //定时器消息来到,启动。5 H- t' o8 d8 V* a' E7 J, J4 n
{
$ x+ |% F/ V; C2 [; I" I gMyTimerMessage = 0; //消息清除
+ I& H& i6 z9 C% E if(callback != NULL)) D' R. x* Q% K' s, B7 j: V
{$ f6 T$ ~* p8 l' P5 B
(*callback)(); //调用回调函数
) x2 m& o# A- x8 c2 j3 r1 P } # o6 [' K. L. t- d* i0 e+ |
}
+ {: V- b ^. o! m" X# p. Y1 ^ }
7 ] t. m$ g2 D6 L8 N% E2 ]% Z }
) U: F+ ~1 j c}
; }3 _8 N0 c! m& h- O# K% F% _. w2 d! \# v3 r9 f0 C
//定时器中断函数,1ms 定时。! S) I/ b* v6 G
void Timer0_isr(void) interrupt 18 u0 q" }/ a' j* w* f6 e7 t
{* C, m4 J- J) A3 \% w
unsigned int i = 0;8 P2 X' K2 Q* S: c( r! c
0 {7 ^# |! r- H( |4 O. H0 N+ y4 _: `! ^; [( x
TH0=(65536-1000)/256;//重新赋值 1ms ~" p6 Z( J$ B: f' A9 L
TL0=(65536-1000)%256;
9 s1 Z) q7 W. T, [. c/ r' ]" _5 C. H' J( x6 X
EA = 0;- k: s! h+ m+ S& [4 t
for(i = 0; i<MY_TIMER_MAX; ++i)) ]* R& q+ V$ v
{
3 l$ B V9 o+ m( p0 U! J if(myTimerList.on)( r4 ]3 [# d3 c/ [' N+ V, j
{
. c0 W# s# b9 s0 `. n6 _ ++(myTimerList.count); //计数, \3 y" L9 M3 @! E9 Y. i
if(myTimerList.count >= myTimerList.time_out) //定时到
9 ]. ?6 V+ e; s1 D5 F {! u8 Y6 ^% J2 M: j0 |& l% r
gMyTimerMessage = 1; //发消息
/ c6 r4 c9 ^+ ~ if(myTimerList.is_period) //是否周期循环$ O% a$ ?8 Q( p4 [) s4 Z
{: T! }" P: Z. }0 ]2 m
myTimerList.count = 0; //计数重置
; t5 w7 c' t0 Z: R2 z }
7 {- t7 p" a9 J# @6 ?0 Q& E# a6 s2 [/ a- s* _. O- s
6 ?! D% k( x |
9 c9 n1 Q. U, X7 […………限于本文篇幅 余下代码请从论坛下载附件…………
6 K' _5 X# H- M( G" s: J下载:
z1 q( W: }% _4 k5 n. F" E- i* I% O" u* m% i
( W% n3 [/ P* h+ q
|
|