单片机C语言编程中,编一个延时约1s的语句

单片机C语言编程中,编一个延时约1s的语句,第1张

双重循环,共有循环 1000 × 1000 = 一百万遍。

每一遍,如果是1us,才能是延时约1s。

但是,晶振是12MHz,一条汇编的指令就至少是1us,C语言的语句,就要更多。

在编写延时函数之前,首先确认一下系统对晶振的分频系数,从而确定每个单周期指令执行所需的时间,一般的单片机都将指令执行周期设置为1us,这样就可以写一个比较接近1秒的延时函数了。

void delay(void) //延时子程序

{

unsigned char m,n,s;

for(m=20;m>0;m--)

for(n=20;n>0;n--)

for(s=248;s>0;s--);

}

具体延时时间要根据你单片机的速度,晶振频率,指令计算

通过调用这个子程序就可以实现

DEL1S: MOV R1,#10

DEL1: MOV R2,#100

DEL2: MOV R3,#250

DEL3: DJNZ R3,DEL3 ;2225010010=1000000us

DJNZ R2,DEL2

DJNZ R1,DEL1

RET

没有做具体计算,要准确的定时1s的话可以稍微改动一下R1R2R3的值。6M晶振则机器周期为2us,一条指令执行为2个机器周期,由此得出其延时时间

最好的方式是使用定时器中断来做延时,更精确

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计时器

}

//----假设,系统工作于

12mhz/12t的传统51单片机下#include

<reg51h>

sbit

test

=

p1^0;

void

delay_50ms(unsigned

char

times)

{

while(times

--

)

{

th0

=

0x3c;

//----装入初值,定时器0定时50ms

tl0

=

0xb0;

tr0

=

1;

//-----启动定时器

while(!tf0);

//-----等等定时时间到达

tf0

=

0;

//-----清零定时到达标志

}

}

void

delay_1s(unsigned

char

times)

{

while(times

--

)

{

delay_50ms(20);

}

}

void

main(void)

{

tmod

=

0x01;

//----定时器0工作于方式1

while(1)

{

delay_1s(2);

test

=

~test;

}

}

delay1000ms:(HT46R65的单片机)(注意不要开启计时中断允许位)

mov a,10000111b (设置频率和记数方式)(上升记数还是下降记数)

mov tmr0c,a (tmr0c 计数器的控制寄存器)

mov a,low(65536-31250) (设置的频率就是1S上升31250)因此是DELAY1S

mov TMR0L,a (计数器的赋予初始值的低位寄存器)

mov a,high(65536-31250)

mov TMR0h,a(计数器的赋予初始值的高位寄存器)

set tmr0c4 (打开记数)

snz intc06 (是否有中断请求标志)(有就跳过)

jmp $-1 (退回一步)

clr tmr0c4 (关闭记数)

clr intc06 (清除中断标志)

ret

以上就是关于单片机C语言编程中,编一个延时约1s的语句全部的内容,包括:单片机C语言编程中,编一个延时约1s的语句、C语言 单片机编写两位数码管不用定时器延时1s,怎么编、单片机51软件延时1s 晶振6M的编程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9787090.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存