今天给各位分享定时器程序的知识,其中也会对单片机定时器应用实验程序进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
单片机定时器的使用方法
第一步:设置特殊功能寄存器TMOD,配置好工作模式。
第二步:设置计数寄存器TH0和TL0的初值。
第三步:设置TCON,通过TR0置1来让定时器开始计数。
第四步:判断TCON寄存器的TF0位,监测定时器溢出情况。
写程序之前,我们要先来学会计算如何用定时器定时时间。我们的晶振是11.0592M,时钟周期就是1/11059200,机器周期是12/11059200,假如要定时20ms,就是0.02秒,要经过x个机器周期得到0.02秒,我们来算一下x*12/11059200=0.02,得到x=18432。16位定时器的溢出值是65536(因65535再加1才是溢出),于是我们就可以这样操作,先给TH0和TL0一个初始值,让它们经过18432个机器周期后刚好达到65536,也就是溢出,溢出后可以通过检测TF0的值得知,就刚好是0.02秒。那么初值y=65536-18432=47104,转成16进制就是0xB800,也就是TH0=0xB8,TL0=0x00。
这样0.02秒的定时我们就做出来了,细心的同学会发现,如果初值直接给一个0x0000,一直到65536溢出,定时器定时值最大也就是71ms左右,那么我们想定时更长时间怎么办呢?用你小学学过的逻辑,倍数关系就可以解决此问题。
好了,我们下面就用程序来实现这个功能。
#include
sbitLED=P0^0;
sbitADDR0=P1^0;
sbitADDR1=P1^1;
sbitADDR2=P1^2;
sbitADDR3=P1^3;
sbitENLED=P1^4;
voidmain(){
unsignedcharcnt=0;//定义一个计数变量,记录T0溢出次数
ENLED=0;//使能U3,选择独立LED
ADDR3=1;
ADDR2=1;
ADDR1=1;
ADDR0=0;
TMOD=0x01;//设置T0为模式1
TH0=0xB8;//为T0赋初值0xB800
TL0=0x00;
TR0=1;//启动T0
while(1){
if(TF0==1){//判断T0是否溢出
TF0=0;//T0溢出后,清零中断标志
TH0=0xB8;//并重新赋初值
TL0=0x00;
cnt++;//计数值自加1
if(cnt》=50){//判断T0溢出是否达到50次
cnt=0;//达到50次后计数值清零
LED=~LED;//LED取反:0--》1、1--》0
}
}
}
}
程序中都写了注释,结合前几章学的内容,自己分析一下,不难理解。本程序实现的结果是开发板上最右边的小灯点亮一秒,熄灭一秒,也就是以0.5Hz的频率进行闪烁
单片机定时器应用实验程序
我来试试吧,用汇编语言编写:
ORG0
JMPMAIN
MAIN:SETBP1.0
ACALLDELAY
CLRP1.0
ACALLDELAY
JMPMAIN
DELAY:MOVR1,#10;500ms的延时子程序
MOVTMOD,#1;定时器0方式1
AGAIN:MOVTL0,#LOW(65536-50000);装载计数初值的低位
MOVTH0,#HIGH(65536-50000);装载计数初值的高位
SETBTR0;启动
LOOP1:JBCTF0,LOOP2;查询并清除溢出位
JMPLOOP1
LOOP2:DJNZR1,AGAIN
CLRTR0
RET
END
刚才我拿51的测试板编译了一下,下载后可以正常运行,你直接拷贝应该就能用,嘻嘻
定时器在单片机中程序的运行过程
我觉得是这样的,单片机的定时器,它的计数过程是相当于电脑里面一个后台运行的东东一样。在计数时单片机同时在执行其他程序,计数周期就是单片机的一个机器周期。
当我们给定时器初始化后,一但打开(这指内部定时器方式,还有外部脉冲计数方式,都差不多),下个机器周期到来便累加一次。计满时,即定时器十六位为0xffff,再计一次后,相应中断标志置1(TF0、TF1),若之前开启了相应的定时器中断(ET0、ET1)且有相应中断服务函数,单片机会暂停当前正在执行的程序,进入相应中断服务函数里面执行,若定时器还在开启状态,则仍会计数。中断执行完后回到暂停处的主程序里。在一个机器周期一般会做六件事情,其中有项是检查访问内部寄存器,包括中断标志。
文章到此结束,如果本次分享的定时器程序和单片机定时器应用实验程序的问题解决了您的问题,那么我们由衷的感到高兴!