《分支程序的设计实验单片机第二次试验》由会员分享,可在线阅读,更多相关《分支程序的设计实验单片机第二次试验(8页珍藏版)》请在金锄头文库上搜索。
1、一、任务要求1. 设有8bits符号数X存于外部RAM单元,按以下方式计算后的结果Y也存于外部RAM 单元,请按要求编写程序。X 2当 X 40Y = IX/2当 20 X 40、X当X 20时将A与40进行比较,如果当AN40时则对其进行平方运算那一 步,当AV40时则进行除法运算那一步。每次算完之后直接储存,最后再分配储存于外部 RAM单元的指定位置。2.清零R0R 2和P0P2,开始先判断控制位P3.0是不是0,当P3.0=1时原地踏步重 复判断,当P3.0=0时开始运行程序。计时开始,进行秒钟R0计数,每次计数完成用BCD 码子程序转换,然后判断计数后R0值是否到60,若R0的值不足6
2、0,就直接输出给P2,若 R0的值为60,就把R0和P2进行清零后,开始分钟计数部分。同理,每次分钟计数完之后 用BCD码子程序转换,然后判断计数后R1的值是否为60,若不为60,就直接输出给P1, 若R1的值为60,就把R1和P1清零后开始时钟计数部分。时钟计数完后同样用BCD码子程 序转换,然后判断计数后的R2的值是否为24,若不为24,就直接输出给P0,若R2为24, 就把R2和P0清零后直接跳出计数部分,从判断P3.0部分再开始.每两次计数输出之间穿插 一个1s的延时程序。就可以达到时钟的功能。三、资源分配1.分支程序:数据指针DPTR:对片外RAM进行读写操作2000H:存放8bit
3、s符号数X2010H:存放结果Y (取反后的数,或者平方后的高8位,或者除法后的商)2011H:存放结果Y (平方后的低8位,或者除法后的余数)2.时钟程序:R0、R1、R2:分别进行秒钟,分钟,时钟的计数P2、P1、P0:分别输出秒钟,分钟,时钟P3.0:是否计数的控制位R3、R4、R5:为1s延时程序指定循环次数B: BCD码转换子程序的操作数四、流程图1.分支程序流程图:除法运算:DPTRTMH)T, DPTR+1H23HH)B2.时钟程序的流程图:五、源代码(含文件头说明、语句行注释)1.分支程序代码如下:ORG0000HSJMPSTARTSTART:MOVDPTR, #2000HMO
4、VA, #31MOVXDPTR,A;存数MOVB,0;寄存器B清零MOVXA,DPTR;从曰0中取出数xJNBACC.7,COMP1;判断符号位,符号位为0时转到COMP1LP3:CPLA;对x取反SJMPSTORECOMP1:CJNEA,#20,COMP2;A20 时,转到 COMP2SJMPLP3;A=20时,转到LP3取反COMP2:JCLP3;C=1,A20.当 A240 时,转到 COMP3LP1:MOVB,A;A=40时,给B赋值为AMULAB;计算x平方SJMPSTORECOMP3:JNCLP1;C=0,A40,转到LP1计算x平方MOVB,#02H;C=1,A40,赋值 B=2
5、DIVAB;计算x除以2STORE:MOVDPTR,#2010HMOVXDPTR,A;存数:INCDPTR;对于平方,高位在前地位在后MOVA,B;对于除法,商在前余数在后MOVXDPTR,ASJMP$END2.时钟程序代码如下:ORG 0000HSJMP MAINMAIN: MOV R0,#0MOV R1,#0MOV R2,#0MOV P0,#0MOV P1,#0MOV P2,#0INPUT: P3.0,INPUTDELAY: MOV R3,#64HLOOP: MOV R4,#64HLOOP1: MOV R5,#31HLOOP2: NOPNOPDJNZ R5,LOOP2DJNZ R4,LOO
6、P1DJNZ R3,LOOPSTART: INC R0MOV A,R0ACALL OUTPUTCJNE R0,#60,X2MOV R0,#0MOV P2,#0INCR1MOVA,R1ACALL OUTPUTCJNE R1,#60,X1MOV R1,#0;R0,R1,R2初始化;P0,P1,P2置 0;延时程序;循环次数100;循环次数100;循环次数49;晶振频率设为23.8836Hz502437us;(4*49+3)*100+3*100=1990300 乘以 0;差不多1s;秒钟计数;计算bcd码;60进制判断进1;进位之后清0;输出清0;分钟计数;计算bcd码;60进制判断;进位之后清0M
7、OVP1,#0;输出清0INCR2;时钟计数MOVA,R2ACALLOUTPUT;计算bcd码CJNER2,#24,X0 ;判断是不是溢出了MOVR2,#0;溢出之后清0MOVP0,#0;输出清0SJMPINPUT;跳出循环X2:MOVP2, A;输出SJMPINPUTX1:MOVP1,ASJMPINPUTX0:MOVP0,ASJMPINPUTOUTPUT:MOV B,#0AH;BCD码转换程序DIV AB;相除得到高位,低位SWAP A;得到高位ORL A,BRETSTEP:SJMP STEPEND六、程序测试方法与结果实验一:第一次令A为10H,进行运算后得到的结果是EFH,即取反成功第二
8、次令A为20H,进行运算后得到的结果是10H,即除以2后的结果第三次取A为50,进行运算后的结果为09C4H=2500,即平方后的结果因此可以判断程序没有问题实验二:第一次不进行任何操作开始运行程序,程序没有反应第二次将P3.0改为0后,程序开始运行第三次将P3.0改为0后再运行程序,经过一段时间后停止,发现此时程序运行的时 间为1分41秒,即101秒;而实际经过的时间为100.85897秒,两者误差很小,说明程序 设计以与运行正常思考题1.实现多分支结构程序的主要方法有哪些?举例说明。主要方法有:分支地址表如:BRATAB:DWSUBRODWSUBR1DWSUBR2转移地址表如:JMPTAB:AJMPSUBR0AJMPSUBR1AJMPSUBR2地址偏移量表如:DISTAB:DBSUBRO-DISTABDBSUBR1-DISTABDBSUBR3-DISTAB2.在编程上,十进制加1计数器与十六进制加1计数器的区别是什么?怎 样用十进制加法指令实现减1计数?十六进制加一直接用INC加一,十进制加一时需先判断该位上是否是9,若是则清零。用十进制加法进行减1计数时,应讲计数器当前值与1的十进制补码99H进行相加, 然后用DA A指令进行二一十进制修正,从而实现十进制减1计数功能。