沦陷理想高台 2023-04-19 12:06 采纳率: 46.4%
浏览 112
已结题

51单片机如何用定时器定时一秒的时长?

51单片机晶振如果是12Mhz,,那么时钟周期是1/12M,为什么机器周期是12/12M?
for(i=0,i<1000;i++),,这个循环i每加一次是一个机器周期还是一个时钟周期?如果是机器周期1000次循环是不是相当于过了1ms?

img

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-04-21 19:17
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 以下回答来自chatgpt:

      首先需要了解51单片机的时钟分频器和定时器,以及它们之间的关系。

      对于12MHz的晶振频率,51单片机的机器周期为12/12M=1us,即每个机器周期1us。但是,由于51单片机时钟分频器的作用,实际上单片机的运行时钟频率会比晶振频率低一些,分频倍数根据不同的晶振频率和时钟模式而定。

      在使用定时器实现一秒定时的过程中,可以通过计算定时器的初值和工作模式来实现。假设要实现的精度为1ms,在12MHz晶振频率下,使用12分频,即每秒钟时钟溢出次数为12*1000=12000次。因此,定时器的初值应设置为65536-12000=53536(因为定时器初值为2^16-计数值),同时选择定时器的工作模式为自动重载方式,即当计时器计满时自动重新装载计时初值,这样可以实现定时器的循环启动。每次定时器溢出后,可以在ISR中设置一个标志量,表示一秒时间已经过去,从而在主程序中实现相应的操作。

      关于for循环中i的增加是一个机器周期还是一个时钟周期,可以根据具体情况来决定。在单片机中,一般采用机器周期计数方式。因此,在循环中,i的增加是一个机器周期。如果需要更精确的计时,可以使用定时器来实现。每次定时器溢出后,在ISR中进行计数并清零计数器,从而实现更准确的计时。

      下面是一段参考代码实现一秒定时器:

      #include <reg51.h>
      
      #define TIMER0_RELOAD_VALUE 53536
      
      volatile unsigned char timerFlag = 0;
      
      void initTimer0(void)
      {
          TMOD |= 0x01; // 设置定时器0为模式1
          TH0 = TIMER0_RELOAD_VALUE >> 8;
          TL0 = TIMER0_RELOAD_VALUE & 0xFF;
          ET0 = 1; // 允许定时器0中断
          TR0 = 1; // 启动定时器0
      }
      
      void timer0Isr(void) interrupt 1
      {
          TH0 = TIMER0_RELOAD_VALUE >> 8;
          TL0 = TIMER0_RELOAD_VALUE & 0xFF;
          timerFlag = 1;
      }
      
      void main(void)
      {
          initTimer0();
      
          while (1)
          {
              if (timerFlag)
              {
                  // 代码段1
                  // ...
      
                  timerFlag = 0;
              }
      
              // 代码段2
              // ...
          }
      }
      

      其中,initTimer0()函数用于初始化定时器0,timer0Isr()函数是定时器0的中断服务程序,用于定时器溢出后的操作。在main()函数中,可以根据定义的timerFlag标志量来判断一秒时间是否已经过去,从而在代码段1中执行相应的操作。在代码段2中,可以放其他需要处理的代码段。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月1日
  • 已采纳回答 4月23日
  • 创建了问题 4月19日

悬赏问题

  • ¥100 python读取速度问题
  • ¥15 stm32f407使用DMA问题
  • ¥15 您好 这个API接口该怎么弄 网站搭建好了 API也有 现在就不知道该怎么填写API 不知道怎么用
  • ¥88 用uniapp写一个多端的程序,用到高德地图,用高德的JSAPI吗?
  • ¥20 关于#c++#的问题:水果店管理系统
  • ¥30 dbLinq最新版linq sqlite
  • ¥20 对D盘进行分盘之前没有将visual studio2022卸载掉,现在该如何下载回来
  • ¥15 完成虚拟机环境配置,还有安装kettle
  • ¥15 2024年全国大学生数据分析大赛A题:直播带货与电商产品的大数据分析 问题5. 请设计一份优惠券的投放策略,需要考虑优惠券的数量、优惠券的金额、投放时间段和投放商品种类等因素。求具体的python代码
  • ¥15 有人会搭建生鲜配送自营+平台的管理系统吗