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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
单片机定时器T0被四次调用,控制led灯6 \1 q& i8 K9 B" y" G8 S

# l1 U1 x# H9 `( z6 V( G' y

* ]6 M8 y* P; g8 h/ i5 p, O3 K定时器T0被四次调用,控制led灯/ i$ z# K' r" ]0 c

; c& u- `2 s7 G$ F; r: _0 D#include<reg52.h>                //头文件' r2 ?0 M7 B& J/ @/ O
#define MY_TIMER_MAX        (4)                //最多四个定时器  `- H+ L! l/ q) ]- y# y" R' U
#define NULL (0)
+ J+ T3 e$ Z% i, V7 M) h* [, r8 n2 w
0 u% k  q5 D# i0 T8 |2 I7 }; btypedef void (*pFun)(void);                //callback 函数指针类型  x. I9 `, T" Q7 \0 e  I
typedef struct myTimer
% W: u3 O/ n! a{; F0 T* l9 x8 d# @
        char on;                                                //开关0 A: i* s1 Y! j1 z& k
        char is_period;                                        //是否周期循环# j( T4 s! t5 _2 U
        unsigned short int time_out;        //定时时间,单位ms* ]# b9 L& b) y# H+ J* {0 e1 l
        unsigned short int count;                //定时计数用" O* l: P  o5 B1 Q, K) u9 _4 O
}- n  `" m, O3 E( s  b
MY_TIMER;
3 {  f! \7 ^: s3 m; Y/ g' j4 w5 c7 p% r
pFun callback[MY_TIMER_MAX] = {NULL};                        //定时器回调函数数组  t9 G% I6 D6 P6 i, G* t
MY_TIMER myTimerList[MY_TIMER_MAX] = {0};                //定时器结构数组
! S4 Z7 y1 {6 j5 n8 h, ^9 r2 v# \int gMyTimerMessage[MY_TIMER_MAX] = {0};                //定时器消息数组8 x# t0 |$ q7 B6 e: w* y3 @

; ]  h, Q' Q" ~: i7 ^  Dsbit LED1=P1^0;
8 ^: I4 U6 g4 W8 Vsbit LED2=P1^1;
! K' v6 P- [5 e, C' \7 Rsbit LED3=P1^2;
- b" {3 a( j/ E; Hsbit LED4=P1^3;
$ N8 T/ R; {: ]% C2 |
7 ?( [% H! Q$ F, h6 o& M#define ALL_ON {LED1=0;LED2=0;LED3=0;LED4=0;}        //灯全开
3 n6 L8 Z0 L: Z% n" L* Y' k) V3 I! n- G7 C& u
//创建定时器,简化版本。/ F% [8 `7 }$ ?7 A
int CreatTimer(int index,unsigned short int time_out,char is_period,pFun callbackFun)
2 x3 H5 r8 L1 E- ~& H' w{
& s7 M. t( h; W  }        if(index >= MY_TIMER_MAX) return -1;5 L& i9 ~, U) b0 D" \  H, z
        myTimerList[index].on = 1;
  L! E6 }0 N' j0 V% v' Z+ r# L        myTimerList[index].is_period = is_period;& r9 V8 ]$ b; Z2 W  ?5 Z5 Y3 H
        myTimerList[index].time_out = time_out;1 G5 i; x5 n% v  F
        myTimerList[index].count = 0;
  q9 m+ Y( r5 `3 ]1 h2 U        callback[index] = callbackFun;, D3 M; o, c! Q0 P
        return index;
( s$ d9 g3 Y- R% T$ `! o) q  b  w}
& Q( P+ J1 F, ]8 o# v
  `, k: S: I& y* F# c//四个LED控制函数,on初始是0,第一次调用on变为1,是关灯。
  z' f# y9 ^& H0 }9 `void led_1_ctrl(void): |. u, N( }! R7 N. N8 \0 z1 i
{% ]. O# c3 o+ c' ?/ `' c& A
        static char on = 0;
/ ^4 i: ]$ X3 }0 K) y        on = !on;! s4 t. C1 s+ p6 I- s
        LED1 = on;9 R" i1 T( F; ?
}1 Z( G2 U- K( i6 [+ S
void led_2_ctrl(void)
; t: h# K$ `. m' v{1 w( t: e* V& J6 I  [" J
        static char on = 0;
  o* T* J% V1 ~% e        on = !on;
: E, w3 j$ i6 ~) p: j        LED2 = on;
/ E5 |$ T/ }  j, L}
6 n% j" s" s4 Uvoid led_3_ctrl(void)
5 F" ]8 N! J  K+ j. T$ n{. n9 V9 @8 [  B' j, D( }3 m# G
        static char on = 0;4 g/ N0 K: w2 g
        on = !on;
  b" C. _- s( X+ a1 ]5 E        LED3 = on;) l( e" F" \0 F4 w4 [
}7 d$ w, _9 r1 H& n0 s
void led_4_ctrl(void)
$ ?) w8 B6 v. f" S# a3 [$ e4 U2 l{
$ f2 x0 H$ _. @  r" ~1 ?9 W        static char on = 0;
' _* |- v" v# J/ K7 y        on = !on;: r+ u/ P' }5 b( ]& g- D
        LED4 = on;
