定时器延时
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void Timer0_Delay (int ms)
{
int i; // 毫秒计数器
TCON &= ~0x30; // 停止定时器T0并清除溢出标志
TMOD &= ~0x0f; // 配置定时器T0为16位模式
TMOD |= 0x01;
CKCON |= 0x08; // 定时器T0计数系统时钟
for (i = 0; i < ms; i++) { // 数毫秒
TR0 = 0; // 停定时器T0
TH0 = (-SYSCLK/1000) >> 8; // 设置定时器T0 1ms溢出
TL0 = -SYSCLK/1000;
TR0 = 1; // 启动定时器T0
while (TF0 == 0); // 等待溢出
TF0 = 0; // 清除溢出标志
}
}
===================================================================
系统时钟是11.059MHz
那么定时器每走一次是1/11.059us,那么5ms就要n=5000/(1/11.059)次,向定时器(若是16位)初值就是65536-n.
===================================================================
void Timer0Ebable(void)
{
EA = 0;
TMOD = (TMOD&0xF0)|0x01;
TL0 = (65535 - 2000)%256;
TH0 = (65536 - 2000)/256;
TR0 = 1;
ET0 = 1;
EA = 1;
}
void Timer0Int(void ) interrupt 1 using 0
{
Count++;
}
====================================================================
定时器延时程序
//定时器0模式1的延时程序
#include
void delay(unsigned int i);
main()
{
TMOD=0x01; //设定定时器0模式1
for(;;) //无限循环
{
P0=0X00;
delay(100);
}
}
void delay(unsigned int i)
{
TR0=1; //启动定时器
i=100; //设定溢出中断的次数
while(i!=0) //检查次数是否到了。i!=0时,次数没到,循环;i=0时,次数到了,跳出循环,关闭定时器;
{
TH0=0xd8;
TL0=0xf0;
while(TF0!=1); //TF0!=1时,循环等待(空语句);TF0=1时,跳出循环,执行TF0=0;TF0=0; //溢出后马上清TF0;
i--;
}
TR0=0; //关闭定时器
====================================================================
因为你用while循环延时时,循环了100,000次。已知CPU晶振为12M赫兹,则1个机器周期为1us。而100,000次等于100,000us等于100ms等于0.1s。
定时器中断时高8位TH0≈c3(十六进制)低8位TL0≈c3(十六进制),十六进制c3c3等于十进制50015,也就是你说的50,000。而使用定时中断时,CPU也是采用的12M赫兹的晶振,则计数频率位1M赫兹,即每微秒(us)计数器加1。
50,000等于50,000微秒等于50毫秒(ms)再乘以200则等于50ms*200=10000毫秒等于10s。这样差不多相差了100倍。
解决方法是用循环时要循环1000,000次。用定时器时50,000*20个周期就可以了:D
定时器中断程序执行前系统要做一些保护现场的的工作,中断后要恢复现场,而且必须等到正在执行的那条指令完成后才会调用中断
《我用while 循环延时循环了100,000 次》
怎么算条数的的?
i++这样的算1条
while这样的算2条
而不可能只是1个while得嵌套的那么执行一次就不一定是几us了
软延时的时间最简单的是用软仿真测试具体时间
或者自己计算(c的不会看汇编会吧编译成SRC文件看不就得了么)
C语言编一段定时器0延时一分钟的程序
哪位武林高手...可以帮我编一段定时器0延时一分钟的程序...这个是5ms程序...怎么变成1分钟?要求定时器中断0程序到了一分钟,P37取反...
void timer0_int(void) interrupt 1
{
TH0=0xee;
TL0=0x00;
while(TF0!=1);
{P37=~P37;
TF0=0;}
}
void timer0_int(void) interrupt 1
{
TR0=0;
unsigned long i=1;
TH0=0xee;
TL0=0x00;
i++
if(i==12000)
P37=~P37;
TR0=1
}
我刚学单片机的,我需要编写延时40ms的子程序,但不懂如何入手.麻烦高手们帮帮忙!
首先需要确定晶振频率,然后可以采用软件延时和硬件延时两种方法。
软件延时就是靠编写循环程序让其循环执行来达到延时目的,另一种方法是硬件延时,用单片机内部的定时器来产生延时效果,这种方法不占用CPU资源,推荐用此方法。
首先需要确定晶振频率,然后可以采用软件延时和硬件延时两种方法。
软件延时就是靠编写循环程序让其循环执行来达到延时目的,另一种方法是硬件延时,用单片机内部的定时器来产生延时效果,这种方法不占用CPU资源,推荐用此方法。
假设晶振频率12MHz,那么一个机器周期为12/12MHz=1us
软件延时40ms:
MOV R3,#200
DIY1:MOV R2,#100
DIY:DJNZ R2,DIY;执行一次2us,共执行20000次
DJNZ R3,DIY1
硬件延时涉及到定时器,需要计算定时初值,40ms可以采用定时器的模式1,最大可延时65ms,这个涉及到的东西较多,我就不具体说了,你可以查看单片机的相关书籍,上面讲的很详细。
由于定时器最大溢出时间大约为65MS(12M),所以需要使用定时器中断,在每次定时器溢出时把一个变量加1。2小时定时器需溢出几千次,变量应设置为16位。