历史上的今天
返回首页

历史上的今天

今天是:2025年05月11日(星期日)

2020年05月11日 | 单片机 软件延时时间控制

2020-05-11 来源:eefocus

一、简述


记--通过代码方式实现软件延时(不精确延时)。


二、指令周期

单片机需要一个时钟信号送给内部各个电路,才能使它们有节拍地协同工作。时钟信号的频率是由外部震荡电路的晶振频率决定的。


外接晶振的频率 = 时钟信号的频率 = 工作频率。(如24MHz,12MHz,11.0592MHz)


震荡周期:为单片机提供时钟脉冲的振荡源的周期。


震荡周期 = 1/晶振频率          (如晶振频率是12MHz时,振荡周期 = 1/12MHz = (1/12)us)


机器周期:51系列单片机的一个机器周期由12个震荡周期组成。

机器周期 = 12 * 振荡周期      


(如晶振频率是24MHz时,振荡周期 = 1/24MHz = (1/24)us,机器周期 = 12*(1/24)us = 0.5us)

(如晶振频率是12MHz时,振荡周期 = 1/12MHz = (1/12)us,机器周期 = 12*(1/12)us = 1us)


(如晶振频率是11.0592MHz时,振荡周期 = 1/12MHz = (1/11.0592)us,机器周期 = 12*(1/11.0592)us = 1.085us)



指令周期:单片机执行一条指令所用的时间。

一般来说,单片机执行1个简单的指令需要一个机器周期,执行复杂的指令需要两个机器周期。


三、软件延时


通过一个循环来实现延时

测试代码:


#include

 

void delay(void)//延时函数

{

unsigned char i;

for(i=0; i<100; i++)

;

}

 

void main(void)

{

while(1)

{

//dosomething()

delay();

}

}


在Keil C51 环境下编译后,点击"调试"--"开始";在执行"视图"--"反汇编",可以看到延时函数对应的汇编代码。


其中:


CLR指令消耗1个机器周期


MOV指令消耗1个机器周期


INC指令消耗1个机器周期                                      


CJNE指令消耗2个机器周期


根据循环条件,INC指令和CJNE指令总共要执行100次(0x64=100),共消耗机器周期(1+2)*100=300,


加上CLR指令和MOV指令,循环程序总共消耗机器周期:1+1+300=302


如果单片机的晶振频率为11.0592MHz,则机器周期 = 12*(1/11.0592)us = 1.085us。


那么for循环程序耗时为302*1.085us=327.67us。


deley()函数用时:0.06607530s-0.000422209s=0.065653091s=65.653091ms=65653.091us   


(指令的执行时间不代表函数的执行时间。函数跳转需要时间,开辟函数栈、临时变量、回收栈资源等需要时间,因此c语言有内联(inline)函数,宏函数(带参宏)用来提高执行效率)。


两层循环


#include

 

void delay(void)//延时函数

{

unsigned char i, j;

for(i=0; i<100; i++)

for(j=0; j<200; j++)

;

}

 

void main(void)

{

while(1)

{

//dosomething()

delay();

}

}



注:对于C语言编译器,某些编译器会进行代码优化,比如循环里面什么都没做,编译器有可能将循环去掉。


软件延时不精准:因为相当于是通过控制CPU做某一些预定消耗一定时间的动作,根据CPU执行完成判断已经过去多长时间。但是CPU有可能在中途被其他进程强行占用(优先级高的进程),CPU被迫中断当前执行,优先执行优先级较高的任务,当执行完优先级较高的任务,才回来继续执行之前中断的任务,那么延时就会加长。比如想要延时1分钟,我们预定执行A动作之后,刚好耗时1分钟,那么让CPU执行这个动作就达到延时1分钟。如果当CPU执行到一半时,突然有一个紧急任务S(优先级高)发生,要求CPU立即处理,那么CPU就会中断当前任务A,优先处理紧急任务S,等待执行完毕,才回来继续执行之前被中断的任务A。那么当A任务执行完毕,我们预期是从执行开始到结束消耗时间1分钟,但是实际上已经过去不止1分钟,因为中途被中断了。所以软件延时时间越长,容易被中断,而且CPU不能长时间被一个进程独占,延时越不精准。


要实现精确的延时可使用硬件延时:使用定时器/计数器。定时器/计数器是根据时钟信号脉冲计数的,是直接跟硬件晶振相关的。


 

