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


穷且益坚,不坠青云之志。–王勃《滕王阁序》