本文目录
- 主程序流程图和子程序流程图怎么写,还有资源分配表怎么写
- STC89C51与DS18B20加一个四位共阳数码管组成的测温显示,谁能告诉我程序的流程图,和子程序流程图,必有重
- 关于max7219显示模块的子程序的流程图
- 怎么在流程图中表示单片机子程序调用
- 子程序流程图用结束还是返回
- 漩涡!!!帮忙解释详细点!!原理等
- 关于单片机延时子程序流程图的问题
- 单片机延时子程序流程图
主程序流程图和子程序流程图怎么写,还有资源分配表怎么写
主程序,和子程序流程图没有本质的区别,都是要表达的程序的图形描述。程序流程图是人们对解决问题的方法、思路或算法的一种描述。 采用简单规范的符号,表达程序执行的过程。流程图有很多种写法,较多的是PAD图。在c语言中用的很多。为便于识别,绘制流程图的习惯做法是: 事实描述用椭圆形表示 行动方案用矩形表示 问题用菱形表示 箭头代表流动方向 资源分配表是程序所要用到的硬件的分配列表,io口,ram空间分配等等
STC89C51与DS18B20加一个四位共阳数码管组成的测温显示,谁能告诉我程序的流程图,和子程序流程图,必有重
#include《reg52.h》unsigned char m,n,p;sbit DQ=P2^3;//定义DS18b20的管脚sbit L1=P2^7;//定义控制数码管的管脚sbit L2=P2^6;sbit L3=P2^5;sbit L4=P2^4;unsigned char table={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x7f,0xbf,0xa7};//0-9数字,后面为". - C"/*****延时子程序*****/void Delay_DS18B20(int num){ while(num--) ;}/*****初始化DS18B20*****/void Init_DS18B20(void){ unsigned char x=0; DQ = 1; //DQ复位 Delay_DS18B20(8); //稍做延时 DQ = 0; //单片机将DQ拉低 Delay_DS18B20(80); //精确延时,大于480us DQ = 1; //拉高总线 Delay_DS18B20(14); x = DQ; //稍做延时后,如果x=0则初始化成功,x=1则初始化失败 Delay_DS18B20(20);}/*****读一个字节*****/unsigned char ReadOneChar(void){ unsigned char i=0; unsigned char dat = 0; for (i=8;i》0;i--) { DQ = 0; // 给脉冲信号 dat》》=1; DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; Delay_DS18B20(4); } return(dat);}/*****写一个字节*****/void WriteOneChar(unsigned char dat){ unsigned char i=0; for (i=8; i》0; i--) { DQ = 0; DQ = dat&0x01; Delay_DS18B20(5); DQ = 1; dat》》=1; }}/*****读取温度*****/unsigned int ReadTemperature(void){ unsigned char a=0; unsigned char b=0; unsigned int t=0; float tt=0; Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0x44); //启动温度转换 Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器 a=ReadOneChar(); //读低8位 b=ReadOneChar(); //读高8位 t=b; t《《=8; t=t|a; tt=t*0.0625; t= tt*10+0.5; //放大10倍输出并四舍五入 return(t);}void display()//数码管扫描函数{P0=table;L1=0;//暂未1,如用三极管驱动要改为0Delay_DS18B20(250);L1=1;//后关闭显示P0=table;//P1=table;//第二位后显示中间点L2=0;Delay_DS18B20(250);L2=1;P0=table;L2=0;Delay_DS18B20(250);L2=1;P0=table;//小数部分L3=0;Delay_DS18B20(250);L3=1;P0=table;L4=0;Delay_DS18B20(250);L4=1;}/*主函数部分程序*/void main()//主函数{unsigned int j;while(1){ j=ReadTemperature();//读取温度m=j/100;//分离出十位n=(j%100)/10;//分离出个位p=j%10;//分离出小数位display();//扫描数码管}}
关于max7219显示模块的子程序的流程图
这是我用的一个图,你参考吧
sbit LOAD = P2^3; //MAX7219 Load-Data Input: rising edge pin 12 sbit DIN = P2^5; //MAX7219 Serial-Data Input: rising edge pin 1sbit CLK = P2^4; //MAX7219 Serial-Clock Input: maximum 10MHz pin 13void Write_Max7219_byte(unsigned char temp){unsigned char i;for (i=0; i《8; i++) { CLK = LOW;DIN = (bit)(temp&MSB); //按位相与操作 temp 《《=1; //左移一位CLK = HIGH;}}void Write_Max7219(unsigned char address,unsigned char dat){ LOAD = LOW;Write_Max7219_byte(address); Write_Max7219_byte(dat);LOAD = HIGH; }void Init_Max7219(void) { Write_Max7219(SHUT_DOWN, 0x01); //Normal Operation XXXXXXX1 Shutdown Mode XXXXXXXX0置 MAX7219 为 正常显示模式 (非shutdown模式)Write_Max7219(DISPLAY_TEST, 0x00); //Normal Operation XXXXXXX0 Display Test Mode XXXXXXXX1 置 MAX7219 为正常显示模式 (非test模式)Write_Max7219(DECODE_MODE, 0xff); //Decode Mode Select D7~D0 1 B decode 0 No decode 定义为解码方式Write_Max7219(SCAN_LIMIT, 0x03); //SCAN LIMIT 0~7 0xX0~0xX7定义要显示的数码管Write_Max7219(INTENSITY, 0x04); //Set Intensity 0xX0~0xXf亮度控制}
怎么在流程图中表示单片机子程序调用
是中断的话在中断大概点出一个箭头,然后写中断程序,子程序的话,我一般就是一句话,子程序也可以再画一个,一个完整的程序一个图恐怕是画不下的,个人意见,望高手有更好的解决方法
子程序流程图用结束还是返回
结束。子程序流程图需要使用结束。子程序(subprogram)是对与子计算任务相应的处理对象和处理规则的描述。它是一个可被其他程序(单位)调用的程序单位。
漩涡!!!帮忙解释详细点!!原理等
涡街流量计是基于卡门涡街原理制成的一种流体振荡性流量计。即在流动的流体中放置一个非流线型的对称形状的物体(涡街流量传感器中称之为漩涡发生体),就会在其下流两侧产生两列有规律的漩涡即卡门涡街,其漩涡频率正比于来流速度: F=Stu/d (1)式中 F—涡街频率 d—漩涡发生体宽度 u—来流速度 St—斯特劳哈尔数 St的值与漩涡发生体宽度d和雷诺数Re有关。当雷诺数Re<2×104情况下,St为变数:当Re在2×104~7×106的范围内,St值基本上保持不变,这段范围为流量计的基本测量范围。 式(1)表明,当d和St为定值时,漩涡产生的频率F与流体的平均流速u成正比,利用这一特性制成了涡街流量计。由于涡街传感器所测的并不是平均流速,而大约是漩涡发生体两侧的流速。对于湍流状态,不同的雷诺数下,流速分布规律是不同的。即不同的流速下具有不同的流速分布,进而说明了涡街流量传感器检测到的主要反映漩涡发生体两侧的流速与管道平均流速的关系不是唯一确定的。这说明涡街流量传感器的非线性误差是其检测机理所决定的。在实际使用时,先绘出传感器的仪表系数与频率的试验曲线f (F)。 K= f (F)=KG(F) (2) 式中G(F)是同一口径的各台仪表相同的曲线形状(仅是位移不同)。K是平均仪表系数。在本文应用MCS一51单片机的智能涡街流量计中,通过将试验曲线形状G(F)事先固化于流量计的EPROM中,和让用户结合现场具体工况通过键盘输入K的值,实现涡街传感器的非线性修正。硬件设计图1是系统的硬件原理框图。图1 硬件原理框图根据设计要求,单片机应用系统包括:(1)接受变送器送来的与流量成正比的脉冲,并对其定时、计数的电路;(2)显示器,键盘,打印机接口电路;(3)外部存储器的扩展电路;主要电路介绍如下:1 键盘/显示器及打印机接口 为使接口硬件尽可能少,设计时,仅用一片8155I/O接口芯片完成智能化仪表的键盘输入,LED输出和打印机输出的接口任务。将8155的PC口用作显示自选通和键盘扫描输出,PB口用作显示字段及小数点的输出,8031外部中断INTO用作键盘响应输入,PA口用作外接打印机的输出。如图2所示。图2 键盘/显示器及打印机接口电路(1)显示器接口设计 设计6位LED显示器作为仪表的显示输出。8155的PB口定义为输出口,其中低四位PB0~PB3输出显示数据的BCD码,并经74LS249 BCD译码器译码后送LED的段码端,PB4作为测量结果的小数点位经驱动器后接LED的小数点发光段;PB5作为极性控制位单独控制一个发光二极管以显示测量结果的正负。8155的PC口定义为输出口,PC0~PC5分别控制6位LED的位选通,实现动态扫描方式显示。 (2)键盘接口设计 在图2所示的键盘接口中,由6个键组成键盘。8031用外部中断INTO作为键盘状态输出。在6个键中,其中两个键定义为"加一键"和"减一键"。另外4个键分别为打印键,编程键,选项键以及复位键。按下编程键后,进入编程状态,用户输入平均仪表系数。选项键用来确定显示那种流量表达方式(如体积流量、质量流量等),键盘的列扫描信号来自于PC口输出的LED位选通信号:键盘的行输入信号由键盘是否闭合得到。没键按下,键状态为开,INTO位高电平,中断不被触发;若有键按下,键状态为闭,INTO由高点平变为低电平,中断由信号下降沿触发,从而向CPU发出中断请求。CPU响应中断后读取PC口的输出状态,判断PC0~PC5输出的低电平为即可完成键扫描和键识别。 (3)打印机接口设计 采用GP一16通用智能微型打印机,自带8039单片机。它可以把8031送来的数据以字符串、数据或图形三种方式打印出来;它与仪表的接口设计如图2所示,它的8根双向三态数据线D0~D7直接与8155的PA0~PA7相连,片选信号CS与8155的片选信号公用单片机系统译码器输出的端口地址Y7,WR和RD直接与8031的WR,RD相连,其硬件设计非常简单。2 外部存储器的扩展 (1)程序存储器EPROM的扩展 由于8031片内没有EPROM,故8031单片机需要外扩一片EPROM2764(8K字节)。在P0口送出的低8位地址时,地址由信号ALE的下降沿控制锁存到锁存器中,高5位由P2.0~P2.4提供,锁存器采用74LS373锁存器,控制端直接与ALE相连。则程序存储器读选通信号PSEN控制EPROM2764的输出允许端OE。 (2)数据存储器的扩展 MCS一51单片机内RAM为128个字节,因其容量不能满足设计要求,故本机扩展8K字节静态RAM6264一片。本机外扩展的RAM和EPROM电路如图3所示:图3 外部存储器扩展从图中可以看出EPROM2764与RAM6264的地址范围是相同的,但是它们的控制信号是不一样的。2764的选通信号是PSEN,而6264的读入或写入是靠RD或WR型号控制,所以不会产生数据冲突问题。软件设计本机软件采用模块结构,其4个主要部分分别如下。1 主程序 主程序为本仪器的监测程序。在程序运行中,必须首先对系统进行初始化,清各工作单元,置计数器及标志位初值,自检指示灯,开中断,启动计数器等工作。仪器采用微型键盘和LED指示灯相配合,使仪器的各种功能清晰有序。 键盘子程序包括:扫描键盘子程序。其功能是寻找是否有键按下,输入键值程序;键值扫描程序;表驱动程序;通用显示子程序等。键值扫描子程序的功能是根据按键的位置一行行的扫描。表驱动程序是判断按键是哪种功能键。通用显示子程序的功能是将显示缓冲区中的字码转换成段码送入显示器中,显示各种字型。几乎所有程序中都要用到这一程序,因此称之为通用显示子程序,以便与显示功能块相区别。2 中断服务程序 仪器的测量、转换等程序均通过中断方式同主程序相连,单片机内的两个定时器计数器作为闸门使用。因为流量频率的测量很重要,所以定时器TO被用来测评,并定为高级中断。测量测频中断服务子程序流程图如图4所示。3 功能块程序 仪器通过键盘输入命令,可随时得到用户所需的结果,这就要用到功能程序块。功能程序块包括:显示、打印、清零等功能块。显示功能块的作用是根据用户的需要转入相应的入口参数,再经过码之转换,送至显示缓冲区中。打印程序包括打印质量流量及体积流量、瞬时流量及累计流量。4 使用计算子程序主要包括计算流量的程序 采用的是浮点制运算子程序,这些运算子程序可直接调用。结 论采用上述设计的智能化涡街流量计,可让用户结合现场具体工况,通过键盘方便地输入校正系数,完成了对涡街流量计非线性修正,拓宽了涡街流量计的应用范围。图4 TO的中断子程序框图
关于单片机延时子程序流程图的问题
你把程序格式弄的规范一些,很好看出来的。。。我只画了一个流程图给你,另外一个也很简单的嘛,自己动手弄弄吧。。;延时子程序_1DELAY1:PUSH05HMOVR5,#10HDELAY2:LCALLDISP1;调用子程序DISP1DJNZR5,DELAY2POP05H;延时子程序_2DELAY12:PUSH06HPUSH05HMOVR6,#4DELAY21:MOVR5,#225DELAY31:DJNZR5,DELAY31DJNZR6,DELAY21POP05HPOP06HRETEND
单片机延时子程序流程图
延时程序在单片机编程中使用非常广泛,但一些读者在学习中不知道延时程序怎么编程,不知道机器
周期和指令周期的区别,不知道延时程序指令的用法, ,本文就此问题从延时程序的基本概念、机器周期和指
令周期的区别和联系、相关指令的用法等用图解法的形式详尽的回答读者
我们知道程序设计是单片机开发最重要的工作,而程序在执行过程中常常需要完成延时的功能。例如
在交通灯的控制程序中,需要控制红灯亮的时间持续30秒,就可以通过延时程序来完成。延时程序是如何
实现的呢?下面让我们先来了解一些相关的概念。
一、机器周期和指令周期
1.机器周期是指单片机完成一个基本操作所花费的时间,一般使用微秒来计量单片机的运行速度,
51 单片机的一个机器周期包括12 个时钟振荡周期,也就是说如果51 单片机采用12MHz 晶振,那么执行
一个机器周期就只需要1μs;如果采用的是6MHz 的晶振,那么执行一个机器周期就需要2 μs。
2 .指令周期是指单片机执行一条指令所需要的时间,一般利用单片机的机器周期来计量指令周期。
在51 单片机里有单周期指令(执行这条指令只需一个机器周期),双周期指令(执行这条指令只需要两个
机器周期),四周期指令(执行这条指令需要四个机器周期)。除了乘、除两条指令是四周期指令,其余均
为单周期或双周期指令。也就是说,如果51 单片机采用的是12MHz 晶振,那么它执行一条指令一般只需
1~2 微秒的时间;如果采用的是6MH 晶振,执行一条指令一般就需2~4 微秒的时间。
现在的单片机有很多种型号,但在每个型号的单片机器件手册中都会详细说明执行各种指令所需的机
器周期,了解以上概念后,那么可以依据单片机器件手册中的指令执行周期和单片机所用晶振频率来完成
需要精确延时时间的延时程序。
二、延时指令
在单片机编程里面并没有真正的延时指令,从上面的概念中我们知道单片机每执行一条指令都需要一
定的时间,所以要达到延时的效果,只须让单片机不断地执行没有具体实际意义的指令,从而达到了延时
的效果。
1.数据传送指令 MOV
数据传送指令功能是将数据从一个地方复制、拷贝到另一个地方。
如:MOV R7,#80H ;将数据80H 送到寄存器R7,这时寄存器R7 里面存放着80H,就单这条
指令而言并没有任何实际意义,而执行该指令则需要一个机器周期。
2.空操作指令 NOP
空操作指令功能只是让单片机执行没有意义的操作,消耗一个机器周期。
3.循环转移指令 DJNZ
循环转移指令功能是将第一个数进行减1 并判断是否为0,不为0 则转移到指定地点;为0 则往下执行。
如:DJNZ R7,KK ;将寄存器R7 的内容减1 并判断寄存器R7 里的内容减完1 后是否为0,如果
不为0 则转移到地址标号为KK 的地方;如果为0 则执行下一条指令。这条指令需要2 个机器周期。
利用以上三条指令的组合就可以比较精确地编写出所需要的延时程序。
三、1 秒延时子程序、流程图及时间计算 (以单片机晶振为12MHz 为例,1 个机器周期需要1μs)
了解了以上的内容,现在让我们来看看
程序总共所需时间:1+10+2560+330240+660480+5120+20+2=998433 μs≈1S
在这里运行这段程序共需998433 μs,还差1567μs 才达到1S 的,所以想要达到完美的1S 延时,需
要在返回指令RET 前再添加一些指令让它把1567μs 的延时完成。有兴趣的读者可以自己试着添加完成。
最后补充一点,编写程序时一般将延时程序编写成独立的子程序,而所谓子程序也就是一个实现某个功能
的小模块。这样在主程序中就可以方便地反复调用编写好的延时子程序。
小提示:循环转移指令(DJNZ )除了可以给定地址标号让其跳转外,还可以将地址标号改成$,这样
程序就跳回本指令执行。例如:
DJNZ R7,$ ;R7 内容减1 不为0,则再次执行本指令;为0 则往下执行,当R7 的值改为10
时,则执行完该条程序所需的时间为2*10=20 μs。
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
=*10+3 ⑧
=998033μs≈1s
由⑧整理得:延时时间=*第三层循环+3 ⑨
此式适用三层循环以内的程序,也验证了例1中式⑦(第三层循环相当于1)的成立。
注意,要实现较长时间的延时,一般采用多重循环,有时会在程式序里加入NOP指令,这时公式⑨不再适用,下面举例分析。
例3仍以1秒延时为例
DEL:MOV R7,#10 1指令周期1
DEL1:MOV R6,#0FFH 1指令周期10
DEL2:MOV R5,#80H 1指令周期255*10=2550
KONG:NOP 1指令周期128*255*10=326400
DJNZ R5,$ 2指令周期2*128*255*10=652800
DJNZ R6,DEL2 2指令周期2*255*10=5110
DJNZ R7,DEL1 2指令周期2*10=20
RET 2
延时时间=1+10+2550+326400+652800+5110+20+2 =986893μs约为1s
整理得:延时时间=*第三层循环+3 ⑩
结论:针对初学者的困惑,对汇编程序的延时算法进行了分步讲解,并就几种不同写法分别总结出相应的计算公式,只要仔细阅读例1中的详解,并用例2、例3来加深理解,一定会掌握各种类型程序的算法并加以运用。
单片机延时子程序
1)延时为:20ms 晶振12M
1+(1+2*248+2)*4+1+1+1=20000US=20MS
用汇编..优点就是精确...
缺点就是算有点复杂.
DELAY20MS:
MOV R7,#4
D1:
MOV R6,#248
DJNZ R6,$
DJNZ R7,D1
NOP
NOP
RET
2)一些通过计算51汇编指令得出的软延时子程序
;*****************************************************************
;延时10uS
;*****************************************************************
time10us: mov r5,#05h ;11us
djnz r5,$
ret
;*****************************************************************
;延时50uS
;*****************************************************************
time50us: mov r5,#19h ;51us
djnz r5,$
ret
;*****************************************************************
;延时100uS
;*****************************************************************
time100us: mov r5,#31h ;99.6us
djnz r5,$
ret
;*****************************************************************
;延时200uS
;*****************************************************************
time200us: mov r5,#64h ;201us
djnz r5,$
ret
;*****************************************************************
;延时250uS
;*****************************************************************
time250us: mov r5,#7ch ;249.6us
djnz r5,$
ret
;*****************************************************************
;延时350uS
;*****************************************************************
time350us: mov r5,#0afh ;351us
time350us_1: djnz r5,time350us_1
ret
;*****************************************************************
;延时500uS
;*****************************************************************
time500us: mov r5,#0fah ;501us
time500us_1: djnz r5,time500us_1
ret
;*****************************************************************
;延时1mS
;*****************************************************************
time1ms: mov r5,#0fah ;1001us
time1ms_1: nop
nop
djnz r5,time1ms_1
ret
;*****************************************************************
;延时2.5mS
;*****************************************************************
time2_5ms: mov r5,#05h ;2.496ms
time2_5ms_1: mov r6,#0f8h ;497us
djnz r6,$
djnz r5,time2_5ms_1
ret
;*****************************************************************
;延时10mS
;*****************************************************************
time10ms: mov r5,#14h ;10.262ms
time10ms_1: mov r6,#0ffh ;511us
djnz r6,$
djnz r5,time10ms_1
ret
;*****************************************************************
;延时50mS
;*****************************************************************
time50ms: mov r5,#63h ;49.996ms
time50ms_1: mov r6,#0fbh ;503us
djnz r6,$
djnz r5,time50ms_1
ret
;*****************************************************************
;延时100mS
;*****************************************************************
time100ms: mov r5,#0c3h ;100.036ms
time100ms_1: mov r6,#0ffh ;511us
djnz r6,$
djnz r5,time100ms_1
ret
;*****************************************************************
;延时200mS
;*****************************************************************
time200ms: mov r5,#02h ;250.351ms
time200ms_1: mov r6,#0f4h ;125.173ms
time200ms_2: mov r7,#0ffh ;511us
djnz r7,$
djnz r6,time200ms_2
djnz r5,time200ms_1
ret
;*****************************************************************
;延时500mS
;*****************************************************************
time500ms: mov r5,#04h ;500.701ms
time500ms_1: mov r6,#0f4h ;125.173ms
time500ms_2: mov r7,#0ffh ;511us
djnz r7,$
djnz r6,time500ms_2
djnz r5,time500ms_1
ret
;*****************************************************************
;延时1S
;*****************************************************************
time1s: mov r5,#08h ;1001.401ms
time1s_1: mov r6,#0f4h ;125.173ms
time1s_2: mov r7,#0ffh ;511us
djnz r7,$
djnz r6,time1s_2
djnz r5,time1s_1
ret
12M晶振 机器周期为1US NOP为单周期指令 DJNZ为双周期指令.
3)
;;晶振12MHZ,延时1秒
DELAY:MOV 72H,#100
LOOP3:MOV 71H,#100
LOOP1:MOV 70H,#47
LOOP0:DJNZ 70H,LOOP0
NOP
DJNZ 71H,LOOP1
MOV 70H,#46
LOOP2:DJNZ 70H,LOOP2
NOP
DJNZ 72H,LOOP3
MOV 70H,#48
LOOP4:DJNZ 70H,LOOP4
4);延时1分钟子程序,F=6MHz
;程序已测过,延时时间60,000,000.0uS
delay60s:mov r3,#228
mov r2,#253
mov r1,#219
loop1: djnz r1,$
djnz r2,loop1
djnz r3,loop1
nop
ret
5)计算机反复执行一段程序以达到延时的目的称为软件延时,单片机程序中经常需要短时间的延时,但是相当一部分人对延时程序很模糊,对延时程序的算法不够了解,在这里我以12MHz晶振和两个经典延时子程序为例,详细分析单片机汇编延时程序。
何为时钟周期、机器周期、和指令周期?
时钟周期:也就是振荡周期,以12MHz的时钟脉冲为例,那时钟周期就为(1/12000000)s=(1/12)us;
机器周期:1个机器周期=6个状态周期=12个时钟周期=1us;
指令周期:CPU执行一条指令所需要的时间称为指令周期,指令周期是以机器周期为单位的,不同的指令所需的机器周期不一定相同,可参考51单片机指令速查表。
由上可得:CPU执行一条单周期指令,需要1us;执行一条双周期指令需要2us。
下面是具体的延时子程序分析:
0.1s延时子程序(12MHz晶振):
MOV R7,#200 ;单周期指令(1us)
D1: MOV R6,#250 ;单周期指令(1us)
DJNZ R6,$ ;双周期指令(2us)//该指令自身执行R6次
DJNZ R7,D1 ;双周期指令(2us)//D1执行R7次
RET ;双周期指令(2us)
T=1+(1+2*R6+2)*R7+2
=100603us
≈0.1s
0.5s延时子程序(12MHz晶振):
MOV R7,#5 ;单周期指令(1us)
D1: MOV R6,#200 ;单周期指令(1us)
D2: MOV R5,#250 ;单周期指令(1us
DJNZ R5,$ ;双周期指令(2us)//该指令自身执行R5次
DJNZ R6,D2 ;双周期指令(2us)//D2执行R6次
DJNZ R7,D1 ;双周期指令(2us)//D1执行R7次
RET ;双周期指令(2us)
T=1+*R7+2
=503018us
≈0.5s
6) 51单片机经典流水灯程序,在51单片机的P2口接上8个发光二极管,产生流水灯的移动效果。
ORG 0 ;程序从0地址开始
START: MOV A,#0FEH ;让ACC的内容为11111110
LOOP: MOV P2,A ;让P2口输出ACC的内容
RR A ;让ACC的内容左移
CALL DELAY ;调用延时子程序
LJMP LOOP ;跳到LOOP处执行
;0.1秒延时子程序(12MHz晶振)===================
DELAY: MOV R7,#200 ;R7寄存器加载200次数
D1: MOV R6,#250 ;R6寄存器加载250次数
DJNZ R6,$ ;本行执行R6次
DJNZ R7,D1 ;D1循环执行R7次
RET ;返回主程序
END ;结束程序