单片机一些常用的延时与中断问题及解决方法
-
单片机一些常用的延时与中断问题及解决方法
延时与中断出错,
是单片机新手在单片机开发应用过程中,
p>
经常会遇到的问题,
本文汇总整
理了包含了
MCS
-
51
系列单片机、
MSP430
单片机、
C
51
单片机
、
8051F
的单片机、
avr
单
片机、
STC89C52
、
< br>PIC
单片机
…..
在内的各种
单片机常见的延时与中断问题及解决方法,希
望对单片机新手们,有所帮助!
一、单片机延时问题
20
问
1
、单片机延时程序的延时时间怎么算的?
答
:
如果用循环语句实现的循环,没法计算,但是可以通过
软件仿真看到具体时间,但是一
般精精确延时是没法用循环语句实现的。
如果想精确延时,一般需要用到定时器,延时时间与晶振有关系,单片机系统
一般常选用
11.059 2
MHz
、
12
MHz
或
6 MHz
晶振。第一种更容
易产生各种标准的波特率,后两种的一
个机器周期分别为
1
μs
和
2
μs
,便于精确延时。本程序中假设使用频率为
12 MHz<
/p>
的晶振。
最长的延时时间可达
216=6
5 536 μs
。若定时器工作在方式
2
,则可实现极短时间的精确延
时;
如使用其他定时方式,<
/p>
则要考虑重装定时初值的时间
(重装定时器初值占用
2
个机器周
期)。
2
、求个单片机
89S51
12M
晶振
用定时器延时
10
分钟,控制
1
个灯就
可以
答:可以设
50ms
中断一次,定时初值,
TH0=0x3c
、
TL0=0xb0
。中断
20
次为
1S
,
10
分
钟的话,需中断
12000
次。
计
12000
次后,给一
IO
口一个低电平(如功率不够,可再加扩
展
),就可控制灯了。
而且还要看你
用什么语言计算了,
汇编延时准确,
知道单片机工作周期和循环
次数即可算出,
但不具有可移植性,在不同种类单片机中,汇编不通用。
用
c
的话,由于各种软件执行效率
不一样,不会太准,通常用定时器做延时或做一个不准确的延时,延时短的话,
在<
/p>
c
中使用
汇编的
nop
做延时
3
、
51<
/p>
单片机
C
语言
f
or
循环延时程序时间计算
,设晶振
12MHz
,即一个机器周期是
1us
。
for(i=0,i<100;i++)
for(j=0,j<100;j++)
我觉得时间是
100*100*1us=10ms
,怎么会是
100ms
答:
不可能的,是不是你的编译有错的啊
我改的晶振
12M
,在
KEIL
4.0
里面编译的,为你得出的结果最大也就是
40ms
,这是软件
的原因,
不可能出现
100ms
那么大的差
距,是你的软件的原因。
不信你实际编写一个秒钟,
利用原理计算编写一个烧进单片机和利用软件测试的秒程序烧进
单片机,
你会发现原理计算的程序是正确的
4
、
51
单片机
c
语言
_nop_()
是一个空指令?短时间延时的?空几个机器周期
?
答:这个
_nop_()
等效与汇编里面的,
NOP
指令,也就是空一个
机器周期,如果是传统
51
单片机的话,等于空
12
个时钟周期【即一个机器周期】
5
、
51<
/p>
单片机
延时
500ms
用机器周期叠加怎么算?
答:
DELAY:
MOV
R7,#4
D2:MOV R6,#250
D1:MOV
R5,#250
DJNZ R5,$$
DJNZ R6,D1
DJNZ R7,D2
RET
假设晶振为
12MHz
刚延时时间为
:
250*250*4*2=500MS
6
、
51
单片机
< br>C
语言程序中延时函数
delay
的原理是什么?
现在找到两个函数
第一:
void
delay(void)
{ unsigned int i,j;
for(i=0;i<500;i++)
{ for(j=0;j<121;j++)
{;}
}
}
第二:
void delay(unsigned int k)
{ unsigned int i,j;
<
br>1
<
br>的取值有什么规律和依据?是不是和单片机接的晶振频率有关?所能延时的最
for(i=0;i
{ for(j=0;j<121;j++)
{;}
}
}
现有几个疑问:
(
):延时函数的原理?
(<
/p>
2
):两个
for
循环的作用?
(
3
):
i
、
j
小单
位时间是怎么计算的?
延时时间怎么计算啊!假如用的是<
/p>
AT89C51RC+11.0592M
的晶振呢?
答:
1
:原理:仅仅执行一些,没有实质性影响的所谓
“
无
意义指令
”
,比如做比大小啊,做某个-