单片机的编程技术_第1页
单片机的编程技术_第2页
单片机的编程技术_第3页
单片机的编程技术_第4页
单片机的编程技术_第5页
已阅读5页,还剩65页未读 继续免费阅读

下载本文档

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

文档简介

单片机的编程技术第一页,共七十页,2022年,8月28日

单片机与一般集成电路的区别在于可编程应用,程序是单片机应用系统的灵魂。

3.1程序设计的方法和技巧程序设计流程

由于汇编语言是面向机器的语言,因此对单片机系统进行程序设计时必须考虑硬件资源的配置。当硬件系统设计完成后,可从以下几方面进行程序设计:第二页,共七十页,2022年,8月28日1.分析问题——针对现有条件,明确在程序设计时应该“做什么”2.确定算法——解决“怎样做”的问题3.绘制程序流程图——用图形的方法描绘解决问题的思路

(常用的程序流程图符号如图3-1所示)

4.分配内存单元——确定程序和数据区的起始地址5.编写源程序——用指令的形式将程序流程图实现出来6.汇编——用开发机或仿真器将源程序转换成机器码,便于单片机识别7.在线仿真调试——查错、改错,对程序进行优化。第三页,共七十页,2022年,8月28日常用的程序流程图符号如图3-1所示。

图3-1常用的程序流程图符号第四页,共七十页,2022年,8月28日3.1.2汇编语言编程技巧

尽量采用模块化程序设计方法;

这种设计方法是把一个完整的程序分成若干个功能相对独立的、较小的程序模块,对各个程序模块分别进行设计、编制程序和调试,最后把各个调试好的程序模块装配起来进行联调,最终成为一个有实用价值的程序。模块化程序设计的优点是:对单个程序模块设计和调试比较方便、容易完成,一个模块可以被多个任务共用。尽量采用循环结构和子程序结构

采用循环结构和子程序结构,可以使程序的总容量减小,提高程序的效率,节省内存。第五页,共七十页,2022年,8月28日尽量少用无条件转移指令

少用无条件转移指令,可以保证程序的条理更加清晰,从而减少错误发生。充分利用累加器;

累加器是主程序和子程序之间信息传递的桥梁,利用累加器传递入口参数或返回参数比较方便。这时,一般不要把累加器内容压入堆栈。对于通用子程序要保护现场;

由于子程序的通用性,除了保护子程序入口参数的寄存器内容外,还要对子程序中用到的其它寄存器内容一并入栈保护。

对于中断处理,还要保护程序状态字

在中断处理程序中,既要保护处理程序中用到的寄存器内容,还要保护程序状态字PSW。否则,当中断服务程序执行结束返回主程序时,整个程序的执行可能会被打乱。第六页,共七十页,2022年,8月28日

80C51单片机汇编语言的语句行由4个字段组成,汇编程序能对这种格式正确地进行识别。这4个字段的格式为:

[标号:]操作码[操作数]

[;注释]

括号内的部分可根据实际情况取舍,各字段之间要用分隔符分隔。可用作分隔符的符号有冒号、空格、逗号、分号等。如:

MAIN:MOVA,#68H;A←68H汇编语言的语句格式第七页,共七十页,2022年,8月28日1.标号

标号是指令的符号地址。有了标号,程序中的其它语句才能很方便地访问该语句。有关标号的规定为:标号要由1~8个ASCII码字符组成,但必须以字母开

头,其余字符可以是字母、数字或其它特定字符。不能使用汇编语言已经定义了的符号作为标号,如指令

助记符MOV、伪指令记忆符END以及寄存器的符号名

称R1等。标号后边必须跟冒号。同一标号在一个程序中只能定义一次,不能重复定义。第八页,共七十页,2022年,8月28日2.操作码

操作码用于规定语句执行的操作。它用指令助记符或伪指令助记符表示,是汇编语句中唯一不能空缺的部分。3.操作数

操作数用于给指令的操作提供数据或地址。在一条语句中,可能没有操作数,也可能只有1个操作数,还可能同时包含2~3个操作数。各操作数之间要以逗号分隔。操作数一般以下面几种形式出现:常数工作寄存器名特殊功能寄存器名第九页,共七十页,2022年,8月28日

