首页 单片机程序设计

单片机程序设计

举报
开通vip

单片机程序设计第章汇编语言程序设计本章内容SingleChipMicrocomputer概述分支程序循环程序简单程序查表程序子程序应用举例程序设计概述—设计语言最早人们只能用机器语言(二进制)编写程序;为了方便记忆,人们开始用助记符形式的汇编语言编写程序,称为低级语言。然后再用汇编系统将其翻译成机器语言,该过程称为汇编;为了用更接近人的语言编写程序,程序设计师们发明了高级语言,如:BASIC、FORTRAN、PASCAL、C、JAVA然后再用编译系统将其翻译成机器语言,该过程称为编译;机器只能识别机器语言。所以必须用编译系统将高...

单片机程序设计
第章汇编语言程序设计本章内容SingleChipMicrocomputer概述分支程序循环程序简单程序查表程序子程序应用举例程序设计概述—设计语言最早人们只能用机器语言(二进制)编写程序;为了方便记忆,人们开始用助记符形式的汇编语言编写程序,称为低级语言。然后再用汇编系统将其翻译成机器语言,该过程称为汇编;为了用更接近人的语言编写程序,程序设计师们发明了高级语言,如:BASIC、FORTRAN、PASCAL、C、JAVA然后再用编译系统将其翻译成机器语言,该过程称为编译;机器只能识别机器语言。所以必须用编译系统将高级语言编写的源程序编译成机器语言,用汇编系统将用汇编语言编写的源程序汇编成机器语言;由低级或高级语言构成的程序称为源程序,由机器语言构成的程序称作目标程序;源程序目标程序低级语言机器语言汇编高级语言机器语言编译程序设计实例引入实例假设一个班有50个人,共有3门选修课:计算机算法服装CAD设计德语请找出:同时选了三门课的同学;问题的解决第一步如何在计算机中表示选修某门课的所有同学5122325225392939412252939计算机算法服装CAD设计德语选修这门人数学生的学号这个过程实际上是设计数据结构的问题问题的解决第二步设计思路:找出同时选了三门课的同学这个过程实际上是设计算法的过程,既构建模型。计算机算法CAD设计德语重复该过程第三步:设计流程找出第一个学生他选了德语吗?他选了CAD吗?记录要找的人还有学生吗?下一个学生NNYNYY结束他选计算机吗?NY几点启示整体构思;构建整体流程框图;结构合理,流程清晰,简单明了;局部模块化;为什么要用流程图?符合人进行逻辑思考的习惯计算机从根本上来说,没有任何逻辑性,所以,你必须告诉它,先做什么,后做什么,遇到什么情况又该做什么,等等流程图设计本身是一个逐步求精的过程,最终将任务划分为若干能由机器指令实现的小模块简单程序设计结构特点:按指令的先后顺序依次执行。例1:将20H单元的两个压缩BCD码拆开变成ASCII码,存入21H、22H单元。(假设20H中的BCD码为00110100)什么是BCD码?什么是ASII码?·········20H21H22HAB0011压缩BCD码001100110100低四位ASII码高四位ASII码 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 1:将BCD码除以10H,恰好是将BCD码分别移到了A、B的低4位。然后再各自与30H相或,即成为ASCII码。方法2:利用半字节交换指令来实现。ORG0000HMOVA,20HMOVB,#10HDIVABORLB,#30HMOV22H,BORLA,#30HMOV21H,ASJMP$开始(20H)A10HBA/B(A中为高4位BCD码,B中为低4位BCD码)B+30HBB(22H)A+30HAA(21H)结束简单程序例1---方法1源程序如下:·········20H21H22HAB00110100PCPCPC0011010000010000PC0011000000000100PC00110100PCPCPC0011PCORG0000HMOVR0,#20HMOVA,#30HXCHDA,@R0MOV22H,AMOVA,@R0SWAPAORLA,#30HMOV21H,ASJMP$简单程序例1---方法2开始#20HR0#30HAA的低4位(20H)的低4位A(22H)(20H)AA的低4位A的高4位A(21H)结束A+30HAPCPCPCPCPCPCPCPCPC源程序如下:·········20H21H22HAR000110010000000110100000001000011010000110000001100000011PC0011程序设计概述--基本步骤题意分析画出流程图分配内存及端口编制源程序仿真、调试程序固化程序例2:有两组BCD码分别存放在23H、22H单元和33H、32H单元,求它们的和并送入43H、42H单元中去。(高位在前,低位在后)分析:·········32H33H42HA22H23H43H···00111000011001010001000110000111BCD码83HBCD码11H例2:有两组BCD码(如:1183H和5678H),分别存放在23H、22H单元和33H、32H单元,求它们的和,并送入43H、42H单元中去。(高位在前,低位在后)解:流程图(框图)如何?请同学们自己绘制流程图。开始(22H)A(32H)+AA十进制调整(33H)+AAA(43H)结束A(42H)(23H)A十进制调整ORG0000HMOVA,22HADDA,32HDAAMOV42H,AMOVA,23HADDCA,33HDAAMOV43H,ASJMP$END此条加法指令可否改用带进位的(ADDC)?开始(22H)A(32H)+AA十进制调整(33H)+AAA(43H)结束A(42H)(23H)A十进制调整ORG2000HCLRCMOVA,22HADDA,32HDAAMOV42H,AMOVA,23HADDCA,33HDAAMOV43H,AEND·········32H33H42HA22H23H43H···100000110101011000010001011110001000001101111000+111110110110000100010001010101100110011101101000PCPCPCPCPCPCPCPCPC1111101101100001PC01101000PC01100111分支程序设计结构特点:不一定按指令的先后顺序依次运行程序,程序的流向有两个或两个以上分支,根据指定条件选择程序的流向。如实训程序中采用的分支:P3.4=0?点亮所有二极管N二极管交叉点亮Y分支程序的典型实例实例:已知30H单元中有一变量X,要求编写一程序按下述要求给Y赋值,结果存入31H单元。X+1,X>0Y=0,X=0–1,X<0题意:根据X的不同,程序编写时有三个出口,即有三个分支!!!!想一想:程序怎么编写?分支程序实例---三分支程序开始XAA=–1A=A+1存结果结束YYNN程序框图:A>0?A=0?分支程序实例---三分支程序源程序如下:ORG2000HMOVA,30HJZLP1;X=0,转LP1处理JNBACC.7,LP2;X>0,转LP2处理MOVA,#0FFH;X<0,则Y=–1SJMPLP1LP2:ADDA,#01;X>0,Y=X+1LP1:MOV31H,A;存结果SJMP$;循环等待,$表示转至本地址,此方法适用于一字节的偏移量最高位为符号位。例设内部RAM20H单元和30H单元中分别存放了两个8位的无符号数X、Y,若X≥Y则让P1.0管脚连接的LED亮;若XY,点亮P1.1X=Y,点亮P1.0X0?NY程序清单XDATA20HYDATA30H;伪指令ORG0000HMOVA,XXRLA,Y;X,Y进行异或JBACC.7,NEXT1;二者符号不同,跳转到NEXT1MOVA,X;符号相同CJNEA,Y,NEQUAL;X≠Y,跳转到NEQUALCLRP1.0;X=Y,点亮P1.0SJMPFINISHNEQUAL:JCXXY;XY,转移到XDYNEXT1:MOVA,XJNBACC.7,XDY;判断X的正、负,正则转移到XDYXXY:CLRP1.2;XY,点亮P1.1FINISH:SJMP$END散转程序散转程序是指通过修改某个参数后,程序可以有三个以上的流向,多用于键盘程序。常用的指令是JMP@A+DPTR,该指令是把16位数据指针DPTR的内容与累加器A中的8位无符号数相加,形成地址,装入程序计数器PC,形成散转的目的地址。DPTR+APCA中内容为8位无符号数16位地址数程序清单如下:JUMP1:MOVDPTR,#JPTAB1;跳转表首送数据指针MOVA,R7ADDA,R7;R72A(修正变址值)JNCNOAD;判有否进位INCDPH;有进位则加到高字节地址NOAD:JMP@A+DPTR;转向形成的散转地址人口JPTAB1:AJMPOPR0;直接转移地址表AJMPOPR1.AJMPOPRn例:根据R7的内容,转向各自对应的操作程序(R7=0,转入OPR0;R7=1,转入OPR1…R7=n,转入OPRn)循环程序设计结构特点:利用转移指令反复运行需要多次重复的程序段。实例:前面几个实训中用到的延时程序:(DELAY)DELAY:MOVR3,#OFFHDEL2:MOVR4,#0FFHDEL1:NOPNOPDJNZR4,DEL1DJNZR3,DEL2RET循环程序的组成:1.初始化部分(设定循环次数等)。2.循环体(重复执行的部分,用于完成实际操作)3.循环控制(不断修改和判别循环变量,直至结束)。4.循环结束处理。循环程序设计延时程序中延时时间的设定:源程序:指令周期DELAY:MOVR3,#(X)H2个T机器DEL2:MOVR4,#(Y)H2个T机器DEL1:NOP1个T机器NOP1个T机器DJNZR4,DEL12个T机器DJNZR3,DEL22个T机器RET指令周期、机器周期T机器与时钟周期T时钟的关系:T机器=12T时钟=121/fosc=1us(假设晶振频率fosc为12M)延时时间的简化计算结果:(1+1+2)XY延时时间怎样计算?若想延时100ms,只需修改计数初始值,即(1+1+2)125200us=100ms#200#125循环程序设计1S延时程序源程序:DELAY:MOVR2,#10DEL3:MOVR3,#200DEL2:MOVR4,#125DEL1:NOPNOPDJNZR4,DEL1DJNZR3,DEL2DJNZR2,DEL3RET循环程序设计编程实现P1口连接的8个LED显示方式如下:从P1.0到P1.7的顺序,依次点亮其连接的LED。设循环次数显示模式字送P1口开始显示模式字左移1位设循环初值次数-1=0YN子程序实例引入ORG0000HSTART:MOVR2,#08H;设置循环次数MOVA,#0FEH;送显示模式字NEXT:MOVP1,A;点亮二极管ACALLDELAYRLA;左移一位,改变显示模式字DJNZR2,NEXT;循环次数减1,不为零,继续点亮SJMPSTART;下面一个二极管DELAY:MOVR3,#0FFH;延时子程序开始DEL2:MOVR4,#0FFHDEL1:NOPDJNZR4,DEL1DJNZR3,DEL2RETEND数据传送程序不同存储区域之间的数据传输:将内部RAM30H单元开始的内容传送到外部RAM0100H单元开始的区域,直到遇到传送的内容是0为止。地址指针R0赋初值(R0)->AA->(DPTR),地址指针增1地址指针DPTR赋初值A=0NY初始化部分循环体循环控制循环结束开始结束查表程序表格是事先存放在ROM中的,一般为一串有序的常数,例如平方表、字型码表等。表格可通过伪指令DB来确定。通过查表指令MOVCA,@A+DPTRMOVCA,@A+PC来实现。在LED显示和键盘处理程序中将会用到。用查表法计算平方(一)ORG0000HMOVDPTR,#TABLE;表首地址送DPTRMOVA,#05;被查数字05AMOVCA,@A+DPTR;查表求平方SJMP$TABLE:DB0,1,4,9,16,25,36,49,64,81END用查表法计算平方(二)ORG0000H1000HMOVA,#05;05A1002HADDA,#02;修正累加器A1004HMOVCA,@A+PC;查表求平方1005HSJMP$1007H:DB0,1,4,9,16,25,36,49,64,81END八路彩灯控制程序要求:(1)D1~D8八个彩灯按规定顺序依次点亮(间隔1秒),最后全量;(2)按规定顺序依次熄灭(间隔1秒),最后全灭;(3)八个灯同时点亮,保持1秒;(4)八个灯同时熄灭,保持0.5秒;再将第3、4步重复4遍,最后整个程序再重复N遍。步骤:(1)绘制流程图(2)编写程序(3)调试程序参考程序(一)ORG0000HLJMPMAINORG0100HMAIN:MOVR7,#7LOOP:MOVR6,#16MOVR5,#4MOVDPTR,#TABLMOVR4,#0LOOP1:MOVA,R4MOVCA,@A+DPTRMOVP1,AINCR4LCALLDELAYLCALLDELAYDJNZR6,LOOP1LOOP2:MOVP1,#0FFHLCALLDELAYLCALLDELAYMOVP1,#00HLCALLDELAYDJNZR5,LOOP2DJNZR7,LOOPSJMP$END开始初始化参数查表延时循环次数到否?结束NY亮灭4次循环N次到否?NY子程序设计在实际问题中,常常会遇到在一个程序中多次用到相同的运算或操作,若每遇到这些运算或操作,都从头编起,将使程序繁琐、浪费内存。因此在实际中,经常把这种多次使用的程序段,按一定结构编好,存放在存储器中,当需要时,可以调用这些独立的程序段。通常将这种可以被调用的程序段称为子程序。主要内容:1.主程序与子程序的关系2.子程序嵌套3.子程序的调用与返回主程序与子程序的关系子程序SUB主程序MAIN返回LCALLSUB调用子程序子程序入口地址RET如调用延时程序的过程ORG0000HMAIN:MOVA,#0FEH;送显示初值LP:MOVR0,#10;送闪烁次数LP0:MOVP1,A;点亮LEDLCALLDELAY;延时MOVP1,#0FFH;熄灭灯LCALLDELAY;延时DJNZR0,LP0RLASJMPLP例:LED灯的闪烁点亮(一)延时次数-1=0点亮相应的LEDYN熄灭相应的LED延时初值左移1位指向下一个LED设闪烁次数送显示初值开始子程序嵌套子程序嵌套(或称多重转子)是指在子程序执行过程中,还可以调用另一个子程序。子程序SUB1主程序MAINLCALLSUB1RET子程序SUB2RETLCALLSUB2子程序嵌套范例:LED灯闪烁(二)ORG0000HMAIN:MOVA,#0FEH;送显示初值COUN:ACALLFLASH;调闪烁子程序RLA;A左移,下一个灯闪烁SJMPCOUN;循环不止FLASH:MOVR0,#10;送闪烁次数FLASH1:MOVP1,A;点亮LEDLCALLDELAY;延时MOVP1,#0FFH;熄灭灯LCALLDELAY;延时DJNZR0,FLASH1;闪烁次数不够10次,继续RETDELAY:MOVR3,#0FFH;延时子程序DEL2:MOVR4,#0FFHDEL1:NOPDJNZR4,DEL1DJNZR3,DEL2RETEND子程序的调用与返回问题:子程序调用、返回到主程序中的正确位置,并接着执行主程序中的后续指令呢?为了解决这个问题,我们采用了堆栈技术。子程序SUB1主程序MAINRET子程序SUB2RET20102013211021132100220020132013PC21131321堆栈指针SP堆栈LCALLSUB1LCALLSUB2子程序设计注意事项(1)要给每个子程序起一个名字,也就是入口地址的代号。(2)要能正确地传递参数。即首先要有入口条件,说明进入子程序时,它所要处理的数据放在何处(如:是放在A中还是放在某个工作寄存器中等)。另外,要有出口条件,即处理的结果存放在何处。(3)注意保护现场和恢复现场。在子程序使用累加器、工作寄存器等资源时,要先将其原来的内容保存起来,即保护现场。当子程序执行完毕,在返回主程序之前,要将这些内容再取出,送还到累加器、工作寄存器等原单元中,这一过程称为恢复现场。例:查表子程序。注意:1.入口参数和出口参数的位置2.现场的保护与恢复。子程序的参数传递范例:计算平方和c=a2+b2ORG0000H;主程序MOVSP,#3FH;设置栈底MOVA,31H;取数a存放到累加器A中作为入口参数LCALLSQR;计算a2MOVR1,A;出口参数——平方值存放在A中MOVA,32H;取数b存放到累加器A中作为出口参数LCALLSQR;计算b2ADDA,R1;求和MOV33H,A;存放结果SJMP$;子程序:SQR;功能:通过查表求出平方值y=x2;入口参数:x存放在累加器A中;出口参数:求得的平方值y存放在A中;占用资源:累加器A,数据指针DPTRSQR:USHDPH;保护现场,将主程序中DPTR的高八位放入堆栈PUSHDPL;保护现场,将主程序中DPTR的低八位放入堆栈MOVDPTR,#TABLE;在子程序中重新使用DPTR,表首地址→DPTRMOVCA,@A+DPTR;查表POPDPL;恢复现场,将主程序中DPTR的低八位从堆栈中弹出POPDPH;恢复现场,将主程序中DPTR的高八位从堆栈中弹出RETTABLE:DB0,1,4,9,16,25,36,49,64,81常用汇编子程序代码转换例:将二进制转换为BCD码查找程序例:查找关键字。例:查找最大值。程序名:BINBCD功能:二进制数转换为BCD码入口参数:要转换的二进制数存放在累加器A中(00H-FFH)出口参数:转换后的BCD码存放在B(百位)和A(十位和个位)中BINBCD:PUSHPSWMOVB,#100DIVAB;除法指令,A/B→商在A中,余数在B中PUSHACC;把商(百位数)暂存在堆栈中MOVA,#10XCHA,B;余数交换到A中,B=10DIVAB;A/B→商(十位)在A中,余数在B(个位)中SWAPA;十位数移到高半字节ADDA,B;十位数和个位数组合在一起POPB;百位数存放到B中POPPSWRET程序名:FIND;功能:片内RAM中数据检索入口参数:R0 指向数据块首地址,R1中为数据块长度,关键字存于累加器A中出口参数:若找到关键字,把关键字在数据块中的序号存放到A中,若找不到关键字,A中存放序号00H占用资源:R0,R1,R2,A.PSWFIND:PUSHPSWPUSHACCMOVR2,#00HLOOP:POPACCMOVB,AXRLA,@R0;关键字与数据块中数据进行异或操作INCR0;指向下一个数INCR2;R2中的序号加1JZLOOP1;找到PUSHBDJNZR1,LOOPMOVR2,#00H;找不到,R2中存放00LOOP1:MOVA,R2POPPSWRET程序名:MAX功能:查找内部RAM中无符号数据块的最大值入口参数:R1指向数据块的首地址,数据块长度存放在工作寄存器R2中出口参数:最大值存放在累加器A中占用资源:R1,R2,A,PSWMAX:PUSHPSWCLRA;清A作为初始最大值LP:CLRC;清进位位SUBBA,@R1;最大值减去数据块中的数JNCNEXT;小于最大值,继续MOVA,@R1;大于最大值,则用此值作为最大值SJMPNEXT1NEXT:ADDA,@R1;恢复原最大值NEXT1:INCR1;修改地址指针DJNZR2,LPPOPPSWRET排序程序程序名:BUBBLE功能:将片内RAM数据块由大到小排序入口参数:R0指向数据块首地址,R2存放数据块长度出口参数:仍存放原来位置占用资源:R0,R1,R2,R3,R5,A,PSW;00H位BUBBLLE:MOVA,R0MOVR1,AMOVA,R2MOVR5,ABUBB1:CLR00HDECR5MOVA,@R1BUB1:INCR1MOVB,@R1CJNEA,B,BUB0BUB0:JNCBUB2SETB00HXCHA,@R1BUB2:DECR1MOV@R1,AINCR1MOVA,@R1DJNZR5,BUB1MOVA,R0MOVR1,AMOVA,R2MOVR5,AJB00H,BUBB1RET作业:1.散转程序的应用。2.要求从P1.0到P1.7,再从P1.7到P1.0轮流显示,显示时间间隔为1S。3.查找无符号数据块中的最小值。
本文档为【单片机程序设计】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_013420
暂无简介~
格式:ppt
大小:654KB
软件:PowerPoint
页数:0
分类:其他高等教育
上传时间:2013-11-20
浏览量:16