51定时器
定时器/计数器 任何一个时刻使用,只能使用其中一种功能
51单片机提供的定时器分别为T0、T1(T0定时器四种工作方式都有,而T1仅有模式0与2)
启动定时器后,每个机器周期到来,初值寄存器自动加1,直到记满溢出
以方式1为例:
- 启动
- 机器周期
- 初值寄存器
TH0 (高八位),TL0 (低八位) 初值均为00H
0000 0000 0000 0000 0-65536 一共经历了65536us 也就是65.536ms
1111 1111 1111 1111
初值的计算:
如果要记50ms TH0 = (65536-50000)/256
TL0 = (65536-50000)%256
PS:机器自动将十进制转化为十六进制
4.自动加1
5.溢出
编程实现步骤
- 报备
TMOD 工作方式寄存器
T0部分
GATE:门控位
D2 C/T 0代表定时器功能 1代表计数器功能
M1 M0
- 0 :方式 0
- 1 :方式1
- 0 :方式2
- 1 :方式3
T1 不用 全部清0
TMOD = 0x01;
2.置初值
根据时间更改 TH0 TL0
3.启动
TCON寄存器
TR0 = 1; (如果停止TR0=0)
4 .等待
开始前手动清0 TF0=0
溢出后 TF0=1;
5.重置初值
更改 TL0 TH0
6.清溢出
TF0=0;
下面代码定时器实现流水灯
#include <REGX52.H>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
void Timer0Init(void)
{
TMOD = 0x01; // 报备
TH0 =(65536-50000)/256; // 置初值
TL0 =(65536-50000)%256;
TR0 = 1; // 启动
}
void main()
{
uchar n = 0x01,k=0;
Timer0Init();
while(1)
{
k=0;
while(k<20)
{
while(TF0 == 0); //等待
k++;
TF0=0; //重置初值和清溢出
TH0 =(65536-50000)/256;
TL0 =(65536-50000)%256;
}
P2=~n;
if(n == 0x80){n=0x01;}
else {n<<=1;}
}
}
标签:50000,TL0,初值,51,TH0,定时器,65536
From: https://blog.csdn.net/2301_81235183/article/details/142282789