首页 > 编程知识 正文

单片机定时器中断(51单片机中的定时器在哪)

时间:2023-05-05 05:57:59 阅读:95117 作者:2262

单片机经常被称为MCU,MCU的全称是微控制单元,是微控制器的意思。 广袤的皮毛和虾经常被单片机用于控制一些设备的动作,所以物联网的终端,或者其他一些智能机器离不开单片机。

从手机、汽车到飞机,现在几乎所有的电子器件都有单片机的身影。

精确计时的重要性

传感器能够感知外界环境,可以说是所有智能机器的基础。 在实际工程中,经常使用单片机,控制传感器的工作,收集传感器的数据。 但是,无论是控制还是收集,单片机都需要与传感器进行通信,将控制命令发送到传感器,或者在单片机内部接收传感数据。

已经制定了若干通信协议以实现设备和装置之间的通信。 通信协议其实是一系列的约定,例如约定总线首先输出低电平的10us,然后输出高电平的30us表示0; 总线输出低电平10us,然后输出高电平100us,表示1。

可见,单片机要分析通信协议,只需要处理电信号和时间的关系。

假设在与单片机所在的传感器进行通信时,总线50us需要降低,则需要准确的计时器。 读取传感器数据时,需要判断总线是被传感器拉高30us,还是拉高100us,需要准确的计时器。

不精确的定时器

中,单片机如何把握准确的时机和时机? 本节以51单片机为例,对这个问题进行说明。

第3节中制作呼吸灯时使用的延迟函数c语言代码定义如下。

音频延迟(无符号整数)。

{

无符号整数x;

wile(n---- ) {

x=50;

while(x----;

}

}

但是,这是一个大致的时机。 因为每次软件运行所花的时间都不一样。 因此,上面的delay ) )函数只能用于对时间精度要求不高的“呼吸器”的小项目。

精确的定时器

单片机中相当一部分在内部拥有计数器资源。 计数器内部有寄存器,该寄存器的值在每个机器周期自动加1,但机器周期只与单片机的晶体振动有关。

我用的这台51单片机有两个计数器,它的晶体振动固定在11.0592MHz,一个机械周期等于12个时钟周期。 因此,每次将计数器加1时,时间就会经过n秒。 n的计算公式如下所示。

n=12 * (1/11.0592MHz )

该单片机的计数器的寄存器宽度为16位,因此最多可显示0xffff即65535。 当计数器进行一次全部计数(溢出)时,寄存器TFx被设置为1,因此通过检测TFx寄存器可以知道计数器是否进行了全部计数。

这样,就有了正确设计的计时器的想法。 请看以下c语言代码。

静态无符号计时器_ CNT=0;

voidset _ time r0(不可分割)。

{

timer _ CNT=(无符号整数) )浮点) tus * 11.0592/12.0 );

timer_cnt=65535 - timer_cnt;

th0=(timer_CNT8)0xff;

TL0=timer_cnt0xff;

TMOD |=0x01;

}

://p6.toutiaoimg.com/origin/pgc-image/f1f7234df30f4771a40280db6103d220?from=pc">

假设定时器计数 timer_cnt 次消耗 tus 微秒,那么让计数器计数 65535-timer_cnt 次就溢出,我们就可以检测 TF0 寄存器的值判断是否已经过去 tus 微秒。请看如下 C语言代码:

void start_timer0() { TF0 = 0; TR0 = 1; } void wait_timer0() { while(!TF0); TR0 = 0; TH0 = (timer_cnt>>8) & 0xff; TL0 = timer_cnt & 0xff; }

TR0 寄存器为高电平时,计数器才开始计数。如此一来,可以定义精确的延时函数,它的C语言代码如下:

set_timer0(10); void delay_10us(unsigned int n) { while(n--){ start_timer0(); wait_timer0(); } }

现在写如下控制程序,测试我们实现的精确定时器,请看如下C语言代码:

void main() { init_uart(9600); set_timer0(10); // 10us prints("program start...n"); while(1){ delay_10us(50000);delay_10us(50000); prints("1s past ...n"); } }

两句delay_10us(50000);表示延时 100万微秒(即 1秒)。编译程序并烧写到单片机,在电脑端打开串口调试工具,发现的确每隔 1秒打印一次 “1s past …”:

精确计时器

思路与设计精确定时器是一样的。因为暂时不方便测试,所以放入下一节再讨论。下一节将介绍一款温度、湿度传感器,并使用单片机采集之,发送到电脑端。这样一来,就可以点击鼠标知道室内的温度和湿度了。敬请关注!!!

欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。