一、概念和原理
冷门考到的知识点,在第十届也就是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频率测量有所掌握了,比赛由于这个模块是纯硬件电路模块,所以没有可编程的东西,掌握频率测量就可以了,大家快去默写实现实验现象的代码吧!
插曲:小蜜蜂版本的代码
优点:听完视频之后会觉得思路很清晰,就是按照正常写法去实现目的。