单片机延时时间程序怎么编程
答案:5 悬赏:20 手机版
解决时间 2021-02-04 11:54
- 提问者网友:山高云阔
- 2021-02-03 23:50
单片机延时时间程序怎么编程
最佳答案
- 五星知识达人网友:鸽屿
- 2021-02-04 00:23
举一个例子来说明吧.比如你要编一个延时50毫秒的子程序,那么步骤如下:
1、查看一下你的硬件环境,比如晶振大小,CPU型号,不用CPU指令的机器周期是不一样的。
2、计算延时需要的机器周期。比如采用12M晶振,CPU采用通用8051,那么一个机器周期为1US,50毫秒为50*1000=50000US,需要的机器周期=50000/1=50000。
3、试编程,如下:
程序代码 指令时间 总共时间
DELAY50MS: ;2 2
MOV R7,#A ;1 1
DELAY1:
MOV R6,#B ;1 1*A
DJNZ R6,$ ;2 2*B*A
DJNZ R7,DELAY1 ;2 2*A
RET ;2 2
所以总时间=2+1+A+2*A*B+2*A+2=5+3A+2AB
4、凑数求A、B
根据2、3得到如下式子:
50000=5+3A+2AB
可以有很多种结果,不过最好是以A尽可能小,B尽可能大为原则,当然不能大于255.
我现在凑出A=110,B=225;那么总延时时间=5+3*110+2*110*225=49835。还差165US
5、补齐不够时间
再加一个小循环就OK了,呵呵如下:
MOV R6,#C
DJNZ R6,$
会算了吧,2*C+1=165;所以C=82。
现在完整的延时程序出来了,如下:
DELAY50MS: ;2 2
MOV R7,#110 ;1 1
DELAY1:
MOV R6,#225 ;1 1*110
DJNZ R6,$ ;2 2*225*110
DJNZ R7,DELAY1 ;2 2*110
MOV R6,#82 ;1 1
DJNZ R6,$ ;2 2*82
RET ;2 2
很圆满:总的时间50000微妙,也就是50毫秒。这种方式编程,在该硬件环境下可以保证最大误差为1微妙。
1、查看一下你的硬件环境,比如晶振大小,CPU型号,不用CPU指令的机器周期是不一样的。
2、计算延时需要的机器周期。比如采用12M晶振,CPU采用通用8051,那么一个机器周期为1US,50毫秒为50*1000=50000US,需要的机器周期=50000/1=50000。
3、试编程,如下:
程序代码 指令时间 总共时间
DELAY50MS: ;2 2
MOV R7,#A ;1 1
DELAY1:
MOV R6,#B ;1 1*A
DJNZ R6,$ ;2 2*B*A
DJNZ R7,DELAY1 ;2 2*A
RET ;2 2
所以总时间=2+1+A+2*A*B+2*A+2=5+3A+2AB
4、凑数求A、B
根据2、3得到如下式子:
50000=5+3A+2AB
可以有很多种结果,不过最好是以A尽可能小,B尽可能大为原则,当然不能大于255.
我现在凑出A=110,B=225;那么总延时时间=5+3*110+2*110*225=49835。还差165US
5、补齐不够时间
再加一个小循环就OK了,呵呵如下:
MOV R6,#C
DJNZ R6,$
会算了吧,2*C+1=165;所以C=82。
现在完整的延时程序出来了,如下:
DELAY50MS: ;2 2
MOV R7,#110 ;1 1
DELAY1:
MOV R6,#225 ;1 1*110
DJNZ R6,$ ;2 2*225*110
DJNZ R7,DELAY1 ;2 2*110
MOV R6,#82 ;1 1
DJNZ R6,$ ;2 2*82
RET ;2 2
很圆满:总的时间50000微妙,也就是50毫秒。这种方式编程,在该硬件环境下可以保证最大误差为1微妙。
全部回答
- 1楼网友:底特律间谍
- 2021-02-04 04:38
单片机语言的延时程序如下:
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: MOV P1,#00H
LCALL DELAY
MOV P1,#0FFH
DELAY: MOV R5,#20
DELAY1 :MOV R6,#100
DELAY2:MOV R7,#250
DJNZ R7,$
DJNZ R6,DELAY2
DJNZ R5,DELAY1
RET
END
- 2楼网友:轻熟杀无赦
- 2021-02-04 03:10
看你做什么语言了,如果是c的话就类似于以下:
……
delay(100);
……
void delay(int i)
{
while(i--);
}
如果是汇编的话就类似以下:
……
call delay ;
……
delay:
mov r7,#0
ddd: djnz r7,ddd
djnz r6,ddd
djnz r5,ddd
ret
- 3楼网友:荒野風
- 2021-02-04 02:40
比较精确的延时一般用定时器,定义一个全局变量g_delay_count:
unsigned char volatile g_delay_count; //延时节拍个数
设置定时中断,比如1ms,在定时中断中执行:
if (g_delay_count) g_delay_count--;
延时程序如下:
void Delay_1ms(unsigned char ms)
{
g_delay_count=ms;
while(g_delay_count);
}
调用方法:
Delay_1ms(100); // delay 100ms
- 4楼网友:蓝房子
- 2021-02-04 01:04
这个很简单那:
f=1mhz/4=250khz,内部振荡模式
;t=4us
这样是什么意思? 如果采用的是1mhz的情况下4分频率得到 t表示单个周期的时间
dly80m mov a,@220 2
mov t3,a 2
mov a,@16 2
mov t4,a 2
dly2 nop 1
wdtc 2 ;防止程序跑飞,喂狗
djz t3 ;2 不是0 循环 220*2
jmp dly2 ;2
nop 1
mov a,@250 2
mov t3,a ;2 这个语句放在这因为第一次算出的时间和后面的组合刚好合适
djz t4 ; 2 外循环再延时间 大约时间应该是 [15*250*8+220*8+10]*4=12。7
jmp dly2 2
nop
ret
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