谭久刚 《单片机应用技术》1-2_第1页
谭久刚 《单片机应用技术》1-2_第2页
谭久刚 《单片机应用技术》1-2_第3页
谭久刚 《单片机应用技术》1-2_第4页
谭久刚 《单片机应用技术》1-2_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

子情境1-2:软件延时流水灯控制任务1-2-2任务1-2-1软件延时实现灯的闪烁及流动1s软件延时程序的设计及调试任务1-2-1:1s软件延时程序的设计及调试任务要求:设计延时1s的软件延时程序多重循环软件延时1s程序设计单循环软件延时1ms程序设计

认识单片机时序Step1Step2Step3任务实施步骤知识点小结如何实现灯的流动及显示灯的闪烁即灯亮会——灭会——再亮——再灭……,所以要实现灯的闪烁,首先应能控制灯的亮灭,上一章的学习可以知道,P1.0引脚置‘0’灯亮,置‘1’灯灭。其次,闪烁的快慢可以通过控制亮灭的间隔时间实现,便涉及时间控制的问题。灯的流动显示先假设一只灯向左流动显示,即灯亮的顺序为D1——D2……——D7——D1——D2……,其实现方法是先将P1.0置‘0’,其它口置‘1’,点亮D1,间隔时间到后,将P1.1置‘0’,其它口置‘1’,点亮D2……依次循环下去。因此,不管是闪烁还是流动控制,都需要延时,首先学习延时程序的设计。1.如何进行时间控制软件延时利用单片机的空操作指令(即NOP指令,CPU执行该指令时,单片机不做任何事,仅仅占用CPU时间。)来实现,当点亮某只灯后就让CPU执行该指令,控制该指令的执行次数便可以控制延时时间。定时器延时利用单片机内部定时器实现硬件定时。返回Step1认识单片机时序软件延时的前提是单片机CPU执行指令要花时间,而NOP指令更是专门为软件延时设计的指令之一,要控制延时时间,首先应弄清楚执行一次该指令要花多长时间。

时钟周期

时钟电路所提供给单片机的时钟信号的周期,单片机内部所有电路的工作时钟都来自于此,当时钟电路晶振频率为l2MHz,它的时钟周期就是。机器周期

单片机访问一次存储器的时间,称之为一个机器周期。一个机器周期包括12个时钟周期,如果一个单片机选择的时钟频率为l2MHz,机器周期则为。指令周期所谓指令周期就是CPU指执行一条指令所花的时间。51单片机的所有指令中,按执行时间可分为单机器周期、双机器周期和4机器周期指令。

NOP指令属单机器周期指令,即,当时钟频率为l2MHz时,CPU执行一次NOP指令,将耗时。Step1认识单片机时序2.单片机的时序

Step2单循环软件延时1ms程序设计根据上面的分析知道,执行一次NOP指令耗时,假设延时1s(即),则需要执行NOP指令次,我们不可能在程序中写条NOP指令,利用循环结构可以很好的解决这个问题。循环程序是一种常用的程序结构,其流程图如图,可知:

循环程序包括设置循环次数、设置循环初值、循环体、次数修改及循环条件判断等,其中,循环体为需要多次重复执行的程序块。执行整个循环程序的耗时为:1.汇编循环程序结构及执行时间Step2单循环软件延时1ms程序设计32.1ms延时程序设计程序功能分析单片机采用12Mhz晶振,机器周期为1us,要实现1ms软件延时,即需单片机执行1000个机器周期。算法确定采用循环程序,循环执行指令1000个机器周期。程序流程图

假设循环次数为200次,则循环程序执行时间包括:(1)循环体+循环次数修改判断两部分程序要执行200次的耗时;(2)赋循环初值、循环次数等指令耗时

用R0寄存器存放循环次数,赋值200,循环次数修改判断指令DJNZ执行1次耗时

2us,则循环体应安排三个NOP指令,执行一次循环耗时3us,则每次循环耗时2+3=5us,5×200=1000us,实现了1ms的延时。汇编语言源程序DELAY1ms:MOV R0,#200 ;设置循环次数及初值(1us)

LP1:NOP ;循环体,执行三次NOP(3us)

NOPNOPDJNZR0,LP1 ;循环次数减1,不为0循环,为0退出循环2us循环体执行200次循环次数修改及判断,执行200次耗时1ms关键指令说明

DJNZ R0,LP1

该指令为一条件跳转指令,双机器周期指令,执行时间为2us,CPU执行该指令将完成以下操作:(1)R0=R0-1,即将R0的内容减1(2)减1后判断R0是否为0,不为0则跳到标号LP1处执行循环程序,否则执行DJNZ下一条指令(退出循环)。

从而我们看出,利用这一条指令便实现了循环次数修改、条件判断的功能,以后的循环程序中会经常使用这条指令。各指令的执行时间可查阅指令表。寄存器寻址将操作数存放在寄存器中,寄存器包括R0~R7、A、B等。立即数寻址十进制数200送入R0直接寻址