//函数名:delay_1ms(uint x)

//功能:利用定时器0精确定时1ms

//调用函数:

//输入参数:x,1ms计数

//输出参数:

//说明:延时的时间为1ms乘以x

 

void delay_1ms(uint x)

{

TMOD=0X01;//开定时器0,工作方式为1

TR0=1;//启动定时器0;

while(x--)

{

TH0=0Xfc;//定时1ms初值的高8位装入TH0

TL0=0X18;//定时1ms初值的低8位装入TL0

while(!TF0);//等待,直到TF0为1

TF0=0;    //重置溢出位标志

}

TR0=0;//停止定时器0;

}


延时1s:delay_1ms(1000); //1000ms = 1s

推荐阅读

史海拾趣

Fuji Teminal Industry Co Ltd公司的发展小趣事

关于Fuji Terminal Industry Co., Ltd.(富士端子工业有限公司)在电子行业中的发展起来的相关故事,由于直接关于该公司的详细发展历程和具体故事可能较为有限,且该公司可能更多地专注于特定领域(如端子、连接器等的制造),以下是根据一般行业经验和公司可能经历的发展路径,构建的五个相关故事:

1. 初创与专业化定位

在电子行业的早期,Fuji Terminal Industry Co., Ltd.作为一家新兴企业,凭借对端子技术的深入研究和市场需求的敏锐洞察,选择了专业化的发展道路。公司创始人或核心团队凭借在电子元件领域的丰富经验,决定专注于端子、连接器等基础电子元件的研发与生产。通过不断的技术积累和产品优化,公司逐渐在行业内树立了专业、可靠的形象。

2. 技术创新与品质提升

随着电子行业的快速发展,Fuji Terminal Industry Co., Ltd.意识到技术创新和品质提升是企业持续发展的关键。公司加大了研发投入,引进先进生产设备和技术人才,致力于开发更高性能、更可靠的端子产品。同时,公司建立了严格的质量控制体系,确保每一件产品都能达到客户的高标准要求。这些努力不仅提升了公司的市场竞争力,也赢得了客户的广泛信赖。

3. 市场拓展与国际化战略

在稳固国内市场的同时,Fuji Terminal Industry Co., Ltd.积极实施国际化战略,将目光投向了更广阔的国际市场。公司通过参加国际展会、建立海外销售网络等方式,不断拓展海外市场。凭借其优质的产品和服务,公司成功打入了欧美、亚洲等多个国家和地区的市场,实现了业务的快速增长。

4. 供应链整合与成本控制

面对日益激烈的市场竞争,Fuji Terminal Industry Co., Ltd.深知供应链整合和成本控制的重要性。公司积极与上下游企业建立长期稳定的合作关系,通过优化供应链管理、降低采购成本、提高生产效率等方式,有效控制了生产成本。同时,公司还注重与客户的沟通与协作,共同应对市场变化和挑战。

5. 可持续发展与环保责任

随着全球对环保问题的日益关注,Fuji Terminal Industry Co., Ltd.积极响应可持续发展的号召,将环保理念融入企业的生产经营中。公司致力于开发环保型端子产品,减少生产过程中的环境污染和能源消耗。同时,公司还加强了废弃物的回收和再利用工作,为构建绿色、低碳的电子信息产业链贡献了自己的力量。

需要注意的是,由于直接关于Fuji Terminal Industry Co., Ltd.的详细发展历程和具体故事可能较为有限,以上故事是基于一般行业经验和公司可能经历的发展路径构建的。实际情况可能因公司战略、市场环境等因素而有所不同。

ELM Technology Corporation公司的发展小趣事

ELM Technology Corporation非常重视企业文化的建设。公司倡导“创新、协作、诚信、责任”的企业精神,鼓励员工积极创新、勇于担当。同时,公司还为员工提供了良好的工作环境和福利待遇,增强了员工的归属感和凝聚力。这种积极向上的企业文化为ELM的持续发展提供了强大的动力。

请注意,以上故事仅为概述,具体细节和事实需要根据ELM Technology Corporation的实际情况进行补充和完善。

HiRel Connectors Inc公司的发展小趣事
使用万用表检查电源线是否导通,如有损坏则更换新的电源线。
博巨兴公司的发展小趣事