标号名符号“$”,表示程序计数器PC的当前值。如:

SJMP$表达式4.注释

注释不属于语句的功能部分,它只是对语句的解释说明,只要用“;”开头,就表明以下为注释内容。使用注释可使程序文件的编制显得更加清楚,便于编程人员的阅读和维护。注释的长度不限,一行不够可以换行接着书写,但换行后仍要以“;”开头。第十页,共七十页,2022年,8月28日

用户根据系统要求用汇编语言或高级语言编好的程序,叫源程序。3.2.1源程序的编辑和汇编

由于通用微型计算机的普及,现在单片机应用系统的程序设计都借助于通用微型计算机。全过程可概括为“机器编辑→交叉汇编→串行传送”三个部骤,如图3-2所示。

3.2源程序的编制第十一页,共七十页,2022年,8月28日1.编辑

将源程序输入计算机并进行修改的过程就是编辑。编辑工作一般在通用微型计算机上利用各种编辑软件完成,故又称其为机器编辑。编辑完成后,生成一个由汇编指令和伪指令共同组成的ASCII码文件,其扩展名为“.ASM”。图3-2单片机汇编语言程序的生成过程

第十二页,共七十页,2022年,8月28日

计算机只能识别机器语言,但程序编制人员通常以汇编语言或高级语言编制源程序。这样,要让计算机能听从程序编制人员的指挥,就必须要将汇编语言或高级语言转换成机器语言,供计算机识别,这个过程称为汇编(或编译)。

汇编工作常由汇编软件来完成。汇编软件通常具有指令的错误识别与提示能力,为编程者迅速查找源程序中的错误提供了方便。在汇编过程中,我们只能发现源程序中的语法错误和一般性的逻辑错误,但不能检查程序结构上的错误。如果有错误,汇编软件会报告,指出错误位置及错误类型。程序错误被纠正后,要重新进行编译调试,直至程序汇编无误为止。现在常用的汇编方法是交叉汇编,即用PC机中的汇编程序去汇编80C51单片机中的源程序。汇编后生成的机器码称为目标程序,扩展名为“.OBJ”。该目标程序可通过PC机的串行通信接口直接传送到开发系统的RAM中。

2.汇编第十三页,共七十页,2022年,8月28日

在前面的课题与实训环节中用到的ORG和END命令就是典型的伪指令,它们是为下一步的汇编工作提供起始地址和结束地址的。

我们知道,汇编语言程序的机器汇编是由计算机自动完成的,因此在源程序中应该有向汇编程序发出的命令。

这种在源程序中出现,通知汇编程序应该如何完成汇编工作的指令,就是伪指令。

下面介绍80C51单片机常用的伪指令。

3.2.2伪指令第十四页,共七十页,2022年,8月28日1.ORG(Origin)汇编起始命令格式为:ORG16位地址或标号该命令总是出现在源程序的开始位置。用来规定目标程序(即此命令后面的程序或数据块)的起始地址。ORG后面通常是16位地址,也可以是已定义的标号地址或表达式。如ORG1000H。在程序中如果不用ORG规定起始地址,则汇编得到的目标程序将从0000H开始存放。在一个源程序中,ORG指令可以多次使用,但要求地址值要由小到大依序排列,且不能出现空间上的重叠。2.END汇编结束命令格式为:END

该命令用于中止源程序的汇编工作。END是汇编语言源程序的结束标志,因此在整个源程序中只能有一条END指令,且位于程序的最后。如果END命令出现在源程序中间,对其后面的源程序,计算机将不予汇编。第十五页,共七十页,2022年,8月28日3.EQU(Equate)等值命令格式为:

标号名EQU表达式该命令用来给标号赋值。赋值以后,其标号值在整个程序中有效。例如:

DATEQU30H4.DB(DefineByte)定义字节命令格式为:

[标号:]DB字节数据表该命令用于从标号指定的地址开始,连续存放字节数据表,常与查表指令MOVC配合使用。其中字节数据表可以是一个或多个字节数据、字符串或表达式。例如:

DB“hello”第十六页,共七十页,2022年,8月28日5.DW(DefineWord)定义字命令格式为:

