快捷搜索:  汽车  科技

51单片机读取计数器的值:单片机做频率计数器

51单片机读取计数器的值:单片机做频率计数器TRx:即TR0/TR1为TCON寄存器中定时器运行控制位,相当于定时器的开关,置1开始计时,置0(清0)停止计时;AT89S52要将端口 3.5 配置为计数器,需要将 TMOD 寄存器值设置为 0x51。下图是TMOD 寄存器。电位器555定时器的方波脉冲发生器8051单片机 是一个8位单片机,具有128字节的片上RAM、4K字节的片上ROM、两个定时器、一个全双工串行口和四个8位端口。

51单片机读取计数器的值:单片机做频率计数器(1)

频率定义为每秒的周期数,也可以定义为一个周期经过的时间“T”的倒数。在这个项目中,我们将计算进入 8051 单片机端口 3.5 的脉冲数,并将其显示在 1602 液晶显示器上。即在8051的3.5端口测量信号的频率。这里我们使用AT89S52 单片机,采样555 IC在非稳态模式下产生脉冲数进行演示。

所需组件:

8051单片机(AT89S52)

1602液晶显示器

频率源(555 定时器)

电位器

电路原理图:

51单片机读取计数器的值:单片机做频率计数器(2)

555定时器的方波脉冲发生器

51单片机读取计数器的值:单片机做频率计数器(3)

使用 8051 的 TIMER 测量频率:

8051单片机 是一个8位单片机,具有128字节的片上RAM、4K字节的片上ROM、两个定时器、一个全双工串行口和四个8位端口。

AT89S52要将端口 3.5 配置为计数器,需要将 TMOD 寄存器值设置为 0x51。下图是TMOD 寄存器。

51单片机读取计数器的值:单片机做频率计数器(4)

TRx:即TR0/TR1为TCON寄存器中定时器运行控制位,相当于定时器的开关,置1开始计时,置0(清0)停止计时;

INTx:即INT0/INT1,外部中断引脚。

GATE :当 GATE=1时,定时/计数器仅在 INTx 引脚为高电平且 TRx 控制引脚高电平时启用。当 GATE=0时,只要 TRx为高电平,定时器就会被启用。

C/T(Count/Timer)定时器/计数器切换开关:C/T=0为定时模式,C/T=1为计数模式;

M1和M0表示定时/计数器操作模式。

当 TMOD = 0x51 时,timer1 用作计数器,并以模式 1(16 位)运行。

关于8051定时/计数器方面的内容这里不展开,有兴趣的请自行学习相关内容。

555定时器作为频率源:

频率源应产生方波,最大振幅限制在5V,因为 8051 单片机的端口不能处理大于 5V 的电压。

8051定时/计数器在模式1时,提供两个16位定时/计数器,计数范围0-65535,计量数存放在TH1 (高8位)和 TL1(低8位) 寄存器。由于 TH1 和 TL1 寄存器的存储限制,TH1 和 TL1 最多可以保存 65536 个计数。

在这个8051 频率计项目中,使用555定时器在非稳态模式下产生可变频率方波。555 IC 产生的信号频率可以通过调整电位器来改变。

在这个项目中,Timer1 (T1) 对进入 8051单片机端口 3.5 的脉冲数进行计数,计数值将分别存储在 TH1 和 TL1 寄存器中。要组合 TH1 和 TL1 寄存器的值,使用以下公式。

脉冲数 = TH1 * (0x100) TL1

在采用12 MHz晶振的情况下,单片机最大计数速度为0.5 MHz即500 kHz。

此项目只计算在 50 毫秒内发生的“脉冲数”,信号的频率又被定义为每秒的经过的周期数。要将其转换为频率,转换如下:

f = 脉冲数* 20

代码说明:

对于1602 LCD 与 8051 单片机的接口,我们须定义 1602 lcd 连接到 8051 单片机的引脚:

sbit rs=P2^7; //1602 lcd 的 RS 脚接 P2.7, sbit rw=P2^6; //1602 lcd 的 RW 脚接 P2.6, sbit en=P2^5; //1602 lcd 的 E 脚接 P2.5, 数据引脚连接到 8051 单片机的端口 0。

接下来定义一些在程序中使用的函数:

//delay延时函数用于创建指定的时间延迟, void delay(unsigned int); //Cmdwrt 函数用于向 1602 lcd 显示器发送命令 void cmdwrt(unsigned char); //datawrt函数用于向 1602 lcd 显示器发送数据。 void datawrt(unsigned char);

1602 LCD初始化代码:清屏、显示光标、强制光标到第 1 行开头等:

for(i=0;i<5;i ) { cmdwrt (cmd[i]); delay (1); }

8051定时/计数器初始化代码中:

//将timer1配置为计数器,并将操作模式设置为模式1, // 用于计数脉冲数。 TMOD=0x51; //Timer0 配置为定时器,操作模式设置为模式 1,用于产生延时。 TL1=0; //TH1 和 TL1 值设置为 0,以确保从 0 开始计数。 TH1=0;

定时器运行 50 ms。TR1=1 用于启动定时器,TR1=0 用于在 50 ms后停止定时器:

TR1=1; delay(50); TR1=0;

将 TH1 和 TL1 寄存器中的计数值组合起来,然后乘以 20得到 1 秒内的总周期数:

Pulses = TH1*(0x100) TL1; Pulses = pulses*20;

将频率值转换为单字节,以便于在 1602 lcd 显示器上显示:

d1 = pulses % 10; s1 = pulses % 100; s2 = pulses % 1000; s3 = pulses % 10000; s4 = pulses % 100000; d2 = (s1-d1) / 10; d3 = (s2-s1) / 100; d4 = (s3-s2) / 1000; d5 = (s4-s3) / 10000; d6 = (pulses-s4) / 100000;

把频率值的各个数字被转换为 ASCII格式,并显示在 1602显示器上:

If(pulses>=) datawrt ( 0x30 d6); if(pulses>=10000) datawrt( 0x30 d5); if(pulses>=1000) datawrt( 0x30 d4); if(pulses>=100) datawrt( 0x30 d3); if(pulses>=10) datawrt( 0x30 d2); datawrt( 0x30 d1);

向 1602 lcd 显示器发送命令:

该命令通过8051 单片机的端口 0发送到1602 lcd。RS 为低电平以进行命令写入。RW 为低电平以进行写操作。在使能 (E) 引脚上施加高到低脉冲(下降沿)以执行命令写入操作。

void cmdwrt (unsigned char x) { P0=x; rs=0; rw=0; en=1; delay(1); en=0; }

将数据发送到 1602 lcd:

通过数据8051 单片机的端口 0发送到1602lcd。RS 为高电平以进行命令写入。RW 为低电平以进行写操作。在使能(E)引脚上施加高到低脉冲(下降沿)以执行数据写入操作。

void datawrt (unsigned char y) { P0=y; rs=1; rw=0; en=1; delay(1); en=0; }

这就是我们如何使用 8051 单片机测量任何信号的频率。

猜您喜欢: