历史上的今天
今天是:2024年08月31日(星期六)
2018年08月31日 | 51单片机自定义多个软件定时器
2018-08-31 来源:eefocus
51单片机只有两个硬件定时/计数器,有时候我们要用多个定时器,可以自己写软件定时器,就可以有多个定时器用了,下面代码用一个硬件定时器实现了四个定时器,实现四个LED以不同频率闪烁,为了验证定时效果,四个LED闪烁频率依次2倍关系,实际可以任意定义。
/*----------------------------------------------------
名称:用定时器控制led亮灭
单片机:stc12c2052
晶振:12M
说明:四个led,四种频率亮。
------------------------------------------------------*/
#include //头文件
#define MY_TIMER_MAX (4) //最多四个定时器
#define NULL (0)
typedef void (*pFun)(void); //callback 函数指针类型
typedef struct myTimer{
char on; //开关
char is_period; //是否周期循环
unsigned short int time_out; //定时时间,单位ms
unsigned short int count; //定时计数用
}MY_TIMER;
pFun callback[MY_TIMER_MAX] = {NULL}; //定时器回调函数数组
MY_TIMER myTimerList[MY_TIMER_MAX] = {0}; //定时器结构数组
int gMyTimerMessage[MY_TIMER_MAX] = {0}; //定时器消息数组
sbit LED1=P1^0;
sbit LED2=P1^1;
sbit LED3=P1^2;
sbit LED4=P1^3;
#define ALL_ON {LED1=0;LED2=0;LED3=0;LED4=0;} //灯全开
//创建定时器,简化版本。
int CreatTimer(int index,unsigned short int time_out,char is_period,pFun callbackFun)
{
if(index >= MY_TIMER_MAX) return -1;
myTimerList[index].on = 1;
myTimerList[index].is_period = is_period;
myTimerList[index].time_out = time_out;
myTimerList[index].count = 0;
callback[index] = callbackFun;
return index;
}
//四个LED控制函数,on初始是0,第一次调用on变为1,是关灯。
void led_1_ctrl(void)
{
static char on = 0;
on = !on;
LED1 = on;
}
void led_2_ctrl(void)
{
static char on = 0;
on = !on;
LED2 = on;
}
void led_3_ctrl(void)
{
static char on = 0;
on = !on;
LED3 = on;
}
void led_4_ctrl(void)
{
static char on = 0;
on = !on;
LED4 = on;
}
void Init_Timer0(void) //初始化定时器0
{
TMOD=0x01; //定时器0,使用模式1,16位定时器
TH0=(65536-1000)/256; //给定初值
TL0=(65536-1000)%256;
EA=1; //打开总中断
ET0=1; //打开定时器中断
TR0=1; //开定时器
}
void main() //主函数
{
unsigned int i;
ALL_ON;
CreatTimer(0,250,1,led_1_ctrl);
CreatTimer(1,500,1,led_2_ctrl);
CreatTimer(2,1000,1,led_3_ctrl);
CreatTimer(3,2000,1,led_4_ctrl);
Init_Timer0();//初始化定时器0
while(1)
{
for(i = 0; i= myTimerList[i].time_out) //定时到
{
gMyTimerMessage[i] = 1; //发消息
if(myTimerList[i].is_period) //是否周期循环
{
myTimerList[i].count = 0; //计数重置
}
else
{
myTimerList[i].on = 0; //关掉定时器
}
}
}
}
EA = 1;
}
史海拾趣
|
金税工程启动税控行业(财税)本报记者 张然 种种迹象表明,税控收款机行业正在迅速崛起。去年10月,翘盼多时的“税控收款机国家标准”终于尘埃落定,同时,北京、上海、成都和长春四地市被确立为全国首批银税一体化试点城市。记者了解到,不少 ...… 查看全部问答> |
|
看起来,Platform Builder对于kernel image的生成过程中。 CEC文件除了描述item在catalog中的位置关系外,主要是使用环境环境变量来控制是否需要将相应的dll通过mkimage置入nk中。 而source和dir决定了那些东西会被编译。 也就是说,无论某些ite ...… 查看全部问答> |
|
芯片研发 和 驱动开发 哪个更有前/钱途? 如果想从事芯片研发方面的工作,应该怎么学? 如果想从事驱动开发方面的工作,又应该怎么学? … 查看全部问答> |
|
S3C2410核心板问题: 我有一套2410的开发板,板上有一个2410核心板,核心板上有一个NorFlash(SST39VF1601),我要在调试状态下操作NorFlash总不能成功,例如读FLASH 的ID等. 调试环境:ADS+HJTAG,调试代码运行在SDRAM(BANK6)上 我使用逻辑分析观看总 ...… 查看全部问答> |
|
我想用F2812做一个音频信号采集、处理、回放系统 我想用F2812做一个音频信号采集、处理、回放系统。不知哪位大侠帮忙介绍一下外围电路和程序设计》 … 查看全部问答> |
|
花了点时间,写了一个STM32的入门系列教程,希望大家喜欢!该入门教程,从stm32的必备软件安装开始,一直到最后的编程上手,都给了详细的讲述,图文并茂。 … 查看全部问答> |
|
wIP TCP/IP stack demonstration for STM32F107xx connectivity line microcontrollers 演示程序中, 在main.c 文件里,有一段用systick 延时的函数 void Delay(uint32_t nCount) { /* Capture the current local time */   ...… 查看全部问答> |




