单片机常见延时与中断问题及解决方法
时问题 ,STC10F08XE单片机,晶振22.1184M void delay(unsigned long uldata) { unsigned int j = 0; unsigned int g = 0; for (j=0;j5;j++) { for (g=0;g { _nop_(); _nop_(); _nop_(); } } } 当uldata=1时延时多少秒? 请给出具体算法………… 答:用keil转换成汇编语句,然后对照指令表计算就行了 13、我想用单片机连接不断地向电脑发数,如下: while (1) { send_char('9'); delay(n); } 如每发送一个数,应延时多少微妙好呢?即一般最短能延时多少微米呢?如延时太长的话,那发送很多数据不就用很长时间吗? 答:不做太多的串口处理分析,只顺着你的问题和你的方法说说: 先考虑下串口的速率 假设9600,那么发送一个字符要多久? (9600bit/S) / 10bit(一个字符1+8+1) = 960字符/秒 约 1ms/byte 也就是说你如果在1ms内发送超过一个字符就没意义了,硬件速度达不到。 while(1) { send_char('9'); delay(n); } 这个循环是执行周期也就十几微秒+delay()的延迟,所以任何小于1040微秒的延迟对串口硬件来说没意义,上一个还没处理完,下一个就来了根本执行不了嘛。 如果你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 为什么?求
- FPGA的DSP性能揭秘(06-16)
- 基于单片机通用引脚的软件UART设计(10-16)
- 分时操作系统思想在单片机中的具体应用 (10-30)
- 基于AT89C51+DSP的双CPU伺服运动控制器的研究(05-26)
- 关于RTX51 TINY的分析与探讨(05-30)
- 基于MC9S12DGl28单片机的智能寻迹车设计(04-03)