历史上的今天
返回首页

历史上的今天

今天是: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;

}


推荐阅读

史海拾趣

GAIA Converter Inc公司的发展小趣事

在环保意识日益增强的今天,锋鸣电子(深圳分公司)积极响应国家号召,致力于绿色电子产品的研发与生产。公司投入大量资金引进环保设备和生产工艺,确保产品从原材料采购到生产制造的全过程都符合环保标准。同时,锋鸣电子还积极推广节能减排理念,为客户提供绿色、低碳的电子产品解决方案。凭借在绿色环保方面的突出表现,锋鸣电子赢得了业界的广泛赞誉。

ELDECO公司的发展小趣事

面对数字化转型的浪潮,ELDECO公司积极拥抱变化,加快数字化转型步伐。公司引入先进的信息技术和大数据分析工具,对生产、销售、服务等各个环节进行数字化改造和升级。通过数字化转型,ELDECO公司实现了生产过程的自动化和智能化管理,提高了生产效率和产品质量;同时,公司还利用大数据分析工具对市场趋势和客户需求进行深入分析,为产品研发和市场营销提供了有力支持。数字化转型的助力使得ELDECO公司在激烈的市场竞争中保持了强劲的发展势头。

请注意,以上故事均为虚构内容,旨在展示电子行业中可能的发展故事。如需了解真实公司的具体发展情况,请查阅相关官方资料或新闻报道。

ADMOS公司的发展小趣事

为了进一步提升公司的竞争力和影响力,ADMOS公司积极寻求与其他行业领导者的战略合作。通过与芯片设计、封装测试等领域的顶尖企业建立战略合作关系,ADMOS得以共享资源、互通有无,共同推动电子行业的进步和发展。这种合作模式不仅加速了ADMOS公司的成长步伐,也为整个电子行业的繁荣做出了贡献。

请注意,以上故事均为虚构,旨在展示一个可能的ADMOS公司发展历程。实际情况可能有所不同,具体细节需参考ADMOS公司的官方资料和相关报道。

申风(everanalog)公司的发展小趣事

随着技术实力的不断提升和产品线的日益丰富,申风(everanalog)公司开始积极拓展市场。公司凭借优质的产品和服务,逐渐在国内市场上树立了良好的品牌形象。同时,公司也积极开展国际合作,与国际知名企业建立了战略合作关系,共同推动集成电路产业的发展。这些合作不仅为公司带来了更多的商业机会,也提升了公司在国际市场上的竞争力。

Broadband公司的发展小趣事

作为一家有社会责任感的企业,申风(everanalog)公司始终关注社会发展和环境保护问题。公司积极参与公益事业和环保活动,致力于为社会做出积极贡献。同时,公司也注重可持续发展战略的制定和实施,在生产经营过程中注重节能减排和资源循环利用等方面的工作。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实的基础。

请注意,以上故事框架仅为示例,并未包含具体的细节和数据。如需了解更多关于申风(everanalog)公司的具体信息和发展历程,请查阅相关新闻报道或官方资料。

Emmoco公司的发展小趣事

Emmoco一直将品质管理作为公司发展的核心。公司建立了完善的质量管理体系,从原材料采购到生产、检测、包装等各个环节都进行严格的质量控制。同时,Emmoco还注重持续改进,通过引入先进的生产设备和工艺、优化生产流程等方式,不断提高产品质量和生产效率。这些举措使得Emmoco的产品在市场上赢得了良好的口碑和声誉。

问答坊 | AI 解惑

金税工程启动税控行业

金税工程启动税控行业(财税)本报记者 张然  种种迹象表明,税控收款机行业正在迅速崛起。去年10月,翘盼多时的“税控收款机国家标准”终于尘埃落定,同时,北京、上海、成都和长春四地市被确立为全国首批银税一体化试点城市。记者了解到,不少 ...…

查看全部问答>

电脑怎样来接收GPRS的数据?

怎样才能让电脑接收到手机传过来的GPRS信号呢?需要什么装置,然后用什么语言编程?有具体代码吗?非常感谢!…

查看全部问答>

大侠们指导下 PT2262与单片机接口的用法?急!

大侠们指导下 PT2262与单片机接口的用法?  谢谢...…

查看全部问答>

cec文件与dir或者sources之间的关系!

看起来,Platform Builder对于kernel image的生成过程中。 CEC文件除了描述item在catalog中的位置关系外,主要是使用环境环境变量来控制是否需要将相应的dll通过mkimage置入nk中。 而source和dir决定了那些东西会被编译。 也就是说,无论某些ite ...…

查看全部问答>

请教达人:芯片研发 和 驱动开发 哪个更有前/钱途?

芯片研发 和 驱动开发 哪个更有前/钱途?   如果想从事芯片研发方面的工作,应该怎么学?   如果想从事驱动开发方面的工作,又应该怎么学? …

查看全部问答>

S3C2410核心板问题

S3C2410核心板问题: 我有一套2410的开发板,板上有一个2410核心板,核心板上有一个NorFlash(SST39VF1601),我要在调试状态下操作NorFlash总不能成功,例如读FLASH 的ID等. 调试环境:ADS+HJTAG,调试代码运行在SDRAM(BANK6)上 我使用逻辑分析观看总 ...…

查看全部问答>

我想用F2812做一个音频信号采集、处理、回放系统

我想用F2812做一个音频信号采集、处理、回放系统 我想用F2812做一个音频信号采集、处理、回放系统。不知哪位大侠帮忙介绍一下外围电路和程序设计》 …

查看全部问答>

芯达stm32入门系列教程~~欢迎下载!!!

花了点时间,写了一个STM32的入门系列教程,希望大家喜欢!该入门教程,从stm32的必备软件安装开始,一直到最后的编程上手,都给了详细的讲述,图文并茂。 …

查看全部问答>

stm32lwipdemo中的Delay函数是否错了?

wIP TCP/IP stack demonstration for STM32F107xx connectivity line microcontrollers 演示程序中, 在main.c 文件里,有一段用systick 延时的函数 void Delay(uint32_t nCount) {   /* Capture the current local time */   ...…

查看全部问答>