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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
单片机定时器T0被四次调用,控制led灯9 ?1 Z  d" f5 s5 Y& b6 t" h2 z

) d0 G) k8 {4 l9 b1 ^% ]/ o. D

8 ?: W0 o3 f; ^6 j% E9 ?1 R定时器T0被四次调用,控制led灯
% D1 e0 X+ G' v& G( F8 m& _# c

- ]7 T' ^: o. M" I* v8 Z#include<reg52.h>                //头文件. W% I* ^6 r( r& g
#define MY_TIMER_MAX        (4)                //最多四个定时器
/ H: R3 U* `% I. B#define NULL (0)
4 `3 H0 x4 |: E1 f; \: w
; a( ~, R  B. X6 |' Z: G0 wtypedef void (*pFun)(void);                //callback 函数指针类型
. D& U. B' F8 qtypedef struct myTimer
- H7 {/ F" V8 p, h: V{( p; J! e9 M+ {! ]' \4 I
        char on;                                                //开关( |( Q; z6 c0 r# N/ @( Y/ F# @
        char is_period;                                        //是否周期循环- \0 _( d$ w8 g; f5 V: k
        unsigned short int time_out;        //定时时间,单位ms
. n5 `/ T+ Q" Y, U1 g2 g        unsigned short int count;                //定时计数用2 n+ X7 A6 Y, L) e6 ~! o
}9 C5 Y5 r. @7 L8 e3 K" H' O4 B
MY_TIMER;4 r" i$ @% q! c7 W" o; Q
3 c7 D$ ]9 ]" F
pFun callback[MY_TIMER_MAX] = {NULL};                        //定时器回调函数数组0 `6 |  V2 M( Q7 V' y7 D
MY_TIMER myTimerList[MY_TIMER_MAX] = {0};                //定时器结构数组
. P7 g2 @8 W, n; M0 M) Gint gMyTimerMessage[MY_TIMER_MAX] = {0};                //定时器消息数组3 r! U* E1 n+ ^
0 i8 f' y( L6 r
sbit LED1=P1^0;3 ~% K* \; e  Q
sbit LED2=P1^1;
7 W# H  D9 K, n: f  D/ N8 f- nsbit LED3=P1^2;$ s: }- w- P3 z# i% K
sbit LED4=P1^3;
! s2 ?5 ]" `. N  Y9 i# g. t# @
) V; R# A( K  ^#define ALL_ON {LED1=0;LED2=0;LED3=0;LED4=0;}        //灯全开$ g/ }* s9 b7 O8 ?
; l8 G, W, n8 B' K7 N% a
//创建定时器,简化版本。7 a  w. d9 k, k# X+ Z2 t1 R
int CreatTimer(int index,unsigned short int time_out,char is_period,pFun callbackFun)1 f0 ^$ D; O' @) S& Q4 K0 M
{' s' |( ^: U5 x5 V
        if(index >= MY_TIMER_MAX) return -1;
8 W; t, v% T6 |$ h0 T! c, Y        myTimerList[index].on = 1;7 q' b0 r+ J& r; L7 q* v
        myTimerList[index].is_period = is_period;3 x2 S7 ^0 a1 P. N
        myTimerList[index].time_out = time_out;
8 |9 L6 K3 w# _1 S7 |. {4 d        myTimerList[index].count = 0;5 A* B1 v& b% Y. Z2 s6 I5 X
        callback[index] = callbackFun;
; l, a  w" C: J$ o' C5 C! v        return index;; V% ^7 h2 S" a' z& Z/ @
}
8 u* A  |5 G8 t# d! t2 _
9 g8 L* _, I! [& d/ \* m7 v7 L//四个LED控制函数,on初始是0,第一次调用on变为1,是关灯。
- d2 r; w' L) B! w  y( bvoid led_1_ctrl(void)
3 L% f# H. r) G" S7 n* d& }{9 r- L6 w1 v. b9 }7 v
        static char on = 0;
6 A% [# L+ }8 G3 @  I" B7 H' a2 q        on = !on;
( y( o- k$ N  j5 `" B        LED1 = on;! W& e3 c2 G: y* I. O5 V* C4 D
}
) W3 B; Y* P% q! Y" Ovoid led_2_ctrl(void): c* F, U2 `! \" O
{
" ]2 j: |8 p1 j5 y2 J        static char on = 0;# X$ v% Y$ Z4 U# Z+ p
        on = !on;2 n( p) E2 s2 x, d: P" T
        LED2 = on;
+ q2 K8 S2 l  u2 J/ d# N- C}' j/ ^+ y5 N# |( t. [; v8 e
void led_3_ctrl(void)  H! S% U0 b/ u1 `1 Z
{
5 c3 ^( P+ F! ~' V        static char on = 0;) Q# r: F2 @5 r  @
        on = !on;
$ s6 U; g* m* {! c: P        LED3 = on;
0 \  F8 h  @7 y# @! P+ Z( J  U. S9 A}1 U4 F9 f8 w9 U* F0 {! q# M3 e5 C; q
void led_4_ctrl(void): S4 x- M) X- L8 m7 z8 ]
{
% h3 r) ?+ h) [6 X: Z9 ?        static char on = 0;( c8 T' V+ o7 C9 x  o' V, C
        on = !on;
8 J) h8 C% E% k( Y- a; _' B3 h6 b        LED4 = on;& i8 Q! X5 [) j& |0 e
}
3 q1 L7 N" B2 k& n6 C
9 b, _# W  h  a9 q% r: [! {% y3 kvoid Init_Timer0(void)        //初始化定时器0
  f2 H, s! e5 L3 d{
" f+ e; D! K/ z! B9 \        TMOD=0x01;                                //定时器0,使用模式1,16位定时器
# K+ W0 a# V* ^; \! _        TH0=(65536-1000)/256;        //给定初值* |3 M( c/ R2 f
        TL0=(65536-1000)%256;
8 u; H, f9 }% f% {) g; h' R8 B7 Y        EA=1;                //打开总中断
' x3 B9 B9 z" F$ t        ET0=1;        //打开定时器中断1 k$ I; b- C3 Y" [; K. ?* p
        TR0=1;        //开定时器' F/ i. E- [' v! J: V- X
}
6 [6 b/ A( _. i1 n6 c" P: [0 V9 A$ j7 m5 C( f5 [* `( v* ~
void main()        //主函数
7 L+ N, l0 l$ W2 q# O/ E5 H  E{* ~% X( r+ l1 j: ^% ]  ~9 c' H' U
        unsigned int i;2 ]; ?5 y: L0 X. o# N, F; s
7 \! Q( j5 N2 e; e$ H
        ALL_ON;
: S, `1 ?  U$ R        CreatTimer(0,250,1,led_1_ctrl);
5 M! x7 w+ ~5 G- k+ v) J  C        CreatTimer(1,500,1,led_2_ctrl);
1 P8 `4 _+ G2 B7 J/ A( c        CreatTimer(2,1000,1,led_3_ctrl);0 I7 E, P9 |' h$ g- {4 o
        CreatTimer(3,2000,1,led_4_ctrl);
. W: o" {$ r/ X& Z/ {
; v8 K8 V. E$ H0 V- a9 i. d        Init_Timer0();//初始化定时器0' b& s; u9 q" ]+ y6 u, n$ H
        while(1)+ O: }4 r* T+ S
        {
" j3 H- P! F+ U                for(i = 0; i<MY_TIMER_MAX; ++i)
2 p9 I% _& Q+ }& x; r) w                {% G# z! l! H1 ^! l# L7 o
                        if(gMyTimerMessage)                //定时器消息来到,启动。. _0 l9 H% X$ j) ?( y
                        {
8 t5 @- J7 q$ Z# e                                gMyTimerMessage = 0;                //消息清除$ I: U" y2 V  a; T' _" w6 J
                                if(callback != NULL)
3 ]; t8 |7 \5 B: z2 f4 B                                {
/ w8 K2 B- J  S: v5 ^( m8 w- e                                        (*callback)();                //调用回调函数# Y# K) N& k2 X
                                }                                7 C' c9 C. X0 j* G' L1 s1 \
                        }
' u# ], q& K5 |+ ^1 j' Q                }
% |4 n" [/ q% M6 _( b        }' |* @# T1 H/ V  O: r0 q, ~* O+ f
}0 D$ G8 L) z4 x' M8 b
: _6 j) a& e( s$ ~# {
//定时器中断函数,1ms 定时。
# }' Q, O, g  S7 i' r+ T0 ~' j7 i! ivoid Timer0_isr(void) interrupt 13 w+ \- Q) C7 d
{$ \7 x6 P, Z/ W( U* E9 R3 o. x2 V6 k8 o
        unsigned int i = 0;
& D7 a& O9 M: ^  I$ ]
4 }8 }0 ]- u! V3 i8 k6 j
- v+ j6 s7 n: M6 W% \4 I        TH0=(65536-1000)/256;//重新赋值 1ms5 ^# Q  s; W# G- U- o. a
        TL0=(65536-1000)%256;
3 h$ N$ T" D/ F8 d4 h: J) y9 w
        EA = 0;4 A# z7 j1 M+ Z
        for(i = 0; i<MY_TIMER_MAX; ++i)
  |$ `6 u; k9 P: ~! W        {
5 P# u) T  ?. u: [2 q                if(myTimerList.on)2 ^, C' M" _3 i
                {
( B/ k( X  T1 m2 F: r                        ++(myTimerList.count);                                                                //计数
8 n3 Q6 N1 Y5 S7 G                        if(myTimerList.count >= myTimerList.time_out)                //定时到5 Z2 w: z* G! w. z8 i8 W$ d
                        {8 @* i0 X: q7 N2 e4 S% M+ o2 x7 q
                                gMyTimerMessage = 1;                                                                //发消息7 `0 W& h/ G3 i* z# c6 m1 r
                                if(myTimerList.is_period)                                                //是否周期循环
! I' ]3 N# {5 o# P                                {0 k& h, _' i' y  f. T8 v
                                        myTimerList.count = 0;                                                //计数重置
" Q8 d0 P& Q( i                                }
( Z9 D( e) d) I8 Y: x$ {- }
" c3 z& k- d4 _2 U  N; }1 g% n8 }& k. H
6 ?. N- r; ^, x3 w* N
…………限于本文篇幅 余下代码请从论坛下载附件…………
: r9 ]& G: `: b: @% C下载:
* m" ^- E( p! c$ U. r# p
游客,如果您要查看本帖隐藏内容请回复
; o5 J. W5 `# O( O4 o

9 K* r4 [7 S2 w1 F5 E; L5 F
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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