51定时器控制4各led,使用回调函数机制
程序转载自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,使用回调函数机制相关推荐
- 三档按键定时器c语言程序,单片机C语言程序设计:定时器控制4个LED滚动闪烁
/* 名称:定时器控制 4 个 LED 滚动闪烁 说明:4 只 LED 在定时器控制下滚动闪烁. */ #include #define uchar unsigned char #define ui ...
- c语言控制led闪烁次数,单片机C语言程序设计之定时器控制4个LED滚动闪烁
描述 通过单片机课程设计,熟练掌握C语言的编程方法,将理论联系到实践中去,提高我们的动脑和动手的能力.通过定时器控制4只LED滚动闪烁系统的设计,掌握定时/计数器的使用方法,和简单程序的编写,最终提高 ...
- Android回调函数机制那点事
引言 在Android的学习过程中经常会听到或者见到"回调"这个词,那么什么是回调呢?所谓的回调函数就是:在A类中定义了一个方法,这个方法中用到了一个接口和该接口中的抽象方法,但是 ...
- 一、51单片机控制LED 灯
1.目标分析 通过51单片机控制8个LED灯依次点亮,形成流水灯. 2.原理图分析 2.1. 74HC573芯片 (1) LED控制涉及到74HC573芯片,上图中的U13.想知道该芯片如何工作的,应 ...
- JavaScript高级day01-PM【对象、函数、回调函数、IIFE、this、关于语句分号问题、webstorm代码模板、复习】
笔记.视频.源码:JavaScript(基础.高级)笔记汇总表[尚硅谷JavaScript全套教程完整版] 目 录 P7 07.尚硅谷_JS高级_对象 23:30 1. 什么是对象? 2. 为什么 ...
- C++回调函数用法(zz)
一.回调函数 我们经常在C++设计时通过使用回调函数可以使有些应用(如定时器事件回调处理.用回调函数记录某操作进度等)变得非常方便和符合逻辑,那么它的内在机制如何呢,怎么定义呢?它和其它函数(比如钩子 ...
- VC回调函数定义和使用
最近经常使用回调函数,有时感觉有点混乱,对回调函数理解不透,昨天花点时间深深品味了一下回调函数,写下博客记录一下,言规正转,VC中的定时器是一种特殊的回调函数,只要我们设置好了定时器,我们就不用管什么 ...
- C++回调函数用法(zt)
一回调函数 我们经常在C++设计时通过使用回调函数可以使有些应用(如定时器事件回调处理.用回调函数记录某操作进度等)变得非常方便和符合逻辑,那么它的内在机制如何呢,怎么定义呢?它和其它函数(比如钩子函 ...
- 彻彻底底了解回调函数
什么是回调函数? 一,回调函数 我们经常在C 设计时通过使用回调函数可以使有些应用(如定时器事件回调处理.用回调函数记录某操作进度等)变得非常方便和符合逻辑,那么它的内在机制如何呢,怎么定义呢?它和其 ...
最新文章
- NR 5G NG-AP(NG接口)介绍
- 一文读懂GAN, pix2pix, CycleGAN和pix2pixHD
- 退出Activity(转)
- oracle中dbms_DBMS中的功能依赖性和属性关闭
- 【Linux】crontab定时任务配置全过程
- python好用的第三方库_非常有用的 Python 第三方库
- Spring—使用类加载从配置文件中读取配置
- 使用MariaDB后端在Ubuntu 18.04 / Debian 9上安装PowerDNS和PowerDNS-Admin
- VB 创建快捷方式函数(可带参数)
- 怎样理解和识别 Linux 中的文件类型
- 软件构造笔记——Java基本数据类型和对象数据类型
- Python编程--目标IP地址段主机指定端口状态扫描
- Opengl 之 窗口初体验 ------ By YDD的铁皮锅
- 非服务器模式下运行getImageData函数出现 the operation is insecure
- 麒麟Linux启动目录,Ubuntu Kylin优麒麟文件管理器篇:介绍,类别,结构,文件系统目录,使用...
- 从-Quora-的-187-个问题中学习机器学习和NLP
- jQuery UI Dialog
- 第一章 阿里大数据产品体系
- COMSOL中场路耦合(电路接口与电磁场接口)
- 【Spire.Doc】合并 Word 文档,将多个文档合并为一个