新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 单片机常见延时与中断问题及解决方法

单片机常见延时与中断问题及解决方法

作者: 时间:2013-06-06 来源:网络 收藏

如果你send_char()里面有while(!TI);TI = 0;这样的语句或有串口中断TI的处理的话,那么实际上你的delay()已经在发送函数里了,while(!TI);这部就是延迟等待吗?那根本不需要主函数去延迟了,直接发就行了。

14、一个延时子程序的问题,在延时子程序那里,一直搞不明白,给r7和r6赋予0,然后下面的djnz r7,delayloop不就一直循环了,那还怎么接下去的程序?

org 0000h

ljmp start

org 0030h

start: mov a,#0feh

mov r5,#8

output: mov p1,a

rl a

call delay

djnz r5,output

ljmp start

delay: mov r6,#0

mov r7,#0

delayloop:djnz r7,delayloop

djnz r6,delayloop

ret

end

答: 你的延时程序不是因为值为0,而是跳转位置不对,改为如下:

delay: mov r6,#0

delayloop:mov r7,#0

:djnz r7,$

djnz r6,delayloop

ret

R7,R6初值为0,但是当DJNZ执行时,这条指令是先减1再判断,所以0-1=255,判断的话也不为0,仍然循环256次。

0-1=255的解释:

0000 0000

- 0000 0001

-------------------------

1111

15、我想提两个延时与按键的问题

1:如果一个程序中延时和按键,如果延时子程序比较长(假如2秒),怎样确保按键能够得到及时响应(假如PC正在执行延时子程序,正在这时候有按键输入,不是响应不了)——,,,前提是不能用定时器定时扫描,和中断来做,因为定时器和中断我另有其他用途

2:没有串口。怎样才能使得他与24C02进行通信(24C02是具有2K内存的EEPROM)

答:

首先明确一点你说单片机没有串口,应该是指没有I2C口吧。

1 在延时程序里面加入按键的检测

2 用IO口模拟I2C时序读写

16、51单片机延时小程序,求高手解释什么意思?

delay200ms:

mov r2,#82

l0:mov r1,#116

l1:mov r0,#9

djnz r0,$

djnz r1,l1

djnz r2,l0

ret

答:以下是每条指令的时间,T为一个机器周期

delay200ms:

mov r2,#82;1T

l0:mov r1,#116;1T

l1:mov r0,#9;1T

djnz r0,$;2T

djnz r1,l1;2T

djnz r2,l0;2T

ret;2T

以上共三层循环,忽略部分指令,最简单算法是:

2*9*116*82=171216

不忽略指令是:

1+(1+(1+2*9+2)*116+2)*82+2=200001

因此延时时间大约为200ms

17、于51单片机延迟时间的问题

uchar i;i--;

uint i;i--;

这两条语句在12M晶振下运行时间分别是多少??

答:一个时钟周期,2us,共4us

18、周期为6MHZ的单片机延时10秒的子程序的怎么编?

答:/*************************************************

* 名称 : Delay()

* 功能 : 延时,延时时间为 10ms * del。这是通过软件延时,有一定误差。

* 输入 : del

* 输出 : 无

***********************************************************/

void Delay(uint del)

{

uint i,j;

for(i=0; i

for(j=0; j1827; j++) //这个是通过软件仿真得出的数

;

}

这个是晶振为12mhz的单片机延时10ms的程序,你只要在这个基础上减小一倍就行了,当然至于具体值还是要调试下的。

19、片机的有些程序需要调用延时程序,如何能合理的安排循环次数以及空操作的个数?

答:用汇编的话就根据你的当前晶振频率去推算你的指令周期,然后结合你需要延迟的时间,编写延迟程序,用C的话还是要看最后生成的汇编码是什么样的了。最简单的方法就是写好程序以后再编译器里软仿真看时间。赞同2| 评论(1)

20、单片机延时程序问题

延时程序 void delay(uint dt)

{

uchar bt;

for(;dt;dt--);

for(bt=0;bt255;bt++);

}

编译时有警告C:DOCUMENTS AND SETTINGSADMINISTRATOR桌面字 310 点阵LED显示.C(46): warning C235: parameter 1: different types

为什么?求大侠指点

答:某个函数传参类型与声明类型不符。

另外你这个for(;dt;dt--);没有起到外层循环的作用……

二、单片机30例

1、单片机外中断INT0为下降沿触发,当中断被触发后cpu执行中断程序,若本次中断的程序还未执行完INT0又来了一个相同的下降沿中断信号怎么办?cpu会怎么处理?若是定时器中断呢?串口中断呢?求解释

答:再来一个INT0信号不会执行。相同的优先级不会打断正在执行的中断。

一. 如果是高优先级的中断来了,会打断低优先级的正在执行的中断而执行高优先级的中断。

51单片机的默认(此时的IP寄存器不做设置)中断优先级为:

外部中断0 > 定时/计数器0 > 外部中断1 > 定时/计数器1 > 串行中断;

当同时有几种中断到达时,高优先级中断会先得到服务。

例如:当计数器0中断和外部中断1(优先级 计数器0中断>外部中断1)同时到达时,会进入计时器0的中断服务函数;但是在外部中断1的中断服务函数正在服务的情况下,这时候任何中断都是打断不了它的,包括逻辑优先级比它高的外部中断0计数器0中断。

51单片机的中断优先级控制寄存器IP可以把默认的中断优先级设置为高或低级,

例如默认是外部中断0 > 定时/计数器0 > 外部中断1 > 定时/计数器1 > 串行中断;

现在设为定时1 和串行中断为高优先级 其它为低 ,那么中断0执行时会被定时器1 或串行中断打断,如果设定的两个高优先级定时/计数器1 和串行中断同时响应,会再自然排队,先执行定时1中断再执行串行中断。

2、单片机,中断3为什么不执行,整个程序有什么不对的地方呢?

51单片机相关文章:51单片机教程


c语言相关文章:c语言教程


晶振相关文章:晶振原理


评论


相关推荐

技术专区

关闭