[范例教程] 定时器产生指定延迟的delay函数

[复制链接]
 楼主| vivilyly 发表于 2023-10-15 15:31 | 显示全部楼层 |阅读模式


  1. void delay(unsigned int n)//STC89C52,晶振:11.0592MHZ
  2. {       
  3.         int i;
  4.         for(i=0;i<n;i++)
  5.         {
  6.                 TMOD &= 0xF0;               
  7.                 TMOD |= 0x01;                //定时器0,工作模式1
  8.                 TH0 = 0xFC;                        //至初值
  9.                 TL0 = 0x66;                        //定时1ms
  10.                 TF0 = 0;                        //清除溢出标志
  11.                 TR0 = 1;                        //开启定时器0
  12.                 EA=0;                                //关中断(使用查询方式)
  13.                 ET0=0;                                //关T0中断
  14.                 while(TF0 == 0);        //溢出等待
  15.                 TR0 = 0;                        //暂停定时器
  16.         }
  17. }


abotomson 发表于 2023-10-17 10:12 | 显示全部楼层
需要传入一个整数参数,表示要延迟的时间长度。
updownq 发表于 2023-10-17 10:21 | 显示全部楼层
在delay函数中,需要通过TMOD寄存器的设置来指定定时器的工作模式。例如,如果要使用1毫秒的延迟,需要将TMOD寄存器的TH0和TL0两位分别设置为0xFC和0x66,同时设置工作模式为1。
mikewalpole 发表于 2023-10-17 11:00 | 显示全部楼层
单片机的时钟频率会影响定时器的计时速度,因此在实现延迟时需要考虑单片机的时钟频率。
kmzuaz 发表于 2023-10-17 11:49 | 显示全部楼层
需要注意避免与其他中断源产生冲突,以免影响程序的正常执行。
sdCAD 发表于 2023-10-17 11:58 | 显示全部楼层
51 单片机的定时器是硬件定时器,其时间基准取决于系统时钟
timfordlare 发表于 2023-10-17 12:07 | 显示全部楼层
void delay(unsigned int ms)  // 声明延时函数  
{
   unsigned int i, j;  
   for (i = ms; i > 0; i--)  
       for (j = 114; j > 0; j--)  
           ;  
}
maqianqu 发表于 2023-10-17 12:32 | 显示全部楼层
需要注意延时时间的准确性、定时器的设置以及代码的优化。
albertaabbot 发表于 2023-10-17 12:41 | 显示全部楼层
循环的次数需要根据单片机的主频进行调整,以保证延时的准确性。
hudi008 发表于 2023-10-17 12:53 | 显示全部楼层
在使用定时器时,你需要注意定时器的时钟源和分频器的设置。这些设置会影响到定时器的计时精度和工作效率。
juliestephen 发表于 2023-10-17 13:10 | 显示全部楼层
可以定义一个参数xms来代表需要延时的毫秒数,然后在函数体中使用两个嵌套的for循环来实现延时。
xiaoyaodz 发表于 2023-10-17 13:26 | 显示全部楼层
在使用定时器产生指定延迟的delay函数时,需要仔细设置定时器的初值、工作模式、溢出标志和中断,以确保程序的正确性和稳定性。
abotomson 发表于 2023-10-17 13:55 | 显示全部楼层
当定时器溢出时,需要处理溢出标志位,以便在延迟结束后清除溢出标志位。
jackcat 发表于 2023-10-17 14:07 | 显示全部楼层
由于各种因素的影响,如晶振的频率误差、电路的负载变化等,实际的延时时间可能会与预期有所不同。因此,你需要根据实际情况进行调整,以保证延时时间的准确性。
fengm 发表于 2023-10-17 14:48 | 显示全部楼层
为了确保程序的正确性,应尽量避免在delay函数中使用其他可能会影响程序执行时间的操作,例如访问外部中断或执行耗时较长的运算。
iyoum 发表于 2023-10-17 16:18 | 显示全部楼层
在delay函数中,需要通过TF0寄存器的清除来及时清除定时器0的溢出标志。否则,当定时器0溢出时,会导致程序出现错误。
hudi008 发表于 2023-10-17 16:36 | 显示全部楼层
使用定时器实现延迟的精度取决于定时器的位数和单片机的时钟频率,一般来说,精度较高,但也不是绝对准确的。
robertesth 发表于 2023-10-17 17:25 | 显示全部楼层
应该尽量优化代码,以提高程序的运行效率。
sesefadou 发表于 2023-10-17 17:59 | 显示全部楼层
定义一个延时x毫秒的函数时,需要先计算出机器周期的时间。
lihuami 发表于 2023-10-17 18:32 | 显示全部楼层
单片机内部的时钟频率不同,因此产生的延迟时间也会有所不同,需要根据实际情况进行调整。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

109

主题

1988

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

109

主题

1988

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部