单片机常被称作 MCU,MCU 的全称是 Micro Control Unit,就是微型控制器的意思。顾名思义,单片机常被用于控制一些器件工作,因此物联网的终端,或者其他一些智能机器,都是离不开单片机的。

小到手机,大到汽车飞机,现在几乎只要是电子器件,就有单片机的身影。

精确计时的重要性

传感器能够感知外界环境,可以说是一切智能机器的基础。实际工程中,常常使用单片机或者控制传感器工作,或者采集传感器的数据。但是不管是控制还是采集,单片机都需要与传感器通信,这样才能将控制命令发送到传感器,或者将传感数据接收到单片机内部。

为了实现器件与器件之间的通信,人们制定了一些通信协议。通信协议其实就是一系列约定,比如约定总线先输出低电平 10us,再输出高电平 30us 表示 0;总线先输出低电平 10us,再输出高电平 100us 表示 1。

可以看出,如果单片机要解析通信协议,就只需要处理电信号与时间的关系就可以了

假设单片机在与某个传感器通信时,需要拉低总线 50us,这就需要一个精确的定时器。在读传感器数据时,需要判断总线究竟被传感器拉高了 30us 还是 100us,这就需要一个精确的计时器。

不精确的定时器

那么单片机怎样才能精确的定时和计时呢?本节就以 51 单片机为例,来说一下这个问题。

在第三节制作呼吸灯时,用到的延时函数C语言代码是如下定义的:

void delay(unsigned int n){ unsigned int x; while(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语言代码:

static unsigned int timer_cnt = 0;void set_timer0(unsigned int tus){  timer_cnt = (unsigned int)((float)tus * 11.0592 / 12.0); timer_cnt = 65535 - timer_cnt; TH0 = (timer_cnt>>8) & 0xff; TL0 = timer_cnt & 0xff; TMOD |= 0x01;}

假设定时器计数 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..."); while(1){  delay_10us(50000);delay_10us(50000);  prints("1s past ..."); }}

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

精确计时器

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

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

单片机机器周期怎么计算公式_单片机很好玩6,单片机是一切智能机器的基础,就是这么嚣张...相关推荐

  1. 单片机机器周期怎么计算公式_什么是晶振,对于单片机来说它有什么重要作用?...

    一.什么是晶振 晶振一般叫做晶体谐振器,是一种机电器件,是用电损耗很小的石英晶体经精密切割磨削并镀上电极焊上引线做成. 对于单片机来说晶振是很重要的,可以说是没有晶振就没有时钟周期,没有时钟周期就无法 ...

  2. 单片机机器周期怎么计算公式_单片机指令周期怎么计算

    描述 指令周期:指令周期执行某一条指令所消耗的时间,它等于机器周期的整数倍.传统的80C51单片机的指令周期大多数是单周期指令,也就是指令周期=机器周期,少部分是双周期指令.现在(截至2012)新的单 ...

  3. 单片机机器周期怎么计算公式_单片机定时器周期计算公式

    定时器是单片机的重要功能模块之一,在检测.控制领域有广泛应用.定时器常用作定时时钟,以实现定时检测,定时响应.定时控制,并且可以产生ms宽的脉冲信号,驱动步进电机.定时和计数的最终功能都是通过计数实现 ...

  4. 单片机机器周期怎么计算公式_单片机的机器周期计算

    单片机的机器周期计算~2007-08-31 10:32 这么个最简单的问题,总是忘记,日了,现在干脆给记下来,以后再忘记的话就看一看好了. 1.时钟周期 时钟周期T又称为状态周期,是时序中最小的时间单 ...

  5. 单片机彩灯移动实验_基于构建主义的单片机彩灯实验

    基于构建主义的单片机彩灯实验 构建主义主张,学习不是由教师把知识信息简单地传 递给学生,而是要由学生自己主动地构建知识的意义,这种 构建是无法由他人来代替的.可以设想,如果我们的实验总 是先把实验的内 ...

  6. 单片机音频节奏灯_用C51写的单片机音乐彩灯程序

    #define TLEDS 20//每个花样状态持续时间,以50mS为单位 #define NUM_OF_LED_S 4//每种模式LED花样数? typedef unsigned char uch ...

  7. 单片机定时器精准定时_单片机很好玩6,制作一个精确的“定时器”,为什么这么重要?...

    单片机常被称作 MCU,MCU 的全称是 Micro Control Unit,就是微型控制器的意思.顾名思义,单片机常被用于控制一些器件工作,因此物联网的终端,或者其他一些智能机器,都是离不开单片机 ...

  8. 汇编烧程序进单片机要什么软件_单片机编程语言及应用技巧解析

    1. C语言和汇编语言在开发单片机时各有哪些优缺点? 汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言.其主要优点是占用资源少.程序执行效率高.但是不同的CPU, 其汇编语 ...

  9. 单片机广告灯实验总结_温州很强的ly51s单片机程序开发公司

    温州很强的ly51s单片机程序开发公司 sdthfsfd 温州很强的ly51s单片机程序开发公司 "时,表示波特率自适应工作正确完成,如图所示,可以进行参数设置和校准操作.这也是为什么晶振的 ...

最新文章

  1. 软件开发的“三重门”
  2. OJ1059: 最高分(C语言)
  3. 工作任务:解决双主控倒换时双机切换问题
  4. 计算机基础ppt_为什么大学老师教编程上课都不敲代码?为何老师上课都是PPT讲解,实战呢?...
  5. 阿里云datav看板然后设置密码
  6. 云队友丨张朝阳不再狂妄,搜狐的艰难复苏路
  7. 用Python+Qt+Java整一个百宝箱
  8. SUST_2018 焦作站亚洲区域赛校内选拔赛题解
  9. webshell、木马与后门之间的区别
  10. Snowflake Snow Snowflakes
  11. 用GCTA计算亲缘关系矩阵和遗传力
  12. 【Latex】高级插入图片技巧: 双栏中如何正确插入图片 + 如何多图
  13. numeric_limits的运用
  14. Linux下嵌入式开发环境配置
  15. C语言错误信息报告函数strerror、perror的使用
  16. fluent python 2nd edition_fluent python读书笔记2.2节
  17. 7、KNN(K近邻)
  18. (八)Azkaban单服务安装
  19. Android中使用自带TextToSpeech实现语音合成时Pico TTS引擎不能播放中文怎样解决
  20. TED演讲的字幕下载

热门文章

  1. unique函数详解
  2. Python之Requests
  3. MySQL中常见的单行函数(上)
  4. MySQL中如何删除数据
  5. Spring boot错误处理原理
  6. 威纶和s7200通讯线_PLC通讯,西门子plc通讯知识汇总学习
  7. 移动**21*设置无法接通_电话打得出去,但别人打你的电话提示用户无法接通,是怎么回事?...
  8. 【深入Java虚拟机JVM 04】JVM内存溢出OutOfMemoryError异常实例
  9. 【KVM系列05】Libvirt 介绍
  10. Java设计模式——迭代器模式