找回密码
 注册
关于网站域名变更的通知
查看: 370|回复: 1
打印 上一主题 下一主题

单片机定时器T0被四次调用,控制led灯

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-1-4 14:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
单片机定时器T0被四次调用,控制led灯
9 Y2 ~: e" E' ^7 T
7 u& s$ }8 U. S* {3 i
8 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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-9 06:04 , Processed in 0.156250 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表