程序转载自51hei,经过自己的实际验证,多了一种编程的思路技能,回调函数的基本思想也是基于事件机制的,哪个事件来了, 就执行哪个事件。

程序中,最多四个子定时器,说明51的处理速度是不够的,在中断中添加过多的代码会定时不准确。自己实验了5个,第五个想要定时4秒,实际差不多有5秒了,因此中断里面是代码越少越好~~

  1 #include<reg52.h>        //头文件
  2 #define MY_TIMER_MAX    (4)        //最多四个定时器
  3 #define NULL (0)
  4
  5 typedef void (*pFun)(void);        //callback 函数指针类型
  6 typedef struct myTimer
  7 {
  8     char on;                        //开关
  9     char is_period;                    //是否周期循环
 10     unsigned int time_out;    //定时时间,单位ms
 11     unsigned int count;        //定时计数用
 12 }
 13 MY_TIMER;
 14
 15 pFun callback[MY_TIMER_MAX] = {NULL};            //定时器回调函数数组
 16 MY_TIMER myTimerList[MY_TIMER_MAX] = {0};        //定时器结构数组
 17 int gMyTimerMessage[MY_TIMER_MAX] = {0};        //定时器消息数组
 18
 19 sbit LED1=P2^0;
 20 sbit LED2=P2^1;
 21 sbit LED3=P2^2;
 22 sbit LED4=P2^3;
 23 sbit LED5=P2^4;
 24
 25 #define ALL_ON {LED1=0;LED2=0;LED3=0;LED4=0;LED5=0;}    //灯全开
 26
 27 //创建定时器,简化版本。
 28 int CreatTimer(int index,unsigned short int time_out,char is_period,pFun callbackFun)
 29 {
 30     if(index >= MY_TIMER_MAX) return -1;
 31     myTimerList[index].on = 1;
 32     myTimerList[index].is_period = is_period;
 33     myTimerList[index].time_out = time_out;
 34     myTimerList[index].count = 0;
 35     callback[index] = callbackFun;
 36     return index;
 37 }
 38
 39 //四个LED控制函数,on初始是0,第一次调用on变为1,是关灯。
 40 void led_1_ctrl(void)
 41 {
 42     static char on = 0;
 43     on = !on;
 44     LED1 = on;
 45 }
 46 void led_2_ctrl(void)
 47 {
 48     static char on = 0;
 49     on = !on;
 50     LED2 = on;
 51 }
 52 void led_3_ctrl(void)
 53 {
 54     static char on = 0;
 55     on = !on;
 56     LED3 = on;
 57 }
 58 void led_4_ctrl(void)
 59 {
 60     static char on = 0;
 61     on = !on;
 62     LED4 = on;
 63 }
 64
 65 void led_5_ctrl(void)
 66 {
 67     static char on = 0;
 68     on = !on;
 69     LED5 = on;
 70 }
 71
 72 void Init_Timer0(void)    //初始化定时器0
 73 {
 74     TMOD=0x01;                //定时器0,使用模式1,16位定时器
 75     TH0=(65536-1000)/256;    //给定初值
 76     TL0=(65536-1000)%256;
 77     EA=1;        //打开总中断
 78     ET0=1;        //打开定时器中断
 79     TR0=1;        //开定时器
 80 }
 81
 82 void main(void)    //主函数
 83 {
 84     unsigned int i;
 85
 86     ALL_ON;
 87
 88     CreatTimer(0,250,1,led_1_ctrl);
 89     CreatTimer(1,500,1,led_2_ctrl);
 90     CreatTimer(2,1000,1,led_3_ctrl);
 91     CreatTimer(3,2000,1,led_4_ctrl);
 92     //CreatTimer(4,4000,1,led_5_ctrl);
 93
 94     Init_Timer0();    //初始化定时器0
 95     while(1)
 96     {
 97         for(i = 0; i<MY_TIMER_MAX; ++i)
 98         {
 99             if(gMyTimerMessage[i])            //定时器消息来到,启动。
100             {
101                 gMyTimerMessage[i] = 0;        //消息清除
102                 if(callback[i] != NULL)
103                 {
104                     (*callback[i])();        //调用回调函数
105                 }
106             }
107         }
108     }
109 }
110
111 //定时器中断函数,1ms 定时。
112 void Timer0_isr(void) interrupt 1
113 {
114     unsigned int i = 0;
115
116
117     TH0=(65536-1000)/256;//重新赋值 1ms
118     TL0=(65536-1000)%256;
119
120     EA = 0;
121     for(i = 0; i<MY_TIMER_MAX; ++i)
122     {
123         if(myTimerList[i].on)        //如果定时开启
124         {
125             ++(myTimerList[i].count);                                //计数++
126             if(myTimerList[i].count >= myTimerList[i].time_out)        //定时到
127             {
128                 gMyTimerMessage[i] = 1;                                //发消息,在main函数中会用到
129                 if(myTimerList[i].is_period)                        //是否周期循环
130                 {
131                     myTimerList[i].count = 0;                        //计数重置
132                 }
133                 else
134                 {
135                     myTimerList[i].on = 0;                            //关掉定时器
136                 }
137             }
138         }
139     }
140     EA = 1;
141 }

