蓝桥杯 有关频率测量NE555的学习过程分享

NE555频率测量与单片机定时器应用详解

一、概念和原理

        冷门考到的知识点,在第十届也就是19年考到了,这个外设比较陌生,所以要了解一下,不过只是考查你会不会利用它对频率进行测量然后进行一些运算转换成别的量,比如说湿度。

说明:1.555是一个纯硬件的电路,是没有可以编程的部分的;

2.2.6引脚输入正弦信号,R8和Rb3和下面的C14组成了高中所说的RC振荡电路,经过芯片从三引脚输出方波信号;

3.P3^4引脚就是计时器0的计数信号输入引脚;

        下面是一些思路和技巧。

1.Hz就是一秒有多少个脉冲,两个就是2Hz当方波信号传进P3^4引脚,就可以计算信号源频率了;

2.我们要计算频率就是计算一秒里面的波形个数,一秒和计数,刚好P3^4就是计时器0的计数信号输入引脚,我们就可以用T0计数,让一个变量每溢出一次就在T0中断里面加加;

        然后讲讲T1,计时最多65535us,也就是65多毫秒,那就可以分段计时,50ms一组计时20组就是一秒;

        讲讲技巧就是,让T0初始化为8为自动重装模式(这种模式不需要反复的往TH0和TL0里写值,只需要初始化的时候写一次即可,溢出之后,自动将TH0里面的值存入TL0里。),然后都赋初始值为255,这样只要有一个脉冲过来都会直接进入中断,中断里面变量再加加就可以实现计数了。

二、题目

        实现逻辑

(1)初始化计数器(模式,清零,开启)
(2)用另一个定时器定时一秒得出频率

三、学习代码知识

        计时器初始化要掌握的知识:

小蜜蜂总结的很好,1.TMOD寄存器高四位是定时器1,低四位是定时器0;

2.GATE位,GATE=0,由TR0和TR1来启动定时器;GATE=1,由外部中断引脚INTO和INT1来启动定时器,一般就是TR来;

3.我们要的是八位自动重装模式就是由后俩位来配置的;

以上这些可以记住,很方便,毕竟经常考到。那前面四位就是0001即定时器1定时,后四位就是0110即定时器0计数,转成16进制就是TMOD=0x16。

        下一步就是中断,我也没思想是知道下一步要干这活的,那就多见识吧,我们已经经历了1给定时器0赋初值、设置TMOD,配置寄存器IE给中断使能三步。

        优先记住IE寄存器,看数据手册就知道我们需要的是哪三个。

        初值这步在这讲:

        这一除一余的操作是为了分别得到高八位和低八位的二进制数。

         然后就是理解为什么除这个256就可以得到。举个例子,我们要得到十进制数66的二进制数,先求高四位,那就是除2的四次方,至于为什么是4次方,俺也不知道,单片机只有16位和八位,16位就除256(2的八次方),八位就四次方。这样一除一余就可以得到66的二进制数了。

四、手写代码

        兄弟们,有时候几处小小的细节很容易卡死我们,一卡就一两天,此时,笔者的做法是最笨的,假如参考代码有正确的实验现象,那就对照着参考代码一处处找到不同的地方,一处处修改,虽然很繁琐,但是直到我们修改到有实验现象时,会对自己犯下的错误有非常深刻的印象,上一次是uart文件没写好,这次还是因为uart文件的问题,而且还是俩个错误,笔者都跟你们说一下,你们要引以为戒。

        感受最深的一点是:即使出现问题,别担心,是正常的,我们最高效率解决问题就是从出现问题的地方出发去寻找解决办法!

        比如这一次,俩次问题都是因为串口那里实验现象不对或者改完后甚至没了实验现象,那我们就一直盯着uart文件改就行了,数值不对再考虑其他,笔者无头苍蝇一样找其他文件该错误浪费了很多时间。

一,没考虑定时器的冲突

        笔者之前用串口一直都是使用烧录软件生成好的,所以没注意到这次的定时的定时器1会与波特率产生使用的定时器1有冲突。那下面这种我们使用多次的就不能再用了。

void UartInit(void)		//9600bps@12.000MHz
{
	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x40;		//定时器1时钟为Fosc,即1T
	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;		//设定定时器1为16位自动重装方式
	TL1 = 0xC7;		//设定定时初值
	TH1 = 0xFE;		//设定定时初值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
}

二、自以为是,改成没bug的样子

        我们本次使用到的是下面这张图那样的代码。

        这里的自以为是就是说笔者自认为,T2L和T2H是打错了,因为笔者一开始看的是小蜜蜂的视频,那都包含了reg52.h和intrins.h这俩个头文件,依旧是报错说这俩个没找到定义,我就联想说是TH0这样的格式,改完之后,这个uart文件自然就废了,出现了上机位窗口全是空白无实验现象的问题,琢磨了很久,一处处对照,就这里不一样,笔者就去搜。

这时候才醒悟过来包含reg52.h文件会让T2L和T2H出现像AUXR没定义一样的问题,所以解决办法是一样的,如下代码。即加上定义,就可以正常使用,这是继续包含reg52文件的方法。

sfr AUXR=0x8E;
sfr T2H=0xD6;
sfr T2L=0xD7;
void UartInit(void)		//9600bps@12MHz
{
	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x01;		//串口1选择定时器2为波特率发生器
	AUXR |= 0x04;		//定时器2时钟为Fosc,即1T
	T2L = 0xC7;		//设定定时初值
	T2H = 0xFE;		//设定定时初值
	AUXR |= 0x10;		//启动定时器2
}

