173 2438 5004
KEROS加密芯片——品牌直销 | 免费样品 | 技术支持
当前位置:网站首页 > 资讯中心 正文 资讯中心

单片机20秒延时开关程序

htxw 2023-03-14 资讯中心 34 ℃

试用循环转移指令编写延时20ms子程序。设单片机的晶振频率为12MHz

DELAY20MS: MOV R7,#04H ;1us NOP ;1us LOOP: MOV R6,#0F8H ;1us DJNZ R6,$ ;F8H * 2us=248x2us=496us DJNZ R7,LOOP ;2us RET ;2us ;总延时时间:t=1us+1us+(1us+496us+2us)*4+2us=20000us=20ms

单片机主频为12MHz,用循环指令编写延时为20ms的延时子程序

DELAY: MOV R6,Y (注:Y=#A0H以及下面的X=#3DH可根据已知求解。)

DELAY1: MOV R7,X

DJNZ R7,$

DJNZ R6,DELAY1

RET

延时时间t=(2*X+3)Y*TM (机器周期TM=12/振荡频率)

求一个单片机的延时子程序延时20ms 谢谢

12M晶振 51单片机

(一)51C 循环

#include reg51.h

void delay_ms(unsigned int ms) // 延时子程序

{

unsigned int a,b;

for(a=ms;a0;a--)

for(b=123;b0;b--);

}

void main ()

{

while(1)

{

delay_ms(20); //20ms延时,数字即为多少毫秒

//这里写自己的程序

}

}

(二)51C中断

#include reg51.h

#define uchar unsigned char

void InitTimer0(void)

{

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

TH0 = 0x0B1;

TL0 = 0x0E0; //20ms中断一次

EA = 1;

ET0 = 1;

TR0 = 1;

}

void main(void)

{

InitTimer0();

//这里写入自己的程序

}

void Timer0Interrupt(void) interrupt 1

{

TH0 = 0x0B1;

TL0 = 0x0E0;

time++;

}

(三)51汇编循环

D20MS:

MOV R7,#100

MOV R6,#100

DJNZ R6,$

DJNZ R7,$-4

RET

(四)51汇编中断

ORG 0000H

LJMP START

ORG 000BH

LJMP T0INT

START:

MOV SP,#60H

LCALL T0INIT

LOOP:

;这里写自己的程序

LJMP LOOP

T0INIT:

MOV TMOD,#01H

MOV TH0,#0B1H

MOV TL0,#0E0H

SETB EA

SETB ET0

SETB TR0

RET

T0INT: 20MS中断子程序

PUSH DPH

PUSH DPL

PUSH ACC

MOV TH0,#0B1H

MOV TL0,#0E0H

;这里写自己的程序

POP ACC

POP DPL

POP DPH

RETI

END

假设单片机晶振为12mhz,编写一段延时20秒的程序?

12MHz

是什么嘛?晶振?频率?

时间和频率是怎么换算的呢注意频率和时间并不是一个概念哦?

T

=

1/f

1Hz

等同于

1s

12MHz

等同于

1/12

us;

设一个变量T

=

0;

每1/12us变化一次,(比如T++);

那么,20s中有多少个

1/12us,则T就需要自动加多少次;

当最后加完最后一个

1/12us的时候,延时计时变量就该溢出了嘛(清零了)

则用个for循环实现我的思路:

unsigned

long

long

T

=

0;

for(T

=

0;T

(20s/(1/12us);T++))

{}

//处理代码

//计时变量恢复成0

T

=

0;

//如果你要进行第二轮处理的话。否则就没必要了

说明:for()循环里面的值不可以这么写哈,你得自己计算了;另外,也可以用while()结构;

当然楼上有人介绍用定时器,定时器还是考验了时间和频率之间的隐射关系。呵呵~~

单片机20秒延时开关程序的介绍就聊到这里吧,感谢您花时间阅读,谢谢。

本文标签:单片机20秒延时开关程序

<