登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 软件延时 快来看看

[复制链接]
发表于 2018-2-7 19:48:53 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 单片机
学习安排: 学会利用软件延时,熟练写出各种延时函数
开始时间: 2018-02-07
结束时间: 2018-02-07
(第一次发帖)初学软件延时,大家想到的应该是for循环和while循环。比如for(i=0;i<200;i++);或者while(i--);等,通过改变变量大小来改变延时长短,for和while都可以形成嵌套以延长更长时间。
注意:要看清变量围,有时写带形参的程序时会忘记变量范围比如
void delay_us(unsigned char i)
{
   while(i--);
}
调用时写delay_us(1000);这时编译不会警告,unsigned char型最大为255,一旦溢出延时就不准确了。
优点:程序理解简易,容易掌握。
缺点:因为不是汇编语言,语句执行时间不确定,所以时间精度不高,且占用单片机大量时间资源。
  
其次想到的是nop语句比如_nop_();nop语句在intrins.h库里,它延时一个机器周期,可以用来做微秒级的延时。
注意:调用时要包括intrins.h
优点:比较精确。
缺点:单片机不做任何事,浪费资源。

再然后是定时器延时,定时器可以12分频也可以不分频,看你延时多少,定时器的精度与晶振有关,我曾经写过一个用定时器延时的函数如下
void delay_us(unsigned int i)//32MHz不分频(ω)
{
    unsigned int time,temp;
    time=i/32;
    TH0=0;
    TL0=0;
    TR0=1;
    while((temp<<8)|(TL0-8)!=time)
    {
        temp=TH0;
    }
    TR0=0;
    TH0=0;
    TL0=0;
}
那个-8是调用及计算所消耗的时间,-8使误差更小。这个比较精确。另外也可以写一个定时器中断函数,这样不占用单片机时间。
注意:定时器要清空。
优点:比较精确。
缺点:占用定时器,占用单片机时间(写在中断里不占用CPU时间)

最后一种(ω) 利用STC-ISP软件如图

194849cr7wqhpsrrdrcihl.jpg
这个是我不久前看到的功能,非常好用。它以经包括了吊调用时间,直接用就行。
优点:精确,简单粗暴。
缺点:好像没什么缺点。

说完了延时函数,在再来看看如何查看到底延时多少,用的最多得是keil自带的模拟器。
点一下这个。
194850kmbx39ymb33db3cn.jpg
然后设置断点,在要观察的语句前双击左键,会出现红色方块

194852dr4hqvvjjww5lwyq.jpg
点击全速运行按钮

194853uyftndd7ddzc4h5i.jpg

记下俩次时间之差就是了。

总结:最重要的就是掌握方法后自己亲自实验,我在编写程序时遇到的问题在上面的注意里,这些错误犯了不少,慢慢就会有经验了,千万不要ヽ(≧Д≦)ノ着急。
祝大家学寒假快乐,打字打地手痛╯﹏╰。
好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表