51单片机定时器0作为时间基准以及延时函数参考使用
51单片机定时器0作为时间基准以及延时函数参考使用
- Proteus仿真演示作为延时使用

这个类似于Arduino 里面的delay()延时函数。
- 由于变量
unsigned long 范围是有限的,暂且不考虑溢出时间。

- 溢出时间:
4294967295/86400/1000 = 49.71026961805556(天)
作为毫秒延时的参考代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| #include<reg52.h> //#include<intrins.h> sbit LED = P2^0; #define FOSC 12000000uL #define T1MS (65536-FOSC/12/1000) //12T模式1ms定时 static volatile unsigned long currentMillis = 0;
void Timer0Init(void) //1毫秒@12.000MHz {
TMOD = 0x01; //set timer0 as mode1 (16-bit) TL0 = T1MS; //设置定时初始值,高8位 TH0 = T1MS >> 8; //设置定时初始值,低8位 TF0 = 0; //清除TF0标志 TR0 = 1; //定时器0开始计时 ET0 = 1; //enable timer0 interrupt EA = 1; //open global interrupt switch }
/\* Timer0 interrupt routine \*/ void tm0\_isr() interrupt 1 { TL0 = T1MS; //reload timer0 low byte TH0 = T1MS >> 8; //reload timer0 high byte currentMillis ++; } //延时函数 void delay(unsigned long interval) { unsigned long previousMillis = currentMillis ; unsigned long temp = interval\*0.02;//修正 while(interval>=temp) { if (currentMillis - previousMillis >=1 ) { interval--; previousMillis++; } } }
void main() { Timer0Init(); while(1) { LED = !LED ; delay(3000); } }
|
仿真资源和程序源码
本实验基于Proteus8.12平台。
1 2 3
| 链接:https://pan.baidu.com/s/1jAsrr2cnHL3sC\_Ftg9NH0A 提取码:vqnt
|
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!