单片机1s延时程序
#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;
【单片机1s延时程序】Delay();
P1_0 = 1;
Delay();
}
}
void Delay()
{
unsigned char h;
for (h = 1000; h > 0; h--); // 此处下断点
}
循环1000次执行完后的时间点
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延时 。
推荐阅读
- 基于51单片机+DAC0832的信号发生器
- 单片机DA转换实现正弦波
- 大佬带你深入了解51单片机,51单片机、AVR、PIC单片机IO口操作
- 微念所持李子柒公司51万元股权被冻结!称系正常司法程序
- 51单片机----16*16LED点阵
- 51单片机控制舵机
- 基于AT89S52的单片机的LED点阵显示屏的设计
- 全功能数字电子钟_C51单片机应用开发
- 单片机内外部资源操作篇之数码管静态显示
- 单片机之流水灯