1s延时子程序程序
51单片机技巧:精确延时

在用C语言写程序时,初学者遇到的一个难题时精确延时程序的设计。
我刚开始用C语言写程序时同样遇到了这个问题,后来参考了一些文章和实际设计后才知道了精确延时程序的设计。
我现在就用两种方法来实现,一种是while()语句,另一种是for()语句,这两种语句均可产生汇编语句中的DJNZ语句,以12MHZ晶振为例(说明:在编写C程序时,变量尽量使用unsigned char,如满足不了才使用unsigned int):1.delay=99;while(--delay);产生的汇编代码为:000FH MOV 08H,#63H0012H DJNZ 08H,0012H这样产生的延时时间为:(99+1)×2us。
最小延时时间为2us,若加上对delay赋值语句,则最小为4us。
2.for(i=delay;i>0;i--);产生的汇编代码同while()语句。
下面来举例几个延时函数:一. 500ms延时子程序void delay500ms(void){unsigned char i,j,k;for(i=15;i>0;i--)for(j=202;j>0;j--)for(k=81;k>0;k--);}产生的汇编代码:C:0x0800 7F0F MOV R7,#0x0FC:0x0802 7ECA MOV R6,#0xCAC:0x0804 7D51 MOV R5,#0x51C:0x0806 DDFE DJNZ R5,C:0806C:0x0808 DEFA DJNZ R6,C:0804C:0x080A DFF6 DJNZ R7,C:0802C:0x080C 22 RET计算分析:程序共有三层循环一层循环n:R5*2 = 81*2 = 162us DJNZ 2us二层循环m:R6*(n+3) = 202*165 = 33330us DJNZ 2us + R5赋值1us = 3us 三层循环: R7*(m+3) = 15*33333 = 499995us DJNZ 2us + R6赋值1us = 3us 循环外: 5us 子程序调用2us + 子程序返回2us + R7赋值1us = 5us延时总时间= 三层循环+ 循环外= 499995+5 = 500000us =500ms计算公式:延时时间=[(2*R5+3)*R6+3]*R7+5二. 200ms延时子程序void delay200ms(void){unsigned char i,j,k;for(i=5;i>0;i--)for(j=132;j>0;j--)for(k=150;k>0;k--);}三. 10ms延时子程序void delay10ms(void){unsigned char i,j,k;for(i=5;i>0;i--)for(j=4;j>0;j--)for(k=248;k>0;k--);}四. 1s延时子程序void delay1s(void){unsigned char h,i,j,k;for(h=5;h>0;h--)for(i=4;i>0;i--)for(j=116;j>0;j--)for(k=214;k>0;k--);}以上的这先希望对大家有帮组,如有不足之处请指出,如有更好的方法也可以告诉我,大家一起分享第二部分关于单片机C语言的精确延时,网上很多都是大约给出延时值没有准确那值是多少,也就没有达到精确高的要求,而51hei给出的本函数克服了以上缺点,能够精确计数出要延时值且精确达到1us,本举例所用CPU为STC12C5412系列12倍速的单片机,只要修改一下参数值其它系例单片机也通用,适用范围宽。
51 单片机 定时器 延时1s函数

