阅读 45

单片机软件延时,单片机io口延时可调的设置

想必现在有很多小伙伴对于什么是单片机软件延时都比较想要了解,那么今天小编就为大家收集了一些关于单片机io口延时可调的设置知识,现在开始吧!

用定时器做最精确,用延时程序的话,误差较大。以下用定时器来做一个。 #include #define uchar unsigned char uchar sec,min,cnt; sbit key=P1^0; sbit led=P1^4; void t0isr() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; cnt++; if(cnt>20) { cnt=0; sec++; if(sec>59) { sec=0; min++; if(min>59){min=0;TR0=0;led=0;} } } } main() { TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; ET0=1; EA=1; while(1) { if(key==0) { while(key==0); TR0=1; } } }

6M晶振,一个机器周期2us 方式0最多计数65536也就是13072.us 无法满足10s 因此可以用定时器计数50000也就是0.1s 计10个这样的数就能满足要求,也就是一开始给一个寄存器赋值10,进入中断减1

1.软件延时

利用多个指令的执行来延时,累加每个指令的运行时间,来计算出延时的总时间。一般写成一个延时函数。

如,以下是10ms软件延时。

delay_10ms() {

int c = 1000; // 调整常数,以达到要求的延时,但很难!

while(c != 0) {

c--;

}

}

以上函数被调用一次,就延时10ms,多次调用可以达到任意更大的时间要求。

!但是,在延时时,就其它什么事也做不了了,就是干等啊!

2.硬件延时

利用定时器/计数器芯片,或用微控制器内部的定时器/计数器,实际上,它就是对晶振的分频(分频系数可编程设置),得到一个精确的低频的周期信号,用这个周期信号(比如10ms)去触发中断,每10ms调用一次定时中断服务程序。在定时中断服务程序中加入计数变量,就可以得到任意的定时了。

在10ms没有到时,微控制器可以运行其它程序,10ms到时再自动进去中断服务程序以处理定时任务,不会像软件延时阻塞了。

3.操作系统中,都有个硬件延时,和定时中断,可以看ucos ii中的源码,节拍时钟,和汇编语言实现的定时中断。

4.硬件延时,要占用一个定时器/计数器硬件资源。

Delay: MOV R7,#64H ;本条指令1TLOOP: MOV R7,#0FAH ;本条指令1T执行100次DJNZ R6,$ ;本条指令2T执行100*250次DJNZ R7,LOOP ;本条指令2T执行100次RET ;本条指令2T延时时间为:1+100+2*100*250+2*100+2=50303T=100606us=100.606ms

利用for循环计数的方式耗用处理器时间,从而达到延时的目的

文章分类
百科问答
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