一、定时器/计数器简介 . k5 K9 C9 k8 n% C7 K0 O
设置等待时间,到达等待时间之后执行指定的硬件操作。
! ~/ p: g; r T6 n9 {1 L定时器最基本的功能就是定时,比如说定时发送串口数据,定时采集AD数据,如果将定时器和IO结合起来就可以实现非常丰富的功能,可以测量输入信号的脉冲宽度,可以产生PWM方波,定时器产生PWM控制电机状态是工业控制的普通。
/ Z5 U1 \, Q. S) E7 o* ?, a. x' p. _2 y3 Q8 }; D5 a# f, G
二、定时器/计数器相关寄存器介绍
2 l) `% r( Y9 x P' X1 d1、计数寄存器TH和HL2 T, g* e1 Z5 \; G, ?2 I
T/C是16位的,计数寄存器由TH高8位和TL低8位构成。" v, P! _4 k: T! r3 C+ I: \
对应T/C0为TH0和TL0, 对应T/C1为TH1和TL1,定时器/计数器的初始值通过TH0/TL0和TH1/TL1设置。
& E% m8 e0 Y3 K& w5 o# p3 ^( o2、定时器/计数器控制寄存器TCON* }& _5 P# Z( h' X7 M( z' X: R; R
: u( Q' q W- |7 y$ |
3、T/C的方式控制寄存器TMOD
! G3 O" [' o9 z$ G- K: x* B
2 Z- S/ g- F0 d
; i8 J& P/ N( e0 y, b% r! [! P1 ^! J x8 g* ]7 B$ g
三、定时器的计数初始值计算 8 a- D0 }5 | L' X, u7 x
2 \, G; F& m% y9 k* K4 B e" G$ x四、中断源及中断信号
/ ?1 I1 A( Q# x$ l) M7 o3 o' D( ^( p. s: e
五、参考代码 - 4 @3 t- J+ M( C7 S) b; B
- /****************************************************** ; F; R9 L' Y2 [8 \2 }) ? F6 l' R
- 功能描述:LED会循环点亮1秒,熄灭1秒。
' h, g2 A0 o+ t2 Z1 s4 K - 使用单片机内部定时器可实现准确延时
9 ~" B% g! i% J - ******************************************************/
# D) D7 C* U4 J% C5 r2 q - #include "reg52.h" 9 j* \' Q+ ^" y9 `
- //此文件中定义了单片机的一些特殊功能寄存器4 `- U3 M3 {" m2 i1 S7 ?* f* [
- typedef unsigned int u16; //对数据类型进行声明定义
8 k& a0 G2 R+ n$ x3 B - typedef unsigned char u8;3 f- b% |( ?/ E5 l5 Z; K" m
- sbit led=P2^0; //定义P20口是led
8 M7 I- ]( Z9 \; g, _ -
, [2 }! K! K* ^7 x- {% O - void Timer0Init()
% m2 a& U5 W! W9 { - {2 x& s Z9 n% `; f
- TMOD|=0X01; //选择为定时器0模式,工作方式1(16位),仅用TR0打开启动, @7 D5 u, c! P
- TH0=0XFC; //给定时器赋初值,定时1ms 高8位3 Y4 T) K7 P, O: A; B
- TL0=0X18; // 低8位(可用软件计算,公司参考上面)
, W ~0 ?& S9 O* {; ]' m; Q. Q1 i - ET0=1; //允许定时器0中断
1 n8 \" x' d! X: S9 Y7 ]' n - EA=1; //打开总中断. s8 P( x2 O8 a& E' a4 F# O3 i
- TR0=1; //打开定时器0,启动T/C0运行
5 m/ o g* w# p! L0 [ - }
, S- V* t6 y- d) t6 g( Q -
* L- }0 {( A1 g& D3 `9 Y1 _5 x4 ~ - void main()5 D' S1 u4 O8 n5 v! F3 [! y* n
- {; f% H0 }. h: {+ B- u
- Timer0Init();
2 b/ C8 m; q# C5 t; N. { - while(1);
4 D6 i. p/ s; x; J5 u3 s, l - }
: G+ ^0 U% P5 L2 q# d1 f+ C8 x7 B p% w - : A5 d* q( ?7 |' `
- void Timer0() interrupt 1 //1是中断号 U+ W& R" T0 M# z6 \( h
- {! @- D4 H7 y1 ?8 \1 v8 }, ^
- static u16 i;
( j) B7 G4 e" D z. \ - TH0=0XFC; //计数器寄存高8位重新载入
! Y* P$ Z% p5 u" E1 c - TL0=0X18; //计数器寄存低8位重新载入
. e& O# h9 t% a2 l! o - i++;
( X% J4 {' o& C - if(i==1000)! H# j$ a4 T6 i5 |$ T
- {, K+ d; a; P- @: K
- i=0;
4 U7 f) N3 ~. X* \ - led=~led;& h, {& O; z+ ?9 q1 u
- }; I* ^3 R1 W% k) I
- }
复制代码 - ^ v) Z! u" R) w
|