0 卖盘信息
BOM询价
您现在的位置: 首页 > 电子资讯 >基础知识 > 51单片机几个延时程序

51单片机几个延时程序

来源: 21ic
2021-04-14
类别:基础知识
eye 7
文章创建人 拍明

原标题:51单片机几个延时程序

51单片机(也称为8051单片机)的延时程序通常依赖于定时器或简单的循环来实现。以下是几种常见的延时方法:

1. 使用定时器延时

定时器是51单片机中常用的硬件资源,通过设置定时器的初值和溢出中断,可以实现精确的延时。以下是一个使用定时器0实现延时的例子:

c复制代码


#include <reg51.h>



void Timer0_Delay(unsigned int ms) {

unsigned int i;

TMOD |= 0x01;  // 设置定时器0为模式1(16位定时器)

TH0 = 0xFC;    // 初始化定时器初值(根据晶振频率和延时需求设置)

TL0 = 0x66;    // 假设晶振频率为12MHz,这里实现大约1ms的延时

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



for(i = 0; i < ms; i++) {  // 循环ms次,每次循环延时1ms

while(!TF0);  // 等待定时器0溢出

TF0 = 0;     // 清除溢出标志

TH0 = 0xFC;  // 重新加载初值(如果需要连续延时)

TL0 = 0x66;

}

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

}



void main() {

while(1) {

P1 = 0xFF;  // 点亮所有LED(假设P1口连接LED)

Timer0_Delay(500);  // 延时500ms

P1 = 0x00;  // 关闭所有LED

Timer0_Delay(500);  // 延时500ms

}

}

注意:上述代码中的定时器初值是假设晶振频率为12MHz时计算得到的,实际使用时需要根据具体的晶振频率进行调整。

2. 使用循环延时

循环延时是一种简单但不精确的延时方法,它依赖于CPU的执行速度和循环体的复杂度。以下是一个使用空循环实现延时的例子:

c复制代码


#include <reg51.h>



void DelayLoop(unsigned int count) {

unsigned int i, j;

for(i = 0; i < count; i++) {

for(j = 0; j < 123; j++) {  // 这里的123是一个经验值,需要根据实际情况调整

// 空循环,什么也不做

}

}

}



void main() {

while(1) {

P1 = 0xFF;  // 点亮所有LED(假设P1口连接LED)

DelayLoop(50000);  // 延时(具体时间取决于CPU速度和循环体复杂度)

P1 = 0x00;  // 关闭所有LED

DelayLoop(50000);  // 延时

}

}

注意:循环延时方法的精度受CPU速度、编译器优化和循环体复杂度的影响,因此通常不推荐用于需要精确延时的场合。

image.png

3. 使用定时器中断延时

定时器中断是一种更精确且灵活的延时方法,它可以在不阻塞CPU的情况下实现延时。以下是一个使用定时器0中断实现延时的例子:

c复制代码


#include <reg51.h>



unsigned int delay_counter = 0;

unsigned int delay_ms = 0;

bit delay_flag = 0;



void Timer0_ISR(void) interrupt 1 {

TH0 = 0xFC;  // 重新加载定时器初值(假设晶振频率为12MHz,实现大约1ms的延时)

TL0 = 0x66;

delay_counter++;

if(delay_counter >= delay_ms) {

delay_counter = 0;

delay_flag = 1;

}

}



void Timer0_Delay(unsigned int ms) {

delay_counter = 0;

delay_ms = ms;

delay_flag = 0;

TMOD |= 0x01;  // 设置定时器0为模式1(16位定时器)

TH0 = 0xFC;    // 初始化定时器初值

TL0 = 0x66;

ET0 = 1;       // 使能定时器0中断

EA = 1;        // 使能全局中断

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

}



void main() {

while(1) {

P1 = 0xFF;  // 点亮所有LED(假设P1口连接LED)

Timer0_Delay(500);  // 延时500ms

while(!delay_flag);  // 等待延时完成

delay_flag = 0;      // 清除延时标志

P1 = 0x00;  // 关闭所有LED

Timer0_Delay(500);  // 延时500ms

while(!delay_flag);  // 等待延时完成

delay_flag = 0;      // 清除延时标志

}

}

注意:在使用定时器中断时,需要确保中断服务程序(ISR)的正确编写和调用,同时要注意中断优先级和嵌套中断的处理。此外,还需要根据具体的晶振频率调整定时器的初值以实现精确的延时。


责任编辑:David

【免责声明】

1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing@iczoom.com),本方将及时处理。

2、本文的引用仅供读者交流学习使用,不涉及商业目的。

3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。

4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing@iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。

拍明芯城拥有对此声明的最终解释权。

标签: 51单片机

相关资讯

资讯推荐
云母电容公司_云母电容生产厂商

云母电容公司_云母电容生产厂商

开关三极管13007的规格参数、引脚图、开关电源电路图?三极管13007可以用什么型号替代?

开关三极管13007的规格参数、引脚图、开关电源电路图?三极管13007可以用什么型号替代?

74ls74中文资料汇总(74ls74引脚图及功能_内部结构及应用电路)

74ls74中文资料汇总(74ls74引脚图及功能_内部结构及应用电路)

芯片lm2596s开关电压调节器的中文资料_引脚图及功能_内部结构及原理图_电路图及封装

芯片lm2596s开关电压调节器的中文资料_引脚图及功能_内部结构及原理图_电路图及封装

芯片UA741运算放大器的资料及参数_引脚图及功能_电路原理图?ua741运算放大器的替代型号有哪些?

芯片UA741运算放大器的资料及参数_引脚图及功能_电路原理图?ua741运算放大器的替代型号有哪些?

28nm光刻机卡住“02专项”——对于督工部分观点的批判(睡前消息353期)

28nm光刻机卡住“02专项”——对于督工部分观点的批判(睡前消息353期)

拍明芯城微信图标

各大手机应用商城搜索“拍明芯城”

下载客户端,随时随地买卖元器件!

拍明芯城公众号
拍明芯城抖音
拍明芯城b站
拍明芯城头条
拍明芯城微博
拍明芯城视频号
拍明
广告
恒捷广告
广告
深亚广告
广告
原厂直供
广告