用汇编语言编写1ms延时程序

合集下载

延时1us程序12mhz晶振c语言,51单片机KeilC延时程序的简单(晶振12MHz,一。。。

延时1us程序12mhz晶振c语言,51单片机KeilC延时程序的简单(晶振12MHz,一。。。

延时1us程序12mhz晶振c语⾔,51单⽚机KeilC延时程序的简单(晶振12MHz,⼀。

⼀. 500ms延时⼦程序void delay500ms(void){unsignedchari,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){unsignedchari,j,k;for(i=5;i>0;i--)for(j=132;j>0;j--)for(k=150;k>0;k--);}产⽣的汇编C:0x0800 7F05 MOV R7,#0x05C:0x0802 7E84 MOV R6,#0x84C:0x080C 22 RET三. 10ms延时⼦程序void delay10ms(void){unsignedchari,j,k;for(i=5;i>0;i--)for(j=4;j>0;j--)for(k=248;k>0;k--);}产⽣的汇编C:0x0800 7F05 MOV R7,#0x05C:0x0802 7E04 MOV R6,#0x04C:0x0804 7DF8 MOV R5,#0xF8C:0x0806 DDFE DJNZ R5,C:0806C:0x0808 DEFA DJNZ R6,C:0804C:0x080A DFF6 DJNZ R7,C:0802C:0x080C 22 RET四. 1s延时⼦程序void delay1s(void){unsignedcharh,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--); }对1s延时的验证:1.设置仿真的晶振为12MHz2.在延时函数设置断点3.单步运⾏程序,到达延时函数的⼊⼝4.先记下进⼊延时函数的时间5.step out跳出函数,记下此时时间,两个时间相减即为延时函数运⾏时间函数运⾏时间=1.00041400-0.00041600≈1s产⽣的汇编C:0x0808 DCFE DJNZ R4,C:0808C:0x080A DDFA DJNZ R5,C:0806C:0x080C DEF6 DJNZ R6,C:0804C:0x080E DFF2 DJNZ R7,C:0802C:0x0810 22 RET在精确延时的计算当中,最容易让⼈忽略的是计算循环外的那部分延时,在对时间要求不⾼的场合,这部分对程序不会造成影响. void mDelay(unsigned int Delay) //Delay = 1000 时间为1S{unsignedinti;for(;Delay>0;Delay--){for(i=0;i<124;i ){;}}}void waitms(inti){charm;for( ; i ;i--){for(m = 203; m ; m--){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}}}延时1ms的函数时钟频率12MHzunsigned intsleepTime;unsingedchar inSleep = 0;void sleepService(void)}void isr_timer(void) //假定定时器中断1ms 中断⼀次。

单片机汇编延时计算小程序

单片机汇编延时计算小程序
for(w=0;w<256;w++)
{
for(x=0;x<256;x++)
{
for(y=0;y<256;y++)
{
periodicity=delay_time/(12.0/f);
delay_period_XY=w*(x*(3+2*y)+3)+3 ;
//精度控制
if((delay_period_XY>periodicity*0.9999)&&(delay_period_XY<periodicity*1.0001))
if((mcu_type==1)&&(delay_time>(12.0/f)*(255*(3+2*255)+3)))
{
printf("您输入的延时长度为%fus,超过了该汇编程序在51单片机下的最大延时长度%fus,将改用三重循环程序来实现该延时。\n",delay_time,(12.0/f)*(255*(3+2*255)+3));
printf("#pragma endasm\n");
if((mcu_type==1)&&(delay_time>(12.0/f)*(255*(255*(3+2*255)+3)+3)))
{
printf("您输入的延时长度为%fus,超过了该汇编程序在51单片机下的最大延时长度%fus,三重循环程序也无法实现。\n",delay_time,(12.0/f)*(255*(3+2*255)+3));

单片机汇编语言设计软件延时程序

单片机汇编语言设计软件延时程序

单片机汇编语言设计软件延时程序作者:袁梅来源:《科技视界》 2013年第11期袁梅(桂林理工大学高等职业技术学院,广西南宁 530001)【摘要】在单片机控制系统中,常用到软件延时程序,其原理是利用CPU执行指令消耗时间来实现的。

本文以单片机I/O口控制LED灯闪烁为例,介绍汇编语言设计软件延时程序的方法,同时讲解延时时间的估算方法。

【关键词】单片机;汇编语言;软件延时程序延时程序是单片机中一个很重要的部分,通常有两种方法实现:一是,定时器定时实现延时;二是,软件延时程序。

本文要介绍的是软件延时程序。

这种方法是通过CPU执行指令消耗时间来实现延时,其内容虽然简单,应用却极其广泛,比如跑马灯,多位数码管的动态显示,键盘扫描等等都需要用到软件延时。

本文介绍要介绍单片机里用汇编语言设计软件延时程序及其延时时间的估算方法,这也是循环结构的一个典型程序。

1 指令周期、机器周期和时钟周期软件延时程序是通过CPU执行指令消耗时间来实现的,首先要了解单片机CPU在执行一条指令时所需要的时间,即指令周期。

指令周期是以机器周期为单位,MCS51单片机通常把指令分为单周期指令、双周期指令和四周期指令三种;而机器周期是指CPU完成某一个规定操作所需要的时间,它是由12个时钟周期组成;时钟周期又叫振荡周期,是由单片机内部振荡电路产生的,是时钟频率的倒数。

以时钟频率12MHz(后面的均以这个频率来计算)为例,计算如下:1)时钟周期Tosc=1/时钟频率=1/12M=1/12us2)机器周期T=12个时钟周期=12Tosc=1us3)指令周期=(1~4)个机器周期=(1~4)T=(1~4)us软件延时程序常用的指令如下所示,计算其指令周期。

MOV Rn,#data ;数据传送指令,t=1T=1usDJNZ Rn,rel ;减1条件转移指令,t=2T=2usNOP ;空操作指令,t=1T=1usRET ;子程序返回指令,t=2T=2usACALL ;短调用指令,t=2T=2usLCALL ;长调用指令,t=2T=2us2 软件延时程序以及时间计算方法从指令周期的概念得知,单片机CPU执行一条指令花(1~4)us,若想得到一定时间t的延时,则需要执行指令次数n=t/指令周期,我们可采用循环结构来实现。

浅析自动化控制中汇编延时方法的实现

浅析自动化控制中汇编延时方法的实现

浅析自动化控制中汇编延时方法的实现【摘要】在实际应用中,特别是自动化控制,经常会用到延时器,有两种实现方法:一种是用硬件实现,可以很精确地实现延时功能;另一种是用软件实现,延迟时间比较粗略,但实现比较简单。

本文主要讨论用汇编语言实现软件延时器功能。

【关键词】延时;时间计算;时钟周期0.前言计算机系统中经常用到定时信号,比如:系统日历时钟的计时,在计算机实时控制和处理系统中,计算机需要每隔一定的时间对处理对象进行采样,再对获得的数据进行处理,这些都用到定时信号。

一般来说,定时信号的产生可以通过硬件和软件两种方法来获得。

如果用硬件方法定时,就要用到计数器/定时器,在简单软件的控制下可产生精确到ns 级的延时时间。

其主要思想是通过软件确定定时/ 计数器的工作方式,根据需要定时时间,设置计数初值并启动计数器工作,当计数到给定值时,便自动产生定时输出。

这种方法突出的优点是计数时不占用CPU 时间,成本不高,程序上也很简单。

它既适合长时间,多次重复定时,也可用于延时时间较短的场合。

1.模数转换器ADC0832 (利用空操作实现延时)图1 ADC0832时序图从图中可以看出,当CS端加入低电平后模数转换器开始工作,CLK输入时钟脉冲,D I端输入通道功能选择信号。

在第1个时钟脉冲的下降沿到来之前D I端必须是高电平,表示启始信号。

在第2、3个脉冲下降沿之前D I端应输入2位数据( SGL /Dif、Odd /Even)用于选择通道功能,当此2位数据为“1”、“0”时,只对CH0进行单通道转换。

通道选择之后,就可以开始在DO端串行输出数据(此时D I端为高阻态),转换时的时钟信号CLK,通过编程的方法来实现。

当单片机的机器周期= 1微秒时,执行一次空操作(NOP)指令,可延时1微秒,下面仅给出模数转换的子程序,在汇编语言的主要指令后面加以注释,便于大家对程序的分析和研究。

AD_CONV:SETB ADC0832_CS准备开始转换CLR ADC0832 _CLK拉低ADC0832 _CLKCLR ADC0832_CS;CS置0,片选有效SETB ADC0832_DAT;D I置1,起始位NOP;延时1微秒SETB ADC0832_CLK;第一个时钟脉冲NOP CLR ADC0832_DAT 在下降沿到来之前D I变为低电平CLR ADC0832_CLK SETB ADC0832 _DAT;D I置1,为单通道方式NOP SETB ADC0832_CLK;第二个脉冲NOP CLR ADC0832_DAT CLR ADC0832_CLK CLR ADC0832 _DAT;D I置0,选择通道CH0 NOP SETB ADC0832_CLK。

汇编延时程序

汇编延时程序

延时程序在单片机编程中使用非常广泛,但一些读者在学习中不知道延时程序怎么编程,不知道机器周期和指令周期的区别,不知道延时程序指令的用法, ,本文就此问题从延时程序的基本概念、机器周期和指令周期的区别和联系、相关指令的用法等用图解法的形式详尽的回答读者我们知道程序设计是单片机开发最重要的工作,而程序在执行过程中常常需要完成延时的功能。

例如在交通灯的控制程序中,需要控制红灯亮的时间持续30秒,就可以通过延时程序来完成。

延时程序是如何实现的呢?下面让我们先来了解一些相关的概念。

一、机器周期和指令周期1.机器周期是指单片机完成一个基本操作所花费的时间,一般使用微秒来计量单片机的运行速度,51 单片机的一个机器周期包括12 个时钟振荡周期,也就是说如果51 单片机采用12MHz 晶振,那么执行一个机器周期就只需要1μs;如果采用的是6MHz 的晶振,那么执行一个机器周期就需要2 μs。

2 .指令周期是指单片机执行一条指令所需要的时间,一般利用单片机的机器周期来计量指令周期。

在51 单片机里有单周期指令(执行这条指令只需一个机器周期),双周期指令(执行这条指令只需要两个机器周期),四周期指令(执行这条指令需要四个机器周期)。

除了乘、除两条指令是四周期指令,其余均为单周期或双周期指令。

也就是说,如果51 单片机采用的是12MHz 晶振,那么它执行一条指令一般只需1~2 微秒的时间;如果采用的是6MH 晶振,执行一条指令一般就需2~4 微秒的时间。

现在的单片机有很多种型号,但在每个型号的单片机器件手册中都会详细说明执行各种指令所需的机器周期,了解以上概念后,那么可以依据单片机器件手册中的指令执行周期和单片机所用晶振频率来完成需要精确延时时间的延时程序。

二、延时指令在单片机编程里面并没有真正的延时指令,从上面的概念中我们知道单片机每执行一条指令都需要一定的时间,所以要达到延时的效果,只须让单片机不断地执行没有具体实际意义的指令,从而达到了延时的效果。

定时器写延时1ms函数

定时器写延时1ms函数

定时器写延时1ms函数在嵌入式系统中,经常需要进行时间控制。

定时器是一种硬件设备,它可以生成一个周期性的中断信号,我们可以利用这个中断信号来实现定时器功能。

在嵌入式系统中,经常需要进行短时间的延时操作。

为了方便使用,我们可以将常用的延时操作封装成函数。

本篇文章将介绍如何利用定时器编写一个延时1ms的函数。

1. 硬件选型在笔者的开发环境中,采用了STM32F103系列微控制器,选用了其内部的TIM2定时器。

TIM2定时器是一个16位的定时器,它可以配置为不同的工作模式,比如定时器模式、输入捕获模式、PWM输出模式等等。

对于我们要编写的延时函数,采用定时器模式就可以实现。

2. 配置定时器工作模式在使用定时器之前,需要进行一些初始化配置。

我们要配置TIM2定时器为定时器模式,采用内部时钟源这种工作模式,周期为1ms。

初始化代码如下所示:```void Delay_Init(void){// 使能定时器时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);// 定时器配置TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_TimeBaseInitStruct.TIM_Prescaler = 7200 - 1; // 分频系数=7200,即1us为一个计数单位TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式TIM_TimeBaseInitStruct.TIM_Period = 1000; // 计数周期=1msTIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);// 开始计时TIM_Cmd(TIM2, ENABLE);}```上述代码中,我们首先使能TIM2的时钟,并配置了定时器的工作模式。

单片机延时汇编语言计算方法

单片机延时汇编语言计算方法

单片机延时汇编语言计算方法我们用汇编语言写单片机延时10ms 的程序(用的是12MHz 晶振的MCS- 51),可以编写下面的程序来实现:MOV R5,#5 ①D1: MOV R6,#4 ②D2: MOV R7,#248 ③DJNZ R7,$ ④DJNZ R6,D2 ⑤DJNZ R5,D1 ⑥RET ⑦这个延时程序共有七条指令,现在就每一条指令执行的次数和所耗时间进行分析:第一条,MOV R5,#5 在整个程序中只执行一次,且为单周期指令,所以耗时1&mu;s,第二条,MOV R6,#4 看⑥的指令可知,只要R5-1 不为0,就会返回执行这条指令,共执行了R5 次,共耗时5&mu;s,第三条,MOV R7,#248 同第二条类似,只要R6-1 不为0,就会返回执行这条指令,同时受到外部循环R5 的控制,共耗时R5*R6*1=20&mu;s,第四条,DJNZ R7,$ 只要R7-1 不为0,就执行这条指令,同时受到外部循环的控制,由于该指令是双周期指令,共耗时为R7*R6*R5*2=9920&mu;s,第五条,DJNZ R6,D2 只要R6-1 不为0,就反复执行此条指令(内循环R6 次),又受外循环R7 的控制,共耗时R6*R5*2=40&mu;s,第六条,DJNZ R5,D1 只要R5-1 不为0,就反复执行此条指令,耗时为R5*2=10&mu;s,第七条,RET 此指令为双周期指令,耗时为2&mu;s,我们也要考虑在调用子程序时用到LCALL 指令,耗时2&mu;s,最后可以得到总的延时为:1+5+20+9920+40+10+2=9998&mu;s=10ms 我们可以总结延时总时间的公式:延时总时间=[(2*一层循环次数+3)*二层循环次数+3]*三层循环次数+3 注意此公式只适用于三层以内的循环tips:感谢大家的阅读,本文由我司收集整编。

用汇编语言编写1ms延时程序

用汇编语言编写1ms延时程序

用汇编语言编写1ms延时程序实验题目:设计延时时间1ms的程序实验目的:通过该延时时间程序的实验设计,了解运行程序时的我们可以通过该程序进行程序的延时操作,以便达到我们的操作目的。

实验设备:计算机一台。

实验程序:参考附录A实验内容:题目分析:题目是让计算机做一些无用的操作,来拖延时间。

可以根据一条指令执行时间需要几个时钟周期,即几个微妙,来编程延时程序,也就可以利用循环程序结构。

由查表可得,我们可以用PUSHF和POPF指令来进行编程。

而延时的时间主要取决于循环体及循环次数。

而PUSHF和POPF指令分别为10和8个时钟节拍,LOOP BX指令为3.4个时钟节拍,即此循环体需要用10+8+3.4=21.4拍,而每个时钟节拍是根据此系统的晶振频率而定的。

假设系统用的是8Mhz的晶振,则每个时钟节拍需要0.125μs,因此我们可以根据下列公式算出循环次数:换算成十六进制数为176H。

下图为程序流程图:六、实验总结:此程序中内循环是1ms时间,而在外循环中的两条控制指令DEC和JNZ所对应的时钟节拍分别为2个和4个,一共只需0.75μs,与1ms比较极短,所以我们在外循环里忽略不计了,外循环的循环初值为1000次,对应的十六进制为3E8H。

有时候我们需要计算机为我们“空”一点时间来进行空操作,即什么也不用做,我们可以通过上述的延时时间子程序来达到目的。

附录A延时1ms的程序如下:START: MOV CX,176H ;初始化,设定循环次数CX=376LP1:PUSHF ;循环体POPFLOOP LP1 ; CX CX-1,若CX0转LP1HLT ;暂停延时1s的程序如下:MOV BX,3E8H ; BX 1000LP2:MOV CX,176HLP1: PUSHFPOPF 延时1ms程序段LOOP LP1DEC BXDEC BX ; BX BX-1JNZ LP2 ;ZF=0时,转至LP2,即BX0时转HLT ;暂停参考文献郑学坚,周斌编著.微型计算机原理及应用(第三版).清华大学出版社.2001。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

用汇编语言编写1ms延时程序
实验题目:设计延时时间1ms的程序
实验目的:通过该延时时间程序的实验设计,了解运行程序时的我们可以通过该程序进行程序的延时操作,以便达到我们的操作目的。

实验设备:计算机一台。

实验程序:参考附录A
实验内容:
题目分析:题目是让计算机做一些无用的操作,来拖延时间。

可以根据一条指令执行时间需要几个时钟周期,即几个微妙,来编程延时程序,也就可以利用循环程序结构。

由查表可得,我们可以用PUSHF和POPF指令来进行编程。

而延时的时间主要取决于循环体及循环次数。

而PUSHF和POPF指令分别为10和8个时钟节拍,LOOP BX指令为3.4个时钟节拍,即此循环体需要用10+8+3.4=21.4拍,而每个时钟节拍是根据此系统的晶振频率而定的。

假设系统用的是8Mhz的晶振,则每个时钟节拍需要0.125μs,因此我们可以根据下列公
式算出循环次数:
换算成十六进制数为176H。

下图为程序流程图:
六、实验总结:此程序中内循环是1ms时间,而在外循环中的两条控制指令DEC和JNZ所对应的时钟节拍分别为2个和4个,一共只需0.75μs,与1ms比较极短,所以我们在外循环里忽略不计了,外循环的循环初值为1000次,对应的十六进制为3E8H。

有时候我们需要计算机为我们“空”一点时间来进行空操作,即什么也不用做,我们可以通过上述的延时时间子程序来达到目的。

附录A
延时1ms的程序如下:
START: MOV CX,176H ;初始化,设定循环次数CX=376
LP1:PUSHF ;循环体
POPF
LOOP LP1 ; CX CX-1,若CX0转LP1
HLT ;暂停
延时1s的程序如下:
MOV BX,3E8H ; BX 1000
LP2:MOV CX,176H
LP1: PUSHF
POPF 延时1ms程序段
LOOP LP1
DEC BX
DEC BX ; BX BX-1
JNZ LP2 ;ZF=0时,转至LP2,即BX0时转
HLT ;暂停
参考文献
郑学坚,周斌编著.微型计算机原理及应用(第三版).清华大学出版社.2001。

相关文档
最新文档