本文主要是介绍C8051f020之定时器实验,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
相信大家经过点灯实验和中断实验,对c8051系列单片机有了一定的了解,目前我们用到的延时函数还不够准确,那么怎么样才能自己手动配置一个准确时间的延时延时函数呢?
我们来看一下定时器的几种工作方式,本次实验我们用的是定时器0
那么这几种工作方式如何设置呢,下面我们来看一下TMOD寄存器第0-1位
下面我们来仔细看一下T0的方式0的原理图,方式0与方式1的原理框图一样,那么这张图我们可以看出SYSCLK(系统时钟)可以选择不分频,和可以12分频,通过第一个二选一多路选择器(红色下标1)来选择分频不分频,然后通过第二个多路选择器(红色下标2)来选择采用计数工作模式和定时工作模式,通过控制TMOD寄存器来选择TR0作为允许T0计数的允许位。
然后我们在通过配置TL0和TH0来配置初始值,例如采用16定时器当达到0xffff 时TF0置1,这时候我们可以根据计算,来算出我们初始值的大小,来实现精准定时。
我们用的晶振频率是2MHZ,经过12分频,则计一个数需要的时间T=12/2MHZ,那样我们需要计数多久的话,直接T*计数个数=定时时间,
计数个数=最大值(65535)-初值(装入TH0和TL0的值)
定时最长时间=T*65535
下面我们来看一下配置过程
1.配置分频方式T0M
2.配置计数方式
3.给定时器装初值
4.开启定时器控制TR0
下面看一下代码
现在大家肯定有疑问为什么我延时20ms,TH0和TL0设置成 TH0=0xF2; TL0=0xFB;
下面我来带大家一起计算一下,
下面大家肯定还有疑问为什么我要用
while(!TF0);
TF0=0;
TR0=0;
如果我不加这条while等待语句你可能看到,不管怎么设定初值都会看不到定时20ms的效果,我这个作用就是一直等待计数到达0(65536在来一个时钟)然后TF被置1,然后跳出循环。清除TF0,清楚TR0的目的是为了下次不设定完初值就立马跑,导致出现错误。
这次随堂练习自己写一个定时器中断,每隔30ms触发一次,然后中断服务函数中实现点亮一次led灯
定时器2实验
1.选择定时器计数方式
2.选择时钟分频
3.装入初值
这篇关于C8051f020之定时器实验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!