1单片机至尊版助考神器例4-5子程序的功能为:根据累加器A中的数x(0~9之间)查x的平方表y,根据x的值查出相应的平方y。x和y均为单字节数。PUSHDPH;保存DPHPUSHDPL;保存DPLMOVDPTR,#TAB1MOVCA,@A+DPTRPOPDPL;恢复DPLPOPDPH;恢复DPHRETTAB1:DB00H,01H,04H,09H,10HDB19H,24H,31H,40H,51H例4-6在一个以MCS-51为核心的温度控制器中,温度传感器输出的电压与温度为非线性关系,传感器输出的电压已由A/D转换为10位二进制数。根据测得的不同温度下的电压值数据构成一个表,表中放温度值y,x为电压值数据。设测得的电压值x放入R2R3中,根据电压值x,查找对应的温度值y,仍放入R2R3中。本例的x和y均为双字节无符号数。程序如下LTB2:MOVDPTR,#TAB2MOVA,R3CLRCRLCAMOVR3,AXCHA,R2RLCAXCHR2,AADDA,DP;(R2R3)+(DPTR)→(DPTR)MOVDPL,AMOVA,DPHADDCA,R2MOVDPH,ACLRAMOVCA,@A+DPTR;MOVCR2,ACLRAINCDPTRMOVCA,@A+DPTR;MOVR4,A;RETTAB2:DW……;例4-7设有一个巡回检测报警装置,需对16路输入进行检测,每路有一最大允许值,为双字节数。运行时,需根据测量的路数,找出每路的最大允许值。看输入值是否大于最大允许值,如大于就报警。根据上述要求,编一个查表程序。取路数为x(0x15),y为最大允许值,放在表格中。设进入查表程序前,路数x已放于R2中,查表后最大值y放于R3R4中。本例中的x为单字节数,y为双字节数。查表程序如下:TB3:MOVA,R2ADDA,R2;(R2)*2→(A)MOVR3,A;保存指针ADDA,#6;加偏移量MOVCA,@A+PC;XCHA,R3ADDA,#3MOVCA,@A+PC;MOVR4,ARETTAB3:DW1520,3721,42645,7580;DW3483,32657,883,9943DW10000,40511,6758,8931DW4468,5871,13284,27808例4-8从50个字节的无序表中查找一个关键字××”H。ORG1000HMOV30H,#××H;MOVR1,#50;MOVA,#14;MOVDPTR,#TAB4;LOOP:PUSHACCMOVCA,@A+PC;CJNEA,30H,LOOP1;MOVR2,DPH;MOVR3,DPL;DONE:RETLOOP1:POPACC;INCA;INCDPTR;DJNZR1,LOOP;MOVR2,#00H;MOVR3,#00H;AJMPDONE;TAB4:DB…,…,…;例4-9片内RAM中存放一批数据,查找出最大值并存放于首地址中。设R0中存首地址,R2中存放字2节数,程序框图如图4-1所示。程序如下:MOVR2,n;MOVA,R0;MOVR1,ADECR2;MOVA,@R1LOOP:MOVR3,ADECR1CLRCSUBBA,@R1;JNCLOOP1;C=0,MOVA,@R1;SJMPLOOP2LOOP1:MOVA,R3LOOP2:DJNZR2,LOOP;MOV@R0,A;RET例4-10一批单字节无符号数,以R0为首地址指针,R2中为字节数,将这批数进行升序排列。程序框图如图4-2所示。SORT:MOVA,R0;MOVR1,AMOVA,R2;MOVR5,ACLRF0;DECR5;MOVA,@R1;LOOP:MOVR3,A;INCR1;CLRC;MOVA,@R1;SUBBA,R3;JNCLOOP1;SETBF0;MOVA,R3;;XCHA,@R1;DECR1;XCHA,@R1;INCR1LOOP1:MOVA,@R1DJNZR5,LOOPJBF0,SORTRET例4-12根据寄存器R2的内容,转向各个处理程序PRGX(X=0~n)。(R2)=0,转PRG0(R2)=1,转PRG1┇(R2)=n,转PRGn例4-1650ms延时程序。延时程序与MCS-51指令执行时间有很大的关系。在使用12MHz晶振时,一个机器周期为1µs,执行一条DJNZ指令的时间为2µs。这时,可用双重循环方法写出下面如下的延时50ms的程序:DEL:MOVR7,#200DEL1:MOVR6,#125DEL2:DJNZR6,DEL2;125*2=250µsDJNZR7,DEL1;0.25ms*200=50msRET编程题已知一MCS—51单片机系统的片内RAM20H单元存放了一个8位无符号数7AH,片外扩展RAM的8000H存放了一个8位无符号数86H,试编程完成以上两个单元中的无符号数相加,并将和值送往片外RAM的01H、00H单元中,同时将所编写程序运行完成后的数据和状态添入下表中给出的PSW的有关位以及寄存器A、DPTR和RAM单元中。MOVDPTR,#8000H;MOVXA,@DPTR;ADDA,20H;MOVR0,#00H;MOVx@R0,A;INCR0;CLRA;ADDCA,#00HMOVx@R0,A;RET1.数据块传送,将RAM从30H开始的连续32个单元的内容传递给片内RAM从60H开始的连续32个单元。ORG1000HMOVR7,#20HMOVR0,#30HMOVR1,#60HLOOP:MOVA,@R0MOVR1,AINCR0INCR1DJNZR7,LOOPSJMP$END2.将4个单字节数放片内30H~~33H,它们求和结果放在片内40H,41H单元。ORG1000HMOVR7,#04HMOVR0,30HCLRAMOV41H,A3LOOP:ADDA...