频率定义为每秒的循环数。也可以将其定义为总时间“ T”的倒数。在这个项目中,我们将计算进入8051微控制器的端口3.5的脉冲数,并将其显示在16 * 2 LCD显示屏上。因此,基本上我们已经测量了8051端口3.5处的信号频率。在这里,我们使用了AT89S52 8051芯片,并且在非稳态模式下使用了555 IC来生成用于演示的采样脉冲。我们之前已经使用Arduino构建了频率计数器。
所需组件:
- 8051微控制器(AT89S52)
- 16 * 2 LCD显示屏
- 频率源(555计时器)
- 电位器
- 连接线
电路原理图:
使用8051的TIMER来测量频率:
8051微控制器是一个8位微控制器,具有128字节的片上RAM,4K字节的片上ROM,两个定时器,一个串行端口和四个8位端口。8052微控制器是微控制器的扩展。要将端口3.5配置为计数器,TMOD寄存器值设置为0x51。下图显示了TMOD寄存器。
门 | 碳/吨 | M1 | M0 | 门 | 碳/吨 | M1 | M2 |
计时器1 | 定时器0 |
GATE-设置GATE时,仅当INTx引脚为高电平且TRx控制引脚被设置时,才使能定时器或计数器。清除GATE时,只要将TRx控制位置1,就使能定时器。
C / T –当C / T = 0时,它充当定时器。当C / T = 1时,它充当计数器。
M1和M0表示操作模式。
对于TMOD = 0x51,定时器1用作计数器,并在模式1(16位)下运行。
16 * 2 LCD用于显示信号频率,以赫兹(Hz)为单位。如果您不熟悉16x2 LCD,请在此处查看有关16x2 LCD引脚及其命令的更多信息。还要检查如何将LCD与8051连接。
555定时器作为频率源:
频率源应该产生方波,并且最大幅度限制为5V,因为8051微控制器的端口无法处理大于5V的电压。由于TH1和TL1寄存器的存储限制(每个8位),它可以测量的最大频率为655.35 KHz。在100毫秒内,TH1和TL1最多可容纳65535个计数。因此,可以测量的最大频率为65535 * 10 = 655.35 KHz。
在此8051频率计项目中,我使用处于非稳定模式的555定时器来产生可变频率的方波。555 IC产生的信号频率可以通过调整电位器来改变,如该项目结尾处的视频所示。
在此项目中,Timer1(T1)对进入8051微控制器的端口3.5的脉冲计数进行了100毫秒的计数。计数值将分别存储在TH1和TL1寄存器中。为了合并TH1和TL1寄存器的值,使用以下公式。
脉冲= TH1 *(0x100)+ TL1
现在,“脉冲”将具有100毫秒的周期数。但是信号的频率定义为每秒的循环数。要将其转换为频率,请使用以下公式。
脉冲=脉冲* 10
工作和代码说明:
在项目结束时,将提供此频率计的完整C程序。该代码分为多个有意义的小块,并在下面进行说明。
对于与8051微控制器接口的16 * 2 LCD,我们必须定义16 * 2液晶显示器连接到8051微控制器的引脚。16 * 2 LCD的RS引脚连接到P2.7,16 * 2 LCD的RW引脚连接到P2.6,而16 * 2 LCD的E引脚连接到P2.5。数据引脚连接到8051微控制器的端口0。
比特rs = P2 ^ 7; 比特rw = P2 ^ 6; sbit en = P2 ^ 5;
接下来,我们必须 定义一些 在程序中使用的功能。 延迟 功能用于创建指定的时间延迟。 Cmdwrt 功能用于将命令发送到16 * 2液晶显示器。 datawrt 功能用于将数据发送到16 * 2液晶显示器。
void delay(unsigned int); void cmdwrt(unsigned char); 无效的datawrt(unsigned char);
在这部分代码中,我们将命令发送到16 * 2 lcd。命令,如清晰的显示,增量光标,迫使光标到1条的开始ST线通过一个指定的一些时间延迟之后被发送到16 * 2液晶显示器中的一个。
for(i = 0; i <5; i ++){cmdwrt(cmd); 延迟(1); }
在此部分代码中,将timer1配置为计数器,并将操作模式设置为模式1。
将Timer0配置为定时器,并将操作模式设置为模式1。定时器1用于计数脉冲数,定时器0用于产生时间延迟。TH1和TL1的值设置为0,以确保计数从0开始。
TMOD = 0x51; TL1 = 0; TH1 = 0;
在此部分代码中,计时器将运行100毫秒。使用延迟功能会产生100毫秒的延迟。TR1 = 1用于启动计时器,TR1 = 0用于在100毫秒后停止计时器。
TR1 = 1;延迟(100); TR1 = 0;
在这部分代码中,将TH1和TL1寄存器中存在的计数值组合在一起,然后将其乘以10,以得到1秒内的总循环数。
脉冲= TH1 *(0x100)+ TL1; 脉冲=脉冲* 10;
在代码的这一部分中,频率值被转换为单个字节,以使其易于在16 * 2 LCD显示器上显示。
d1 =脉冲%10; s1 =脉冲%100; s2 =脉冲%1000; s3 =脉冲%10000; s4 =脉冲%100000; d2 =(s1-d1)/ 10; d3 =(s2-s1)/ 100; d4 =(s3-s2)/ 1000; d5 =(s4-s3)/ 10000; d6 =(pulses-s4)/ 100000;
在这部分代码中,频率值的各个数字转换为ASCII格式,并显示在16 * 2 LCD显示屏上。
如果(pulses> = 100000)datawrt(0x30 + d6); if(脉冲> = 10000)datawrt(0x30 + d5); if(脉冲> = 1000)datawrt(0x30 + d4); if(脉冲> = 100)datawrt(0x30 + d3); if(脉冲> = 10)datawrt(0x30 + d2); datawrt(0x30 + d1);
在这部分代码中,我们将命令发送到16 * 2 LCD显示器。该命令将复制到8051微控制器的端口0。将RS设为低电平以进行命令写入。将RW设为低电平以进行写操作。在使能(E)引脚上施加从高到低的脉冲,以开始命令写入操作。
void cmdwrt(unsigned char x){P0 = x; rs = 0; rw = 0; en = 1; delay(1); en = 0; }
在这部分代码中,我们将数据发送到16 * 2 LCD显示器。数据被复制到8051微控制器的端口0。将RS设为高电平以进行命令写入。将RW设为低电平以进行写操作。在使能(E)引脚上施加从高到低的脉冲以开始数据写入操作。
无效的datawrt(无符号字符y){P0 = y; rs = 1; rw = 0; en = 1; delay(1); en = 0; }
这就是我们可以使用8051单片机测量任何信号的频率的方式。查看下面的完整代码和演示视频。