什么是捕获?
捕获就是捕捉某一瞬间的值,通常用它来测量外部某个脉冲的宽度或周期。使用捕获功能可以非常准确的测量脉冲宽度或周期,他的工作原理是:单片机内部有两组寄存器,其中一组的内部数值是按照固定的机器周期递增或递减,通常这组寄存器就是定时器的计数器寄存器(TLX,THX),当与捕获功能相关的外部某引脚有一个负跳变时,捕获便会立即将此时第一组寄存器中的数值准确地获取,并且存入另一组寄存器中,这组寄存器通常被称为“陷阱寄存器”(RCAPXL,RCAPXH),同时向CPU申请中断,以方便软件记录。当给引脚的下一次负跳变来临时,便会产生另外一个捕获,再次向CPU申请中断,软件记录两次捕获之间数据后,便可以准确的计算出该脉冲的周期。
定时器2控制寄存器T2CON
TF2 定时器2 溢出标志位.定时器2 溢出时将置位.当TCLK 或RCLK 为1 时,将不会置位
EXF2 定时器2 外部标志,当EXEN2=1, 并在引脚T2EX 检测到负跳变时置位.如果定时器2
中断被允许,将产生中断.
RCLK 接收时钟标志,当串行口以方式1 或3 工作时,将使用定时器2 的溢出率作为串行
口接收时钟频率
TCLK 发送时钟标志,位当串行口以方式1 或3 工作时,将使用定时器2的溢出率作为串行
口接收时钟频率
EXEN2 定时器2 外部允许标志,当EXEN2=1 时,在T2EX 引脚出现负跳变时将造成定时器2
捕捉或重装,并置位EXF2,产生中断
TR2 定时器运行控制位,置位时,定时器2 将开始工作,否则定时器2 停止工作
C/T2 定时器计数方式选择位,如果C/T2=1,定时器2 将作为外部事件计数器,否则对内部
时钟脉冲计数
CP/RL2 捕捉/重装标志位,当EXEN2=1,时如果CP/RL2=1,T2EX 引脚的负跳变将造成捕捉,
如果CP/RL2=0 ,T2EX 引脚的负跳变将造成重装
机器周期:一个机器周期包含6个状态周期,用S1、S、.......S6;共12个节拍S1P1 S1P2 ......S6P2
指令周期:执行一条指令所占用的全部时间,以机器周期为单位。
12MHz晶振 单周期和双周期指令的时间为1μ和2μs,乘法和除法指令为4μs
可以捕获信号
智能小车专用红外反射式探头\红外避障\反射式红外传感
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]=
{
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display(uchar shi,uchar ge)
{
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delayms(5);
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delayms(5);
}
uint read()
{
uchar tl,th1,th2;
uint val;
while(1)
{
th1=TH0;
tl=TL0;
th2=TH0;
if(th1==th2)
break;
}
val=th1*256+tl;
return val;
}
void main()
{
uchar a,b;
uint num;
TMOD=0x05;
TH0=0;
TL0=0;
TR0=1;
while(1)
{
num=read();
if(num>=100)
{
num=0;
TH0=0;
TL0=0;
}
a=num/10;
b=num%10;
display(a,b);
}
}