[标号:]DW字数据表该命令用于从标号指定的地址开始,连续存放16位字数据表。该数据表在程序存储器中存放的格式为:高8位存放在低地址单元,低8位存放在高地址单元。例如:ORG1000HTABLE:DW1234H,66H……汇编后,(1000H)=12H,(1001H)=34H,(1002H)=00H,(1003H)=66H。DB和DW定义的数据表,数的个数不能超过80个。如遇数目较多时,可以使用多个定义命令。在80C51程序设计中,常用DB来定义数据,DW来定义地址。

第十七页,共七十页,2022年,8月28日6.BIT定义位命令格式为:标号名BIT位地址该命令用来将位地址赋值给指定的标号名。例如:KAIGUANBITP1.0将P1.0的位地址赋值给标号KAIGUAN,在后面编程时就可以用KAIGUAN来代替P1.0。7.DS(DefineStorage)定义空间命令格式为:

[标号:]DS表达式该命令用于从指定单元开始,预留一定数目的字节单元作存储区,供程序运行使用。第十八页,共七十页,2022年,8月28日

程序结构通常分为三种形式:顺序结构、分支结构、循环结构。形式如图3-3所示。

图3-3三种程序结构3.3基本程序结构第十九页,共七十页,2022年,8月28日

顺序程序是最简单的程序结构,它既无分支,又无循环,在执行时单片机是按程序中指令的顺序逐条进行的。

编程注意事项:

正确选择程序存放的地址:通常主程序起始地址在0100H之后,但由于80C51单片机上电后从0000H开始执行,所以必须在0000H设一条转移指令,转至主程序首址。

要注意检查所用指令是否合法,在没有把握的情况下,最好查一下指令表。如,下面的指令是非法的:

MOVX2002H,2000H

为使程序运行结束时不至于跑飞,可在程序最后加一条暂停指令,如:SJMP$。

顺序程序第二十页,共七十页,2022年,8月28日例1将地址为2000H、2001H、2002H的片外数据存储单元的内容分别传送到2002H、2003H和2004H单元中去。

ORG0000HAJMP0100H;转到主程序起始地址

ORG0100HMOVDPTR,#2002H;最后一个数据的起始地址

MOVXA,@DPTR;2002H单元的数据送AMOVDPTR,#2004H;最后一个数据的目的地址

MOVX@DPTR,A;2002H单元的数据送2004H单元

MOVDPTR,#2001H;中间数据的起始地址第二十一页,共七十页,2022年,8月28日

MOVXA,@DPTR;2001H单元的数据送AMOVDPTR,#2003H;中间数据的目的地址

MOVX@DPTR,A;2001H单元的数据送2003H单元

MOVDPTR,#2000H;第一个数据的起始地址

MOVXA,@DPTR;2000H单元的数据送AMOVDPTR,#2002H;第一个数据的目的地址

MOVX@DPTR,A;2000H单元的数据送2002H单元

SJMP$END<想一想>还可以怎样修改?

第二十二页,共七十页,2022年,8月28日

例2已知30H单元存有8位二进制数的BCD码,请将其转换为共阴显示的字形码,然后从P1口输出。设这些字形码存放在标号为TABLE的存储单元。程序如下:

ORG0000HAJMPMAIN;转到主程序起始地址

ORG0100HMAIN:MOVDPTR,#TABLE;字形码表首地址送DPTRMOVA,30H;取数

MOVCA,@A+DPTR;查表取值送AMOVP1,A;字形码送P1SJMP$TABLE:DB3FH,06H,5BH,4FH,66H;0~4共阴字形码

DB6DH,7DH,07H,7FH,6FH;5~9共阴字形码

END2.查表程序第二十三页,共七十页,2022年,8月28日

通常情况下,程序是顺序执行的,但我们也可以根据需要,在程序中安排一些控制转移指令,改变程序的执行方向,这就是分支程序。分支程序可以分为单分支和多分支等情况。

单分支程序结构如图3-3(b)所示。

当条件满足时顺序执行程序段A,否则执

行程序段B。

多分支结构如图3-4所示。先将分支

按序号排列,然后按照分支的值来实现

多分支选择。