2005年,博巨兴公司的业绩取得了突破性进展,全年业绩突破5000万元。这一年,公司还与世平科技有限公司展开了战略合作,共同推动芯片行业的发展。此外,公司还成功取得了台湾义隆公司在华东地区的代理权,进一步拓展了市场份额。

Cramer公司的发展小趣事

随着可穿戴设备的兴起,Cramer公司迅速捕捉到了市场机遇。他们推出了一款智能手表,该手表不仅具备基本的时间显示功能,还集成了健康监测、运动追踪等多项实用功能。为了提升产品的竞争力,Cramer公司与多家科技公司合作,共同研发新技术。这款智能手表在市场上获得了广泛认可,进一步提升了Cramer公司的品牌知名度和市场份额。

登丰微(GSTEK)公司的发展小趣事

歌普电子科技有限公司以自有品牌(GEPU歌普)创立于2006年,公司最初在台湾设立,随后逐步扩展至江苏和东莞,形成了跨区域的研发、生产和销售网络。公司自创立之初便专注于各式线对板连接器、板对板连接器、网络连接器等产品的研发与设计。通过不断的技术积累和市场需求洞察,歌普逐渐在连接器领域建立了自己的市场地位。

问答坊 | AI 解惑

测量仪器的分类及应用

1.示波器   示波器是一种测量电压波形的电子仪器,它可以把被测电压信号随时间变化的规律,用图形显示出来。使用示波器不仅可以直观而形象地观察被测物理量的变化全貌,而且可以通过它显示的波形,测量电压和电流,进行频率和相位的比较,以及描绘特 ...…

查看全部问答>

询问电流传感器

大概是测10A左右的电流传感器  工作电压12V 有什麽推荐的…

查看全部问答>

选用组合逻辑还是时序逻辑?

组合逻辑的输出仅与当前的输入有关; 而时序逻辑的输出不但与输入有关,还和系统上一个状态有关。 这个话很清楚,可是具体是有些迷糊: 请达人分析下这个:PC=Int_Sev?Int_Sev_addr:{PC[31:5]+1\'b1,PC[4:0]},这个应该是组合逻辑呢?还是时序逻 ...…

查看全部问答>

请教在CEPC虚拟机上录音失效的问题

1.录音程序是参考微软官方网站的代码修改的 2.在虚机上第一次录音成功,但是第二次录音却失败了 3.在第一次录音结束,调用waveInReset方法的时候,声音消失 请教大家有遇到这样的问题吗,我使用的是Visual PC 如果有,请问用什么方法能避免这样 ...…

查看全部问答>

调试 wince6.0 multi-bin 遇到的问题

最近在弄 wince6.0的multi-bin遇到了一些问题,想请教一下: 在BSP中我的config.bib是这样设置的: MEMORY         XIPKERNEL        80200000  002FF000  RAMIMAGE   &nbs ...…

查看全部问答>

EVB打包程序,急需~~

谁有EVB的打包程序啊,我下的EVB没有打包程序,编译出来的.VB程序无法在WIN CE上运行,谁能帮我做个打包程序嘛? 程序中要用到WIN CE file控件,MS CE comm控件,image控件,急需~~…

查看全部问答>

各位老兄,一起收集较好的嵌入式论坛(ARM,DSP,FPGA,单片机都行)

我先来 eeworld 硬件嵌入式板块,自是不用说了,俺就是在这里成长的。 www.armce.com/bbs——这个专门wince的,我感觉也不错,里面收藏了很多原创和非原创工具 驱动开发网wince板块,以前很火,不知道为啥现在堕落了。 www.2@1i ...…

查看全部问答>

高性能交流伺服的指标?

一个高性能的交流伺服可以用哪些指标来衡量?比如调速范围,稳速精度,响应频率等再有就是这些指标具体多大(大概的一个数值)才算是高性能? 比如调速范围:满载条件下,不低于5000:1,不要动辄相信谁的伺服都能达到10000:1; 稳速精度:满载 ...…

查看全部问答>

FPGA流水灯

用FPGA跑流水灯的程序,也许对你有用!…

查看全部问答>

.tcf格式的文件作用是什么?

刚接触CCS,创建一个工程的时候里面的.tcf格式的文件作用是什么啊?知道的给简单说说吧…

查看全部问答>