新手在单片机开发应用过程中,时而出现延时与中断的问题,那该怎么解决呢?
一些人会把单片机中断和延时概念搞混,首先我们先来理清楚单片机中断和延时的概念。中断是停止当前正执行的任务,转而去执行中断任务,等中断任务执行结束后继续回来执行当前正在运行的任务。开启中断源之后,有初始化中断、响应中断等都是从中断入口地址处执行中断程序的,建议有中断程序尽可能的简洁,越短越好。而延时仅仅是主程序在执行的过程中不断调用的一段子程序。
下边为大家分享一下大多数单片机包含PIC单片机开发在内的延时与中断的常见问题及解决方法。
1、单片机延时程序的延时时间怎么算的?
答:如果用循环语句实现的循环,没法计算,但是可以通过软件仿真看到具体时间,但是一般精精确延时是没法用循环语句实现的。
如果想精确延时,一般需要用到定时器,延时时间与晶振有关系,单片机系统一般常选用11.059 2 MHz、12 MHz或6 MHz晶振。第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。本程序中假设使用频率为12 MHz的晶振。最长的延时时间可达216=65 536 μs。若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。
2、求个单片机89S51 12M晶振 用定时器延时10分钟,控制1个灯就可以
答:可以设50ms中断一次,定时初值,TH0=0x3c、TL0=0xb0。中断20次为1S,10分钟的话,需中断12000次。计12000次后,给一IO口一个低电平(如功率不够,可再加扩展),就可控制灯了。而且还要看你用什么语言计算了,汇编延时准确,知道单片机工作周期和循环次数即可算出,但不具有可移植性,在不同种类单片机中,汇编不通用。用c的话,由于各种软件执行效率不一样,不会太准,通常用定时器做延时或做一个不准确的延时,延时短的话,在c中使用汇编的nop做延时
3、51单片机,晶振为6M,求一个10ms的延时程序
答:延时有很多种方法,有一种是让单片机去做无聊的循环,还有一种是用定时器。
第一种的算法是:
晶振的周期T1=1/f; 这里f=6MHz 所以T1=1/6 us;(微秒)
单片机花12个T1去执行一个指令,
所以一个机器周期等于12个晶振周期,
T2=12*T1=2us
10ms=1000 0us
所以你要得到10ms的延时就要想办法让机器去做5000条“无聊的指令”
(尤其是在多中断任务执行时),中断首先要开启中断源,初始化中断,然后响应中断,从中断的入口地址处执行中断程序。
利用中断可以使程序执行效率高效,实现“一边。。。一边。。。”初始化中断源后主程序,就可以去干其他事情了。
4、51单片机C语言for循环延时程序时间计算 ,设晶振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那么大的差距,是你的软件的原因。
不信你实际编写一个秒钟,利用原理计算编写一个烧进单片机和利用软件测试的秒程序烧进单片机,你会发现原理计算的程序是正确的。
5、PIC单片机AD中断什么时候开启,对AD中断应该怎样理解。
答:
AD模数转换,是把模拟电压数值采样进来,然后转换成数字信号。这一采样和转换是需要时间的。并不是一开AD就能读到数字信号数据。
一般来说其时间都只有几微秒到几百微秒(根据设置不同而定)。如果单片机没有其他工作的时候,可以用循环等待的方式等AD转换结束(转换结束后DONE位会被置位)。但如果你的单片机还有其他工作,那就没必要在等待它上面花费时间。可以开AD操作后,继续执行其他程序。而转换结束后,AD中断可以暂时断开现有炒作,而把AD数据读进来。这就是AD中断的作用。
6、51单片机的五个中断分别在什么时候(什么情况)执行里面的程序!
答:
外部中断0 :P3.2口有低电平(IT0=0)/ 下降沿(IT0=1)。
外部中断1 :P3.3口有低电平(IT1=0)/ 下降沿(IT1=1)。
定时器0中断:当定时器0计数到FFFF溢出时
定时器1中断:当定时器1计数到FFFF溢出时
串口中断:串口接收到一帧。或发送完一帧数据都会产生中断。
你网上找一下TCON和SCON。什么条件让中断标志位的值改变。 那么就会进入中断服务程序去。
7、51单片机,如果中断函数比较长,执行到一半又触发了这个中断,程序会停止从头执行,还是执行结束后响应中
答:51单片机中,中断分高低两个优先级,高优先级的中断能打断低优先级的中断。
但同级中断是不能打断同级中断的!无论该中断函数有多长,在执行到一半这个中断又发生了,还是要等到该中断函数执行完毕,并再执行了一条主程序指令后才会再次进入该中断。
不过,若楼主恰好在这个低优先级中断服务程序中修改了该中断为高优先级,那么如果该中断函数比较长,执行到一半又触发了这个中断,则该中断函数就会被重新从头开始执行(中断嵌套)。这是因为除串口中断以外的其他中断,在 CPU 响应该中断,程序转入该中断函数前就已经将该中断的中断标志清零了。
另外,51的串口中断比较特别,因为需要软件清除串口中断标志,所以只要在未清串口中断标志前,是不会发生上述这样的中断嵌套的。
以上是一些单片机开发过程中的中断与延时的常见问题解答。单片机开发过程是比较复杂的,需要进行项目评估及项目实施两个大步骤,希望以上的知识总结能够给你带来一定帮助。