预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共69页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

4.1程序编制的方法和技巧4.1程序编制的方法和技巧二、进行算法的优化三、程序总体设计及流程图绘制清晰正确的流程图是编制正确无误的应用程序的基础和条件。所以,绘制一个好的流程图,是程序设计的一项重要内容。常用的流程图符号有:开始和结束符号、工作任务符号、判断分支符号、程序连接符号、程序流向符号等4.1.2编制程序的方法和技巧二、尽量采用循环结构和子程序4.1.3汇编语言的语句格式一、标号三、操作数四、注释注释只是对语句的说明。注释字段可以增加程序的可读性,有助于编程人员的阅读和维护。注释字段必须以分号“;”开头,长度不限,当一行书写不下时,可以换行接着书写,但换行时应注意要在开头使用分号“;”。4.2源程序的编辑和汇编伪指令是汇编程序能够识别并对汇编过程进行某种控制的汇编命令。它不是单片机执行的指令,所以没有对应的可执行目标码,汇编后产生的目标程序中不会再出现伪指令。4.3基本程序结构一、单分支程序例求双字节补码。设在内部RAM的addr1和addr+1单元存有一个双字节数(高位字节存于高地址单元)。编写程序将其读出取补后再存入addr2和addr2+1单元。首先对低字节取补,然后判其结果是否为全“0”。若是,则高字节取补,否则高字节取反。三、多分支程序例根据R7的内容转向相应的处理程序。设R7的内容为0~N,对应的处理程序的入口地址分别为PP0~PPN。程序段如下:START:MOVDPTR,#TAB;置分支入口地址表首址MOVA,R7;分支转移序号送AADDA,R7;分支转移序号乘以2MOVR3,A;暂存于R3MOVCA,@A+DPTR;取高位地址XCHA,R3INCAMOVCA,@A+DPTR;取低位地址MOVDPL,A;处理程序入口地址低8位送DPLMOVDPH,R3;处理程序入口地址高8位送DPHCLRAJMP@A+DPTRTAB:DWPP0DWPP1………DWPPN4.3.3循环程序一、先执行后判断例50ms延时程序。若晶振频率为12MHz,则一个机器周期为1μs。执行一条DJNZ指令需要2个机器周期,即2μs。采用循环计数法实现延时,循环次数可以通过计算获得,并选择先执行后判断的循环结构。程序段如下:DEL:MOVR7,#200;1μsDEL1:MOVR6,#123;1μsNOP;1μsDEL2:DJNZR6,DEL2;2μs,计(2×123)μsDJNZR7,DEL1;2μs,RET共计[(2×123+2+2)×200+1]μs,即50.001ms二、先判断后执行例将内部RAM中起始地址为data的数据串传送到外部RAM中起始地址为buffer的存储区域内,直到发现‘$’字符停止传送。由于循环次数事先不知道,但循环条件可以测试到。所以,采用先判断后执行的结构比较适宜。程序段如下:MOVR0,#dataMOVDPTR,#bufferLOOP0:MOVA,@R0CJNEA,#24H,LOOP1;判断是否为‘$’字符SJMPLOOP2;是‘$’字符,转结束LOOP1:MOVX@DPTR,A;不是‘$’字符,执行传送INCR0INCDPTRSJMPLOOP0;传送下一数据LOOP2:……4.3.4子程序及其调用二、现场保护与恢复在子程序执行过程中常常要用到单片机的一些通用单元,如工作寄存器R0~R7、累加器A、数据指针DPTR,以及有关标志和状态等。而这些单元中的内容在调用结束后的主程序中仍有用,所以需要进行保护,称为现场保护。1、在主程序中实现示例如下:PUSHPSW;保护现场PUSHACC;PUSHB;MOVPSW,#10H;换当前工作寄存器组LCALLaddr16;子程序调用POPB;恢复现场POPACC;POPPSW;……其特点是结构灵活。4.4常用程序举例二、多字节数乘法运算例双字节无符号数的乘法。设双字节的无符号被乘数存放在R3、R2中,乘数存放在R5、R4中,R0指向积的高位。例多字节无符号数的减法。设两个N字节的无符号数分别存放在内部RAM中以DATA1和DATA2开始的单元中。相减后的结果要求存放在DATA2数据区。MOVR0,#DATA1;MOVR1,#DATA2;MOVR7,#N;置字节数CLRC;LOOP:MOVA,@R0;SUBBA,@R1;求差MOV@R1,A;存结果INCR0;修改指针INCR1;DJNZR7,LOOP;BMUL:MOVA,R2;MOVB,R4;MULAB;低位乘ACALLRADD;MOVA,R2;MOVB,R5;MULAB;交叉乘DECR0;ACALLRADD;MOVA,R4;MOVB,R3;MULAB;交叉乘DECR0;DECR0;ACALLRADD;MOVA,R5;MOVB,R3;MULAB;高字节乘DECR0;ACALLRADD;DECR0RET例将1位十六进制数转