单片机延时问题20问
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--);没有起到外层循环的作用……
51单片机相关文章:51单片机教程
c语言相关文章:c语言教程
单片机相关文章:单片机教程
单片机相关文章:单片机视频教程
单片机相关文章:单片机工作原理
晶振相关文章:晶振原理
评论