还有一种笔者更加推荐,现在才明白国一学长为什么要我们这样写。即

#include <STC15F2K60S2.H>

这样在.h文件里面包含之后,直接使用生成的代码而不用我们重新定义地址,很方便。

但是第一次使用这个头文件的同学可能会出现bug说打不开这个文件,ok,教程开始。

解决办法:

一,找到到达这个头文件的路径,并复制待用

 二、点开keil5,点开魔术棒,在C51这将路径添加进去,点击OK

 解决这俩处细节之后,才终于可以顺利的开始我们的手写代码之旅。 

框架

uart文件

 今天的主角NE555文件

三、结尾

        实验现象:用螺丝刀扭动Rb3频率和湿度会变化,在接近两千频率时,湿度接近九十。

至此,我们就对NE555频率测量有所掌握了,比赛由于这个模块是纯硬件电路模块,所以没有可编程的东西,掌握频率测量就可以了,大家快去默写实现实验现象的代码吧!

插曲:小蜜蜂版本的代码

优点:听完视频之后会觉得思路很清晰,就是按照正常写法去实现目的。

<think>嗯,用户问的是蓝桥杯单片机中如何用NE555测量频率。我需要先回忆一下NE555的基本工作原理,以及它在频率测量中的应用。首先,NE555通常被用作多谐振荡器,可以生成方波信号。在蓝桥杯单片机开发板中,可能通过NE555模块产生一定频率的方波,然后单片机需要测量这个频率。 接下来要考虑的是单片机如何测量频率。常用的方法有两种:法和周法。法是在固定时间内计数脉冲的数量,适用于高信号;周法则是测量一个脉冲周期的时间,适用于低信号。用户可能想知道这两种方法的具体实现步骤,以及如何在蓝桥杯的环境下应用。 然后需要结合蓝桥杯的比赛板子,可能使用的是STC15系列的单片机,比如IAP15F2K61S2。这类单片机有定时器和计数器功能,可以用来实现频率测量。比如,使用定时器0作为定时,定时1秒,同时使用定时器1作为计数器,统计外部脉冲的数量。这样在1秒内的脉冲数就是频率值。 另外,可能需要注意NE555的输出信号是否需要调理,比如是否需要分压或者整形,确保信号符合单片机的输入电平要求。同时,单片机的IO口模式设置,可能需要设置为输入模式,并可能使用外部中断或者计数器输入引脚。 用户可能还关心代码的结构,比如如何初始化定时器和计数器,如何计算频率,以及如何处理测量过程中的误差。需要给出具体的代码示例,但可能需要注意蓝桥杯比赛中是否对代码结构有特殊要求,比如必须使用特定的头文件或者函数。 另外,可能需要提到在测量过程中如何切换法和周法,以覆盖更广的频率范围。例如,当频率较高时使用法,频率较低时使用周法,以提高测量精度。 还需要考虑可能遇到的问题,比如信号抖动、噪声干扰,以及如何通过软件滤波(如多次测量取平均)来提高测量结果的稳定性。此外,定时器的精度和计数器的溢出处理也是需要注意的地方。 最后,需要验证整个方案的可行性,确保代码在蓝桥杯的开发板上能够正确运行,并且测量结果准确。可能还需要提醒用户在实际试时调整NE555的电阻电容参数,以生成不同频率的信号进行试。</think>在蓝桥杯单片机竞赛中,使用NE555测量频率的步骤如下: ### 一、硬件设计原理 1. **NE555电路配置** NE555需配置为**多谐振荡器模式**,其输出频率公式为: $$f = \frac{1.44}{(R_1 + 2R_2)C}$$ 其中$R_1$、$R_2$为电阻,$C$为电容。 2. **信号接入** 将NE555的输出引脚连接到单片机的**外部中断引脚**(如P3.2/INT0)或**定时器计数器输入引脚**(如P3.4/T0)。 ### 二、软件实现方法 #### 方法1:法(适合高) 1. **定时器配置** - 定时器0:设为定时模式(如1秒) - 定时器1:设为计数模式,统计NE555脉冲 2. **代码框架** ```c void Timer0_Init() { // 1秒定时 AUXR |= 0x80; TMOD &= 0xF0; TL0 = 0xCD; TH0 = 0xD4; ET0 = 1; TR0 = 1; } void Timer1_Init() { // 计数器模式 TMOD &= 0x0F; TMOD |= 0x50; TR1 = 1; } unsigned int freq = 0; void Timer0_ISR() interrupt 1 { TR1 = 0; freq = TH1 << 8 | TL1; TH1 = TL1 = 0; TR1 = 1; } ``` #### 方法2:周法(适合低) 1. **外部中断配置** 通过测量相邻两个上升沿的时间差计算周期。 2. **代码片段** ```c unsigned long t1, t2, period; void INT0_ISR() interrupt 0 { t2 = (TH0 << 8) | TL0; period = t2 - t1; t1 = t2; TH0 = TL0 = 0; } ``` ### 三、关键注意事项 1. **信号整形** NE555输出需添加施密特触发器(如74HC14)消除抖动 2. **量程切换** 建议设置阈值(如10kHz),高法,低周法 3. **误差处理** 可通过多次采样取平均(推荐8-16次)提高精度 ### 四、拓展优化 1. **动态显示** 使用数码管或LCD实时显示频率值 2. **自动量程** 根据测量值自动切换/周模式 3. **频率换算** 添加单位自动切换(Hz/kHz) 建议结合官方提供的CT107D开发板原理图,验证硬件连接后再进行编程调试。实际比赛中需注意代码效率和测量精度之间的平衡。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值