单片机 软件延时时间控制

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

关键字:单片机  软件延时  时间控制 编辑:什么鱼 引用地址:http://news.nvwayi.com/mcu/ic496695.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:单片机 矩阵式按键
下一篇:一个简易的51单片机串口接收和发送程序

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

MSP430单片机写Info Memory
MSP430F5438A单片机在写Info Memory时,需要先把整页数据擦除,才能写进去。否则写失败。而且还得设置下载程序时不要擦除 Info memory, 否则存储数据失败。因为没此下载时都给你擦除了。
发表于 2020-05-08
MSP430单片机写Info Memory
51单片机实验8:led点阵(1):点亮一个点
开发板led点阵模块电路图如下:74HC595:74HC595是一个8位串行输入、并行输出的位移缓存器。芯片第11角为数据输入时钟线,上升沿有效。芯片第12脚为输出存储器锁存时钟线,上升沿有效。芯片第13脚为输出有效(低电平)。芯片第14脚为串行数据输入。为表示出输入74HC595的8位二进制数,开发板加入了led模块(图一中绿色所示)。若要使led发光,则需将JP595接vcc。OE为输出有效控制端,低电平有效,所以务必将JOE短接片短接到GND端。_nop_();函数为延时一个机器周期,所对应头文件为intrins.h#include<reg52.h>#include<intrins.h>#define
发表于 2020-05-08
51单片机实验8:led点阵(1):点亮一个点
51 单片机:在 P0 口接上 8 个 LED,实现每次亮两个灯的流水灯
要求:每次亮相邻两个灯,分别闪烁五次后,移动一位,汇编。做而论道编程如下:;------------------------    ORG   0000H    LJMP  MAIN    ORG   0100HMAIN:    MOV   R2, #0FCH    MOV   A, #1;------------------------LOOP:    MOV   P0, R2   ;
发表于 2020-05-08
51单片机 4个独立按键控制LED灯 (protues仿真)(C语言版)
}}void main(){while(1){key();}}四、运行程序后成功后,打开proteus右键单击单片机AT89C51,找到编辑,然后添加hex文件
发表于 2020-05-08
51单片机 4个独立按键控制LED灯 (protues仿真)(C语言版)
单片机实例---定时器控制点阵显示0~9
显示状态:点阵上每隔1s显示一个数字,显示到9又重头显示不断循环#include<reg52.h>#include<intrins.h> typedef unsigned int u16;typedef unsigned char u8; u8 flag=0;   //时间标志位 #define lie_io P0    //定义P0端口 sbit RCLKK = P3^5;    sbit SRCLK = P3^6;sbit SER = P3^4;   //串行输入 u
发表于 2020-05-08
51单片机课程设计——led点阵广告牌程序设计
上学期期末的课设题目是led点阵广告牌,当时的要求如下:(1)能够显示不同字符的LED点阵广告牌;(2)按键切换不同的显示效果(如闪烁,静止,平移等);(3)按键切换不同的显示内容;(4)能够显示图形或自定义字符;(5)其他功能(创新部分);(6)系统调试、分析、总结与功能实现。当时用的是我用是的普中科技的STC90C51RD+的单片机,不过只要是51单片机,换哪个51内核的芯片都可以,只要电路和程序匹配就可以。我用的那款普中科技的51单片机可以直接连线决定线路的布置,不需要自己去重新焊一个电路板。然后我根据任务要求连接了电路,写了对应的程序,还有proteus仿真。另外,觉得有趣可以点个赞;有什么有趣的想法可以评论一下,我感兴趣
发表于 2020-05-08
51单片机课程设计——led点阵广告牌程序设计
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD。com。cn, Inc。 All rights reserved
彩票网送彩金存款 澳门银河官网送彩金 充值1元送彩金 时时彩机器人 澳门银河官网送彩金 网上现金赌博送彩金 电子娱乐送彩金论坛 北京赛车Pk10全自动下注q群微信群机器人 送彩金棋牌网站 正规官网送彩金