51定时器控制4各led,使用回调函数机制
程序转载自51hei,经过自己的实际验证,多了一种编程的思路技能,回调函数的基本思想也是基于事件机制的,哪个事件来了, 就执行哪个事件。
程序中,最多四个子定时器,说明51的处理速度是不够的,在中断中添加过多的代码会定时不准确。自己实验了5个,第五个想要定时4秒,实际差不多有5秒了,因此中断里面是代码越少越好~~
#include<reg52.h> //头文件
#define MY_TIMER_MAX (4) //最多四个定时器
#define NULL (0) typedef void (*pFun)(void); //callback 函数指针类型
typedef struct myTimer
{
char on; //开关
char is_period; //是否周期循环
unsigned int time_out; //定时时间,单位ms
unsigned int count; //定时计数用
}
MY_TIMER; pFun callback[MY_TIMER_MAX] = {NULL}; //定时器回调函数数组
MY_TIMER myTimerList[MY_TIMER_MAX] = {}; //定时器结构数组
int gMyTimerMessage[MY_TIMER_MAX] = {}; //定时器消息数组 sbit LED1=P2^;
sbit LED2=P2^;
sbit LED3=P2^;
sbit LED4=P2^;
sbit LED5=P2^; #define ALL_ON {LED1=0;LED2=0;LED3=0;LED4=0;LED5=0;} //灯全开 //创建定时器,简化版本。
int CreatTimer(int index,unsigned short int time_out,char is_period,pFun callbackFun)
{
if(index >= MY_TIMER_MAX) return -;
myTimerList[index].on = ;
myTimerList[index].is_period = is_period;
myTimerList[index].time_out = time_out;
myTimerList[index].count = ;
callback[index] = callbackFun;
return index;
} //四个LED控制函数,on初始是0,第一次调用on变为1,是关灯。
void led_1_ctrl(void)
{
static char on = ;
on = !on;
LED1 = on;
}
void led_2_ctrl(void)
{
static char on = ;
on = !on;
LED2 = on;
}
void led_3_ctrl(void)
{
static char on = ;
on = !on;
LED3 = on;
}
void led_4_ctrl(void)
{
static char on = ;
on = !on;
LED4 = on;
} void led_5_ctrl(void)
{
static char on = ;
on = !on;
LED5 = on;
} void Init_Timer0(void) //初始化定时器0
{
TMOD=0x01; //定时器0,使用模式1,16位定时器
TH0=(-)/; //给定初值
TL0=(-)%;
EA=; //打开总中断
ET0=; //打开定时器中断
TR0=; //开定时器
} void main(void) //主函数
{
unsigned int i; ALL_ON; CreatTimer(,,,led_1_ctrl);
CreatTimer(,,,led_2_ctrl);
CreatTimer(,,,led_3_ctrl);
CreatTimer(,,,led_4_ctrl);
//CreatTimer(4,4000,1,led_5_ctrl); Init_Timer0(); //初始化定时器0
while()
{
for(i = ; i<MY_TIMER_MAX; ++i)
{
if(gMyTimerMessage[i]) //定时器消息来到,启动。
{
gMyTimerMessage[i] = ; //消息清除
if(callback[i] != NULL)
{
(*callback[i])(); //调用回调函数
}
}
}
}
} //定时器中断函数,1ms 定时。
void Timer0_isr(void) interrupt
{
unsigned int i = ; TH0=(-)/;//重新赋值 1ms
TL0=(-)%; EA = ;
for(i = ; i<MY_TIMER_MAX; ++i)
{
if(myTimerList[i].on) //如果定时开启
{
++(myTimerList[i].count); //计数++
if(myTimerList[i].count >= myTimerList[i].time_out) //定时到
{
gMyTimerMessage[i] = ; //发消息,在main函数中会用到
if(myTimerList[i].is_period) //是否周期循环
{
myTimerList[i].count = ; //计数重置
}
else
{
myTimerList[i].on = ; //关掉定时器
}
}
}
}
EA = ;
}
51定时器控制4各led,使用回调函数机制的更多相关文章
- 定时器控制单只LED灯
点击查看代码 #include <reg51.h> #define uchar unsigned char #define uint unsigned int sbit LED=P0^0; ...
- android中回调函数机制完全解析
1.在要调用的业务操作中,创建一个接口,在接口中创建方法,这个方法表示的是我们原先要在业务类中执行的操作 public interface BackUpSmsListener { /** * 设置总进 ...
- 浅谈js回调函数
回调函数原理: 我现在出发,到了通知你”这是一个异步的流程,“我出发”这个过程中(函数执行),“你”可以去做任何事,“到了”(函数执行完毕)“通知你”(回调)进行之后的流程 例子 1.基本方法 ? 1 ...
- js中的回调函数 和promise解决异步操作中的回调地狱问题。
回调函数 : 函数作为参数传递到另外一个函数中.简单数据类型和引入数据类型中的数组和对象作为参数传递大家肯定都不陌生,其实引用数据类型中的函数也是可以的. 事实上大家见到的很多,用到的也很多,比如jQ ...
- C++ 回调函数的定义与用法
一回调函数 我们经常在C++设计时通过使用回调函数可以使有些应用(如定时器事件回调处理.用回调函数记录某操作进度等)变得非常方便和符合逻辑,那么它的内在机制如何呢,怎么定义呢?它和其它函数(比如钩子函 ...
- C++回调函数的应用<转自:http://blog.csdn.net/wubin1124/article/details/4386269>
一回调函数 我们经常在C++设计时通过使用回调函数可以使有些应用(如定时器事件回调处理.用回调函数记录某操作进度等)变得非常方便和符合逻辑,那么它的内在机制如何呢,怎么定义呢?它和其它函数(比如钩子函 ...
- JS之回调函数(callback)
1.什么是回调函数? -- 简单点说,一个函数被作为参数传递给另一个函数(在这里我们把另一个函数叫做"otherFunction"),回调函数在otherFunction中被调用. ...
- 回调函数的原理及PHP实例
背景:在最近的一个开发项目中,用户要先调用服务才能开始进行一系列的查询活动,想了好久,经同事提醒, 用回调函数即可解决该问题.在这里,对PHP下回调函数的原理及实现分别做一下讲解. 1 什么是回调 软 ...
- C++回调函数的理解与使用
一.回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在 ...
随机推荐
- monkey使用
一.Monkey测试原理:Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中.它向系统发送伪随机的用户事件流(如按键输入.触摸屏输入.手势输入等),实现对正在开发的应用程序 ...
- 再学UML-深入浅出UML类图(二)
类与类之间的关系(1) 在软件系统中,类并不是孤立存在的,类与类之间存在各种关系,对于不同类型的关系,UML提供了不同的表示方式. 1. 关联关系 关联(Association)关系是类与 ...
- ORACLE_LPAD_FUNCTION
Oracle / PLSQL: LPAD Function This Oracle tutorial explains how to use the Oracle/PLSQL LPAD functio ...
- Python——追加学习笔记(四)
函数 1.python里的函数可以返回一个值或者对象,知识在返回一个容器对象的时候有点不同,看起来像是能返回多个对象. >>> def bar(): ... return 'abc' ...
- 【Hibernate那点事儿】—— Hibernate应该了解的知识
前言: 最近由于有点时间,就像深入的学习一下Hibernate.之前只是简单的使用,并没领会它的妙处.这里就趁着分享的机会,好好整理一下. 这篇主要讲到了下面几个部分: Hibernate框架 Hib ...
- Linux--LAMP平台搭建
LAMP平台搭建 准备工作 rpm -e php php-cli php-ldap php-commn php-mysql --nodeps 删除php相关依赖软件 rpm -ivh zlib-dev ...
- Kubernetes stateful set讲解以及一个基于postgreSQL的具体例子
Stateful Set是Kubernetes 1.9版本新引入的一个概念,用于管理有状态的应用. Kubernetes官方文档: https://kubernetes.io/docs/concept ...
- 深度优先搜索(dfs),城堡问题
题目链接:http://poj.org/problem?id=1164 1.深搜,每个点都访问一次,没有标记的话,就做深搜,同时标记. #include <iostream> #inclu ...
- 【[NOI2013]矩阵游戏】
我们看到了及其可怕的数据范围 这个样子都没有办法直接读入的数据范围应该怎么算 我们观察一下递推式\(f[i][j]=a*f[i][j]+b(j!=1)\) \(f[i][1]=c*f[i-1][m]+ ...
- PHP设计模式——适配器模式
<?php /** * 适配器模式 * 适配器模式是将某个对象的接口适配为另一个对象所期望的接口 * * 在需要转化一个对象的接口用于另一个对象时,最好实现适配器模式对象 */ class We ...