首页 > 其他分享 >51单片机定时器实现delay函数

51单片机定时器实现delay函数

时间:2024-07-06 10:42:39浏览次数:11  
标签:12 周期 51 delay 单片机 65536 256 11059200 1000

参考内容:不记得原作地址了,很尴尬啊,

1.确定时钟周期、机器周期。

时钟周期由单片机的晶振频率Fclk决定。那么时钟周期就是1/Fclk(比如:11.0592MHz)。确定单片机的机器周期是n个时钟周期(n在51单片机下一般是12)。

2.确定需要单次定时器最大的计时时间长度

如果是16位的计数器,16位最大值是65535,共可计数65536次。如果是8位最大值是255,共可计数256次,12 * 65536/11059200 = 0.0711s,也就是说单次定时时间不超过71 ms

3.确定计数器初始值

先确定每一次要定时的时间长度,比如xms (注意不要超过步骤2的单次定时最长时间), 那么计数器的初始值如下:
TH0=(65536-Fclk/1000/nx)/256; //注意:这里的除以1000是认为Fclk的单位是MHz
TL0=(65536-Fclk/1000/n
x)%256;



1Hz:1秒内电流往返一次
晶振 11.0592MHz =11059200Hz
时钟周期  1/11059200 s(晶振的倒数)
机器周期是 12/11059200 s (标准框架下51单片机一个机器是12个时钟周期)
因为定时器是每个机器周期加1所以: 定时时间为 N时钟机器周期时间=所定时间T
所以要经过的机器周期是N
(12/11059200 s)=T
N=t/(12/11059200)
初值等于 65536-N(因为16位的定时器65535再加1才溢出)
如果是16位的计数器,16位最大值是65535,共可计数65536次。如果是8位最大值是255,共可计数256次,
例如:
需要定时50ms=0.05s
0.05/(12/11059200)=0.05(11059200/12)=0.05921600=46080
快速计算只需更改这个 ↑
初值y=65536-46080=19456=0X4C00

#include "REG52.H"
#include "INTRINS.H"


void timer0_delay_10ms(unsigned int t);

void main()
{
    while (1)
    {
        timer0_delay_10ms(100);
        P2 = ~P2;
    }
}


/***
 *
 1.确定时钟周期、机器周期。

时钟周期由单片机的晶振频率Fclk决定。那么时钟周期就是1/Fclk(比如:11.0592MHz)。确定单片机的机器周期是n个时钟周期(n在51单片机下一般是12)。

2.确定需要单次定时器最大的计时时间长度

如果是16位的计数器,16位最大值是65535,共可计数65536次。如果是8位最大值是255,共可计数256次,12 * 65536/11059200 = 0.0711s,也就是说单次定时时间不超过71 ms

3.确定计数器初始值

先确定每一次要定时的时间长度,比如xms (注意不要超过步骤2的单次定时最长时间), 那么计数器的初始值如下:
  TH0=(65536-Fclk/1000/n*x)/256;     //注意:这里的除以1000是认为Fclk的单位是MHz
  TL0=(65536-Fclk/1000/n*x)%256;
*********************************************************
*********************************************************
1Hz:1秒内电流往返一次
晶振           11.0592MHz =11059200Hz
时钟周期  1/11059200   s(晶振的倒数)
机器周期是 12/11059200 s (标准框架下51单片机一个机器是12个时钟周期)
因为定时器是每个机器周期加1所以: 定时时间为 N*时钟机器周期时间=所定时间T
所以要经过的机器周期是N*(12/11059200 s)=T
                  N=t/(12/11059200)
初值等于 65536-N(因为16位的定时器65535再加1才溢出)
 如果是16位的计数器,16位最大值是65535,共可计数65536次。如果是8位最大值是255,共可计数256次,
例如:
需要定时50ms=0.05s
0.05/(12/11059200)=0.05*(11059200/12)=0.05*921600=46080
                                快速计算只需更改这个 ↑
初值y=65536-46080=19456=0X4C00
 */
void timer0_delay_10ms(unsigned int t)
{
    unsigned int fclk = 11059200UL;
    unsigned char ms = 10;// 10ms
    unsigned int temp = 0;
    // 这个th tl不能动态计算,动态计算就不行,为什么
    // 我觉得 它是寄存器,寄存器只能配置,不能计算
    //    unsigned char th = (65536 - fclk / 1000 / 12 * ms) / 256;
    //    unsigned char tl = (65536 - fclk / 1000 / 12 * ms) % 256;
    unsigned char th = 220;//(65536 - fclk / 1000 / 12 * ms) / 256;
    unsigned char tl = 0;//(65536 - fclk / 1000 / 12 * ms) % 256;
    TMOD |= 0x1;
    //    TH0 = ((65535 + 1) - (ms / 1000 / (12 / fclk))) / 256;
    //    TL0 = ((65535 + 1) - (ms / 1000 / (12 / fclk))) % 256;
    //    TH0 = (65536 - fclk / 1000 / 12 * ms) / 256;
    //    TL0 = (65536 - fclk / 1000 / 12 * ms) % 256;
    TH0 = th;
    TL0 = tl;
    ET0 = 1;
    TR0 = 1;
    while (temp != t)
    {
        while (TF0)
        {
            TF0 = 0;
            TH0 = th;
            TL0 = tl;
            temp++;
        }
    }
    TR0 = 0;
}


