定时器延时

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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位。

相关文档
最新文档