51定时器延时函数(精确延时)

 1 bit f,m;
 2
 3 void T0_service(void) interrupt 1
 4 {
 5     TH0=(65536-5000)>>8;
 6     TL0=(unsigned char)(65536-5000);
 7     Count5ms=Count5ms+1;
 8         m=~m;
 9     if (Count5ms==100)
10     {
11         Count5ms=0;
12         f=~f;
13     }
14 }
15
16 void delay1s(void)
17 {
18     while(f);
19     while(!f);
20 }
21
22 void delay10ms(void)
23 {
24     while(m);
25     while(!m);
26 }
时间: 2024-11-10 00:54:05

51定时器延时函数(精确延时)的相关文章

使用系统定时器SysTick实现精确延时微秒和毫秒函数

SysTick定时器简介 SysTick定时器是存在于系统内核的一个滴答定时器,只要是ARM Cortex-M0/M3/M4/M7内核的MCU都包含这个定时器,它是一个24位的递减定时器,当计数到 0 时,将从RELOAD 寄存器中自动重装载定时初值,开始新一轮计数.使用内核的SysTick定时器来实现延时,可以不占用系统定时器,由于和MCU外设无关,所以代码的移植,在不同厂家的Cortex-M内核MCU之间,可以很方便的实现.而东芝的这款TT_M3HQ开发板使用的TMPM3HQFDFG芯片,正

Keil C51程序设计中几种精确延时方法

单片机因具有体积小.功能强.成本低以及便于实现分布式控制而有非常广泛的应用领域[1].单片机开发者在编制各种应用程序时经常会遇到实现精确延时的问题,比如按键去抖.数据传输等操作都要在程序中插入一段或几段延时,时间从几十微秒到几秒.有时还要求有很高的精度,如使用单总线芯片DS18B20时,允许误差范围在十几微秒以内[2],否则,芯片无法工作.用51汇编语言写程序时,这种问题很容易得到解决,而目前开发嵌入式系统软件的主流工具为C语言,用C51写延时程序时需要一些技巧[3].因此,在多年单片机开发经验

关于51精确延时及keil仿真延时时间

转自:http://blog.sina.com.cn/s/blog_980e19e00101b5dh.html 有时候需要精确的延时,比如18B20温度传感器对时序要求非常严格,必须精确到微秒级别 一.用NOP函数 在keil C51中,直接调用库函数: #include // 声明了void _nop_(void); _nop_(); // 产生一条NOP指令 作用:对于延时很短的,要求在us级的,采用“_nop_”函数,这个函数相当汇编NOP指令,延时几微秒.NOP指令为单周期指令,可由晶振

【转】STM32 不占用定时器(包括SysTick)实现精确延时(巧用DWT)

/** ****************************************************************** * file core_delay.c * author fire * version V1.0 * date 2018-xx-xx * [url=home.php?mod=space&uid=247401]@brief[/url] 使用内核寄存器精确延时 **************************************************

VC++中的延时函数

原文链接:http://www.educity.cn/develop/478947.html VC中提供了很多关于时间操作的函数,编写程序时我们可以跟据定时的不同精度要求选择不同的时间函数来完成定时和计时操作. 方式一:VC中的WM_TIMER消息映射能进行简单的时间控制.首先调用函数SetTimer()设置定时 间隔,如SetTimer(0,200,NULL)即为设置200ms的时间间隔.然后在应用程序中增加定时响应函数 OnTimer(),并在该函数中添加响应的处理语句,用来完成到达定时时间

arduino的自带延时函数的陷阱

新手刚接触arduino,在今天玩温湿度传感器(AM2302)时,发现网上的程序中有一个名为micros()的函数不知是干什么用的,然后就在网上搜了搜: micros()是一个用了arduino的中断timer0写的函数,用于计算时间和,同时arduino的函数库中用了中断的函数还有delay().delayMicroseconds.millis()等等 . 那么问题来了,假设我们在做项目的时候,要用到定时器timer0相关的函数,但同时又要定时接收外来信号,那么必然要使用更多中断.这时就要小心

8051单片机软件精确延时研究(一)

前言 最近自学51单片机,编程中如流水灯等非精确延时多用软件延时实现,写了几个类似DelayX10us(unsigned char x)的函数方便调用,函数内部的语句多是用官方延时程序再自己套一个for或者do..while循环改造而成,像这样: //非精确延时10*Xus//@12.000MHz 12T模式 void DelayX10us(unsigned char x) { unsigned char i; for (; x > 0; x--) { _nop_(); i = 2; while

织女星开发板RISC-V内核实现微秒级精确延时

前言 收到VEGA织女星开发板也有一段时间了,好久没玩了,想驱动个OLED屏,但是首先要实现IIC协议,而实现IIC协议,最基本的就是需要一个精确的延时函数,所以研究了一下如何来写一个精确的延时函数.众所周知,ARM Cortex-M内核都有一个24位的SysTick系统节拍定时器,它是一个简易的周期定时器,用于提供时基,多为操作系统所使用.RV32M1的RISC-V内核也有一个SysTick定时器,只不过它不属于内核,而是使用的一个外部通用定时器,即LPIT0( low power perio

改进的延时函数Delay(使用MsgWaitForMultipleObjects等待消息或超时的到来)

解决上一节中延时函数占CPU使用率(达50%)的第二种方法是利用消息机制,通过API函数MsgWaitForMultipleObjects等待消息或超时的到来,从而避免使用循环检测使CPU占用率过高.完整的改进版Delay函数代码如下: [delphi] view plaincopyprint? procedure Delay(dwMilliseconds:DWORD); var endTick: DWORD; Event: THandle; begin Timer1.Enabled:=Fals

stm32中的延时函数

//粗延时函数,微秒 void delay_nus(u16 time) { u16 i=0; while(time--) { i=10;  //自己定义 while(i--) ; } } //毫秒级的延时 void delay_nms(u16 time) { u16 i=0; while(time--) { i=12000;  //自己定义 while(i--) ; } } 运用SysTick来实现准确定时: SysTick_Config(SystemCoreClock / 10)   函数的形