课程主讲:訾学博第1章:微机原理概述第2章:单片机概述第3章:MCS-51单片机的硬件结构(*)第4章:MCS-51单片机指令系统(*)第5章:MCS-51单片机程序设计(*)第7章:MCS-51的定时器/计数器(*)第6章:MCS-51的中断系统(*)第8章:MCS-51的串行口(*)第9章:系统扩展技术第10章:模拟接口第11章:人机交互接口课程内容2•程序编制的方法和技巧•源程序的编辑和汇编•基本程序结构•子程序及其调用•简单I/O设备的并口直接驱动示例本讲主要内容3单片机应用系统由硬件系统和应用程序构成汇编语言高级语言应用程序设计方法汇编语言,生成的目标程序占内存空间少、运行速度快,具有效率高、实时性强。高级语言,对系统的功能描述与实现简单,程序阅读、修改和移植方便,适合于编写复杂的程序。5.1程序编制的方法和技巧4注意:标号:表示该指令所在的符号地址,一般由字母和数字组成,第一位为字母,其余位为字母、数字任选。操作助记符不能缺少操作数个数可为:1、2、3个2个操作数的指令,目的操作数在左边一般格式[标号]:操作助记符[目的操作数][,源操作数][;注释]指令的书写格式5.1.1伪指令伪指令,也叫汇编命令。仅对汇编过程进行指示伪指令无对应的单片机可执行代码起始地址设定伪指令ORGORG表达式表达式通常为十六进制地址,例:ORG8000HSTART:MOVA,#30H……ORG可多次使用,但地址值的顺序要由小到大结束汇编伪指令ENDEND该伪指令位于源程序的最后一行。定义字节数据表伪指令DB定义字数据表伪指令DW1000H[标号:]DB字节数据表如:ORG1000HDB-2,-4,-6,8,10,181001H[标号:]DW字数据表ORG1400HDATA1:DW324AH,3CH……FEHFCHFAH08H0AH12H1400H1402H32H4AH1401H00H3CH1403H定义常值为符号名伪指令EQU符号名EQU常值表达式LENEQU10SUMEQU21HBLOCKEQU22HCLRAMOVR7,#LENMOVR0,#BLOCKLOOP:ADDA,@R0INCR0DJNZR7,LOOPMOVSUM,A符号名为:地址常数段名字符串寄存器名位名比较:标号只能是地址定义位地址为符号名伪指令BIT符号名BIT位地址表达式如:STBITP1.0;将P1.0的位地址赋给符号名STCFBIT0D7H;将位地址为D7H的位定义为符号名用BIT定义的“符号名”一经定义便不能重新定义和改变5.1.2程序编制的步骤明确任务:功能要求、技术指标运行环境调研任务分析将实际问题转化为计算机处理的程序算法算法比较与优化(内存需求与运行速度)算法设计10流程描述流程图符号开始或结束符号工作任务符号判断分支符号程序连接符号程序流向符号程序流向符号“超级循环”框架初始化开始循环扫描、处理强化模块观念使程序占用空间减少、结构清晰循环初值和结束条件,避免“死机”现象子程序的现场保护(注意栈平衡、寄存器内容)程序模块(主程序模块、各种子程序模块)模块化优点:分块设计、便于阅读、调试方便采用循环和子程序对中断子程序还有注意保护PSW的内容5.1.3汇编语言的语句格式非数字字符开头,后跟字母、数字、“-”、“?”等不能用已定义的保留字(指令助记符、伪指令等)后跟英文冒号“:”汇编器可以识别的语句形式为:标号(即符号地址)[标号:]指令助记符[操作数1,][操作数2,][操作数3,][;注释]指令助记符是指令功能的英文缩写。数据:二进制(B)十进制(D或省略D)十六进制(H),注意A~F开头时要加“0”ASCII码,如‘A’,‘1245’符号:符号名、标号或“$”(PC的当前值)表达式:由运算符和数据构成(见表5.1)操作数注释英文分号“;”开头优先级运算符功能表达式及其结果示例高↓↓↓↓↓↓↓低·()括号4*(5+6)即44NOT、HIGH、LOW取反、取高字节、取低字节NOT55H即AAH;HIGH1234H即12H+、-正号、负号+5、-6*、/、MOD乘、除(取商)、取余数17/5即3;17MOD5即2+、-加、减5+4即9;5-4=即1SHL、SHR左移、右移2SHL2即8;8SHR2即2AND、OR、XOR与、或、异或45HAND0FH即05H、、=、、=、=比较运算符MOVA,X8;若X8为真,则为MOVA,01H若X8为假,则为MOVA,00H表5.1运算符优先级顺序表目标程序的产生过程如下图:汇编器A51.EXE编译器C51.EXE目标文件(浮动地址).OBJC源文件.C汇编源文件.ASM连接器BL51.EXE调试目标文件(绝对地址)无扩展名转换器OH51.EXE可烧写目标文件.HEX.LST.LST.M51库文件.LIB映像文件仿真调试写入芯片5.2源程序的编辑和汇编5.2.1源程序的编辑和汇编源程序的编辑ORG0000HLJMPMAINORG0040HMAIN:MOVR7,#16MOVR0,#60HMOVA,#55HLOOP:MOV@R0,AINCR0DJNZR7,LOOPSJMP$END依据汇编语言规则用好伪指令符号不用中文SJMP$用于调试以.ASM存盘源程序的汇编汇编源程序转为目标程序的过程叫汇编汇编通常在Windows下的集成开发环境完成用A51.EXE汇编生成.OBJ、.LIB及.LST目标程序的连接.OBJ、.LIB经BL51.EXE生成无扩展名的绝对地址目标文件绝对地址目标文件可以用于仿真器调试调试无误的目标文件用OH51.EXE转换为.HEX文件.HEX文件经编程器写入单片机存储器过程A过程B是否入口出口条件满足?P2入口出口P1P3过程是否入口出口条件满足?(a)顺序结构(b)分支结构(c)循环结构基本程序结构5.3基本程序结构1978H56H34H12H00H2EH2DH2CH2BH2AHACC78H56H34H12H00H2EH2DH2CH2BH2AHACC00H5.3.1顺序程序顺序程序是指无分支、无循环结构的程序。其执行流程是依指令在存储器中的存放顺序进行的。一、数据传送【例1】内部RAM的2AH~2EH单元中存储的数据如图所示。试编写程序实现图示的数据传送结果。20方法一:MOVA,2EH;2字节,1个机器周期MOV2EH,2DH;3字节,2个机器周期MOV2DH,2CH;3字节,2个机器周期MOV2CH,2BH;3字节,2个机器周期MOV2BH,#00H;3字节,2个机器周期使用14个字节的指令代码,执行时间为9个机器周期21方法二:CLRA;1字节,1个机器周期XCHA,2BH;2字节,1个机器周期XCHA,2CH;2字节,1个机器周期XCHA,2DH;2字节,1个机器周期XCHA,2EH;2字节,1个机器周期仅用了9个字节的代码,执行时间也减少到了5个机器周期。实际应用中应尽量采用指令代码字节数少、执行时间短的高效率程序,即注意程序的优化。22顺序程序(无分支、无循环)【例2】片内RAM的21H单元存放一个十进制数据十位的ASCII码,22H单元存放该数据个位的ASCII码。编写程序将该数据转换成压缩BCD码存放在20H单元。开始结束取十位的ASCII码保留低半字节移至高半字节,存回取个位的ASCII码保留低半字节合并到结果单元ORG0040HSTART:MOVA,21H;取十位ASCII码ANLA,#0FH;保留低半字节SWAPA;移至高半字节MOV20H,A;存于20H单元MOVA,22H;取个位ASCII码ANLA,#0FH;保留低半字节ORL20H,A;合并到结果单元SJMP$END#2000H→DPTR(20H)→A(A+DPTR)→AA→21H开始结束【例3】有一变量存放在片内RAM的20H单元,其取值范围为:00H~05H。要求编制一段程序,根据变量值求其平方值,并存入片内RAM的21H单元。ORG1000HSTART:MOVDPTR,#2000HMOVA,20HMOVCA,@A+DPTRMOV21H,ASJMP$ORG2000HTABLE:DB00,01,04,09,16,25END二、查表程序25通过查表可以完成数据计算、误差补偿、数据转换等。优点:程序简单、执行速度快。缺点:表格存放于程序存储区,需更多的程序存储器空间。(也可将表格存于数据存储器中,但不能用MOVC)查表过程:根据变量x,在表中查找y,使y=f(x)。查表指令:1、MOVCA,@A+PC2、MOVCA,@A+DPTR261、MOVCA,@A+PC不需其它特殊功能寄存器。但表格只能存放在该指令地址以下00—0FF单元中,表格的大小和位置受到限制。两条查表指令的区别2、MOVCA,@A+DPTR表格的大小和位置不受限制,大小和位置均可通过DPTR改变。但需特殊功能寄存器DPH和DPL(需注意保护)。27【例4】根据累加器的值(0--9)查平方表,求平方值。解:首先建立平方表。用PC作指针LOOK_UP1:ADDA,#01HMOVCA,@A+PCRETTABLE:DB00H,01H,04H,09H,10H;平方表DB19H,24H,31H,40H,51Hx0123456789y0149162536496481用DPTR作指针LOOK_UP2:MOVDPTR,#TABLEMOVCA,@A+DPTRRET28(练习):根据累加器A的值(0–7F)查平方表,求平方值,结果放在BA中。LOOK_UP:MOVDPTR,#TABLERLAPUSHACCMOVCA,@A+DPTRMOVB,APOPACCINCAMOVCA,@A+DPTRRETTABLE:DW0000H,0001H,0004H,0009H,0010HDW0019H,……29【例5】要求同上,A的数值范围为(0–4F),用MOVCA,@A+PC指令实现LOOK_UP:RLAMOVB,A;暂存ADDA,#06HMOVCA,@A+PCXCHA,BADDA,#02HMOVCA,@A+PCRETTABLE:DW0000H,0001H,0004H,0009H,0010HDW0019H,……30COMPRESS:MOVDPTR,#TABLEMOVA,R3;(R2R3)+(DPTR)ADDA,DPLMOVDPL,AMOVA,R2ADDCA,DPHMOVDPH,ACLRAMOVCA,@A+DPTRMOVR3,ARETTABLE:DB……;表格长度?【例6】在一智能仪器中,需对A/D转换的结果进行对数压缩。已知A/D转换的结果为12位二进制数,压缩后的数据为8位二进制数,设输入值存于R2R3中,编写此数据压缩程序,压缩结果存于R3中。31由于8051指令系统中只有单字节加法指令,因此对于多字节的相加运算必须从低位字节开始分字节进行。除最低字节可以使用ADD指令外,其他字节相加时要把低字节的进位考虑进去,这时就应该使用ADDC指令。【例7】双字节无符号数加法。设被加数存放在内部RAM的51H、50H单元,加数存放在内部RAM的61H、60H单元,相加的结果存放在内部RAM的51H、50H单元,进位存放在位寻址区的00H位中。三、简单运算32程序段如下:MOVR0,#50H;被加数的低字节地址MOVR1,#60H;加数的低字节地址MOVA,@R0;取被加数低字节ADDA,@R1;加上加数低字节MOV@R0,A;保存低字节相加结果INCR0;指向被加数高字节INCR1;指向加数高字节MOVA,@R0;取被加数高字节ADDCA,@R1;加上加数高字节(带进位加)MOV@R0,A;存高字节相加结果MOV00H,C;保存进位。335.3.2分支程序(单分支、双分支、多分支)条件成立?下条指令程序段AYN条件成立?程序段AYN程序段BK=0?分支0YK=1?Y分支1K=2?Y分支2NNN34CMPT:JNBAcc.7,RETURN;(A)0,不需转换MOVC,Acc.7;符号位保存CPLA;(A)求反,加1ADDA,#1MOVAcc.7,C;符号位