第七课 :AI8051U定时器
哪怕梦想让我们拼的遍体鳞伤,这一次我们也要勇往直前!
关于定时器,单片机中最重要,也是最基础的一个单元,
1.定时器的介绍
2.定时器的应用
3.函数的定义、声明、调用
1定时器的介绍
问题:LED三秒闪烁一下,这三秒按下按键但是没有反应了?这怎么办呢?
答:因为MCU单核的,同一时间只能执行一个事情,没有特殊情况不能被打断。所以这里就要引入一个特殊的情况,定时器中断。
定时器作用:
(1) 用于计时系统,可实现软件计时,或者使程序每隔一固定时间完成一项操作
(2) 替代长时间的Delay,提高程序的运行效率和处理速度(可以打断主循环)
定时器的配置,可以使用ISP软件中的定时器计算器,可以很方便的得到定时器参数的配置代码;在这里需要注意系统时钟要确定下来.时钟确定下来以后,就可以根据时钟来计算参数.
图7-1
有的同学要问了,定时器中断是怎么执行的呢??
通过学习,我们就会知道了.
首先,通过ISP软件配置好定时器的参数,然后把ISP软件生成的定时器初始化代码,加入到我们的代码工程中.然后添加定时器中断的函数…..,简单吧,其实也不复杂!
图7-2-3 定时器的初始化函数,在主函数中进行调用
图7-4 定时器中断函数放在末尾
这里补充了一个关于keil0xfd的问题解决方法.其实就是KEIL软件对某些汉字不支持产生乱码,对于这些汉字使用时可以在汉字后面加上”\0xfd”
printf("数学"); //Keil 编译后打印会显示乱码
printf("数\xfd 学"); //显示正常
GB2312 中,包含 0xfd 编码的汉字如下:
褒饼昌除待谍洱俘庚过糊积箭烬君魁
例笼慢谬凝琵讫驱三升数她听妄锡淆
旋妖引育札正铸 佚冽邶埤荦蔟摭啐
帻猃恺泯潺妪纨琮椠辇挲臊忑睚铨稞
瘕颀螨簖酏觚鳊鼾
还有一种另类的方法,绕过这个问题,但不推荐,可能会产生莫名奇妙的问题,想尝试的同学可以试一下哦:
使用HexEditor编辑Keil安装目录下的/keil/c51/bin/c51.exe文件,搜索80FBFD改成80FBFF,如果使用汇编则修改A51.exe.
C251.EXE,A251.EXE没有试过,有改过的同学反馈一下哦.
2定时器的应用 :
分频:
图7-5 TM0PS
图7-6 AUXR的1T 12T模式也属于分频的范畴
图7-7 C/T 设置定时器为定时或计数模式
图7-8 定时器的软件或外部引脚控制模式
图7-9 TH计数寄存器(可以这么叫么)
图7-10定时器定时时间计算公式
所以说: 16位自动重载定时器的本质就是从设定值数到65536(溢出)之后置位一次标志位,如果使能ET0就可以进入中断!
定时器看起来挺复杂的哦,学过了,会用了,才知它的好处.
3.函数的定义、声明、调用
图7-11 函数的定义 声明 调用的格式 规则
来一个例子:
图7-12
图7-13 任务
思考:定时器一次只能定时一次,如果我有很多个定时任务怎么办?
我的理解是,定时器做规定时间的定时,当定时中断时,在定时中断函数内进行多任务的判断,如果某一个任务到达了规定的时间,则输出结果.
课后小练:
图7-14
通过以上的学习,复习了定时器的参数配置,定时时间的计算原理,以及多任务下,定时器中断的使用。