LP1代表ROM的单元地址R0不为0精确执行时间为多少?Step2单循环软件延时1ms程序设计Step2单循环软件延时1ms程序设计33.程序调试仿真(1)单步调试利用keil软件建立项目,编译后进入调试界面,单步执行程序,可以观察R0和sec的变化情况。演示链接(2)断点调试

使用单步调试工具可以逐条执行程序语句并观察运行结果,而利用断点调试工具可以调试某个程序块。按下列步骤调试:演示链接

a.断点设置,双击‘LJMP$’语句前的程序执行箭头处,显示一红色圆点即表示在该语句处设置了一个断点,再双击则取消断点;

b.运行程序,断点设好后,点击全速运行按钮,程序将被执行到断点处,并在个窗口显示相关信息;

c.查看运行结果,sec显示为0.00100100s,表示该程序段执行了0.00100100秒(即1001us)满足延时要求。否则修改源程序,直到调试通过。Step3多重循环软件延时1s程序设计1.算法确定及流程图

前面的程序中使用了寄存器R0存放循环次数,赋值200,延时1ms,以此类推,如果给R0赋值200000就可以实现1s的延时。但由于AT89S51为8位单片机,除PC和DPTR外,其余都是8位存储器单元,最大存储数据为255,因此,要实现更长时间的软件延迟,考虑采用多重循环。延时1s需循环执行1ms软件延时1000次,由于寄存器位数受限,将1000拆分为100×10,即先设计10ms延时程序,再循环调用10ms延时程序100次即可,分别采用R0~R2存放循环次数,流程图如图所示。2.汇编语言源程序DELAY1s: MOV R2,#100 ;1usDELAY10ms: MOV R1,#10 ;1usDELAY1ms: MOV R0,#200 ;1usLP1: NOP ;1us

NOP ;1us

NOP ;1us

DJNZ R0,LP1 ;2us

DJNZ R1,DELAY1ms;2us

DJNZ R2,DELAY10ms;2us

SJMP $ ;死循环,防止程序跑飞

END

;程序结束1ms内循环10ms二重循环1s外循环Step3多重循环软件延时1s程序设计3.软件仿真调试1s程序仿真结果保存源文件,建立项目,添加源文件,编译后进入仿真调试状态,设置断点并运行,显示结果如图3-5所示,结果符合设计预期。演示链接。返回Step3多重循环软件延时1s程序设计任务1-2-2:软件延时实现灯的闪烁及流动任务要求:利用1s软件延时程序实现灯的闪烁及流动显示延时子程序实现灯的流动带参数延时子程序实现闪烁速度控制延时子程序实现灯的闪烁

软件延时实现LED闪烁

Step1Step2Step3任务实施步骤知识点小结Step4Step1软件延时实现灯的闪烁1.系统功能分析及流程图此系统的主要功能是利用软件延时实现灯的闪烁,即控制某只灯亮——延时——灯灭——延时——再亮——延时——再灭——延时……。因此,主程序实际是一个循环程序,流程图如图。2.汇编语言源程序

ORG 0000H LJMP START

ORG 0030HSTART:

CLR P1.0

;P1.0=0,灯亮;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;延时1s;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;DELAY1s: MOV R2,#100DELAY10ms: MOV R1,#10 DELAY1ms: MOV R0,#200 LP1: NOP NOP NOP DJNZ R0,LP1 DJNZ R1,DELAY1ms DJNZ R2,DELAY10ms

SETB P1.0

;P1.0=1,灯灭

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;延时1s;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;DELAY1s1: MOV R2,#100DELAY10ms1: MOV R1,#10 DELAY1ms1: MOV R0,#200 LP11: NOP NOP NOP DJNZ R0,LP11 DJNZ R1,DELAY1ms1 DJNZ R2,DELAY10ms1 LJMP START ;跳转到START处,灯亮

END

CLR(位置‘0’)指令格式:CLRbit,(bit表某个位寻址单元,如P1.0)指令功能:将某位置‘0’,‘CLRP1.0’将P1.0引脚置‘0’,灯亮。SETB(位置‘1’)指令格式:SETBbit,(bit表某个位寻址单元,如P1.0)指令功能:将某位置‘1’,‘SETBP1.0’将P1.0引脚置‘1’,灯灭。位寻址

