访问电脑版页面

导航:老古开发网手机版51单片机定时器

51单片机1s延时程序设计

导读:
关键字:
延时程序,51单片机,

#include

sbit P1_0 = P1^0;

void Delay(); // 下面引用时一定要和这里的大小写一致否则会有警告或错误

void Main()

{

while (1) // 开始一直循环

{

P1_0 = 0;

Delay(); // 没有参数也要加 () 否则会有Warning

P1_0 = 1;

Delay();

}

}

void Delay() // 12M晶振1s延时

{

unsigned char h, i, j, k;

for (h = 5; h 》 0; h--)

for (i = 4; i 》 0; i--)

for (j = 116; j 》 0; j--)

for (k = 214; k 》 0; k--); // 最后个要有 ; 号

}

//=======以下非代码==========//

原理,利用h,i,j,k循环指令消耗掉一定时间来达到延时,为什么利用循环延时的做法,在12M晶振延时1秒中需要h,i,j,k四个变量,且各变量的值是上面代码中那样呢?这要从单片机的周期说起,单片机有指令周期,机器周期,状态周期,时钟周期;

时钟周期:也就晶振的振荡周期,以12MHz为例,时钟周期为 1/ 12000000 = 1/12us;

机器周期:1个机器周期=6个状态周期=12个时钟周期=1us;

指令周期:单片机执行一条指令所需要的时间称为指令周期,指令周期是以机器周期为单位的,不同的指令所需要的机器周期不一定相同(1-4个),单片机执行一条单周期指令需要1us,执行一条双周期指令需要2us,for循环需要8个指令周期;

具体执行for循环消耗的时间,可以在Keil里通过代码测量:

#include

sbit P1_0 = P1^0;

void Delay();

void Main()

{

while (1)// 开始一直循环

{

P1_0 = 0;

Delay();

P1_0 = 1;

Delay();

}

}

void Delay()

{

unsigned char h;

for (h = 1000; h 》 0; h--); // 此处下断点

}

51单片机1s延时程序设计

循环1000次执行完后的时间点

51单片机1s延时程序设计

1000次循环耗时 0.00042850s - 0.00019600s = 0.00023250s = 232.5us;1次循环耗时约 0.2us,

1s = 1000000us,1000000us / 0.2us = 500000次,而5 * 4 * 116 * 214 = 496480;因为无符号字符型unsigned char 大小为1 byte,范围为0~255,所以只能通过循环嵌套,近似的得到一个1s延时。

来源:工程师周亮   作者:lhl545545  2019/1/17 16:09:00
栏目: [ 51单片机定时器]

相关阅读

MCS-51单片机定时系统

单片机定时器初值计算公式(51单片机和AVR单片机的初值计算三种方法)

零基础:学51单片机定时器

80C51单片机内部定时器和计数器的结构及原理解析

51单片机计数器与定时器的区别

mcs51单片机计数器工作方式1 计数初值计算与定时编程举例

如何实现C8051单片机的精确延时

51单片机时钟精度误差的解决

MCS-51单片机精确定时的两种编程方法介绍

51单片机的定时器

C51单片机延时时间的计算方法解析

51单片机中的定时计数器的主体结构及功能解析

51单片机1s延时程序设计

基于51单片机的计时器设计

AT89S51单片机00-59秒计时器设计

如何利用51单片机内部定时器实现对时间的操作

AT89S51单片机的定时/计数器T0的应用

MCS-51单片机的定时器/计数器概念

51单片机基于定时器0的硬件延时代码

51单片机定时器模式2与波特率的应用