图3-4多分支结构3.3.2 分支程序第二十四页,共七十页,2022年,8月28日

分支程序在单片机系统中应用较多,在编程时有许多技巧,设计要点如下:

(1)先建立可供条件转移指令测试的条件。

(2)选用合适的条件转移指令。

(3)在转移的目的地址处设定标号。

第二十五页,共七十页,2022年,8月28日

3已知内RAM30H单元存有一个ASCII码,试对其进行判断,如果是“$”(24H),将其存入40H,否则存入31H单元。

程序如下:

ORG0000H

AJMPMAIN

ORG0100H

MAIN:MOVA,30H

CJNEA,#24H,DY31;不是“$”,转去ZY31

MOV40H,A;是“$”,存入40H单元

AJMPEND0

DY31:MOV31H,A;不是$,存入31H单元

END0:SJMP$

END1.单分支程序第二十六页,共七十页,2022年,8月28日(1) 位操作程序

例4已知某信号灯电路如图3-5,试编程实现如下功能:

⑴S0单独按下,红灯亮,其余灯灭;

⑵S1单独按下,绿灯亮,其余灯灭;

⑶S0、S1均按下,红、绿、黄灯全亮;

⑷都不按下黄灯亮。

图3-5某信号灯电路参考程序如下:

ORG0000HLJMPSTARTORG0100HSTART:ORLP1,#11000111B;P1.6、P1.7设为输入,红绿黄灯灭2.多分支程序第二十七页,共七十页,2022年,8月28日

SS0:JBP1.7,SS1;S0未按,转判S1JBP1.6,RED;S0按下,S1未按,转红灯亮

DL:CLRP1.2;红灯亮

CLRP1.1;绿灯亮

CLRP1.0;黄灯亮

SJMPSS0;重新检测

SS1:JBP1.6,YELLOW;S0未按,S1未按,转黄灯亮GREEN:CLRP1.1;绿灯亮

SETBP1.2;红灯灭

SETBP1.0;黄灯灭

SJMPSS0RED:CLRP1.2;红灯亮

SETBP1.1;绿灯灭

SETBP1.0;黄灯灭

SJMPSS0

第二十八页,共七十页,2022年,8月28日YELLOW:CLRP1.0;黄灯亮

SETBP1.2;红灯灭

SETBP1.1;绿灯灭

SJMPSS0END说明:该程序只是说明位操作指令在分支程序中的应用方法,如果真要实现信号灯的点亮,还要在每段灯亮灭指令后加一段延时程序。第二十九页,共七十页,2022年,8月28日

例5有一巡回检测报警装置,需对16路输入信号进行控制,每路设有一个报警上限值(等于或超出此值即报警,置报警标志F0),设16路输入信号存放在以50H为首地址的内RAM中,16路报警上限值存在以2000H为首地址的ROM中,试编制该程序。

程序如下:

START:MOVDPTR,#2000H;置16路报警上限值首地址

MOVR0,#50H;置16路输入信号数据区首地址

MOVR7,#0;置16路输入信号的序号0LOOP:

MOVR1,@R0;检测信号存R1MOVA,R7;读输入信号序号

MOVCA,@A+DPTR;查找该序号对应的报警上限值

CJNEA,R1,NEXT;与对应的输入信号比较

AJMPALAM;输入信号等于报警上限值,转报警(1)字节操作程序第三十页,共七十页,2022年,8月28日NEXT:JCALAM;输入信号超出报警上限值,转报警

INCR0;输入信号小于报警上限值,指向下一路输入信号

INCR7;指向下一路输入信号序号

CJNER7,#16,LOOP;看16路是否全查完?未完继续

CLRF0;16路全查完,清报警标志

AJMP$;暂停ALAM:SETBF0;置报警标志

RET第三十一页,共七十页,2022年,8月28日3.3.3循环程序

1.循环结构在程序设计时,常常遇到需要反复执行的某种操作,这时可编写一个程序段重复执行,这就是循环。循环程序一般包括4部分,如图3-6所示。对这4部分的含义,我们以例题的形式加以说明。

例6编程实现以下数据传送功能:将BUF为起始地址的50个数取反后,传送到以DATA为起始地址的内存单元中。