标签:12,周期,51,delay,单片机,65536,256,11059200,1000
From: https://www.cnblogs.com/mofrite/p/18286975

相关文章

  • FreeRTOS中vTaskDelay 和 xTaskDelayUntil 的区别?
     vTaskDelay和xTaskDelayUntil是FreeRTOS提供的两种不同任务延迟函数,各自有其适用的场景和优缺点。vTaskDelay适用于简单的延迟操作,而xTaskDelayUntil提供了精确的周期控制能力。在设计FreeRTOS应用程序时,根据任务的时间要求选择合适的延迟机制,将有助于优化系统性......
  • 初学者指南:如何选择嵌入式Linux和单片机(MCU)
    前言在嵌入式系统开发领域,选择合适的平台是项目成功的关键之一。对于初学者来说,如何在嵌入式Linux和单片机(MCU)之间做出选择可能是一项艰巨的任务。本文将详细解释这两种平台的特点、优缺点,以及在不同应用场景中的适用性,帮助初学者做出明智的选择。嵌入式Linux简介概述嵌入......
  • 417、基于51单片机的热水器(燃气,温度,LCD1602,阀门PID)(程序+Proteus仿真+原理图+流程图+
    毕设帮助、开题指导、技术解答(有偿)见文未目录方案选择单片机的选择显示器选择方案一、设计功能二、Proteus仿真图单片机模块设计三、原理图四、程序源码资料包括:需要完整的资料可以点击下面的名片加下我,找我要资源压缩包的百度网盘下载地址及提取码。方案选择......
  • 【车载开发系列】常见单片机调试接口的区别
    【车载开发系列】常见单片机调试接口的区别【车载开发系列】常见单片机调试接口的区别【车载开发系列】常见单片机调试接口的区别一.JTAG协议二.SWD接口三.RDI接口四.仿真器1)J-Link仿真器2)ULink仿真器3)ST-LINK仿真器五.SWD/JTAG的各种区别六.信号线说明一......
  • 51单片机嵌入式开发:Protues开发板仿真平台制作
    Protues开发板仿真平台制作1软件配置2软件配置3初步建的工程及所用器件列表4测试代码5Protues中常用器件对应位置。Protues开发板51开发板的制作1软件配置2软件配置新建protues工程在所有的.C文件夹中,在仿真时可以看到执行的代码位置,目前按路径观察到......
  • 代码随想录算法训练营第五十二天 | 647.回文子串 516.最长回文子序列
    647.回文子串题目链接文章讲解视频讲解动态规划法动规五部曲:dp[i][j]:表示区间范围[i,j]的字串是否是回文串如果dp[i]表示下表为i的字符串有dp[i]个回文串的话,写不出递推公式,因为dp[i]和dp[i-1]没有什么关系,但如果已经知道i-j位置的字符串已经是回文串的话,只需判断i-1......
  • 洛谷P5517题解
    题目解释现有一数列:\(a_{0}=-3,a_{1}=-6,a_{2}=-12,a_{n}=3a_{n-1}+a_{n-2}-3a_{n-3}+3^n,求T组a_{n}\)modp的异或和题目思路分析抛开复杂度不谈,这道题可以用矩阵加速(矩阵的快速幂)和通项公式两种方法来做,这两种方法求一个\(a_{n}\)的时间复杂度都是\(log_2(n)\),但矩阵乘法需......
  • 代码随想录算法训练营第十三天|今天量大管饱144、145、94、102、107、199、637、429、
    今天来处理二叉树part1、2、3,顶级享受,一次到位。完全二叉树和满二叉树概念没问题。二叉搜索树,左子树所有结点的值小于它的根结点的值,右子树上所有结点的值大于它的根结点的值平衡二叉搜索树,它是一棵空树或它的左右两个子树的高度差的绝对值不超过1。二叉树的存储方式:链式存储......
  • 代码随想录算法训练营第九天|151.反转字符串中的单词、55.右旋字符串、28.找出字符串
    151以前写过很呆的写法但能用嘿1classSolution{2public:3stringreverseWords(strings){4//初始化变量5vector<vector<int>>data;//存储单词的起始地址和长度6stringans;//最终结果字符串7intnum=0;......
  • 【单片机毕业设计选题24046】-基于单片机的智能鱼缸设计
    系统功能:检测水温,水温过低开启PTC加热。检测水位,水位过低开启水泵抽水。检测湿度,湿度过高则开启风扇通风。检测PH值和浑浊度,TTS语音播报功能,OLED显示系统信息,蓝牙模块连接手机APP。系统上电后显示“欢迎使用智能鱼缸系统请稍后”两秒后进入正常显示页面。第一页面第一行显......