转载于:https://www.cnblogs.com/CodeWorkerLiMing/p/10742313.html

51定时器控制4各led,使用回调函数机制相关推荐

  1. 三档按键定时器c语言程序,单片机C语言程序设计:定时器控制4个LED滚动闪烁

    /*  名称:定时器控制 4 个 LED 滚动闪烁 说明:4 只 LED 在定时器控制下滚动闪烁. */ #include #define uchar unsigned char #define ui ...

  2. c语言控制led闪烁次数,单片机C语言程序设计之定时器控制4个LED滚动闪烁

    描述 通过单片机课程设计,熟练掌握C语言的编程方法,将理论联系到实践中去,提高我们的动脑和动手的能力.通过定时器控制4只LED滚动闪烁系统的设计,掌握定时/计数器的使用方法,和简单程序的编写,最终提高 ...

  3. Android回调函数机制那点事

    引言 在Android的学习过程中经常会听到或者见到"回调"这个词,那么什么是回调呢?所谓的回调函数就是:在A类中定义了一个方法,这个方法中用到了一个接口和该接口中的抽象方法,但是 ...

  4. 一、51单片机控制LED 灯

    1.目标分析 通过51单片机控制8个LED灯依次点亮,形成流水灯. 2.原理图分析 2.1. 74HC573芯片 (1) LED控制涉及到74HC573芯片,上图中的U13.想知道该芯片如何工作的,应 ...

  5. JavaScript高级day01-PM【对象、函数、回调函数、IIFE、this、关于语句分号问题、webstorm代码模板、复习】

    笔记.视频.源码:JavaScript(基础.高级)笔记汇总表[尚硅谷JavaScript全套教程完整版] 目   录 P7 07.尚硅谷_JS高级_对象 23:30 1. 什么是对象? 2. 为什么 ...

  6. C++回调函数用法(zz)

    一.回调函数 我们经常在C++设计时通过使用回调函数可以使有些应用(如定时器事件回调处理.用回调函数记录某操作进度等)变得非常方便和符合逻辑,那么它的内在机制如何呢,怎么定义呢?它和其它函数(比如钩子 ...

  7. VC回调函数定义和使用

    最近经常使用回调函数,有时感觉有点混乱,对回调函数理解不透,昨天花点时间深深品味了一下回调函数,写下博客记录一下,言规正转,VC中的定时器是一种特殊的回调函数,只要我们设置好了定时器,我们就不用管什么 ...

  8. C++回调函数用法(zt)

    一回调函数 我们经常在C++设计时通过使用回调函数可以使有些应用(如定时器事件回调处理.用回调函数记录某操作进度等)变得非常方便和符合逻辑,那么它的内在机制如何呢,怎么定义呢?它和其它函数(比如钩子函 ...

  9. 彻彻底底了解回调函数

    什么是回调函数? 一,回调函数 我们经常在C 设计时通过使用回调函数可以使有些应用(如定时器事件回调处理.用回调函数记录某操作进度等)变得非常方便和符合逻辑,那么它的内在机制如何呢,怎么定义呢?它和其 ...

最新文章

  1. NR 5G NG-AP(NG接口)介绍
  2. 一文读懂GAN, pix2pix, CycleGAN和pix2pixHD
  3. 退出Activity(转)
  4. oracle中dbms_DBMS中的功能依赖性和属性关闭
  5. 【Linux】crontab定时任务配置全过程
  6. python好用的第三方库_非常有用的 Python 第三方库
  7. Spring—使用类加载从配置文件中读取配置
  8. 使用MariaDB后端在Ubuntu 18.04 / Debian 9上安装PowerDNS和PowerDNS-Admin
  9. VB 创建快捷方式函数(可带参数)
  10. 怎样理解和识别 Linux 中的文件类型
  11. 软件构造笔记——Java基本数据类型和对象数据类型
  12. Python编程--目标IP地址段主机指定端口状态扫描
  13. Opengl 之 窗口初体验 ------ By YDD的铁皮锅
  14. 非服务器模式下运行getImageData函数出现 the operation is insecure
  15. 麒麟Linux启动目录,Ubuntu Kylin优麒麟文件管理器篇:介绍,类别,结构,文件系统目录,使用...
  16. 从-Quora-的-187-个问题中学习机器学习和NLP
  17. jQuery UI Dialog
  18. 第一章 阿里大数据产品体系
  19. COMSOL中场路耦合(电路接口与电磁场接口)
  20. 【Spire.Doc】合并 Word 文档,将多个文档合并为一个

热门文章

  1. 关于MySQL count(distinct) 逻辑的另一个bug_
  2. CCNA考试的一点体会
  3. HTML5中figure标签使用实例
  4. 程序员基本功书籍--程序员修炼之道——从小工到专家
  5. CC++面试题大汇总
  6. 常考数据结构与算法:进制转换
  7. org.apache.ibatis.binding.BindingException原因总结
  8. oracle schema
  9. TiDB之mac上搭建及调试技巧
  10. 盘点六大在中国复制失败的O2O案例