第三十二页,共七十页,2022年,8月28日分析:如果采用顺序结构编写,程序会很麻烦,要执行50次从源地址中取数的MOV指令,50次数据取反的CPL指令,50次向目的地址送数的MOV指令。经过观察,我们发现,可以把顺序结构中重复执行的部分提取出来,编成一个独立的小程序段(即循环体部分),然后对这个小程序段重复执行50次(循环次数),这就构成了循环。图3-6循环结构第三十三页,共七十页,2022年,8月28日

1.初始化

规定循环体中各控制变量的初始状态。

2.循环体

这是循环程序需要重复执行的部分。对这部分编程的时候要注意两个问题:指令要具有通用性,程序要便于修改。程序尽可能简化。第三十四页,共七十页,2022年,8月28日

(3)循环修改

循环程序每执行一次,都要对数据的地址指针、循环次数等作一次修改,这就是循环修改。

(4)循环控制

根据循环结束条件,判断循环是否结束。常用作循环控制的变量是循环次数。第三十五页,共七十页,2022年,8月28日参考程序如下:

START:MOVR0,#SBUF;数据的源地址

MOVR1,#DATA;数据的目的地址

MOVR7,#50;循环次数

LOOP:MOVA,@R0;源地址中数据送ACPLA;取反

MOV@R1,A;取反后的数据送目的地址

INCR0;源地址加1,准备取下一个数

INCR1;目的地址加1,准备接收下一个数

DJNZR7,LOOP;循环结束?未结束重新取数

RET

循环程序按结构分,有单重循环与多重循环。在多重循环中,只允许外重循环嵌套内重循环;不允许循环相互交叉,也不允许从循环程序的外部跳入循环程序的内部。

第三十六页,共七十页,2022年,8月28日

2.循环结构的典型应用——定时

在单片机控制系统中,常有定时的需要,如定时中断、定时检测、定时扫描等。定时功能可以使用定时/计数器实现,但更多的是使用定时程序完成。定时程序是典型的循环程序,它通过执行一个具有固定延时时间的循环体来实现时间的推移,因此,又常把定时程序叫做延时程序。定时程序的延时时间不受器件的限制,只要选择好循环初值,就可以实现几秒、几分、乃至几年的时间延迟。

第三十七页,共七十页,2022年,8月28日(1)单循环延时单循环延时是最简单的定时程序。如:

DELAY:MOVR7,#TIME;TIME是循环程序控制变

;量,可以取任意值

LOOP:NOPNOPNOPDJNZR7,LOOP

其中的NOP是空操作指令,它不做任何操作,只是消磨时间。该程序段的延时时间可以这样计算:NOP指令的机器周期是1,DJNZ指令的机器周期是2,因此循环一次共需5个机器周期。如果单片机的晶振频率采用12MHz,则一个机器周期是1μs,因此循环一次的延迟时间是5μs。第三十八页,共七十页,2022年,8月28日

延时程序中总的延时时间为5×TIME(μs),根据程序的需要,TIME可以任意取值(不超过8位二进制的表示范围)。因此该程序的最长延时时间是(TIME=0时)

5×256=1280(μs)

(2)较长时间的延时

单循环延时的延迟时间较短,为了延长定时时间,可以采用多重循环的方法。

例7编写延时1s子程序,要求:晶振采用12MHz,用三重循环编写。

分析:用12MHz晶振,机器周期是1μs,程序如下:

DELAY:MOVR7,#20;1μsD1:MOVR6,#200;1μsD2:MOVR5,#123;1μs

第三十九页,共七十页,2022年,8月28日

NOP;1μsDJNZR5,$;2μs,共(2×123)μsDJNZR6,D2;2μs,共〔(2×123+2+2)

×200〕μs,即50msDJNZR7,D1;2μs,共〔(2×123+2+2)

×200+2+1〕×20+2=1000062μs≈1sRET;2μs

在该程序中,改变不同的寄存器初值,可以实现不同的定时要求。

(3)以一个基本的延时程序满足不同的定时要求

如果系统中有多个定时需要,我们可以先设计一个基本的延时程序,通过对这个基本延时程序的调用,实现所需的不同定时。如将例7延时1秒的DELAY作为基本的延时程序,则实现5秒、10秒的调用情况如下:第四十页,共七十页,2022年,8月28日

