单片机交通灯子程序图试题编程序:延时30ms的子程序。用汇编语言编写。

求4MHZ的晶振,延时500ms的子程序,在线等急用O_o_百度知道
求4MHZ的晶振,延时500ms的子程序,在线等急用O_o
我有更好的答案
编程,你总得指定一种 CPU 吧?
采纳率:64%
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。 上传我的文档
 下载
 收藏
粉丝量:33
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
用汇编语言编写1ms延时程序
下载积分:30
内容提示:用汇编语言编写1ms延时程序
文档格式:PDF|
浏览次数:296|
上传日期: 11:30:06|
文档星级:
全文阅读已结束,如果下载本文需要使用
 30 积分
下载此文档
该用户还上传了这些文档
用汇编语言编写1ms延时程序
关注微信公众号单片机汇编延时程序的理解
单片机&嵌入式
单片机应用
嵌入式操作系统
学习工具&教程
学习和开发单片机的必备工具
(有问必答)
(带你轻松入门)
电子元件&电路模块
当前位置: >>
>> 浏览文章
单片机汇编延时程序的理解
单片机汇编实现延迟的程序代码:
DELAY: MOV R7,#250 ;
D1: MOV R6,#250 ;
D2: DJNZ R6,D2 ;
DJNZ R7,D1 ;
&&&&&&& 如果用高级语言编程,只需要简单地调用延时函数就可以实现,但是计算机具体是怎么实现的呢?要想知其所以然,还得从汇编开始学起。
&&&&&&& 冒号前面的&DELAY&、&D1&、&D2&为语句行的名字,是为了程序的条件语句跳转用的,分号后面为注释,计算机执行时将过滤掉这些信息,最大限度减少代码长度,提高效率。
DELAY: MOV R7,#250 ; 名字为&DELAY&的语句:意思是将CPU内部内存RAM的R7位置填写为250(原来为0,为什么是0呢?因为任何程序开始执行前都要复位,就像我们打算盘要将算子复位一样,或者我们用沙盘写字,要将沙盘抹平类似)
D1: MOV R6,#250 ; 名字为&D1&的语句:将R6位置填写为250
D2: DJNZ R6,D2 ; 名字为&D2&的语句:将R6位置的250减1,如果为0就继续执行下一条,不为0就继续执行D2这一句,因为R6=250,所以这个语句要原地踏步执行250次!
DJNZ R7,D1 ; 这句没有名字,因为没有别的语句要跳到这里,所以就省略了。R7同样等于250,但它不是原地踏步,而是跳回了D1,这么干,D!、D2和本句将被循环执行250遍,需要强调的是:D2语句自身每次都要执行250遍,也就是执行了250*250=62500遍!
RET ;子程序结束(因为延时程序一般不作为独立程序存在,它只是一个子程序,也就是高级语言中的一个函数,看到这个字符,子程序将跳回到母程序,进行下一步)。
&&&&&&& 这个子程序这么反复地循环指令,到底有什么意义呢?又是怎么实现的延时程序呢?说起来计算机真是有点笨,它是*数程序执行的次数来累加时间的!也就是说语句本身就是为了浪费时间!哈哈,可笑吧?这就像你没有钟表,但是你知道你跑操场一圈是一分钟,然后就绕着操场跑了60圈,时间过了正好一小时一样。
&&&&&&& 如果是人的话,谁也不会笨到干这么累的活儿来计时,但计算机不一样,它不论静止还是运动,程序总是一拍一拍地运行着,所以它不累。
&&&&&&& 那么,计算机执行一个语句耗费的时间是多少呢?
&&&&&&& 以51型单片机为例:如果采用12MHz的晶振,运行一个机器周期为1微秒,具体为什么暂时不管。单片机的指令系统分为单周期、双周期和三周期指令(三周期实际上占用四个周期,多余一个周期浪费掉),这是有指令的内容决定的,内容多的单周期执行不完,肯定要延长了。子程序里面的MOV是单周期、DJNZ是双周期。
&&&&&&& 这样,我们就可以算算这个子程序累计进行了多少个周期,然后乘以1微秒,就算出它占用的时间,也就是延时的时长了!
&&&&&&& 第一句:DELAY: MOV R7,#250 ;执行了一次,没有任何语句跳转给它,单周期。1
&&&&&&& 第二句:D1: MOV R6,#250 ;执行了250次,全部是第四句跳过来的,单周期。250
&&&&&&& 第三句:D2: DJNZ R6,D2 ;原地执行了250次,从第二句顺延(第二句执行完,没有其它跳转的话肯定要执行第三句)过来250次,也就是250*250=62500次,双周期*2。125000
&&&&&&& 第四句:DJNZ R7,D1 ; 从第三句顺延过来250次,双周期*2。500
&&&&&&& 总计:1+250+=1257501次,乘以1微秒,换算约为0.13秒。
&&&&&&& 我们可以通过调整R6、R7的数值来调整延时的长度。事实上,8位计算机中,R6之类的工作寄存器地址最大只能放下255的十进制数值,因此要通过上述程序达到更长的延时是办不到的。
&&&&&&& 那怎么办呢?
&&&&&&& 我们可以再增加一个R4,让上述的程序最多可以循环255遍,这样,0.13秒的200多倍就是30秒上下了,不够的话再增加循环,又可以扩大200多倍,当然,工作寄存器的数量是有限的,因此这个延时程序也是有限的,如果还不够用怎么办呢,就目前我所学的知识,只能在母程序里面设置循环了,也就是让这个子程序在母程序里面继续循环......
【】【】【】【】
上一篇:下一篇:
CopyRight @
单片机教程网 51hei.com , All Rights Reserved试用循环转移编写延时50ms,晶振12MHZ (单片机程序)的延时子指令_百度知道
试用循环转移编写延时50ms,晶振12MHZ (单片机程序)的延时子指令
我有更好的答案
你是想要左移还是右移?还是一直循环就可以了?
如果是左移右移就要调用了&intrins.h&的文件包,如果是一直循环,那么用while循环语句就可以实现了,如下:
左移右右:#include &reg52.h&
#include&intrins.h&
//包含_crol_函数所在的头文件
#define uint unsigned int
#define uchar unsigned char
void delayms(uint);
//说明子函数
//定袖个变量,用来给P1口赋值
void main()
//先点亮第一个发光管
delayms(500);
//延时500毫秒
aa=_crol_(aa, 1);
//将aa循环左移1位后同给aa
void delayms(uint xms)
for(i=i&0;i--)
for(j=110;j&0;j--);
我已经一句写出来,可以看得慬吧!
采纳率:38%
MOV R0,50;DL2:MOV R1,#250;DL1:NOP;
DJNZ R1,DL1
DJNZ R2,DL2精确延时时间为1*1us+[(1+1+2)*1us*250+(1+2)*1us]*10=10057us
void delay_1ms(uchar _1ms){ while (_1ms--) {
while(i--); }}需要50ms直接调用
delay_1ms(50);就行了。
R1,#98LOOP_2:
RET没有误差
其他1条回答
为您推荐:
其他类似问题
您可能关注的内容
晶振的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。单片机晶振为6MHz,编写100ms延时程序_百度知道
单片机晶振为6MHz,编写100ms延时程序
在使用6MHz晶振时,1个机器周期为1us,执行1条DJNZ指令的时间为2us。
我有更好的答案
采用定时方式1,计数初值为:X=3CB0H确定TMOD方式字,TMOD=10H程序设计:
LJMP INTMAIN:MOV TMOD,#10H
MOV TH1,#3CH
MOV TL1,#B0H
SETB TR1HALT:SJMP $INT:
MOV TH1,#3CH
MOV TL1,#B0H
采纳率:50%
先给你改个错误:在使用6MHz晶振时,1个机器周期为1us,是不对的。51单片机在使用6MHz晶振时
1个机器周期=12/6MHz=2us可以编写100ms延时子程序
调用子程序YS100MS
就可以延时100msYS100MS: MOV R7,#100L1:
MOV R6,#250
DJNZ R6,$;
RET 延时时间=(R6*2*2us)×R7=(250*2*2us)×100=100000us=100ms
就选满意回答
本回答被提问者和网友采纳
MOV R7,#100L1:MOV R6,#250DJNZ R6,$;250*2*2=1000usDJNZ R7,L1
为您推荐:
其他类似问题
晶振的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 单片机跳出子程序循环 的文章

 

随机推荐