|
一、定时器/计数器简介 - n: D3 c' V3 W$ R
设置等待时间,到达等待时间之后执行指定的硬件操作。
+ I' L4 j+ g, g定时器最基本的功能就是定时,比如说定时发送串口数据,定时采集AD数据,如果将定时器和IO结合起来就可以实现非常丰富的功能,可以测量输入信号的脉冲宽度,可以产生PWM方波,定时器产生PWM控制电机状态是工业控制的普通。
* K2 }. I, |6 v; `; Q1 K) [5 y# }4 l2 F
二、定时器/计数器相关寄存器介绍 8 ^9 {) H3 z G/ ]6 Q
1、计数寄存器TH和HL
7 P* m8 @ y8 o& r b5 ^5 pT/C是16位的,计数寄存器由TH高8位和TL低8位构成。: a( p L/ _6 ]& L: t3 o5 O
对应T/C0为TH0和TL0, 对应T/C1为TH1和TL1,定时器/计数器的初始值通过TH0/TL0和TH1/TL1设置。; ?: l* g/ X+ q8 t$ X
2、定时器/计数器控制寄存器TCON
% D/ b% q$ @/ a( S6 B
6 | H0 T" u% R2 d3、T/C的方式控制寄存器TMOD
# r D6 X5 g+ d6 ]7 O1 A
. Z' ~$ R z1 o! L; ~6 x
2 X% f& M8 x$ A5 A( H- H
( m2 ^/ ~1 |! W0 ~/ }8 F5 k0 o
三、定时器的计数初始值计算 " }+ ^( K$ h1 [0 h& D2 M6 U) X
' b6 v; d- F( r
四、中断源及中断信号
; h7 {( ]: M0 I9 N2 o+ ?- a
; J* Y r6 L2 l. Q s: U8 L0 l五、参考代码 - * ^( h L1 K8 V: o
- /****************************************************** $ \, c; W6 c) t
- 功能描述:LED会循环点亮1秒,熄灭1秒。6 a2 a5 X- [/ L- H( I# T7 B
- 使用单片机内部定时器可实现准确延时 + H/ [# O% \4 H. j) }' {) K$ }
- ******************************************************/
( Q# S. o- B+ A. ^6 V7 e" N - #include "reg52.h"
2 _- \/ T7 W X9 W/ R6 R" M - //此文件中定义了单片机的一些特殊功能寄存器/ ?; b& G: O% E( h, L$ _
- typedef unsigned int u16; //对数据类型进行声明定义& J6 p4 N6 G4 A5 N! G5 I# L
- typedef unsigned char u8;, }, E2 L+ i+ I
- sbit led=P2^0; //定义P20口是led
3 u3 d @2 F& Z7 F# }% d, z -
: L4 M' ~7 A6 [# [7 m - void Timer0Init()
- R( v- X% a) Z- \: X - {
/ h6 n) Z( B* m- \ - TMOD|=0X01; //选择为定时器0模式,工作方式1(16位),仅用TR0打开启动
1 W( s/ R& T: z' ~8 l$ S$ i8 P8 C: u - TH0=0XFC; //给定时器赋初值,定时1ms 高8位$ ]/ y1 b8 q9 ^ n k P# J( W+ Q
- TL0=0X18; // 低8位(可用软件计算,公司参考上面)
7 R0 A1 |6 t! @- q2 U& I - ET0=1; //允许定时器0中断
" ~* ` `% C# k- G - EA=1; //打开总中断1 w U) R; }% c& {( z$ v
- TR0=1; //打开定时器0,启动T/C0运行9 I: O! f" j" x$ Q
- }
" c4 w: t( p% h, M/ o! D/ R -
. T$ t" j n6 q; x+ {+ l' u; ]& M! v - void main()+ e# ]% E. N1 B& k8 E" L
- {
]3 J6 P( D c' f - Timer0Init();
6 U" i% ~$ f9 m, m. Q' W - while(1);' M! @+ O( V+ L$ c3 X
- }! h8 |9 [4 U+ W$ N i
- {0 M7 Q% e, W- ]5 B' a- void Timer0() interrupt 1 //1是中断号
+ D! K4 k Q- e# F5 \1 ` - {$ i5 k5 W" P; N
- static u16 i;5 b0 b# g' a* Q/ g% M7 _7 \
- TH0=0XFC; //计数器寄存高8位重新载入
7 c2 t, _" W# n- m3 e6 ` - TL0=0X18; //计数器寄存低8位重新载入 e( g$ c" s. K7 L8 h8 L
- i++;
8 b, V& Q, M3 W6 \* U - if(i==1000)
& [; G w/ a& h9 c( D - {" [3 i7 `$ z* [: s: _
- i=0;6 o8 \9 m8 V. a# {% Q
- led=~led;
( J2 p* A' O2 |8 g' }* ~ - }
# p W2 h b2 S m- x6 H5 A - }
复制代码
! a$ Q7 Q' C0 r# ^' e4 ` |