求一个精准延时的函数(51单片机用),void delay(unsigned int t)
{
unsigned int i,j;
for(i=t;i>0;i–)
for(j=112;j>0;j–);
}
类似于这种,输入变量t, 就延时t毫秒,delay(1000)就是延时1秒。
,用定时器中断来做比较“精准“的延时,除此之外别无它法,这个”精准“取决于你晶体的的温飘、误差、电压等等指标。,怎么个精准法,你要的延时最小单位是多少,你用的晶振是多少兆的,要延时精准,只是相对的精准。定时部分用汇编写,再后期调试修正。,
- // 全局变量,ms时标
- unsigned char xms = 0;
- // 定时函数
- void delay(unsigned int t) {
- TR0 = 1; // 定时器 T0 开始计时
- while (xms != t); // 直至计时至 t ms 退出
- }
- // 定时器 T0 初始化
- void t0_init() {
- TMOD = 0x02; // 定时器 T0,方式 2
- TH0 = (256-200)%256; // 定时200us 初值
- TL0 = (256-200)%256;
- EA = 1;
- ET0 = 1;
- TR0 = 0;
- }
- void t0_srv() interrupt 1 {
- static unsigned char 200us = 0;
- 200us++;
- if (200us == 5) {
- xms++;
- 200us = 0;
- }
- }
复制代码
不知道这样可不可以呢?,第一、不同的单片机,比如STC12和STC8 速度就不同。你算那么精准有啥用?,第一、不同的单片机,比如STC12跟STC8就不一样。你算这么精准有啥用?
第二、同一片单片机芯片,不同的晶振频率速度也不一样。你算这么精准有啥用?
第三、相同的时钟,不同的指令,速度也不相同。你算这么精准有啥用?
第四、不同的变量长度,执行速度也不同。你算这么精准有啥用?
第五、不同的变量存放位置,执行速度也不同。你算这么精准有啥用?
第六、中断一打开,这种延迟函数 误差可能会增加250%,你算这么精准有啥用?
所以,看《人人学会单片机》课程,来学习我们的框架式编程方式。没要求的用计数延迟,有要求的必须定时器。程序里面不能这样死等、提高代码执行效率才是最需要考虑的事情。,可以用一些辅助软件计算的呢,论坛里也都有!,
1984528951 发表于 2021-1-14 15:47
怎么个精准法,你要的延时最小单位是多少,你用的晶振是多少兆的
当然是12MHZ的哟,
留住这一刻2014 发表于 2021-1-14 20:14
可以用一些辅助软件计算的呢,论坛里也都有!
是单片机小精灵吧,我知道哇,
cedtek 发表于 2021-1-14 17:11
不知道这样可不可以呢?
就是用定时器嘛,这个可以。,STC单片机的下载程序里头有软件延时程序计算器很方便,精准就呵呵了罢,除非你对精准的要求和“最美”一样随便就能拉一车。
软件写得再精准,没有精准的硬件还是不可能,难不成你是航天科技派出的探子
硬件大多都有个宽容度,大多对延时要求都不高,甚至很多步骤省去也能正常工作的,你可以调试好硬件后对单片机的主频(软件写或硬改晶振)动一下试试就知道了。,STC下载器有专用的软件延时,直接生成C或者汇编就可以了
就算是一样的时钟,不同的STC系列延时都不一样的
想要真正的精准,直接上汇编