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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
单片机定时器T0被四次调用,控制led灯
3 b" H  Z7 H9 M" L; n6 |3 B$ l  d6 v
0 j, b! H0 h6 `5 d% V3 j2 m
1 E( y" W: Y8 r0 I( R3 ^
定时器T0被四次调用,控制led灯: q3 ~" \5 s. p- [6 J) \( P) j, W
! `$ Z$ m0 j& S$ O
#include<reg52.h>                //头文件6 a/ A! [& C4 T) L7 s; m# j
#define MY_TIMER_MAX        (4)                //最多四个定时器  L# B: s& B( m: M. `% b# i0 L3 r
#define NULL (0)* l$ D5 k4 e8 V9 ]  G
! {& T% A9 n3 R' V  q5 ^: q5 R
typedef void (*pFun)(void);                //callback 函数指针类型* _7 Q- f2 C6 [$ q$ M
typedef struct myTimer# Y2 g, B7 q- }0 B
{- d( U4 _/ b* p! A2 J  \( ?
        char on;                                                //开关9 n# v$ w, j4 U
        char is_period;                                        //是否周期循环4 w5 \4 b: a, [, N/ Y1 R7 p
        unsigned short int time_out;        //定时时间,单位ms
9 Q9 u, q  I. T2 ~        unsigned short int count;                //定时计数用2 y8 S/ k/ K+ k. C. l) O" _+ N  @
}
1 X0 P! K/ [/ V7 z9 ?& {MY_TIMER;
& m" G/ x% J, W' g! E0 M8 i6 ?+ r" M4 Q3 b9 k
pFun callback[MY_TIMER_MAX] = {NULL};                        //定时器回调函数数组  K2 A$ d7 ]& H4 S) b7 s5 u
MY_TIMER myTimerList[MY_TIMER_MAX] = {0};                //定时器结构数组
, l# R) o- t6 N. ~4 Y2 H9 Dint gMyTimerMessage[MY_TIMER_MAX] = {0};                //定时器消息数组) C$ |0 t3 A( A: @

" K+ h' f0 n4 wsbit LED1=P1^0;' s( v3 n* Z/ S2 [& ^3 S
sbit LED2=P1^1;
2 H9 K4 i- o7 \  t! rsbit LED3=P1^2;
. Y, [" s& L2 W- r6 {sbit LED4=P1^3;
& s  e1 _: w" Q5 N8 `& R9 [, e! ^- _- J
+ c9 X+ m6 @4 X; z, ]" `! i# i#define ALL_ON {LED1=0;LED2=0;LED3=0;LED4=0;}        //灯全开9 A( B0 }# i+ c% H
) e6 X$ b7 p/ O
//创建定时器,简化版本。
) ^8 M! A: N6 j& R# X0 r' M$ [0 v# dint CreatTimer(int index,unsigned short int time_out,char is_period,pFun callbackFun)2 z6 \* v  \% [0 Q4 |: h
{! ]% q% b8 @1 ^2 z5 M2 ^0 K
        if(index >= MY_TIMER_MAX) return -1;$ H5 e; ?9 v) n/ D
        myTimerList[index].on = 1;
8 o! ?8 y' g  V4 o        myTimerList[index].is_period = is_period;* y8 l# t( q7 T) d) F1 `* s
        myTimerList[index].time_out = time_out;
: f& c1 ]2 K* I- h8 _( }        myTimerList[index].count = 0;
0 W. u6 s8 Q# O! _4 z" ]        callback[index] = callbackFun;
( L/ j- h! C7 C3 }2 d3 k4 g! P        return index;
% f; E7 ?' F/ t9 r1 |}: e5 ]* g) V* ~5 m

' B& R- b" a% P" v. S. A5 q//四个LED控制函数,on初始是0,第一次调用on变为1,是关灯。" a) K0 @; N: a0 J
void led_1_ctrl(void)2 a- D5 m- f0 Z; I
{& z! q7 W& R( t3 A8 ?5 o! i$ e
        static char on = 0;; L' z: U( U3 d" |9 A
        on = !on;
1 ?& _6 ~* K9 j/ x  q+ h        LED1 = on;- C1 J5 k: B! |- J% h
}
$ u& a6 O) D) i. v6 Jvoid led_2_ctrl(void)  i) j' A$ R' z
{
1 w# m" L2 h% F4 {+ V' r9 J8 P( o        static char on = 0;
' l+ i3 r+ ^; U$ q  _+ ~0 Z7 X        on = !on;1 `9 z4 o- M6 c7 M
        LED2 = on;2 e( f$ I. h6 D
}1 H% i& [  l9 f: J5 @( W* [
void led_3_ctrl(void)8 x; w) y; l, O+ M' l; v! B) P
{4 H9 |' i  U# N2 H  G( D
        static char on = 0;6 e7 d: x9 ~) M" h7 K
        on = !on;% Q) {0 ^% }  I
        LED3 = on;/ e  H2 h) m0 E9 F
}9 `# W6 g. b. k2 d7 r* F4 ^
void led_4_ctrl(void)9 J( d! u) G( a! _) c
{
! o  D4 ~0 _) }, p        static char on = 0;  h, Z- y. a1 w1 _" ?
        on = !on;
. x$ E( Z8 a5 E' l- `6 Z) L        LED4 = on;
! D- {/ U& c. [9 P}
* v: u/ _8 b2 ~4 ~& `% v
3 I7 T& W& Z% r, [void Init_Timer0(void)        //初始化定时器0
5 H; M7 i8 {9 B0 ?0 S( K) f9 S2 Y{; S& g( K! @* M% j+ s
        TMOD=0x01;                                //定时器0,使用模式1,16位定时器7 _2 N) o6 C( a9 r. o4 S
        TH0=(65536-1000)/256;        //给定初值6 C8 F6 a5 `. Y# O
        TL0=(65536-1000)%256;
3 V: x' a5 E( g* e9 @& l        EA=1;                //打开总中断8 y$ a) t, r4 e
        ET0=1;        //打开定时器中断) d+ f' ^+ J: i" ]& h
        TR0=1;        //开定时器5 Q$ ^% g1 T! ^9 \
}
( G6 b" P! z# x
( H+ c7 k8 W' o9 b  Fvoid main()        //主函数
- o3 `9 p5 r6 F) P9 J2 H. \{$ T: ?% j" O% |2 J% G
        unsigned int i;1 h9 K9 |, L5 \: l1 A
6 u8 v8 ?$ a. e  J4 N/ a; o; e. m
        ALL_ON;
- O% Y+ e8 O# I- U* v+ `        CreatTimer(0,250,1,led_1_ctrl);
# v8 @' P& g; J3 ]        CreatTimer(1,500,1,led_2_ctrl);
3 b; E9 i9 Z* U/ u6 j. k/ O" Y0 q        CreatTimer(2,1000,1,led_3_ctrl);
; X+ T4 x& l: w, K( g4 N# B5 v        CreatTimer(3,2000,1,led_4_ctrl);8 n* V- l2 W1 I0 V& T
! o4 n6 o" |' A2 \# Z6 _" [$ @) R
        Init_Timer0();//初始化定时器0
7 q& L) k! q; q8 Z        while(1). X; p2 d1 }; W/ H- O
        {0 s" N  F" v  c
                for(i = 0; i<MY_TIMER_MAX; ++i)" {& V* J9 q$ @( w
                {  B0 _2 h2 D0 H4 `9 {  c. S
                        if(gMyTimerMessage)                //定时器消息来到,启动。- L' G! Z: \1 E9 f0 Z  `$ e
                        {! ^+ T0 e. L+ v3 [
                                gMyTimerMessage = 0;                //消息清除! |" \  Z$ @! S1 _
                                if(callback != NULL)
+ q  u* h3 Z4 D5 z                                {
8 u- u9 n4 @% ~( c" X4 D7 r                                        (*callback)();                //调用回调函数
; f% ~; z" ]  s( O7 i, V# |3 @7 i                                }                                7 `- M% ?& F- P" O" X
                        }, P' V& F; ~  a' M# ~# d
                }2 h) |% L, Q. j* ~; @! z7 E
        }
5 L" U2 h% N; I}4 ]3 K& K# q) \2 a* f
) [+ `4 M! D( e1 Z0 }
//定时器中断函数,1ms 定时。
1 \. O) T# ^' b5 ~6 Ivoid Timer0_isr(void) interrupt 1
! n+ D7 ]- D- i- ]: U1 p/ l{& z- b$ `$ p% C. w8 b) V
        unsigned int i = 0;! z0 u) O- F1 V! y
3 A6 w8 T8 \2 M; K/ x9 z

* l9 z0 B2 V! ?; ]) \' [3 _        TH0=(65536-1000)/256;//重新赋值 1ms' v2 \% P. \: H* W
        TL0=(65536-1000)%256;