4 ?, f6 O) G- c4 }}* V9 w4 n! d) m$ |+ H& y4 _# ]
2 t) o, _9 [7 C8 h( z+ J! {6 g
void Init_Timer0(void)        //初始化定时器0- ^# \5 D9 X4 \" w
{( b% b) `0 Z- [% a8 Y; R. q
        TMOD=0x01;                                //定时器0,使用模式1,16位定时器8 H3 d, K, V: I8 J0 ?9 v
        TH0=(65536-1000)/256;        //给定初值# G2 m& k# {. X2 t1 f5 P0 S3 \
        TL0=(65536-1000)%256;
! _, M4 \! h5 z" C+ q+ B, v        EA=1;                //打开总中断' n* G$ o( L) T( m6 _/ _+ `8 v( c
        ET0=1;        //打开定时器中断
) b1 r5 W# Z8 N& l( F        TR0=1;        //开定时器
) o; _& M4 q, v+ q}
8 L( ?* w: V1 Q4 g+ r1 K
# B' {; h. H8 I# J# _. Qvoid main()        //主函数8 Z6 c5 s8 {$ h/ M4 ^, r
{
( b& p+ j, v8 k        unsigned int i;( P4 b! Y0 q5 n3 f0 R8 U
: ^6 L; v( |: g
        ALL_ON;
# w0 c$ v; N3 p( g; \        CreatTimer(0,250,1,led_1_ctrl);- W3 h/ b1 e7 W% T1 u. y+ k/ S) M
        CreatTimer(1,500,1,led_2_ctrl);
' N) Q# {( B2 J) g. w8 v        CreatTimer(2,1000,1,led_3_ctrl);/ o, X0 U: p& v5 e  ^% {
        CreatTimer(3,2000,1,led_4_ctrl);
+ Q3 h6 y9 ~9 |! G) g3 c0 `+ @6 x# f& E* q' G2 F- r9 v3 \. F
        Init_Timer0();//初始化定时器0
; y* p2 Z1 A) O0 a5 Y        while(1)
  K: {0 T: U- K  k" |, r! a4 B4 v        {4 ]$ d  O' W5 o9 Q. H: i1 S6 [
                for(i = 0; i<MY_TIMER_MAX; ++i)* m- t# y8 z  ?
                {
) s; r0 z* v3 r# Q( R- I% F                        if(gMyTimerMessage)                //定时器消息来到,启动。$ y: n' `( a7 h  ]
                        {
+ J8 ?, G2 u: l( q                                gMyTimerMessage = 0;                //消息清除
# O' T" c' M1 [                                if(callback != NULL)
- |! [, c( M/ X2 b                                {# G" j* N8 }; T8 O' D5 M
                                        (*callback)();                //调用回调函数" D, R2 @/ x  U; o6 C1 i. r( y
                                }                                $ Q1 q7 O: q$ `3 w: g4 F. C! k
                        }/ A: A4 K# C3 J- T( X- D
                }
: K+ _- H$ y5 @5 P9 Y& }# T: s1 d' y        }
8 ^5 P( s2 a9 _3 ~}
4 p( [3 |8 n; @1 k/ |  Y/ l! T4 j2 @( L/ B  o
//定时器中断函数,1ms 定时。
5 G+ g$ o1 C' m8 m( B* Ivoid Timer0_isr(void) interrupt 17 D/ h7 r6 D6 a$ c0 R
{
' D1 i2 Q2 S6 Q7 K' h        unsigned int i = 0;0 E- ?& t+ t( c; f4 J$ N9 C; K
/ u& h5 z4 X$ R' j8 ]4 Y) t- t

) u- i1 t' x* L9 h. h& ^1 t+ Q2 y, U. m        TH0=(65536-1000)/256;//重新赋值 1ms
) T  V( S; t1 L        TL0=(65536-1000)%256;- N  O- o# G6 Q% l

1 _; ]% u1 V1 u# j' T! _        EA = 0;
* B0 Z6 T+ Q. j! ^        for(i = 0; i<MY_TIMER_MAX; ++i)
' _) B( Z/ P& G# {8 c0 C        {9 \7 I- \/ {6 \5 L; ?* U& ^# u
                if(myTimerList.on)* e( S- B2 f0 \% P% a8 a5 _
                {3 {2 e( y) j# w' r9 h1 q
                        ++(myTimerList.count);                                                                //计数
& I8 {7 \: N% ^4 C6 N$ f                        if(myTimerList.count >= myTimerList.time_out)                //定时到9 L% ~# f6 L  B. H3 x
                        {  Z% K9 t9 T6 H
                                gMyTimerMessage = 1;                                                                //发消息
! d) }. B1 N# B7 ]5 J1 S+ c                                if(myTimerList.is_period)                                                //是否周期循环
5 n( _" s# O# {) {/ G7 w                                {( _$ c. u3 _* B: M+ |( N7 o
                                        myTimerList.count = 0;                                                //计数重置
! d: X' _) q& E5 z% V4 N& [                                }
. W( e; Z2 b0 q9 a
2 x: h  D+ p2 E4 C9 u4 k% u! B! p, b8 T
: U% k. ], [; k  u
…………限于本文篇幅 余下代码请从论坛下载附件…………$ l% [/ v, ?+ T: s* @  J- Q* {
下载:5 O1 d, k# [) M3 G2 x6 O. k. b) }
游客,如果您要查看本帖隐藏内容请回复
* I. w/ y4 }5 l$ ~' B3 a+ s# e, T
/ [. r/ s; m6 y; ]1 _9 K. m1 h
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-8 23:35 , Processed in 0.078125 second(s), 26 queries , Gzip On.

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

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

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