仅对某位进行操作,如程序中的CLRP1.0指令,仅将P1寄存器中的P1.0位清‘0’,其它位不变。3.仿真调试建立项目并编译完成后,进入调试状态,调出P1窗口,全速执行程序,可以发现P1.0的内容在不停地变化。如果利用Proteus软件仿真也可以看到D1闪烁的效果。达到设计要求。演示链接Step1软件延时实现灯的闪烁Step2延时子程序实现灯的闪烁1.子程序概念在解决实际问题时,经常会遇到一个程序中多次使用同一个程序段,为了节约内存,我们把这种具有一定功能的独立程序段编成子程序,例如上面的延时子程序。当需要时,可以去调用这些独立的子程序,调用程序称为主程序。如图为灯闪烁控制程序,由主程序和延时子程序两部分构成,主程序需要延时时才转去执行延时子程序,但,为完成系统功能,延时子程序执行完后还得返回主程序控制灯的亮灭。2.子程序调用及返回CPU执行哪段程序取决于指令指针寄存器PC的值,如图所示,延时子程序定位在ROM的0100H单元,当PC=0100H时,CPU将执行延时子程序。再以1次调用为例,延时子程序执行完后,使PC=0035H,CPU将执行

‘SETBP1.0’语句,使灯灭。LCALL为子程序调用指令,可完成PC=0100H的功能,同时进行断点地址保护;RET为子程序返回指令,可将之前保护的断点地址送给PC(即PC=0035H)。断点地址即LCALL指令下一条指令所在ROM地址,断点地址保护在堆栈中。堆栈,存放临时数据(如断点地址)的内存区域(RAM中)。LCALL(子程序调用指令)指令格式:LCALL标号,标号即子程序入口地址(如DELAY1s)指令功能:CPU执行LCALL指令时,依次完成以下操作:a.PC自动加1,使PC指向SETBP1.0所在地址单元(即PC=0035H),注意,LCALL为三字节指令;b.保护PC中的断点地址0035H到堆栈(RAM中);c.将子程序DELAY1s的入口地址0100H赋给PC(即PC=0100H);d.CPU转向DELAY1Sz子程序运行。RET(子程序返回指令)子程序必须以RET指令结尾,CPU执行RET指令将顺序完成以下操作:a.取出先前保护在堆栈中的断点地址0035H赋给PC;b.CPU转向断点处继续执行后续程序。如何调用又如何返回?首先明确Step2延时子程序实现灯的闪烁3.延时子程序实现灯的闪烁程序设计演示链接

;;;;;;;;;;;;;;;;;;;;;;;;;;;;主程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

ORG 0000H LJMP START

ORG 0030H

;定位主程序起始地址为0030HSTART: CLR P1.0 ;灯亮

LCALL DELAY1s

;调用1s延时子程序

SETB P1.0 ;灯灭

LCALL DELAY1s

;调用1s延时子程序

LJMP START ;跳到START处,灯亮;;;;;;;;;;;;;;;;;;;;;;;;;;;;;延时1s子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

ORG 0100H

;定位延时子程序起始地址为0100HDELAY1s: MOV R2,#100DELAY10ms: MOV R1,#10 DELAY1ms: MOV R0,#200LP1: NOP NOP NOP DJNZ R0,LP1 DJNZ R1,DELAY1ms DJNZ R2,DELAY10ms

RET

;子程序返回

END子程序调用子程序返回如何灵活调整闪烁时间?Step3带参数延时子程序实现闪烁速度的控制带参数延时子程序实现闪烁速度的控制程序设计演示链接

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;带参数延时子程序,可灵活改变演示时间,便于控制闪烁速度;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

ORG 0000H LJMP START

ORG 0030H

;定位主程序起始地址为0030HSTART: CLR P1.0 ;灯亮

MOV R2,#200 ;给入口参数赋值,延时2s

LCALL DELAY10ms ;调用延时子程序

SETB P1.0 ;灯灭

MOV R2,#50 ;给入口参数赋值,延时0.5s

LCALL DELAY10ms ;调用延时子程序

LJMP START ;跳到START处,灯亮;;;;;;;;;;;;;;;;;;;;;;;;;;;;;带参数延时子程序,入口参数为R2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

ORG 0100H

;定位延时子程序起始地址为0100HDELAY10ms: MOV R1,#10 DELAY1ms: MOV R0,#200LP1: NOP NOP NOP DJNZ R0,LP1 DJNZ R1,DELAY1ms

DJNZ R2,DELAY10ms;修改循环次数并进行循环条件判断

RET

;子程序返回

END利用R2传递参数,

主程序中赋值,表示10ms延时程序循环次数利用R2传递参数,

子程序中访问R2,并作为循环次数使用Step3灯的闪烁及流动程序设计5.延时子程序实现灯的流动显示——功能分析先假设一只灯向左流动显示,即灯亮的顺序为D1——D2……——D7——D1——D2……,其实现方法是先将P1.0置‘0’,其它口置‘1’,点亮D1,间隔时间到后,将P1.1置‘0’,其它口置‘1’,点亮D2……依次循环下去。由此,只要依次给P1口送11111110B—11111101B—11111011B—11110111B—11101111B—11011111B—10111111B—01111111B—11111110B……,就可以实现灯的向左移动显示,控制间隔时间就可以控制移动的速度。5.延时子程序实现灯的流动显示——循环移位指令RL(循环左移,)指令格式:RLA,该指令只能以累加器A作为

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论