51 单片机定时器延时1s函数1.引言1.1 概述本文介绍了51单片机中的定时器功能以及如何通过定时器实现延时1秒的函数。
在单片机应用中,定时器是一种非常重要且常用的功能模块之一。
它能够精确计时,并可用于实现周期性的任务触发、计时、脉冲输出等功能。
本文首先将对51单片机进行简要介绍,包括其基本概念、结构和特点。
随后,重点讲解了定时器的基本原理和功能。
定时器通常由一个计数器和一组控制寄存器组成,通过预设计数器的初值和控制寄存器的配置来实现不同的计时功能。
接着,本文详细介绍了如何通过编程实现一个延时1秒的函数。
延时函数是单片机开发中常用的功能,通过定时器的计时功能可以实现精确的延时控制。
本文将以C语言为例,介绍延时函数的编写步骤和原理,并给出示例代码和详细的说明。
最后,本文对所述内容进行了总结,并展望了定时器在单片机应用中的广泛应用前景。
通过学习定时器的相关知识和掌握延时函数的编写方法,我们可以更好地应用定时器功能,提高单片机应用的效率和精确性。
综上所述,通过本文的学习,读者可全面了解51单片机中定时器的功能和应用,并能够掌握延时函数的编写方法,为单片机应用开发提供一定的参考和指导。
1.2 文章结构本文以51单片机定时器功能为主题,旨在介绍如何使用定时器进行延时操作。
文章分为引言、正文和结论三个主要部分。
在引言部分,首先会对文章的背景进行概述,介绍单片机的基本概念和应用领域。
然后,给出本文的整体结构,并阐述文章的目的和意义。
正文部分将分为两个小节。
在2.1节中,将对单片机进行详细介绍,包括其构造与工作原理。
这部分的内容将帮助读者全面了解单片机的基本知识,为后续的定时器功能介绍打下基础。
2.2节将重点介绍定时器的功能和特点。
这部分将涵盖定时器的基本原理、工作模式以及在实际应用中的使用方法。
同时,还将详细讲解如何使用定时器进行1秒钟的延时操作,包括具体的代码实现和注意事项。
结论部分将对全文进行总结,并强调定时器的重要性和应用前景。
各种汇编延时程序大集合

MOV TL0,#0B0H
MOV R4, #10
SETB ET0
SETB EA
SETB TR0
SJMP $ ;
RET
DELAY: ;延时子程序(1秒)
MOV R0,#0AH
DELAY1: MOV R1,#00H
DELAY2: MOV R2,#0B2H
DJNZ ห้องสมุดไป่ตู้2,$
DJNZ R1,DELAY2
DJNZ R0,DELAY1
RET
MOV R2,#10 ;延时1秒
LCALL DELAY
*r5+5
DEL : MOV R5,#08H
DEL1: MOV R6,#0FFH
DEL2: MOV R7,#0FFH
DJNZ R7,$
DJNZ R6,DEL2
DJNZ R5,DEL1
RET
;1秒延时子程序是以12MHz晶振
POP R0
POP R1
POP R2
RET
1:DEL: MOV R7, #200
DEL1: MOV R6, #123
NOP
DEL2: DJNZ R6, DEL2
D52: NOP
NOP
NOP
NOP
DJNZ R6,D52
DJNZ R7,D51
POP PSW
RET
DELAY: ;延时1毫秒
PUSH PSW
SETB RS0
MOV R7,#50
D1: MOV R6,#10
D2: DJNZ R6,$
DJNZ R7,D1
51单片机延时程序

