51单片机定时/计数器学习笔记

定时器和计数器

定时/计数器简介:

11

12

晶振12M, 振荡周期 1/12us, 机械周期 1/12 * 12 = 1us.

定时器/计数器寄存器:

13

TH0-高八位寄存器,TL0-低八位寄存器

TMOD:工作方式选择寄存器

14

15

0123位设置T0定时/计数器;

4567位设置T1定时/计数器;

通常使用将GATE = 0的方式。

/T表示低电平有效。

16

从上到下依次为工作方式0\1\2\3;

工作方式0(M0 = 0, M1 = 0):

0~2^13-1(最大计数个数为2^13,因为从0开始计数,故减1)

工作方式1(M0 = 0, M1 = 1):

0~2^16-1(0~65535)

工作方式2(M0 = 1, M1 = 0):

通常用在串口通信的波特率发生器;

自动装入:高8位TH放开始计数的初始值(如80),低8位TL负责计数(2^8=256),计数溢出时,将高8位TH中的值(如80)放入低8位,低8位从此值(如80)重新开始计数,如此循环计数。

工作方式3(M0 = 1, M1 = 1):

仅适于T0定时/计数器

17

TF2:溢出标志;

EXF2: 外部标志(信号引发);

RCLK/TCLK:接收/发送时钟位;

EXEN: 外部引脚使能位;

TR2: 启动位;

C//T2: 选择定时计数器;

CP//RL2: 捕获、重载标志位;

 

定时器/计数器工作方式:

18

C//T:

选为0,使用定时器,使用系统机械周期(1us)

选为1,使用计数器,计算T0引脚的脉冲信号;

19

21

定时器/计数器使用方法:

22

23

 

示例:

 1 #include "reg52.h"
 2 #include "intrins.h"
 3 
 4 typedef unsigned char u8;
 5 typedef unsigned int u16;
 6 
 7 sbit LED = P2^0;
 8 
 9 void Timer0Init()//定时器0中断初始化
10 {
11     TMOD |= 0x01; //GATE C/~T M1 M0 GATE C/~T M1 M0,T1不变,T0工作方式1,所以进行与操作,0000 0001
12     TH0 = 0xFC;    //定时器0初始化,定时1ms
13     TL0 = 0x18;
14     ET0 = 1;//定时器0使能
15     EA = 1; //打开总中断使能
16 
17     TR0 = 1; //定时器0开始计数
18 
19 } 
20 
21 int main()
22 {
23     Timer0Init();
24     while(1);
25 }
26 
27 void Timer0() interrupt 1 //定时器0中断
28 {
29     static u16 i;
30     TH0 = 0xFC;//定时器0重新赋初值
31     TL0 = 0x18;
32     i++;
33     if(i == 1000)//1S
34     {
35         LED = ~LED;
36     }
37 
38 }

 

 

另外:发现一个强大的资料神器,STC官方出品的STC-ISP烧录软件,它不仅是烧录软件,我感觉它更像一个STC芯片资料词典

image

功能1:烧录,串口调试;

功能2:为keil C51软件提供STC芯片资料包

新安装的keil C51软件有时会发现编程时找不到STC系列的芯片,打开STC-ISP,在右上方找到Keil仿真设置选项,点击下方的添加型号和头文件到keil中,添加STC仿真驱动到Keil中,然后弹出窗口,选择Keil的安装目录(目录下必须有C51目录和UVx目录存在),之后点击确定即可。

image

功能3:程序示例。

找到范例程序,在单片机系列中选择单片机型号以及需要实现的功能,就会看到软件给出的c语言示例

image

功能4:小工具波特率计算器、定时器计算器、软件延时计算器

同样在软件的右上方可以找到这些实用小工具。

image

 本文目的在于学习分享,无商业目的。部分资源来自于网络,如有侵权,请联系作者删除,谢谢!

 

 

 

posted @ 2020-03-04 17:02  BrianSun  阅读(1376)  评论(0编辑  收藏  举报