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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
单片机定时器T0被四次调用,控制led灯+ C6 y5 R& `) `' u  G5 ^

1 V( r3 h+ n6 {; z& a

8 Q  E; Q$ I( C3 i9 n/ J定时器T0被四次调用,控制led灯
2 r7 k$ m! a9 X7 f

7 V" Y2 V/ Q; L$ `. s% a#include<reg52.h>                //头文件) n- Z$ d5 ]  L( t: b, a/ A: g
#define MY_TIMER_MAX        (4)                //最多四个定时器' z1 |4 H" i. h& H( P; z1 S
#define NULL (0)) E! |, r# {: y$ o

. q+ N- e. k( \" h0 |typedef void (*pFun)(void);                //callback 函数指针类型
3 _! \( s! u7 F0 n; S4 Itypedef struct myTimer
0 M8 w0 A6 x. a1 T$ v{% V2 E+ w* ], _
        char on;                                                //开关2 Z6 e; Y$ y' K1 }/ A) o1 {
        char is_period;                                        //是否周期循环/ b0 ], ~, n, e" i- k/ n) B0 T# F
        unsigned short int time_out;        //定时时间,单位ms
. i& q: s2 U$ Y        unsigned short int count;                //定时计数用+ O' Y: K$ X4 i7 z( t  K3 Z8 a
}2 a3 l# j3 C, a) d
MY_TIMER;
4 j0 b9 T9 i( n/ `( v" V; I3 q) w  p5 r5 u3 @( d
pFun callback[MY_TIMER_MAX] = {NULL};                        //定时器回调函数数组; }" Q$ f3 Y* n
MY_TIMER myTimerList[MY_TIMER_MAX] = {0};                //定时器结构数组5 ]$ n8 g4 y( n8 F
int gMyTimerMessage[MY_TIMER_MAX] = {0};                //定时器消息数组
% y0 e0 l7 d" T3 g8 b2 D# v, o- K1 N& Y) B5 R0 H; f
sbit LED1=P1^0;
4 P( q9 v/ J- {  q8 q* z% Xsbit LED2=P1^1;
. ?7 i8 J6 B' nsbit LED3=P1^2;
8 Z9 U+ j% B# w4 Osbit LED4=P1^3;8 V$ P, d- Q( @* M, `# a

/ e# a" [& Q9 R. Q+ T#define ALL_ON {LED1=0;LED2=0;LED3=0;LED4=0;}        //灯全开# G6 r) r$ d  i4 D5 Y  q, E2 T  c

1 D3 @8 P, Y: U* E7 W( c5 e: k//创建定时器,简化版本。
. o6 {! K# V! ], m5 [int CreatTimer(int index,unsigned short int time_out,char is_period,pFun callbackFun)
: ^% h; P. G" Q{* I, D* T% ~. ^9 L, e& ?
        if(index >= MY_TIMER_MAX) return -1;) o" o2 o7 {4 {5 Y9 C
        myTimerList[index].on = 1;
, w" K7 g0 T: Y! G& H* a! F        myTimerList[index].is_period = is_period;
( p" H7 m' c8 \' `. a5 `' x        myTimerList[index].time_out = time_out;% ^  S* w$ S8 a: n7 p1 R3 G% t
        myTimerList[index].count = 0;7 ^' X+ ?) ]8 T, s& x+ Q# x/ k* |
        callback[index] = callbackFun;5 t2 G& E/ O- Q4 J5 h9 [9 J
        return index;: f( t2 |: D# \# }
}9 F! Q7 l! ~8 W- `/ J

4 W: A* S" j$ o) K$ k//四个LED控制函数,on初始是0,第一次调用on变为1,是关灯。) s) r" J4 U- N4 i# ?" r! o
void led_1_ctrl(void)
/ y( U0 V+ P, |+ P1 Q{. w, s7 K0 \) [- Z
        static char on = 0;& A' j/ {1 n2 r" I: u; y
        on = !on;
9 S3 y- F- s4 J0 D2 w3 b9 y' E        LED1 = on;
& F# E% M& i% G5 L) o}
( S; n7 m7 m2 f1 q8 ^void led_2_ctrl(void)  Y- _, a) W- m- C. A$ Q
{
6 q9 _9 K1 b1 g; _' [' x        static char on = 0;
  z# I2 u" \/ P! n* e! Q) T        on = !on;
6 P- P+ b* W2 N9 d! _3 t7 j        LED2 = on;  ?/ s+ A1 s7 V; f1 c8 E6 u
}  x7 O' M  f: Y* f& p* \4 M* t6 ?
void led_3_ctrl(void)
) D4 x, a0 @9 S2 _* J3 z{& w( @- p3 _" m; v% O! \
        static char on = 0;& [  i  H" z) Y1 n
        on = !on;! I* v/ \$ C- h( _
        LED3 = on;
: k/ p  X: l' P' o4 V}0 e, c( l( W; h" x2 \. D6 g7 [6 `
void led_4_ctrl(void)( R; E; e+ |$ J4 m
{
( Y  l* |' G- H; o, X        static char on = 0;
; I# O- W7 a0 C" d3 d9 T! R        on = !on;
1 N$ g! M. ~* i) r! B* p7 ^        LED4 = on;2 R$ |' I( V0 `5 L
}5 j! K8 O/ @( x6 x9 Y' p% x
& _5 h; X) m) I5 U8 z, d. y" d
void Init_Timer0(void)        //初始化定时器01 j  N! R8 G4 c( W; V- T6 Z( i
{
: r/ t2 M! \. B; o; \  n        TMOD=0x01;                                //定时器0,使用模式1,16位定时器
$ k1 W) K+ `- ^" B6 w        TH0=(65536-1000)/256;        //给定初值8 v! G' s, \; a. y- ~; \( a- Z
        TL0=(65536-1000)%256;5 m. D" R3 k3 `, G) p2 E7 v
        EA=1;                //打开总中断1 _3 o4 G' [8 ^) C5 H
        ET0=1;        //打开定时器中断' G* @9 V5 U! [& ]# I, T( b
        TR0=1;        //开定时器
1 r$ c$ y, n8 t) ~}/ x  e4 F0 Q" s% f6 E; y" T
1 f$ @' N& G3 w" {% _8 L' k
void main()        //主函数  m7 h; J6 d* `, ]7 m1 a
{' q( y# u) e# a. R% b/ Q
        unsigned int i;1 x% W+ Y" I) K

! m8 Q, s' Z& B( Y        ALL_ON;6 a' l, S  p4 q0 u3 Z- V6 F
        CreatTimer(0,250,1,led_1_ctrl);
& X0 N  s/ ^9 C6 u$ L        CreatTimer(1,500,1,led_2_ctrl);
% d/ O9 u/ I) y- \2 b6 N/ R( |        CreatTimer(2,1000,1,led_3_ctrl);
- h' A3 n6 _7 h2 i. z& \7 i        CreatTimer(3,2000,1,led_4_ctrl);
- A) R8 A+ A: p4 x7 o0 n+ M7 o# q* W/ x
        Init_Timer0();//初始化定时器0
; n. B4 |( u0 B1 I7 N5 T        while(1)
9 q7 `) G6 T3 X5 B% Y$ a9 A# N        {7 w$ z+ O* H* S6 L  E
                for(i = 0; i<MY_TIMER_MAX; ++i)! G6 p2 J7 S) R* L1 K' \
                {! P: E# Z7 f/ T# j
                        if(gMyTimerMessage)                //定时器消息来到,启动。" w' T, o& [) D. a" D* K* z  R
                        {% S# g+ X$ M5 Z. Z2 {! ^' o
                                gMyTimerMessage = 0;                //消息清除
: B. _2 w- t5 r5 U8 c                                if(callback != NULL)/ @3 s: j- u! b/ Y. X3 A* [# d$ z( `
                                {0 n$ O1 [( C. h$ w& H
                                        (*callback)();                //调用回调函数9 b! [- A& w% d* V$ e- I2 K" _$ S; C
                                }                                
, S$ b0 L$ i" G$ S) g8 O                        }! N' q& Z9 [2 G4 e" N
                }* b: I# v8 Q$ S8 s4 Z9 w. d
        }4 k4 k" u  f  [+ a- S6 _) E% l
}
0 k5 f$ f8 t$ h5 ^: t4 Y
  H; V/ L$ U7 f; F% X//定时器中断函数,1ms 定时。" d7 f$ h2 D  Z( [7 S% z
void Timer0_isr(void) interrupt 1
/ k: i) H* X# ?( X9 q{9 s+ t  ]' W6 o3 G6 X. x
        unsigned int i = 0;1 ^" b# _1 L* m3 t

2 y  _. A  d: E* J5 `
8 z- y0 m. m: C! p6 s; F; v# C        TH0=(65536-1000)/256;//重新赋值 1ms0 `% G- b( _# s$ D: X# U
        TL0=(65536-1000)%256;, n. c) v; {' [1 L" s2 H  K
4 ~, P* t; u2 ~. ^5 B& l- M" s/ I
        EA = 0;1 Z( s) ?) H0 y! {
        for(i = 0; i<MY_TIMER_MAX; ++i)0 b5 H6 A+ L+ m2 q+ k2 g/ K5 R
        {9 [* w9 x) c- l. Q
                if(myTimerList.on); P! q8 ?8 U. r+ Q& A* ^
                {
9 }* y. W0 n9 x3 S  q                        ++(myTimerList.count);                                                                //计数$ t( x+ @- V6 r, i; k5 R' T/ _! d8 a
                        if(myTimerList.count >= myTimerList.time_out)                //定时到9 ^' t3 L- |* t4 ~5 c6 ^
                        {
% T! l) _7 ~$ Y$ Y( g6 V                                gMyTimerMessage = 1;                                                                //发消息
) g) I2 p, v& z2 n2 |& v# _                                if(myTimerList.is_period)                                                //是否周期循环: _+ z7 I8 z5 s8 f
                                {
' f' I1 t% f0 J# X  |! y7 i' i4 Q                                        myTimerList.count = 0;                                                //计数重置/ E- }2 a0 I! D& M( o3 U
                                }& W& f; _( a1 F' n
6 |, e& X5 W, H% a8 K( c+ W* e
5 j* b7 x( X5 ?6 T8 ~

; X/ _/ m! a1 o. ]( V4 Y( A' g…………限于本文篇幅 余下代码请从论坛下载附件…………
4 O5 y1 V6 C" s. b% _8 Y: B下载:9 n- a( n6 h1 R8 a; q
游客,如果您要查看本帖隐藏内容请回复

  M" I; s+ n' }0 F6 W8 `. t- q5 v
$ {# y$ L* {( ]* I3 M1 m
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-19 19:29 , Processed in 0.109375 second(s), 26 queries , Gzip On.

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

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

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