浙江大学远程教育学院《微机原理与接口技术》课程作业姓名:罗名声学号:715039202002年级:2015级学习中心:南昌学习中心—————————————————————————————第二章P472.80C51单片微机芯片引脚第二功能有哪些?答:80C51单片机的P0、P2和P3引脚都具有第二功能。第一功能第二变异功能P0口地址总线A0~A7/数据总线D0~D7P2口地址总线A8~A15P3.0RXD(串行输入口)P3.1TXD(串行输出口)P3.20INT(外部中断0)P3.31INT(外部中断1)P3.4T0(定时器/计数器0的外部输入)P3.5T1(定时器/计数器0的外部输出)P3.6WR(外部读写存储器或I/O的写选通)P3.7RD(外部读写存储器或I/O的读选通)4.80C51存储器在结构上有何特点?在物理上和逻辑上各有哪几种地址空间?访问片内数据存储器和片外数据存储器的指令格式有何区别?答:80C51单片机采用哈佛(Har-yard)结构,即是将程序存储器和数据存储器截然分开,分别进行寻址。不仅在片内驻留一定容量的程序存储器和数据存储器及众多的特殊功能寄存器,而且还具有强的外部存储器扩展能力,扩展的程序存储器和数据存储器寻址范围分别可达64KB。⒈在物理上设有4个存储器空间片内程序存储器;片外程序存储器;片内数据存储器;片外数据存储器。⒉在逻辑上设有3个存储器地址空间片内、片外统一的64KB程序存储器地址空间。片内256B(80C52为384B)数据存储器地址空间。片内数据存储器空间,在物理上又包含两部分:-对于80C51型单片机,从0~127字节为片内数据存储器空间;从128~255字节为特殊功能寄存器(SFR)空间(实际仅占用了20多个字节)。片外64KB的数据存储器地址空间。在访问三个不同的逻辑空间时,应采用不同形式的指令,以产生不同存储空间的选通信号。访问片内RAM采用MOV指令,访问片外RAM则一定要采用MOVX指令,因为MOVX指令会产生控制信号RD或WR,用来访问片外RAM。访问程序存储器地址空间,则应采用MOVC指令。6.80C51片内数据存储器低128个存储单元划分为哪4个主要部分?各部分主要功能是什么?答:80C51片内RAM的低128个存储单元划分为4个主要部分:寄存器区:共4组寄存器,每组8个存储单元,各组以R0~R7作为单元编号。常用于保存操作数及中间结果等等。R0~R7也称为通用寄存器,占用00H~1FH共32个单元地址。位寻址区:20H~2FH,既可作为一般RAM单元使用,按字节进行操作,也可以对单元中的每一位进行位操作,称为位寻址区。寻址区共有16个RAM单元,共计128位,位地址为00H~7FH。堆栈区:设置在用户RAM区内。用户RAM区:在内部RAM低128单元中,除去前面3个区,剩下的所有单元。第三章P879.MOV、MOVC、MOVX指令有什么区别,分别用于那些场合,为什么?答:MOV指令用于对内部RAM的访问。MOVC指令用于对程序存储器的访问,从程序存储器中读取数据(如表格、常数等)。MOVX指令采用间接寻址方式访问外部数据存储器,有Ri和DPTR两种间接寻址方式。MOVX指令执行时,在P3.7引脚上输出RD有效信号或在P3.6引脚上输出WR有效信号,可以用作外部数据存储器或I/O的读或写选通信号,与单片机扩展电路有关。15.已知(R1)=20H,(20H)=AAH,请写出执行完下列程序段后A的内容。MOVA,#55HANLA,#0FFHORL20H,AXRLA,@R1CPLA答:各指令执行结果如下:MOVA,#55H;(A)=55HANLA,#0FFH;(A)=55HORL20H,A;(20H)=FFHXRLA,@R1;(A)=AAHCPLA;(A)=55H执行完程序段后,A的内容为55H。16.阅读下列程序,说明其功能。MOVR0,#30HMOVA,@R0RLAMOVR1,ARLARLAADDA,R1MOV@R0,A答:对程序注释如下:MOVR0,#30H;(R0)=30HMOVA,@R0;取数RLA;(A)×2MOVR1,ARLA;(A)×4RLA;(A)×8ADDA,R1;(A)×10MOV@R0,A;存数功能:将30H中的数乘以10以后再存回30H中。条件:30H中的数不能大于25,25×10=250仍为一个字节。若30H中的数大于25,则应考虑进位。17.已知两个十进制数分别从内部数据存储器中的40H单元和50H单元开始存放(低位在前),其字节长度存放在内部数据存储器的30H单元中。编程实现两个十进制数求和,并把和的结果存放在内部数据存储器40H开始的单元中。答:程序如下:ORG0000HSJMPMAINORG0030HMAIN:MOVR0,#40H;被加数首址.又作两个十进制数和的首址MOVR1,#50H;加数首址MOVR2,30H;字节长度CLRCPP:MOVA,@R1;取加数ADDCA,@R0;带进位加DAA;二一十进制数调整MOV@R0,A;存和INCR0;修正地址INCR1DJNZR2,PP;多字节循环加AJMP$END21.读程序,请⑴画出P1.0~P1.3引脚上的波形图,并标出电压V-时间T坐标;⑵加以注释。ORG0000HSTART:MOVSP,#20HMOV30H,#01HMOVP1,#01MLP0:ACALLD50ms;软件延时50mSMOVA,30HCJNEA,#08H,MLP1MOVA,#01HMOVDPTR,#ITABMLP2∶MOV30H,AMOVCA,@A+DPTRMOVP1,ASJMPMLP0MLP1:INCASJMPMLP2ITAB:DB0,1,2,4,8DB8,4,2,1D50ms:…;延时50ms子程序(略)RET答:①程序功能:P1.0~P1.3引脚上的波形图如图3-2所示。图3-2P1.0~P1.3引脚上的波形图②注释见源程序右边所述。ORG0000HSTART:MOVSP,#20HMOV30H,#01HMOVP1,#01H;P1.0~P1.3引脚输出波形MLP0:ACALLD50ms;软件延时50msMOVA,30HCJNEA,#08H,MLP1;判表格中数据是否取完?MOVA,#01H;取完,从表头开始取MOVDPTR,#ITAB;表格首地址MLP2∶MOV30H,AMOVCA,@A+DPTR;取表格中数据MOVP1,ASJMPMLP0MLP1:INCA;表格中数据未取完,准备取下一个SJMPMLP2ITAB:DB0,1,2,4,8;表DB8,4,2,1D50ms:…;软件延时50ms子程序RET第四章P1236.根据运算结果给出的数据到指定的数据表中查找对应的数据字。运算结果给出的数据在片内数据存储器的40H单元中,给出的数据大小在00~0FH之间,数据表存放在20H开始的片内程序存储器中。查表所得数据字(为双字节、高位字节在后)高位字节存于42H、低位字节存于41H单元。其对应关系为:给出数据;000102……0DH0EH0FH对应数据:00A0H7DC2HFF09H3456H89ABH5678H请编制查表程序段,加上必要的伪指令,并加以注释。答:程序如下:ORG0000HAJMPMAIN,0RG0020HTAB:DBOAOH,OOH,0C2H,7DH,09H,OFFH,...,56H,34H,0.ABH,89H,DB78H,56H;数据字表ORG0050HMAIN:MOVA,40H;运算结果给出的数据放在40H中MOVDPTR,#TAB;指向数据字表首地址RLA;由于是双字节,所以A左移1位(乘2)MOV40H,A;结果放在40H’MOVCA,@A+DPTR;查表,找出对应的值MOV41H,A;查找出的数据值低字节放入41HMOVA.40HADDA,#01H;查找数据的高位字节MOVDPTR,#TABMOVCA,@A+DPTRMOV42H,A。;查找出的数据值高字节放入42HSJMP$注意:数据表存放在20H开始的片内存储器中,该存储器应为内部程序存储器,因为查表指令MOVC的功能是从程序存储器中读数据。10.把长度为10H的字符串从内部数据存储器的输入缓冲区INBUF向设在外部数据存储器的输出缓冲区OUTBUF进行传送,一直进行到遇见回车字符“CR”结束传送或整个字符串传送完毕。加上必要的伪指令,并对源程序加以注释。答:程序如下:ORG0000HAJMPMAINORG0030HMAIN:MOVR7,#10H;数据长度MOVR0,#INBUF;源数据首地址MOVDPTR,#OUTBUF;目的数据首地址LOOP:MOVA,@R0;把源数据的值赋给ACJNEA,#0DH,LOOP1;是“CR”(ASCII码值为0DH)?SJMPEND1;是“CR”,则结束传送LOOP1:MOVX@DPTR,A;把A的值赋给目的数据INCR0;源数据下一个地址值INCDPTR;目的数据下一个地址值DJNZR7,LOOP;判数据传送是否完毕?END1:SJMPEND112.比较两个ASCII码字符串是否相等。字符串的长度在内部数据存储器的20H单元,第一个字符串的首地址在内部数据存储器的30H中,第二个字符串的首地址在内部数据存储器的50H中。如果两个字符串相等,则置用户标志F0为0;否则置用户标志F0为1。加上必要的伪指令,并加以注释。(注:每个ASCII码字符为一个字节,如ASCII码“A”表示为41H)答:字符串中每一个字符都可以用一个ASCII码表示。只要有一个字符不相同,就可以判断字符串不相等。ORG0000H’AJMPMAIN·ORG0030HMAIN:MOVR0,#30H第一个字符串的首地址MOVR1.,#50H第二个字符串的首地址LOOP:MOVA,@R0第一个字符串的字符值赋给AMOVB,@R1;第二个字符串的字符值赋给BCJNEA,B,NEXT;两个字符值比较INCR0字符值相等,则继续比较INCR1.DJNZ20H,LOOP;判断字符串是否比较完CLRF0字符串相等,则F0位清0SJMP$NEXT:SETBF0字符串不等,则F0位置1SJMP$END例如:(2OH)=03H,(3OH)=41H,(31H)=42H,(32H)=43H,(5OH)=41H,(51H)=42H,(52H)=43H。两个字符串均为“ABC。执行结果:F0=014.80C51单片机从内部数据存储器的31H单元开始存放一组8位带符号数,字节个数在30H中。请编写程序统计出其中正数、零和负数的数目,并把统计结果分别存入20H、21H和22H三个单元中。加上必要的伪指令,并对源程序加以注释。答:分析:带符号数以字节最高位D7的值来区分是正数(包括零)和负数。D7=1,则该带符号数为负数。程序如下:POS_NUMEQU20H;正数个数ZERO_NUMEQU21H;零个数NEG_NUMEQU22H;负数个数ORG0000HAJMPMAINORG0030HMAIN:MOVPOS_NUM,#0;计数单位初始化为0MOVZERO_NUM,#0MOVNEG_NUM,#0MOVR1,30H;数据长度MOVR0,#31H;数据首地址LOOP:MOVA,@R0JBACC.7,INC_NEG;符号位为1,该数为负数,跳转加1CJNEA,#0,INC_POSINCZERO_NUM;该数为0,0个数加1AJMPLOOP1INC_NEG:INCNEG_NUM;负数个数加1AJMPLOOP1INC_POS:INCPOS_NUM;该数为正数,正数个数加1LOOP1:INCR0;判断统计是否结束DJNZR1,LOOPEND例如:已知(30H)=08H,31H单元起存放数据为:00H,80H,7EH,6DH,2FH,34H,EDH,FFH。执行结果:(20H)=04H,(21H)=01H,(22H)=03H。16.将外部数据存储器的2040H单元中的一个字节拆成2个ASCII码,分别存入内部数据存储器40H和41H单元中,试编写以子