MOVR0,#5;5sLOOP1:ACALLDELAY;1sDJNZR0,LOOP1……MOVR0,#10;10sLOOP2:ACALLDELAY;1sDJNZR0,LOOP2……

例8已知某单片机温控系统每隔50ms测一次温度,测得的8位温度值存在特殊功能寄存器SBUF中,请编程求其1s的平均值,并存于60H中。(设1s采样温度总和不超过255)程序如下:

AVR1S:MOVR2,#0;温度初值为0MOVR4,#20;平均次数为20第四十一页,共七十页,2022年,8月28日

LOOP:MOVA,SBUF;读温度值

ADDA,R2;温度求和

MOVR2,A;回存

LCALLDELAY50;延时50ms,延时子程序略

DJNZR4,LOOP;20次采样完否?未完继续

MOVA,R2;和存入AMOVB,#20;除数存入BDIVAB;求均值

MOV60H,ARET

请尝试编写延时50ms子程序。第四十二页,共七十页,2022年,8月28日3.4程序设计实例3.4.1数据极值查找程序

极值查找就是在指定的数据区中挑出最大值或最小值。

例9从内部RAM30H单元开始存有8个无符号8位二进制数,请编程查找到最大值,并将其存放于40H单元。

分析:假定在比较过程中,用A存放大数,与之逐个比较的另一个数存放在2AH单元。流程图见图3-7。图3-7最大值查找程序流程图第四十三页,共七十页,2022年,8月28日

程序如下:

MOVR1,#30H;数据区首址

MOVR5,#08H;数据区长度

MOVA,@R1;读第一个数

DECR5;修改数据长度

LOOP:INCR1MOV2AH,@R1;读下一个数

CJNEA,2AH,BJ;数值比较

AJMPLOOP1BJ:JNCLOOP1;A值大,转移

MOVA,@R1;大数送ALOOP1:DJNZR5,LOOP;继续

MOV40H,A;最大值送40HSJMP$第四十四页,共七十页,2022年,8月28日

3.4.2数码转换程序

数码转换通常采用子程序调用的方法进行,即由子程序完成具体的转换功能,而由主程序组织数据和安排结果。例10在内部RAM的SHU16单元存有两位十六进制数,请将其转换成ASCII码,并存放于ASCL(低位的ASCII码)和ASCH(高位的ASCII码)两单元。

主程序如下:

MAIN:MOVSP,#5FH;设堆栈指针

PUSHSHU16;16进制数进栈

ACALLASC16;调转换子程序

POPASCL;第一位转换结果送ASCLMOVA,SHU16;再取原16进制数

SWAPA;高低半字节交换

PUSHACC;交换后的16进制数进栈

ACALLASC16;转换

POPASCH;第二位转换结果送ASCHSJMP$第四十五页,共七十页,2022年,8月28日

子程序如下:

ASC16:DECSP;跳过断点保护内容PCDECSPPOPACC;弹出转换数据

ANLA,#0FH;屏蔽高位

ADDA,#7;修改变址寄存器指针

MOVCA,@A+PC;查表

PUSHACC;2字节,查表结果进栈

INCSP;2字节,修改断点指针回到断点保护内容

INCSP;2字节,

RET;1字节,

ASCTAB:DB'012345678';ASCII码表

DB'9ABCDEF'END第四十六页,共七十页,2022年,8月28日

这是一个很典型的程序,在阅读时应注意这样两个问题:

(1)该程序强化了堆栈的使用,这对于大家加深理解堆栈的概念十分有利。在程序中用到了两种使用堆栈的方法:

用堆栈传递数据。使要转换的16进制数在主程序中进栈(PUSHSHU16)而在子程序中出栈(POPACC),最后再通过堆栈把转换结果返回主程序(POPASCL)。低位转换其堆栈的变化见图3-8;系统在调用子程序时自动完成的PC入栈操作。由于要转换的16进制数是在主程序中先于断点值PC

(ACALLASC16下一条指令的地址)入栈,这样在子程序中要取出转换数据,就得修改堆栈指针SP,以指向该数据。第四十七页,共七十页,2022年,8月28日

