51单片机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;
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延时。

带有Arduino的语音控制开关的制作
terawins T101A
HAL255全极XYZ三轴感应霍尔开关、三轴传感霍尔元件
堡盟推出受专利保护涂层的耐化学腐蚀微型超声波传感器
示波器如何利用好?
51单片机1s延时程序设计的详细资料说明
波音宣布将在北京大兴国际机场免费提供机场移动地图功能
福田智蓝展出氢燃料电池产品,以行业尖端技术引领新能源商用车发展潮流
ios11发正式版推送了:iphone6升级ios11正式版体验,有轻微卡顿你升不升呢?
带你了解TI的DSP入门芯片TMS320F28335
西门子电机和大型驱动器公司Innomotics全新成立!
多屏一云应用兴起 通用处理器发展势不可当
汽车仿真测试领域频频出手?天翼云为安全出行再次加码
贴片机生产工艺流程连线方式
谐振电感升压DC/DC转换器
中性线与零线的区别
国产FPGA再获助力 上海安路D轮融资获得大基金领投
用于提高前照灯效率的LED控制器
Li-O2电池的工作机理和电极设计
魅族Note8评测 一款合格的千元机