9 \! C7 e0 J- I& q+ Y5 C& g# L5 ?) d; c# s# z8 t8 o
        EA = 0;
' V: e6 F" \0 w# K5 d        for(i = 0; i<MY_TIMER_MAX; ++i)
/ G# K. p8 y+ q7 u) M        {5 e9 ~* }6 x' S* B( ~. u
                if(myTimerList.on)
) U; q: Y+ ~( a7 J% J                {
0 x3 D; r+ G$ x/ g  l& ~                        ++(myTimerList.count);                                                                //计数9 c2 E! L/ l' f% _6 v3 @5 ]$ p
                        if(myTimerList.count >= myTimerList.time_out)                //定时到
! s' m, d4 m5 o( z: Z& p4 q" Y                        {4 f' f2 T$ Z' X( d1 z6 Q
                                gMyTimerMessage = 1;                                                                //发消息
0 [# Y$ {2 J2 K; _                                if(myTimerList.is_period)                                                //是否周期循环& G9 R8 r) r) r3 J  g; a
                                {6 y9 @1 q# f7 Y& s8 r
                                        myTimerList.count = 0;                                                //计数重置( n3 A( `$ z7 o5 B
                                }
9 ^" o& F' H( \6 t5 ]( H. ~
- b9 [2 G6 A( a" C3 t4 }" A9 E9 k
! k5 C- Y0 `$ Q( V7 P' i& s; U) R$ u5 p
…………限于本文篇幅 余下代码请从论坛下载附件…………4 d, c; i" A- j0 ^
下载:
" ^" {2 W, l* E0 K
游客,如果您要查看本帖隐藏内容请回复

3 w( s! |6 h$ \4 ?! u. s# p

: v& o. `" q8 U  |
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-24 16:03 , Processed in 0.140625 second(s), 26 queries , Gzip On.

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

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

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