(2)在ASCII码表中,是以字符串的形式列出的16进制数,但在汇编的过程中,写入存储单元的是该字符串的ASCII码形式。图3-8数码转换程序的堆栈变化图第四十八页,共七十页,2022年,8月28日课题与实训4程序设计一.实训目的

1.熟悉汇编语言的基本格式、伪指令的使用方法。

2.学习单片机应用程序的设计方法。二.课题要求

1.将60H~69H单元存放的10个无符号数按照从小到大的顺序重新排列。

2.选择课后思考题与习题的部分程序运行并调试出来。三.背景知识

可采用冒泡排序法。冒泡排序法把一批数据想象成纵向排列,采用自下而上的方法比较相邻两个数据,如果这两个数据的大小顺序符合要求,则保持原样,否则交换它们的位置。这样比较一轮后,最小的数据就像气泡一样浮到最顶上,故称冒泡排序法。第四十九页,共七十页,2022年,8月28日

实际编程设计时,每一轮操作都从数据区的首地址开始,向末端推进。一般来讲,N个数据要进行N-1轮次比较和交换排序。表3-1表示了60H~65H单元存储数据的冒泡排序的执行过程。表3-1冒泡排序过程说明第五十页,共七十页,2022年,8月28日

假定60H~65H单元存储的原始数据为无序数列,从最上面开始进行相邻两个数据的比较,大的数据放上面,小的数据放下面。第一轮操作,6个数据进行6-1=5次比较,最大数据58“沉淀”到最下面(65H单元)。第二轮操作58不参加,5个数据需比较6-2=4次,5个数据中的最大值36“沉淀”到64H单元。对于本例,经过三轮操作就可以完成排序。采用冒泡排序法,一般应设立一个标志位,在每轮开始时将标志位清0,在操作过程中出现位置交换,标志位置1,每轮结束时若标志位为0,则说明数据已经有序,可以提前结束排序,从而提高了效率。第五十一页,共七十页,2022年,8月28日图3-9冒泡排序流程图

四.程序流程图第五十二页,共七十页,2022年,8月28日课题与实训5交通灯的设计

一.实训目的

1.进一步熟悉单片机I/O接口的线路连接。

2.学习顺序控制程序的编程技术。

二.课题要求

用仿真器的P1口控制4只双色LED灯,来模拟十字路口交通灯的工作方式,本次实训交通灯变化规律如下:假设一个十字路口是东西南北走向。初始状态为东西南北均红灯。停顿1秒后转状态S1(南北绿灯,东西红灯)。延时20秒,转S2(南北绿灯闪3次变黄灯,东西红灯)。再转S3(东西绿灯,南北红灯)。延时20秒,转S4(东西绿灯闪3次变黄灯,南北红灯)。最后跳转至S1循环。第五十三页,共七十页,2022年,8月28日

三.背景知识

双色LED灯有三只引脚,工作时,中间引脚接地,另外两支引脚单独接高电平时,一种亮红光,一种亮绿光,两只引脚同时接高电平时,亮黄光。在本次实训线路中,P1.0~P1.3接双色LED的绿灯引脚,当P1.0~P1.3输出1时,相应灯亮绿光,P1.4~P1.7接双色LED的红灯引脚,当P1.4~P1.7输出1时,相应灯亮红光,如果P1.0和P1.4同时为1,则RG南亮黄光,其余道理与此相同。四.硬件电路

(见图3-10

)

图3-10交通灯电路第五十四页,共七十页,2022年,8月28日ORG0000H LJMPSTART ORG0100H START:MOVSP,#60HMOVA,#0F0H;初始状态(红灯) MOVP1,A MOVR2,#10;延时1秒

LCALLDELAYS1:MOVA,#69H;南北绿灯,东西红灯

MOVP1,A MOVR2,#200;延时20秒

LCALLDELAYS2:MOVR3,#03H;南北绿灯闪3次变黄灯,东西红灯

GLIS:MOVA,#69H

五.软件设计第五十五页,共七十页,2022年,8月28日

