用户登录
用户注册

分享至

单片机延时工具软件 51单片机软件延时和定时器的区别

  • 作者: XX4763430
  • 来源: 51数据库
  • 2020-04-21

单片机进中断后执行中断里的程序,比如你进定时中断,执行完后退出中断后做其他事,但定时还在计数,这样计数和做其他事情两不误。

你的程序中本来就没做其他事情,你的LED移动就是等待中断计数到10才操作的,LED动作的先决条件就是中断计数结束更多

亲,首先谢谢您无私的奉献,小弟还有一点不理解,就上面的这个程序,在第一次进入中断定时器数数的时候,主程序在干什么? 好像什么也没有做,在等呢?是不是这样?

下面的程序就不一样了,没进中断时执行主循环,有中断就进中断,中断执行完再回到中断前主程序执行的位置

进中断后,主程序就等啊,等中断退出才回到主程序

谢谢您 ,如果是进中断后,主程序在等,那和软件延时,感觉差不多啊!!软件延时好比是在等的时间内在数数 是这样吗? 小弟刚开始学单片机,所以脑袋有些不开翘,嘿嘿

在你这个程序是差不多的,但是软件延时,就一直在那计数,要不然中断计数,中断计数器满了才进中断累加的,比如说,要定时1分钟,用延时的话,这一分钟都在delay,不能做其他事情,中断的话中断累加10次到达1分中的话,不到0.1分钟内的时间不进中断,那这0.1分钟可以做其他事情,等到0.1后进中断,累加一次,就退出中断,再过0.1才进中断,这之间大部分时间可以做其他了

真的谢谢您无私的奉献,感谢

编写一个延时10秒的程序单片机

//假设晶振12MHZ

#include "reg51.h"

unsigned int YSJS=0;

void main(void)

{

TMOD |= 0X10; //定时器1工作于方式1,16位定时器

TH1 = 0XFF; //定时器1定时时间=500uS

TL1 = 0X06;

ET1 = 1; //使能定时器1中断

EA =1; //开总中断

while(1)

{

}

}

void TIMER1(void) interrupt 3 //定时器1中断函数使用默认寄存器组

{

TH1 = 0XFF; //定时器1定时时间=500us

TL1 = 0X06;

YSJS++;

if(YSJS==20000) //500uS*20000=10000000us=10s

{

P1 = P1 ^ 0X01; //P1.0十秒钟翻转一次

YSJS = 0

}

}

关于51单片机用定时器1秒延时,这有个程序不知对了?求解。

你这个程序肯定不行,别说1秒,0.1秒都达不到,我帮你改一下:

void delay1()

{

uchar t = 19;

TMOD=0x10;

for(t=19;t>0;t--)

{

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

TR1=1;

while(!TF1);//等待定时器1溢出标志置位

TF1 = 0;//清0标志位

}

}

你没有说明晶体振荡器频率,所以定时器初值和循环次数t按原程序

谢谢你,大侠,我写的错在哪了啊?晶体是12MHz的。

你没有等待定时器溢出,怎能达到延时效果。

单片机的延时程序

执行空语句执行124次,大概就能延时到1秒.不是很准的。

如要算的话:

比如51,mdelay函数想延时1ms,而执行for(i=0;i<124;i++),假设4个机器周期,每个机器周期时长为[12*(1/晶振频率)秒],若晶振为6MHz时,每个机器周期为2us,这样124*4*2是992us,加上for(;Delay>0;Delay--)需要的8us,正好延时1ms

单片机延时0.5秒的程序

晶振11.0592M下的标准延时函数:

void one_msDelay(uint16 mtime) //1ms延时函数

{

for(; mtime > 0; mtime--)

{

uint16 j = 650;

while(--j);

}

}

循环个500次就是0.5s,你可以用示波器测一下。

单片机延时一秒的c程序

单片机延时一秒

程序是不固定的

要根据你的晶振 计算出一次循环执行需要的时间

然后 写循环次数

一般是

voiddelay_one_second(void)

{

inti;

for(i=0;i<TIMES;i++);

}

这样就可以了。 TIMES是要计算的。或者 根据示波器 自己尝试。

利用定时器T0的工作方式1实现1秒钟延时程序(单片机)

#include <reg51.h>

#define uchar unsigned char

sbit LED=P1^0;

uchar time;

void initT0( )

{

TMOD = 0x01; //定时器0,工作方式1

TH0 = (65536-50000)/256;

TL0 = (65536-50000)%256; //50ms中断一次

EA = 1;

ET0 = 1;

TR0 = 1;

}

void main(void)

{

initT0();

while(1)

if(time==20) //中断20次,1s

{

time=0;

LED=!LED; //P1.0上的LED,1s亮或灭一次

}

}

void T0int( ) interrupt 1

{

TH0 = (65536-65536)/256;

TL0 = (65536-65536)%256;

time++;

}

转载请注明出处51数据库 » 单片机延时工具软件 51单片机软件延时和定时器的区别

软件
前端设计
程序设计
Java相关