导航:首页 > 操作系统 > 单片机定时器延时

单片机定时器延时

发布时间:2022-12-14 23:26:09

A. 如何用单片机的delay实现延时

单片机中的delay()的单位时间不是系统提供的,而是用户自己编制的。

如果用循环语句实现的循环,没法计算,但是可以通过软件仿真看到具体时间,但是一般精精确延时是没法用循环语句实现的。

如果想精确延时,一般需要用到定时器,延时时间与晶振有关系,单片机系统一般常选用11.059 2 MHz、12 MHz或6 MHz晶振。第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。本程序中假设使用频率为12 MHz的晶振。

最长的延时时间可达216=65 536 μs。若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。

(1)单片机定时器延时扩展阅读

单片机C语言程序中延时函数delay的原理是:仅仅执行一些,没有实质性影响的所谓“无意义指令”,比如做比大小啊,做某个int的自加运算啊之类的。

单片机的有些程序需要调用延时程序,合理的安排循环次数以及空操作的个数方法:用汇编的话就根据你的当前晶振频率去推算你的指令周期,然后结合需要延迟的时间。

编写延迟程序,用C的话还是要看最后生成的汇编码是什么样的了。最简单的方法就是写好程序以后再编译器里软仿真看时间。

单片机C语言延时需注意的问题:

标准的C语言中没有空语句。但在单片机的C语言编程中,经常需要用几个空指令产生短延时的效果。这在汇编语言中很容易实现,写几个nop就行了。

在keil C51中,直接调用库函数:

#include // 声明了void _nop_(void);

_nop_(); // 产生一条NOP指令

作用:对于延时很短的,要求在us级的,采用“_nop_”函数,这个函数相当汇编NOP指令,延时几微秒。NOP指令为单周期指令,可由晶振频率算出延时时间,对于12M晶振,延时1uS。对于延时比较长的,要求在大于10us,采用C51中的循环语句来实现。

B. 51单片机用定时器查新的方法编写一秒的延时程序,fosc=12MHZ

一、用定时器中断,50ms中断的1 次,20次就是1秒
#include <REG51.H>
#define uchar unsigned char
sbit LED =P1^1; //接一LED,1 秒钟亮或灭一次
uchar time;
void init_t0int()
{
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void main()
{
init_t0int();
while(1);
}

void t0int() interrupt 1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
time++;
if(time==20)
{
time=0;
LED=~LED;
}
}

二、用循环延时可能程序更简单一点,但没实际意义 。单片机在这1 秒内只能循环而不能做其它事。
#include<reg51.h>
sbit LED=P1^0;
void delay_ms(unsigned char ms)
{
unsigned char i;
while(ms--)
for(i=0;i<123;i++);
}
void main()
{
while(1)
{
delay_ms(1000);
LED=~P1^0; //P1.0接一LED,可看到LED每1S亮或灭一次
}
}
参考资料: LED

C. 单片机定时器延时计算方法

用延时函数就可以实现;
首先,设置定时器工作方式,也就是TMOD,在设置TH0/1,TL0/1的初值,也就是定时时间的设置,然后设置中断允许,并开中断就可以;
参考例子如下:
#include<reg51.h>
void main()
{
TMOD=0X01;
TH0=0X3C;
TL0=0XB0;
EA=1;
ET0=1;
TR0=1;
while(1);
}
void timer0() interrupt 1
{
TH0=0X3F;
TL0=0XB0;
}

D. 51单片机软件延时和定时器的区别

区别就是用单片机软件定时,CPU循环执行一小段延时程序,浪费CPU的精力,用定时器定时,CPU就可以干别的。

如果是程序延时的话,时间消耗在(延时程序+剩下的代码);计时器中断则相当于把延时程序交给定时器,此时CPU可以干别的事情,提高了效率。就类似于电脑打游戏时把图形处理任务交给显卡,CPU的压力就小。

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

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

(4)单片机定时器延时扩展阅读

1、软件循环延时:采用循环语句,如for,while等,进行长时间的空操作,或者空语句。


优点:程序理解简易,入手快,新手必备武器。


缺点:时间精度不高,且占用单片机大量时间资源,引发其它子函数的不流畅(卡滞、迟钝),导致系统实时反应能力下降。


2、定时延时:采用定时器定时,如T0,T1;


优点:时间精度高,提高系统程序执行的高效性,不影响子函数的正常运行。

缺点:需占用1个定时器资源(可以复用),需良好程序构架支持,入手难。


个人建议:一旦学会定时器,就不应该再使用“循环延时”函数,采用定时器才是正道。如果对延时精度要求不高,建议使用结构体组成多个延时体。

E. 怎么写段单片机延时函数要用定时器!

