单片机一些常用的延时与中断问题及解决方法

余年寄山水
988次浏览
2021年02月20日 06:49
最佳经验
本文由作者推荐

-

2021年2月20日发(作者:铁皮玩具)


单片机一些常用的延时与中断问题及解决方法




延时与中断出错,


是单片机新手在单片机开发应用过程中,


经常会遇到的问题,


本文汇总整


理了包含了


MCS



51


系列单片机、


MSP430


单片机、


C


51


单片机



8051F


的单片机、


avr



片机、


STC89C52


< br>PIC


单片机


…..


在内的各种 单片机常见的延时与中断问题及解决方法,希


望对单片机新手们,有所帮助!

< p>



一、单片机延时问题


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


晶振



用定时器延时

< p>
10


分钟,控制


1


个灯就 可以



答:可以设


50ms

< p>
中断一次,定时初值,


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;



for(i=0;i




{ for(j=0;j<121;j++)







{;}




}



}


现有几个疑问:



< br>1


):延时函数的原理?



(< /p>


2


):两个


for


循环的作用?




3


):


i



j

< br>的取值有什么规律和依据?是不是和单片机接的晶振频率有关?所能延时的最


小单 位时间是怎么计算的?



延时时间怎么计算啊!假如用的是< /p>


AT89C51RC+11.0592M


的晶振呢?



答:



1


:原理:仅仅执行一些,没有实质性影响的所谓



无 意义指令



,比如做比大小啊,做某个

-


-


-


-


-


-


-


-