
一、用定时器中断,50ms中断的1 次,20次就是1秒
#include <REG51H>
#define uchar unsigned char
sbit LED =P1^1; //接一LED,1 秒钟亮或灭一次
uchar time;
void init_t0int()
{
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void main()
{
init_t0int();
while(1);
}
void t0int() interrupt 1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
time++;
if(time==20)
{
time=0;
LED=~LED;
}
}
二、用循环延时可能程序更简单一点,但没实际意义 。单片机在这1 秒内只能循环而不能做其它事。
#include<reg51h>
sbit LED=P1^0;
void delay_ms(unsigned char ms)
{
unsigned char i;
while(ms--)
for(i=0;i<123;i++);
}
void main()
{
while(1)
{
delay_ms(1000);
LED=~P1^0; //P10接一LED,可看到LED每1S亮或灭一次
}
}
是要汇编的还是c的
这有个c的,试试看
/-----------------------------------------------
名称:delay2ms
功能:延时2ms
晶振:12MHz 机器周期1us
时间计算:t=2+1+1995+2=2000us =2000ms
-----------------------------------------------/
void delay2ms(void) //延时2ms子程序
{
unsigned char i,j,z;
for(z=5;z>0;z--)
for(i=12;i>0;i--)
for(j=15;j>0;j--);
}
void delay(void) //延时1s 误差+0446ms。
{
unsigned int x,y,z;
for(z=251;z>0;z--)
for(x=12;x>0;x--)
for(y=40;y>0;y--);
}
若要精确延时还是用汇编或直接用定时器
12M就是每秒
12000000HZ
也就是说
循环12次的话是1微秒,循环12000次的话是1毫秒。
所以你的这个循环执行了
ms
10微秒
如果你要延迟1毫秒,那么ms就应该是100
一般先写一个延时几个毫秒的子程序,很简单。
void delay( int ms )
{
while( ms-- )
{
int i = 延时常数;
do { _nop_(); } while( --i );
}
}
要延时一秒钟,就是1000ms,delay( 1000 );
几个注意事项,
1、延时程序没有关中断,所以中断程序会影响定时精度。
2、延时常数可以用软仿真程序实验确定,需要根据不同的单片机、晶振频率调整延时常数。
3、想要适用任意型号单片机,内层循环最好加一句空 *** 作,通常这可以阻止编译时优化程序。
delay(1);//此行设置断点 //此行设置断点分别设置断点看运行时间。这两个断点之间运行的时间就是延时时间你再看设置的是12M晶振还是11m晶振的延时为25ms
//----假设,系统工作于
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;
}
}
这个程序你写的太不规范了。
改你的程序
DELAY MOV R7,#50 ;2 2代表机器周期
D3: MOV R6,#50 ;2
D2: MOV R5,#200 ;2
D1: DJNZ R5,D1 ;2
DJNZ R6,D2 ;2
DJNZ R7,D3 ;2
RET ;2
其实这个程序来做延迟程序是有误差的,而且很大。
实际延迟时间 t=2us+((2us200+2us)60)50+2us=
自己算吧 反正比1S延迟要高,仔细看看计算式子的顺序。以基本2重循环思路来解决3重循环。如果要求不高的话,用它来做1S延迟也可以。
下面来给你写一个通过定时,计数器来做延迟子程序。(精确度很高)
有关知识看定时计数器单元的介绍。
DELAY: MOV TMOD,#01H ;选择工作方式1 定时器0
MOV TH0,#
MOV TLO,#
SETB TR0
LOOP1: JNB TF0,LOOP
CLR TF0
SJMP MAIN
的初始值计算方法 1000 000US=(65535-X)/T
T=121/FOSC
FOSC 即为晶振频率 用X的值除以256,商给TH0,余数给TL0
这样,如果需要延迟子程序直接调用。精确度极高。
希望对你有用。不懂继续问
以上就是关于假如fosc=12MHz,编写1秒延时的时间程序全部的内容,包括:假如fosc=12MHz,编写1秒延时的时间程序、若晶振为12MHz,试编制延迟2ms和1s的子程序 单片机程序、C语言延迟时间,我的是12M晶振,这个程序的延迟时间到底是多少等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)