51单片机定时/计数器学习笔记
定时器和计数器
定时/计数器简介:
晶振12M, 振荡周期 1/12us, 机械周期 1/12 * 12 = 1us.
定时器/计数器寄存器:
TH0-高八位寄存器,TL0-低八位寄存器
TMOD:工作方式选择寄存器
0123位设置T0定时/计数器;
4567位设置T1定时/计数器;
通常使用将GATE = 0的方式。
/T表示低电平有效。
从上到下依次为工作方式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定时/计数器
TF2:溢出标志;
EXF2: 外部标志(信号引发);
RCLK/TCLK:接收/发送时钟位;
EXEN: 外部引脚使能位;
TR2: 启动位;
C//T2: 选择定时计数器;
CP//RL2: 捕获、重载标志位;
定时器/计数器工作方式:
C//T:
选为0,使用定时器,使用系统机械周期(1us)
选为1,使用计数器,计算T0引脚的脉冲信号;
定时器/计数器使用方法:
示例:
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芯片资料词典
功能1:烧录,串口调试;
功能2:为keil C51软件提供STC芯片资料包
新安装的keil C51软件有时会发现编程时找不到STC系列的芯片,打开STC-ISP,在右上方找到Keil仿真设置选项,点击下方的添加型号和头文件到keil中,添加STC仿真驱动到Keil中,然后弹出窗口,选择Keil的安装目录(目录下必须有C51目录和UVx目录存在),之后点击确定即可。
功能3:程序示例。
找到范例程序,在单片机系列中选择单片机型号以及需要实现的功能,就会看到软件给出的c语言示例
功能4:小工具波特率计算器、定时器计算器、软件延时计算器
同样在软件的右上方可以找到这些实用小工具。
本文目的在于学习分享,无商业目的。部分资源来自于网络,如有侵权,请联系作者删除,谢谢!