当前位置:看商机 > 行业资讯 > 资讯 > 单片机学习笔记之51内核软件延时和串口的巧妙方法

单片机学习笔记之51内核软件延时和串口的巧妙方法

发布时间:2020-12-28 11:16:45 点击次数:273

我不知道每个人都是如何深造51的。无论如何,我一路轻弹。如今,使用51来开发产品须要充分利用其内部资源。最初,主要的频率和资源不如32。如何在没有充分利用的情况下开发出优质的产品?然后今天我求学了两个小技巧:扩展时间和串口传输中断

情况就是这样。在产品开发中,我相遇了74hc595支配数码管。使用过此数字逻辑芯片的每个人都知道一个数字管是可以的。如果有多个,则须要连续刷新。然后达到在不同的位显示不同的破损代码(数字)的效果。这种刷新率还是很特别的。我不知道我的学说是否正确。无论如何,我知道将50hz的民用电连通到灯泡上,人眼看不到灯泡不停闪烁,然后基于此法则,我只需要确保50hz以上的频率(在20ms以内))即时刷新显示,但实际效果是我延迟了for循环刷新一次,几乎看不到闪烁。延迟是软件的5ms延迟,虽然不可靠,但几乎是一样的,我不明白为什么要花5ms才能扫除闪烁,反正只要按照实际结果,就出现了疑问5毫秒定期刷新,是否有可能MCU只是刷新数码管而没有做其他工作,这一般而言是不可能的。我在调试过程中实现的方法是这样的:

该程序没有操作系统,只有一般而言的while循环。循环中有许多任务,可能需要很长时间才能运转。然后我将复制更多的刷新函数,并根据任务的大体时间损耗将它们放置在不同的位置,这样效果十分显著,最少效果要好得多,然后出现了一个新疑问。当任务功能长时间执行时,依然会闪烁。有些朋友可能会认为,然后将刷新显示功能放在任务功能中。这确实是个好方法,我也在程序中使用了它,但是某些任务功能对时间有严苛的要求,因此它们其实不能放置在内部来扰乱其底层驱动程序。我使用的两种方法;

1.巧妙使用任务功能本身的延迟功能

例如,我在项目中使用了DHT11温度和湿度传感器。该传感器(包括DS18B20)是单总线协商,并且对时间要求十分严苛。我检视了底层驱动程序,发现并找到了一个相对较长的地方:

1.jpg

上图是DHT11的时序图,红线标记的地方是MCU提供给传感器的实际信号。这里的手册说它最少要低18ms,所以我在这里写一篇文章。以下是我修改的代码:

2.jpg

只需让这20ms的时间来做其他事情,即刷新数字管,当然,如果有操作系统,则操作系统的延迟调用机制将更进一步提高效率,在这里,请确保执行时间红色框中的类似于延迟所需的时间,并且传感器数据可以正常读取。我还估算没有实际的测试时间。算是,它不便利展开仿真,也不在公司手中。没有示波器。

2.使用串口发送中断

除了修改延迟时间外,还有一个棘手的地方,那就是串行端口发送一帧数据,而一帧数据相对较长。等候一个字节一个字节的发送需要太多时间,而且添加起来并不容易。刷新功能,我该怎么做,我忽然想到在发送中断之前使用32的串行端口。所以我检验了寄存器并对其开展了尝试,它确实有效性。这说明以前几乎没有使用过串行传输中断,修改之前和之后的代码如下:

3.jpg

请注意,字节按字节数依次发送。发送一个字节的函数原型如下:

4.jpg

修改后的串口中断功能:

5.jpg

从代码的构造来看,一般的法则是当没有数据要发送时,串行端口中断是关闭的。当有要发送的数据时,先打算好数据并将其存储在一个数组中,然后调用发送函数,发送函数的内容是开启串口的中断(ES=1),清除发送完成标记(TI=0),并即将发送的第一个数据放入寄存器(SBUF=dat[0)]),将模拟的发送数据地址对准已发送的第二个字节(因为第一个字节已发送)已发送),然后等候中断。每次发送一个字节时,串口都会进入中断功能。在中断功能中,首先断定它是否是发送中断(51内核串行端口的发送中断和接收中断使用相同的中断向量)。发送中断后,请确保清除中断。标记,然后继续放置下一个需要发送的数据(SBUF=WIFI_TX_DATA[TX_CNT++];),然后将需要发送的数据的地址移回。确定是否已发送所有数据发送,然后在发送后关闭串口中断,这样可以理想发送一帧数据,提高效率!

上面的方法只是一个简便的过程。检测长度是14字节的固定长度。如果是变长检测,可以根据实际情况开展修改。还有一个我在这里没有处置但需要注意的疑问,就是有一种情况需要考虑,当尚无发送一帧数据时,需要发送一个新的数据帧,在这种情况下,您需要修改存储方法,此处的注意事项是解决方案是将需要发送的数据存储到相对较大的数组,然后在每次发送时为该数组分派两个指针,分别是头指针(p)和尾指针(q)。首先断定它是否是(p=q),如果是,则验证以前的数据早已发送,现在可以不受阻碍了;如果不等于,则继续存储并同时回到尾指针q的位置(如果溢出,则回头看一下循环数组的方法)。