1、首先分析您的程序,
void
delay()
{
int
i;
if(1
==
TF0)//if(TF0==1),查询定时器溢出标志位
{
TF0=0;
i=10000;//定时溢出时给i赋值1000
TH0=0xDC;TL0=0x00;
i--;//i=999,如果还没有减到0时定时器又溢出,则i永远不会减到0!!!!所以您的这段程序不应该行不通!!
}
while(1)
{
if(i==0)
break
;
}
}
2、建议做法
(1)定义一个全局变量用于作定时计数如unsigned
char
n;
(2)定时器采用以某一时间基准(10ms)中断方式,每中断一次中断处理程序里n++;
(3)在延时函数中对n进行操作,如延时1s即1000ms则:
void
delay_1s()
{
while(n<100);//如果n<100,即还没有到1s就等待
n=0;如果1s时间到则清零n,退出子程序
}
当然这样定时精度可能需要调整,但思路可以试试。

F. 51单片机中,定时器怎么做延时函数用,比如说,要精确延时1s,该怎么写

unsigned long TimeTickCount;//1ms计时器
void Timer0Configuration();
void Delay1ms(unsigned int a);
void main()

{
while(1)
{
Delay1ms(1000);//1s延时;
}
}
void Delay1ms(unsigned int a)//0~65535
{
unsigned long b;//0~0xffffffff
b = TimeTickCount;//记下及时器初始值
while((TimeTickCount-b<a)||(0xffffffff+TimeTickCount-b<a));
//当计数器未溢出只须用 计数器实时变化的值-其初始值
//当计数器溢出则须用 计时器上限值+计数器实时变化的值-其初始值
}
void Timer1Configuration()
{
TMOD=0X10;//选择为定时器模式,工作方式1。
TH1=0Xfc; //给定时器赋初值,定时1000us
TL1=0X18;
ET1=1;//打开定时器1中断允许
EA=1;//打开总中断
TR1=1;//打开定时器
}
void interrupt_timer1() interrupt 3 //1000us
{
TH1 = 0xfc; //重装
TL1 = 0x18;
TimeTickCount++;//1000us计时器
}

G. 单片机怎么用定时器替代延时函数

1、首先分析您的程序,
void
delay()
{
int
i;
if(1
==
tf0)//if(tf0==1),查询定时器溢出标志位
{
tf0=0;
i=10000;//定时溢出时给i赋值1000
th0=0xdc;tl0=0x00;
i--;//i=999,如果还没有减到0时定时器又溢出,则i永远不会减到0!!!!所以您的这段程序不应该行不通!!
}
while(1)
{
if(i==0)
break
;
}
}
2、建议做法
(1)定义一个全局变量用于作定时计数如unsigned
char
n;
(2)定时器采用以某一时间基准(10ms)中断方式,每中断一次中断处理程序里n++;
(3)在延时函数中对n进行操作,如延时1s即1000ms则:
void
delay_1s()
{
while(n<100);//如果n<100,即还没有到1s就等待
n=0;如果1s时间到则清零n,退出子程序
}
当然这样定时精度可能需要调整,但思路可以试试。

H. 解释一下51单片机定时器延时的查询法和中断法各是什么

就好像你在烧一壶开水,查询法就是你不停的去查看水开了没有,中断法就是等水开了,水壶就会鸣笛,这时你去关火倒水。其中水壶鸣笛就是触发中断的,而你去关火倒水算是一个中断服务。很明显,相比查询的方法中断可以极大提高程序的效率,你不必一直不停的查看水开了没有而专注于其他的事情,只需到水响之后去关火倒水即可。

I. 用定时器1的工作方式2实现延时1s的程序是什么(单片机)

用定时器1的工作方式2实现延时1s 不好,方式2最大只能定时256us,中断太频繁了.
主程序中:
uint a=0;
TMOD=0X20;
TH1=256-200;//定时200us
TL1=256-200;
ET1=1;
EA=1;
TR1=1;
中断程序里:
a++;
if(a ==5000)
{
a=0;
其它操作
}

J. 单片机定时器做精确延时问题

定时器溢出好像和cy没有关系吧。我记得cy是程序状态字寄存器(psw),是执行算术运算和逻辑运算时判断第7位是否进位的一个标志位。所以cy不会变1.
定时器控制寄存器是tcon,tf0属于tcon,用于计数溢出的标志位。

阅读全文

与单片机定时器延时相关的资料

热点内容
dvd光盘存储汉子算法 浏览:755
苹果邮件无法连接服务器地址 浏览:958
phpffmpeg转码 浏览:669
长沙好玩的解压项目 浏览:140
专属学情分析报告是什么app 浏览:562
php工程部署 浏览:831
android全屏透明 浏览:730
阿里云服务器已开通怎么办 浏览:801
光遇为什么登录时服务器已满 浏览:300
PDF分析 浏览:482
h3c光纤全工半全工设置命令 浏览:139
公司法pdf下载 浏览:379
linuxmarkdown 浏览:349
华为手机怎么多选文件夹 浏览:681
如何取消命令方块指令 浏览:347
风翼app为什么进不去了 浏览:776
im4java压缩图片 浏览:360
数据查询网站源码 浏览:148
伊克塞尔文档怎么进行加密 浏览:888
app转账是什么 浏览:161