MOVP1,A MOVR2,#03H LCALLDELAY MOVA,#60H MOVP1,A MOVR2,#03H LCALLDELAY DJNZR3,GLIS MOVA,#0F9H MOVP1,A MOVR2,#10;延时1秒

LCALLDELAYS3:MOVA,#96H;南北红灯,东西绿灯

MOVP1,A MOVR2,#200;延时20秒

LCALLDELAY第五十六页,共七十页,2022年,8月28日

S4:MOVR3,#03H;东西绿灯闪3次变黄灯,南北红灯GLIS1:MOVA,#96H MOVP1,A MOVR2,#03H LCALLDELAY MOVA,#90H MOVP1,A MOVR2,#03H LCALLDELAY DJNZR3,GLIS1 MOVA,#0F6H MOVP1,A MOVR2,#10;延时1秒

LCALLDELAY LJMPS1第五十七页,共七十页,2022年,8月28日DELAY:MOVR1,#200;延时程序

D1:MOVR0,#248;延时100毫秒

DJNZR0,$DJNZR1,D1DJNZR2,DELAYRETEND

六.总结与思考

本实训电路只是用单片机模拟交通灯的管理,真正的交通灯还要考虑到灯的驱动等实际问题。

想一想,如果采用建表方式,程序该如何设计?第五十八页,共七十页,2022年,8月28日3.4.5课题与实训6以循环方式实现流水灯

一.实训目的

1.进一步熟悉单片机I/O接口的线路连接。

2.学习循环程序的编程技术。二.课题要求

用单片机的P1口控制8只LED灯,作P1.0→P1.1→P1.2→P1.3→P1.4→P1.5→P1.6→P1.7的依次单灯点亮,间隔0.2秒,接下来8只LED灯全灭1次,间隔0.2秒;然后作P1.7→P1.6→P1.5→P1.4→P1.3→P1.2→P1.1→P1.0的依次单灯点亮,间隔0.2秒,接下来8只LED灯全灭1次,间隔0.2秒,再从开始状态循环,8只LED灯即呈现出流水灯的状态。第五十九页,共七十页,2022年,8月28日

三.背景知识

循环程序用于需要多次反复执行的相同操作,因此在编制程序时,首先应该确定的就是有哪些相同的操作可由循环部分实现。在该实训中,我们用数据传送指令向P1.0→P1.7一次送数,所以对送出数据的处理过程就是相同的;延时时间都是0.2秒,这也是相同的,这两部分都可以用循环来实现。

在编制具体的循环程序时,要设置一个存放循环次数的寄存器,通常选用R2~R7中的任何一个来实现(R0和R1常用于寄存器间接寻址。当然,程序中如果不采用间接寻址方式,R0和R1也可用来存放循环次数)。程序每循环一次,循环次数寄存器内容要减1,当该寄存器内容减到0时,表示循环结束,这两个过程可用DJNZ指令实现。第六十页,共七十页,2022年,8月28日

四.硬件电路图3-11流水灯电路第六十一页,共七十页,2022年,8月28日

参考程序如下:

ORG0000HSTART:MOV

A,#0FFH;设初值

MOV

R0,#8;移动八次

CLR

C;将CY清0LOOP1:RLC

A;带进位位循环左移

MOV

P1,A;送P1口,P1.0灯亮

ACALL

DELAY;调延时

DJNZR0,

LOOP1;判断是否左移8次

MOV

A,#0FFH;够八次,灯全灭

MOV

P1,AACALL

DELAYMOV

A,#0FFH;设初值

MOV

R0,#8;移动八次

CLR

C;将CY清0五.软件设计第六十二页,共七十页,2022年,8月28日

LOOP2:RRC

A;带进位位循环右移

MOV

P1,A;送P1口,P1.7灯亮

ACALL

DELAYDJNZ

R0,LOOP2;判断是否右移8次

MOV

A,#0FFH;够八次,灯全灭

MOV

P1,AACALL

DELAYAJMP

START;重新开始

DELAY:MOV

R5,#4;延时0.2秒

D1:MOV

R6,#200D2:MOV

R7,#123NOPDJNZ

R7,$DJNZ

R6,D2

第六十三页,共七十页,2022年,8月28日

DJNZ

R5,D1

温馨提示

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

评论

0/150

提交评论