双重循环,共有循环 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的编程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)