实验名称 实验二 分支与循环程序设计实验 指导教师专业班级 姓名 学号联系电话一、任务要求1. 设有8bits 符号数X 存于外部RAM 单元,按以下方式计算后的结果Y 也存于外部RAM 单元,请按要求编写程序。
240/2204020X X Y X X X X ⎧≥⎪=<<⎨⎪≤⎩当当当2. 利用51系列单片机设计一个24小时制电子时钟,电子时钟的时、分、秒数值分别通过P0、P1、P2端口输出(以压缩BCD 码的形式)。
P3.0为低电平时开始计时,为高电平时停止计时。
设计1s 延时子程序(延时误差小于10us ,晶振频率12MHz )。
提高部分(选做):a. 实现4位十进制加、减1计数,千位、百位由P1口输出;十位、个位由P2口输出。
利用P3.7状态选择加、减计数方式。
b. 利用P3口低四位状态控制开始和停止计数,控制方式自定。
二、设计思路1.任务一:先判断输入自变量的正负性。
如果是负数则直接归到取反区间;如果是正数,则与20,40进行大小比较,即和20,40分别做减法,然后根据比较结果归到各个区间。
2.任务二:先设置好进位计数器数值,再将R3、R4和P0、P1、P2、P3清零。
开始先判断控制位P3.0是否为0,当P3.0=1时原地踏步重复判断,当P3.0=0时开始计时。
计时开始,进行秒钟B 计数,计数后R0减一,每次计数完成用BCD 码子程序转换,然后由P2输出秒钟,判断计数后R0值是否为0,若R0的值不为0,就跳转回秒钟继续计数,若R0的值为0,就把R0和P2进行清零后,开始分钟计数部分。
同理,每次分钟计数完之后用BCD码子程序转换,然后由P1输出分钟,判断计数后R1值是否为0,若R1的值不为0,就跳转回秒钟继续计数,若R1的值为0,就把R1和P1清零后开始时钟计数部分。
时钟计数完后同样用BCD码子程序转换,然后判断计数后的R2的值是否为0,若不为0,就跳转回秒钟计数,若R2为0,就吧R2和P0清零后直接跳出计数部分,从判断P3.0部分再开始.每两次计数输出之间穿插一个1s的延时程序。
就可以达到时钟的功能。
3.加、减1计数程序:将十进制数的千位数和百位数存于P1,将十进制数的十位数和个位数存放于P2,P3.0至P3.3全为低电平则开始计数,否则停止计数。
P3.7为选择加一或减一的计数方式的控制位,P3.7为0时加1计数,P3.7为1时减1计数;R3,R4,R5为计数中的延时程序指定循环次数。
三、资源分配1.任务一:2000H: 输入的自变量2001H:若X≤20,则为取反结果若20<X<40,则为X除以二的整数部分若X≥40,则为平方后的低八位2002H:若20<X<40,则为X除以二的余数部分若X≥40,则为平方后的高八位DPTR:数据指针2.任务二:R0、R1、R2:秒、分、时进位计数器B:秒钟计数R3:分钟计数R4:时钟计数P0:时钟输出P1:分钟输出P2:秒钟输出P3:电子钟开关控制3.加、减1计数程序:P1:十进制数的千位数和百位数P2:十进制数的十位数和个位数P3.0-P3.3:是否进行计数的4个控制位P3.7:选择加一或减一的计数方式的控制位R3,R4,R5:计数中的延时程序指定循环次数。
四、流程图1.任务一:2.任务二:3.加、减1计数程序:五、源代码1.任务一:File name: 1.asmDescription: 多分支程序设计Date: 2014/10/8Designed by: LXQSource used: 2000H: 输入的自变量2001H:若X≤20,则为取反结果若20<X<40,则为X除以二的整数部分若X≥40,则为平方后的低八位2002H:若20<X<40,则为X除以二的余数部分若X≥40,则为平方后的高八位DPTR:数据指针ORG 0000HLJMP MAINORG 0100HMAIN: MOV A,#25 ;输入自变量MOV B,#00H ;B清零MOV DPTR,#2000H ;设置数据指针MOVX @DPTR,A ;存入片外RAMJNB ACC.7,COMP1 ;判断符号位SJMP LOOP1 ;负数则取反COMP1: CJNE A,#20,COMP2 ;A≠20H时跳转到COMP2 SJMP LOOP1 ;A=20H时取反COMP2: JC LOOP1 ;CY=1时取反CJNE A,#40,COMP3 ;A≠40H时跳转到COMP3SJMP LOOP3 ;A=40H时平方COMP3: JC LOOP2 ;CY=1时除以二SJMP LOOP3 ;CY=0时平方LOOP1: CPL A ;取反操作SJMP STORE ;跳转存储指令LOOP2: MOV B,#02HDIV AB ;除以二SJMP STORE ;跳转存储指令LOOP3: MOV B,AMUL AB ;平方SJMP STORE ;跳转存储指令STORE: INC DPTR ;设置数据指针MOVX @DPTR,AINC DPTRMOV A,BMOVX @DPTR,A ;高位和低位依次存入片外RAM SJMP $ ;原地踏步END2.任务二:ORG 0000HLJMP MAINORG 0100HMAIN: MOV R0,#60MOV R1,#60MOV R2,#24 ;时针、分针、秒针计数器赋初值MOV R3,#0HMOV R4,#0H ;时钟、分钟赋初值MOV P0,#0HMOV P1,#0HMOV P2,#0HMOV P3,#0HSTART: JB P3.0,STOP ;若P3.0为高电平则停止计时ACALL DLYMOV A,BADD A,#01HDA AMOV B,A ;秒钟计时MOV P2,A ;输出秒钟DJNZ R0,START ;R0-1,不等于零则跳到START继续循环MOV B,#0HMOV P2,#0HMOV A,R3ADD A,#01HDA AMOV R3,A ;分钟计时MOV P1,A ;输出分钟MOV R0,#60 ;计数器归位DJNZ R1,START ;R1-1,不等于零则跳到START继续循环MOV B,#0HMOV R3,#0HMOV P1,#0HMOV A,R4ADD A,#01HDA AMOV R4,A ;时钟计时MOV P0,A ;输出时钟MOV R1,#60 ;计数器归位DJNZ R2,START ;R2-1,不等于零则跳到START继续循环SJMP MAINSTOP: SJMP $ ;原地踏步DLY: MOV R5,#46 ;延时1s,误差1us ;延时1s,误差1usDLY:DELAY: MOV 72H,#100LOOP3: MOV 71H,#100LOOP1: MOV 70H,#47LOOP0: DJNZ 70H,LOOP0NOPDJNZ 71H,LOOP1MOV 70H,#46LOOP2: DJNZ 70H,LOOP2NOPDJNZ 72H,LOOP3MOV 70H,#48LOOP4: DJNZ 70H,LOOP4RETEND3.加、减1计数程序:ORG 0000HLJMP MAINORG 0100HMAIN: MOV P1,#00H ;P1端口置零MOV P2,#00H ;P2端口置零MOV P3,#7FH ;P3端口置#7FHSTART: JB P3.0,STARTJB P3.1,STARTJB P3.2,STARTJB P3.3,START ;判断是否开始计时LJMP DELAY ;跳转到延时子程序DELAY: MOV R7,#24DEL1: MOV R6,#61DEL2: MOV R5,#170DEL3: NOPNOPDJNZ R5,DEL3DJNZ R6,DEL2DJNZ R7,DEL1 ;延时1秒JB P3.7 ,DOWN ;P3.7为0时,加1计数;P3.7为1时,减1计数LJMP UPDOWN: CLR CMOV A,P2SUBB A,#01HMOV R1,AANL A,#0FHMOV R7,AMOV A,R1ANL A,#0F0HMOV R1,AMOV A,P1SUBB A,#00HMOV R0,AANL A,#0FHMOV R6,AMOV A,R0ANL A,#0F0HMOV R0,ACJNE R7,#0FH,LOOP1MOV R7,#09HLOOP1: CJNE R1,#0F0H,LOOP2MOV R1,#90HLOOP2: CJNE R6,#0FH,LOOP3MOV R6,#09HLOOP3: CJNE R0,#0F0H,LOOP4MOV R0,#90HLOOP4: MOV A,R1ADD A,R7DA AMOV P2,AMOV A,R0ADD A,R6DA AMOV P1,ALJMP START ;减1计数子程序UP: MOV A,P2ADD A,#01HDA AMOV P2,AMOV A,P1ADDC A,#00HDA AMOV P1,ALJMP START ;加1计数子程序END六、程序测试方法与结果1.任务一:⑴取X=10,则结果应为F5H,即(2000H)=0AH,(2001H)=F5H,(2002H)=00H。
编译结果如下:⑵取X=25,则结果应为0CH,即(2000H)=19H,(2001H)=0CH,(2002H)=01H。
编译结果如下:⑶取X=60,则结果应为3600,即(2000H)=3CH,(2001H)=10H,(2002H)=0EH。
编译结果如下:综上可得程序功能正确,运行成功。
2.任务二:P3.0设为低电平,设置断点,开始计数,秒种到60时,分钟进位,秒钟清零:重新设置断点,开始计数,分种到60时,时钟进位,分钟清零:重新设置断点,开始计数,时种到24时,全部清零,重新判断P3.0。
P3.0置一则计时停止:测试完成,程序运行顺利,功能正确。
3.加、减1计数程序:P3.0至P3.3全为低电平时开始计数,P3.7为0时加1计数(0加1为1):P3.7为0时减1计数(0减一则为9999):功能运行正常。
七、心得与体会通过这次的微机实验,我加深了对于分支程序设计的理解,并通过自己设计程序框图和代码,提高了我的编程和调试代码的能力。
在编程过程中,由于分支众多,我常常遇到思路不清晰的情况,这就要求我们在动手写代码之前一定要先想好代码的整体架构,设计好流程图,再跟着流程图的思路一步步编写代码,才能保持思路清晰,减少错漏。
总之,要学会编写复杂的程序,看书是远远不够的,还需要我们多动手,多实际操作,去解决一些实际遇到的问题,这样才能提高我们的编程水平。
思考题1.实现多分支结构程序的主要方法有哪些?举例说明。
答:实现多项分支的主要方法是采用分支表法,常用的分支表法的组成有三种形式:⑴分支地址表:它是由各个分支程序的首地址组成的一个线性表,每个首地址占连续的两个字节。