void delay1s(void)
{
unsigned char h,i,j,k;
for(h=5;h>0;h--)
for(i=4;i>0;i--)
for(j=116;j>0;j--)
for(k=214;k>0;k--);
//
void delay(uint t)
{
for (;t>0;t--);
}
1ms延时子程序(12MHZ)
void delay1ms(uint p)//12mhz
{ uchar i,j;
for(i=0;i<p;i++)
{
for(j=0;j<124;j++)
{;}
在实际应用中,定时常采用中断方式,如进行适当的循环可实现几秒甚至更长时间的延时。使用定时器/计数器延时从程序的执行效率和稳定性两方面考虑都是最佳的方案。但应该注意,C51编写的中断服务程序编译后会自动加上PUSH ACC、PUSH PSW、POP PSW和POP ACC语句,执行时占用了4个机器周期;如程序中还有计数值加1语句,则又会占用1个机器周期。这些语句所消耗的时间在计算定时初值时要考虑进去,从初值中减去以达到最小误差的目的。
}
void Delay10us( ) //12mhz
{
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
}
/*****************11us延时函数*************************/
单片机课程实验报告-延时子程序

单片机实验报告实验报告单片机实验报告一、实验目的:学习P1口的使用方法,学习延时子程序的编写二、实验要求:以P1口作为输出口,控制6个发光二极管,模拟交通信号灯的管理。
在实验仪上选择两组红、黄、绿指示灯,代表交通信号灯。
设有一个十字路口为东西南北方向,其中东西方向为支路,南北方向为主路。
初始状态为4个路口的红灯全亮。
之后,南北路口的绿灯亮,东西路口的红灯亮。
南北路口方向通车,延时20秒后,南北路口绿灯熄灭,黄灯开始闪烁,闪烁5次后红灯亮。
而同时东西方向路口的绿灯亮,东西方向开始通车,延时10秒后,东西路口的绿灯熄灭,而黄灯开始闪烁。
闪烁5次后,在切换到南北路口的绿灯亮,东西路口的红灯亮。
之后重复上述过程。
三、实验电路:四、程序框图:五、程序清单:ORG 4000H ;定义程序存放区域的起始地址START: CLR P1.0 ;红灯亮LOOP: SETB P1.1SETB P1.2CLR P1.5SETB P1.6SETB P1.7ACALL DELAYSSETB P1.0 ;南北绿灯亮,东西红灯亮CLR P1.2ACALL DELAYL2 ;长延时20sMOV R3,#5 ;南北黄灯闪烁5次,东西红灯亮YELLOW1: ;南北黄灯亮,东西红灯亮CLR P1.1SETB P1.2ACALL DELAYS ;短延时;南北黄灯灭,东西红灯亮SETB P1.1ACALL DELAYS ;短延时DJNZ R3,YELLOW1;南北红灯亮,东西绿灯亮CLR P1.0SETB P1.5CLR P1.7ACALL DELAYL1 ;长延时10sMOV R3,#5 ;南北红灯亮,东西黄灯闪烁五次YELLOW2:CLR P1.6 ;东西黄灯亮SETB P1.7ACALL DELAYS ;短延时SETB P1.6 ;南北红灯灭,东西黄灯亮ACALL DELAYS ;短延时DJNZ R3,YELLOW2AJMP LOOP ;循环DELAYL2:MOV R4,#200 ;长延迟20sDELAY1: MOV R5,#200DELAY2: MOV R6,#250DELAY3: DJNZ R6,DELAY3DJNZ R5,DELAY2DJNZ R4,DELAY1RETDELAYS: MOV R4,#10 ;短延迟1sDELAY4: MOV R5,#200DELAY5: MOV R6,#250DELAY6: DJNZ R6,DELAY6DJNZ R5,DELAY5DJNZ R4,DELAY4RETDELAYL1:MOV R4,#100 ;长延迟10sDELAY7: MOV R5,#200DELAY8: MOV R6,#250DELAY9: DJNZ R6,DELAY9DJNZ R5,DELAY8DJNZ R4,DELAY7六、LST文件A51 MACRO ASSEMBLER LED04/21/2010 16:50:30 PAGE 1MACRO ASSEMBLER A51 V7.01OBJECT MODULE PLACED IN LED.OBJASSEMBLER INVOKED BY: C:\Keil\C51\BIN\A51.EXE LED.asm SET(SMALL) DEBUG EPLOC OBJ LINE SOURCE0000 1 ORG 0000H230000 7590DE 4 START: MOV P1,#11011110B0003 1155 5 CALL DALY1 ;0.5S0005 7590DB 6 MOV P1,#11011011B0008 1133 7 CALL DALY ;20S000A 7805 8 MOV R0,#5H000C 74DD 9 LOOP1: MOV A,#11011101B000E F590 10 MOV P1,A0010 1155 11 CALL DALY1 ;0.-5S0012 74DF 12 MOV A,#11011111B0014 F590 13 MOV P1,A0016 1155 14 CALL DALY10018 D8F2 15 DJNZ R0,LOOP1001A 747E 16 MOV A,#01111110B001C F590 17 MOV P1,A001E 1144 18 CALL DALY2 ;10S0020 7805 19 MOV R0,#5H0022 74BE 20 LOOP2: MOV A,#10111110B0024 F590 21 MOV P1,A0026 1155 22 CALL DALY10028 74FE 23 MOV A,#11111110B002A F590 24 MOV P1,A002C 1155 25 CALL DALY1002E D8F2 26 DJNZ R0,LOOP20030 020000 27 LJMP START2829 ;20S0033 7C64 30 DALY:MOV R4,#1000035 7B64 31 DELAY1:MOV R3,#1000037 7A14 32 DELAY2:MOV R2,#200039 792D 33 DELAY3:MOV R1,#45003B D9FE 34 DELAY4:DJNZ R1,DELAY4003D DAFA 35 DJNZ R2,DELAY3003F DBF6 36 DJNZ R3,DELAY20041 DCF2 37 DJNZ R4,DELAY10043 22 38 RET3940 ;10S0044 7C64 41 DALY2:MOV R4,#1000046 7B64 42 DEAY1:MOV R3,#1000048 7A0A 43 DEAY2:MOV R2,#10004A 792D 44 DEAY3:MOV R1,#45004C D9FE 45 DEAY4:DJNZ R1,DEAY4004E DAFA 46 DJNZ R2,DEAY30050 DBF6 47 DJNZ R3,DEAY20052 DCF2 48 DJNZ R4,DEAY10054 22 49 RET5051 ;0.5S0055 7C64 52 DALY1:MOV R4,#1000057 7B64 53 DEY1:MOV R3,#1000059 7A19 54 DEY2:MOV R2,#25005B DAFE 55 DEY3: DJNZ R2,DEY3005D DBFA 56 DJNZ R3,DEY2005F DCF6 57 DJNZ R4,DEY10061 22 58 RETA51 MACRO ASSEMBLER LED 04/22/2010 16:20:30 PAGE 25960 ENDA51 MACRO ASSEMBLER LED 04/21/2010 16:50:30 PAGE 3SYMBOL TABLE LISTING------ ----- -------N A M E T Y P E V A L U E ATTRIBUTESDALY . . . . . . . C ADDR 0033H ADALY1. . . . . . . C ADDR 0055H ADALY2. . . . . . . C ADDR 0044H ADEAY1. . . . . . . C ADDR 0046H ADEAY2. . . . . . . C ADDR 0048H ADEAY3. . . . . . . C ADDR 004AH ADEAY4. . . . . . . C ADDR 004CH ADELAY1 . . . . . . C ADDR 0035H ADELAY2 . . . . . . C ADDR 0037H ADELAY3 . . . . . . C ADDR 0039H ADELAY4 . . . . . . C ADDR 003BH ADEY1 . . . . . . . C ADDR 0057H ADEY2 . . . . . . . C ADDR 0059H ADEY3 . . . . . . . C ADDR 005BH ALOOP1. . . . . . . C ADDR 000CH ALOOP2. . . . . . . C ADDR 0022H AP1 . . . . . . . . D ADDR 0090H ASTART. . . . . . . C ADDR 0000H AREGISTER BANK(S) USED: 0ASSEMBLY COMPLETE. 0 WARNING(S), 0 ERROR(S) 七、实验步骤:(1)根据书中设计流程图编写源程序(见实验程序)(2)用keil软件仿真:(3)更改参数:(4)下载:1.正确连接实验仪与主机的RS-232通信电缆和电源2.把实验仪的工作模式选择开关切换到LOAD处,复位系统使实验仪工作于下载状态3.运行DPFlash下载软件4.把实验仪的工作模式选择开关切换到RUN处,复位系统使实验仪工作观察发光二极管的运行情况。
单片机延时一秒

对于程序 DELAY: DELAY1: MOV R1,#0B3H
MOV R0,#00H
DJNZ R1,$ DJNZ R0,DELAY1
查指令表可知 MOV 一个机器周期,DJNZ 指令需用两个机器周期,而一个机器周期时间长度 为12/11.0592MHz,所以该段程序执行时间为: ((0B3×2+1+2)×256+1)×12÷11059200=100.2789mS 第一层:DJNZ R1,$:执行了 B3H 次,一次两个周期,所以为0B3×2; 第二层:MOV R1,#0B3H 为一个周期,DJNZ R0,DELAY1为两个周期,这样循环一次就是0B3×2 +1+2个周期;第二层的执行次数本来是255次,但因为赋首值为0,而 DJNZ 是先减1,再比 较的,所以就应该是256次。
单片机程序 要求数码管显示时间 1-60 显示一秒响一次
Count
EQU
40H
TimeCount
EQU
42H
BEEP
EQU
P3.7 ;********************************************************** ORG 0000H JMP
MAIN
ORG
000BH
BL2: CALL DEX1 CPL BEEP DJNZ R6,BL2 MOV R5,#15 CALL DELAY_BL RET DEX1:
MOV R7,#90 DE2: NOP DJNZ R7,DE2 RET ;------------------------------------------- DELAY_BL:
*************** END
求单片机一秒延时程序(12M 晶振),要用 C 语言且用定时和中断 转载自 部分文摘:我以前写的控制跑马灯的程序,有1s 定时,也有中断, 根据需要修改修改就可以了。 #include<reg51.h> #defineucharunsignedchar #defineuintunsignedint voiddelay(ucharuu);
51单片机延时函数

C程序中可使用不同类型的变量来进行延时设计。
经实验测试,使用unsigned char类型具有比unsigned int更优化的代码,在使用时应该使用unsigned char作为延时变量。
以某晶振为12MHz 的单片机为例,晶振为12MHz即一个机器周期为1us。
一. 500ms延时子程序程序:void delay500ms(void){unsigned char i,j,k;for(i=15;i>0;i--)for(j=202;j>0;j--)for(k=81;k>0;k--);}计算分析:程序共有三层循环一层循环n:R5*2 = 81*2 = 162us DJNZ 2us二层循环m:R6*(n+3) = 202*165 = 33330us DJNZ2us + R5赋值 1us = 3us三层循环: R7*(m+3) = 15*33333 = 499995us DJNZ 2us + R6赋值1us = 3us循环外: 5us子程序调用2us + 子程序返回 2us + R7赋值 1us = 5us延时总时间= 三层循环+ 循环外= 499995+5 = 500000us =500ms计算公式:延时时间=[(2*R5+3)*R6+3]*R7+5二. 200ms延时子程序程序:{unsigned char i,j,k;for(i=5;i>0;i--)for(j=132;j>0;j --)for(k=150;k>0;k --);}三. 10ms延时子程序程序:{unsigned char i,j,k;for(i=5;i>0;i--)for(j=4;j>0;j--)for(k=248;k>0;k --);}四. 1s延时子程序程序:void delay1s(void){unsigned char h,i,j,k;for(h=5;h>0;h--)for(i=4;i>0;i--)for(j=116;j>0;j --)for(k=214;k>0;k --);}关于单片机C语言的精确延时,网上很多都是大约给出延时值没有准确那值是多少,也就没有达到精确高的要求,而本函数克服了以上缺点,能够精确计数出要延时值且精确达到1us,本举例所用CPU为STC12C5412系列12倍速的单片机,只要修改一下参数值其它系例单片机也通用,适用范围宽。
延时子程序——精选推荐

用C51编写单片机延时函数参考了51单片机Keil C 延时程序的简单研究,自己也亲身测试和计算了一些已有的延时函数。
这里假定单片机是时钟频率为12MHz,则一个机器周期为:1us.参考了51单片机Keil C 延时程序的简单研究后,我们可知道,在Keil C中获得最为准确的延时函数将是void delay(unsigned char t){while(--t);}反汇编代码如下:执行DJNZ指令需要2个机器周期,RET指令同样需要2个机器周期,根据输入t,在不计算调用delay()所需时间的情况下,具体时间延时如下:t Delay Time (us)1 2×1+2 =42 2×2+2=6N 2×N+2=2(N+1)当在main函数中调用delay(1)时,进行反汇编如下:调用delay()时,多执行了两条指令,其中MOV R, #data需要1个机器周期,LJMP需要2个机器周期,即调用delay()需要3us.Keil C仿真截图与计算过程:加上调用时间,准确的计算时间延时与Keil C仿真对比如下:(可见,仿真结果和计算结果是很接近的)t Delay Time (us) 仿真11.0592Mhz时钟(us)1 3+2×1+2 =7 | 7.7(实际) 7.602 3+2×2+2=9 | 9.9 9.76N 3+2×N+2=2N+5 | (2N+5)*1.1/3 11 | 12.1 11.941535 | 38.5 37.981205 | 225.5 222.44255515 | 566.5 558.81也就是说,这个延时函数的精度为2us,最小的时间延时为7us,最大的时间延时为3+255×2+2=515us.实际中使用11.0592MHz的时钟,这个延时函数的精度将为2.2us,最小时间延时为7.7us, 最大时间延时为566.5us.这个时间延时函数,对于与DS18B20进行单总线通信,已经足够准确了。
延时子程序

延时子程序高手能给我一个延时1s的子程序吗?我以前学习的都是汇编语言,现在刚开始学习C语言不足一周,所以还需要各位高手帮助。
谁能给我一个1s延时的程序,然后帮我讲讲好吗?万分感激!!!顺便再问两个问题。
用汇编语言时只需执行MOV @DPTR,A就能够实现写的功能;只需执行MOV A,@DPTR就能执行读的功能。
那么这两句用C如何实现?[em01][em01][em01]//延迟1Svoid main(){unsigned int i,j,k;for(i=100;i>0;i--)for(j=20;j>0;j--)for(k=248;k>0;k--)}用C编写,要转化思维,不一定汇编的每个语句都有一定的C语句想对应!只要能实现的相同的功能就行了!能不能说细一点,这一秒是怎么算出来的?比如for(i=100;i>0;i--)这句应该是多少秒?延时5秒左右DELAY5S USH 04HPUSH 05HPUSH 06HMOV R4,#50DELAY5S_0:MOV R5,#200 DELAY5S_1:MOV R6,#245DJNZ R6,$DJNZ R5,DELAY5S_1DJNZ R4,DELAY5S_0 POP 06HPOP 05HPOP 04HRET;513微秒延时程序DELAY: MOV R2,#0FEHDELAY1: DJNZ R2,DELAY1RET;10毫秒延时程序DL10MS: MOV R3,#14HDL10MS1CALL DELAYDJNZ R3,DL10MS1RET;0.1s延时程序12mhzDELAY: MOV R6,#250DL1: MOV R7,#200DL2: DJNZ R6,DL2DJNZ R7,DL1RET;延时1046549微秒(12mhz);具体的计算公式是:;((((r7*2+1)+2)*r6+1)+2)*r5+1+4 = ((r7*2+3)*r6+3)*r5+5DEL : MOV R5,#08HDEL1: MOV R6,#0FFHDEL2: MOV R7,#0FFHDJNZ R7,$DJNZ R6,DEL2DJNZ R5,DEL1RET;1秒延时子程序是以12MHz晶振Delay1S:mov r1,#50del0: mov r2,#91del1: mov r3,#100djnz r3,$djnz r2,del1djnz r1,del0Ret;1秒延时子程序是以12MHz晶振为例算指令周期耗时KK: MOV R5,#10 ;1指令周期1K1: MOV R6,#0FFH ;1指令周期10K2: MOV R7,#80H ;1指令周期256*10=2560K3: NOP ;1指令周期128*256*10=327680DJNZ R7,K3 ;2指令周期2*128*256*10=655360DJNZ R6,K2 ;2指令周期2*256*10=5120DJNZ R5,K1 ;2指令周期2*10=20RET;2指令周期21+10+2560+327680+655360+5120+20+2=990753;约等于1秒1秒=1000000微秒C的等号就是包含了读写功能啊比如二个变量TEMP0,TEPM1TEMP0=TEMP1;这句的执行就需要先从RAM读取TEPM1的值再写到TEMP0对应的RAM里面。
延时子程序计算方法

学习MCS-51单片机,如果用软件延时实现时钟,会接触到如下形式的延时子程序:delay:mov R5,#data1d1:mov R6,#data2d2:mov R7,#data3d3:djnz R7,d3djnz R6,d2djnz R5,d1Ret其精确延时时间公式:t=(2*R5*R6*R7+3*R5*R6+3*R5+3)*T(“*”表示乘法,T表示一个机器周期的时间)近似延时时间公式:t=2*R5*R6*R7 *T假如data1,data2,data3分别为50,40,248,并假定单片机晶振为12M,一个机器周期为10-6S,则10分钟后,时钟超前量超过1.11秒,24小时后时钟超前159.876秒(约2分40秒)。
这都是data1,data2,data3三个数字造成的,精度比较差,建议C描述。
上表中e=-1的行(共11行)满足(2*R5*R6*R7+3*R5*R6+3*R5+3)=999,999e=1的行(共2行)满足(2*R5*R6*R7+3*R5*R6+3*R5+3)=1,000,001 假如单片机晶振为12M,一个机器周期为10-6S,若要得到精确的延时一秒的子程序,则可以在之程序的Ret返回指令之前加一个机器周期为1的指令(比如nop指令),data1,data2,data3选择e=-1的行。
比如选择第一个e=-1行,则精确的延时一秒的子程序可以写成:delay:mov R5,#167d1:mov R6,#171d2:mov R7,#16d3:djnz R7,d3djnz R6,d2djnz R5,d1nop ;注意不要遗漏这一句Ret附:#include"iostReam.h"#include"math.h"int x=1,y=1,z=1,a,b,c,d,e(999989),f(0),g(0),i,j,k;void main(){foR(i=1;i<255;i++){foR(j=1;j<255;j++){foR(k=1;k<255;k++){d=x*y*z*2+3*x*y+3*x+3-1000000;if(d==-1){e=d;a=x;b=y;c=z;f++;cout<<"e="<<e<<" "<<"R5="<<a<<" "<<"R6="<<b<<" "<<"R7="<<c<<""<<"f="<<f<<endl<<endl;};if(d==1){e=d;a=x;b=y;c=z;g++;cout<<"e="<<e<<" "<<"R5="<<a<<" "<<"R6="<<b<<" "<<"R7="<<c<<" "<<"g="<<g<<endl<<endl;};x++;}x=1;y++;}y=1;z++;}}。
延时子程序的编写

延时子程序的编写
延时程序与MCS-51执行指令的时间有关,如果使用6MH Z晶振,一个机器周期为2µs,计算出执行一条指令以至一个循环所需要的时间,给出相应的循环次数,便能达到延时的目的。
例如编制一个延时10秒的延时程序:
DEL: mov r5,#100 ;延时子程序
DEL0: mov r6,#200
DEL1: mov r7,#248
DEL2: djnz r7,DEL2 ; 248X2+4
djnz r6,DEL1 ;( 248X2+4)X200+4
djnz r5,DEL0 ;( ( 248X2+4)X200+4)X100+4
RET ;延时子程序结束,返回到调用处的下一句
END
每执行djnz rn,rel (rn 指r0~r7,rel 指转移地址)指令一次,需要2个机器周期,单片机需耗时2uS(指本机),若忽略装数等语句,延时子程序从开始到结束,单片机共耗时( ( 248X2+4)X200+4)X100+4uS,既1000000uS=1秒!若加上装数语句的耗时,延时时间大于1秒。
R5=10 为延时1秒的延时程序。
单片机延时子程序

单片机延时子程序单片机延时是指在程序运行过程中,程序须要暂停一段时间,以便执行下一个任务。
延时所耗费的时间必须是可靠的,否则将导致程序运行出错。
单片机延时分为软件延时和硬件延时两种,其中软件延时是指在程序运行过程中使用延时程序实现延时,而硬件延时则是利用定时器等硬件设备来实现延时。
软件延时子程序是指在程序中使用循环语句实现延迟。
程序中使用循环语句,通过循环次数来控制延迟时间,这种延迟实现方法简单易用,但由于循环次数的不同,延迟时间精度也难以保证。
下面介绍一种常用的软件延时子程序,可以实现毫秒级的精度。
软件延时子程序的实现方法软件延时子程序是利用单片机内部的计时器来实现延时,计时器的计数值越大,延时的时间越长。
方法如下:(1)首先,需要定义计时器要计数的时钟周期。
(2)然后,选定一个比较合适的计数次数。
(3)计算出计数器的计数值。
(4)在程序中使用循环语句来实现延时。
;-----------------------------------------;软件延迟程序;入口:X--DelayCnt(需要延时时间);出口:none;-----------------------------------------Delay1ms: mov R2,#13 ;初始化计数值Delay_Loop1: mov R1,#32 ;初始化计数值Delay_Loop2: djnz R1,$ ;32次循环耗费 4.56usdjnz R2,Delay_Loop2djnz R0,Delay_Loop1ret ;延时结束,退出;-----------------------------------------该代码在STC89C52单片机上进行实验,延迟时间为1毫秒,计数值为13。
代码中使用两个循环语句,根据计数值进行循环次数限制,循环次数越多,延时时间越长。
由于不同单片机的晶振频率不同,计算计数值时需要考虑晶振频率。
例如,若晶振频率为11.0592MHz,则计数值应为153。
51单片机延时程序算法详解

51单片机汇编延时程序算法详解将以12MHZ晶振为例,详细讲解MCS-51单片机中汇编程序延时的精确算法。
指令周期、机器周期与时钟周期指令周期:CPU执行一条指令所需要的时间称为指令周期,它是以机器周期为单位的,指令不同,所需的机器周期也不同。
时钟周期:也称为振荡周期,一个时钟周期=晶振的倒数。
MCS-51单片机的一个机器周期=6个状态周期=12个时钟周期。
MCS-51单片机的指令有单字节、双字节和三字节的,它们的指令周期不尽相同,一个单周期指令包含一个机器周期,即12个时钟周期,所以一条单周期指令被执行所占时间为12*(1/12000000)=1μs。
程序分析例1 50ms 延时子程序:DEL:MOV R7,#200 ①DEL1:MOV R6,#125 ②DEL2:DJNZ R6,DEL2 ③DJNZ R7,DEL1 ④RET ⑤精确延时时间为:1+(1*200)+(2*125*200)+(2*200)+2=(2*125+3)*200+3 ⑥=50603μs≈50ms由⑥整理出公式(只限上述写法)延时时间=(2*内循环+3)*外循环+3 ⑦详解:DEL这个子程序共有五条指令,现在分别就每一条指令被执行的次数和所耗时间进行分析。
第一句:MOV R7,#200 在整个子程序中只被执行一次,且为单周期指令,所以耗时1μs 第二句:MOV R6,#125 从②看到④只要R7-1不为0,就会返回到这句,共执行了R7次,共耗时200μs第三句:DJNZ R6,DEL2 只要R6-1不为0,就反复执行此句(内循环R6次),又受外循环R7控制,所以共执行R6*R7次,因是双周期指令,所以耗时2*R6*R7μs。
例2 1秒延时子程序:DEL:MOV R7,#10 ①DEL1:MOV R6,#200 ②DEL2:MOV R5,#248 ③DJNZ R5,$ ④DJNZ R6,DEL2 ⑤DJNZ R7,DEL1 ⑥RET ⑦对每条指令进行计算得出精确延时时间为:1+(1*10)+(1*200*10)+(2*248*200*10)+(2*200*10)+(2*10)+2 =[(2*248+3)*200+3]*10+3 ⑧=998033μs≈1s由⑧整理得:延时时间=[(2*第一层循环+3)*第二层循环+3]*第三层循环+3 ⑨此式适用三层循环以内的程序,也验证了例1中式⑦(第三层循环相当于1)的成立。
精确延时1秒程序单片机汇编

精确延时1秒程序单片机汇编(2006-12-14 15:44:23)转载▼DELAY:MOV R4,#10 ;延时子程序,12M晶振延时1.002秒L3: MOV R2 ,#200L1: MOV R3 ,#249L2: DJNZ R3 ,L2DJNZ R2 ,L1DJNZ R4 ,L3RET计算方法如下:[(249*2+1+2)*200+1+2]*10*12/12000000=1.002030s通常选用的是11.0592MHZ的晶振:[(249*2+1+2)*200+1+2]*10*12/11059200=1.08727213541666666...S参考文章:延时子程序的延时计算问题对于程序DELAY:MOV R0,#00HDELAY1: MOV R1,#0B3HDJNZ R1,$DJNZ R0,DELAY1查指令表可知MOV一个机器周期,DJNZ 指令需用两个机器周期,而一个机器周期时间长度为12/11.0592MHz,所以该段程序执行时间为:((0B3×2+1+2)×256+1)×12÷11059200=100.2789mS第一层:DJNZ R1,$:执行了B3H次,一次两个周期,所以为0B3×2;第二层:MOV R1,#0B3H为一个周期,DJNZ R0,DELAY1为两个周期,这样循环一次就是0B3×2+1+2个周期;第二层的执行次数本来是255次,但因为赋首值为0,而DJNZ是先减1,再比较的,所以就应该是256次。
这样的话,整个循环执行完应该是(0B3×2+1+2)×256+1次。
再加上开始赋值这一句,就是((0B3×2+1+2)×256+1)了不过一些要求不是很高的场合用0B3*256*2就可以了..。