1、小于28H时,再与14H比较,大于14H时除二,否则取反。地址存于片外0040H和0041H,低位存于0040H,高位存于0041H。 2. 电子时钟电子时钟的时、分、秒数值分别通过P0、P1、P2端口输出(以压缩BCD码的形式)。P3.0=0时开始计时。秒满60进位,为了60秒时直接显示1分钟0秒,需先将A赋给P2,再加一,再与60H比较,看是否进位。同理,分满60进位。时满24重新开始,由于P0端口的位置错误,A与P0相互赋值时,需加中间变量RO。 3.双向计数P3的底四位全为1时开始计数;用P3.7状态控制加、减计数方式;千位、百位由P1口输出,十位、个位由P2口输出(以压缩BCD码的形
2、式)。P3.7为1时加计数,需先将进位C清零,用ADD语句给P2加一,并用DA语句进行十进制修正;再用ADDC语句给P1加一再十进制修正。P3.7为0时减计数,需先判断P2是否为00H, 不是00H则P2减一,是00H则给P2赋99H;同理,再判断P1是否为00H,不是00H则P1减一,是00H则给P1赋99H。延时可以用上面程序的延时1s子程序。三、资源分配初始数据X存于片外0010H;取反和除二操作,结果都存于片外0040H中;平方操作低位存于0040H中,高位存于0041H中。2. 电子时钟 P3.7为0时开始计数,为1时停止;P2显示秒,P1显示分,P0显示时;R3、R4、R5用于进行
3、延时的装载循环次数。3.双向计数P1口显示千位、百,P2口显示十位、个位。四、流程图 图1为分支计算程序流程图图2为电子时钟程序流程图图3为双向计数程序流程图五、源代码 (含文件头说明、资源使用说明、语句行注释)1. 分支计算/*File name: 分支计算Description: 8bits符号数X存于片外0010H,当X=40时,取平方,高位存于0040H, 低位存于片外0041H中;当20X40时,除二,结果存于片外0040H中; 当X=20时,对X取反,结果存于片外0040H中。Date: 2012.10.10Designed by: gxySource used: 0010H:片外
4、RAM存储的数X 0040H:除二和取反结果、平方结果的平方的低八位 0041H:平方结果的高八位*/ ORG 0000H LJMP MAIN ORG 0010HMAIN: MOV DPTR,#0010H ;x存于片外0010H中 MOVX A,DPTR CLR C CJNE A,#7FH,TO1 ;与7FH比较,判断正负 SJMP PLACE1TO1: JNC PLACE3 CJNE A,#28H,TO2 ;与28H比较TO2: JNC PLACE1 CJNE A,#14H,TO3 ;与14H比较 SJMP PLACE3TO3: JNC PLACE2 SJMP PLACE3PLACE1: M
5、OV B,A ;当x大于等于40时,取平方 MUL AB SJMP SAVEPLACE2: CLR C RRC A ;当x大于20小于40时,通过右移实现X除以2 PLACE3: CPL A ;当x小于等于20时,取反 SAVE: MOV DPTR ,#0040H MOVX DPTR,A ;低位存入片外0040H MOV A ,B INC DPTR MOVX DPTR,A ;高位存入片外0041HHERE: SJMP HERE ;踏步END 电子时钟 24小时电子时钟的时、分、秒数值分别通过P0、P1、P2端口输出(以压缩BCD码的形式)。 P3.0为低电平时开始计时,为高电平时停止计时。 P
6、2显示秒,P1显示分,P0显示时 P3.7为0时开始计数,为1时停止 R3、R4、R5:进行延时装载循环次数 ORG 0000H LJMP STARTSTART: MOV SP,#40H MOV P0,#00H MOV P1,#00H MOV P2,#00H MOV R0,#00H MOV R1,#00H MOV R2,#00HWAIT: JB P3.0,WAIT ;P3.0为0时开始,为1时停止SEC: MOV A,R2 ;秒 MOV P2,A ;将A值赋给P2端口 ADD A,#01H DA A MOV R2,A ACALL DLY ;跳转到1s延时子程序 CJNE A,#60H,WAIT
7、 ;满60秒进位1分钟MIN: MOV R2,#00H ;分 MOV A,R1 ADD A,#01H MOV P1,A ;将A值赋给P1端口 MOV R1,A满60分钟进位1小时HOUR: MOV P2,#00H ;时 MOV P1,#00H MOV A,R0 MOV P0,A ;将A值赋给P0端口 MOV R0,A CJNE A,#24H,WAIT ;判断是否满24小时 SJMP START ;满24小时,重新开始计时 DLY: MOV R4,#46 ;延时1s,误差1usL3: MOV R5,#152L1: MOV R3,#70L2: DJNZ R3,L2 DJNZ R5,L1 DJNZ
8、R4,L3 RET END 3. 双向计数 /* 双向计数 4位十进制加、减1计数,千位、百位由P1口输出;P3.7为1时加计数,为0时减计数。P3的底四位全为1时开始计数。 P3.7为1时加计数,为0时减计数 P3的底四位全为1时开始计数 P1口输出千位、百位 P2口输出十位、个位由 */ LJMP MAIN MOV P3,#00H MOV P2,#00H MOV P1,#00H ACALL DLY ;延时1s MOV A,P3 ANL A,#0FH CJNE A,#0FH,WAIT ;P3低四位全为1则开始计数 JB P3.7,INCREACE ; P3.7为1进行加计数 LJMP DEC
9、REACE ; P3.7为0进行减计数INCREACE: CLR C MOV A,P2 ADD A,#01H DA A ;P2十进制修正修正 MOV P2,A MOV A,P1 ADDC A,#00H ;P1加上P2的进位P1十进制修正修正 MOV P1,A AJMP WAITDECREACE: MOV A,P2 CJNE A,#0,DECREACE_1 ;P2不为0时,P2减1 MOV P2,#99H ;P2为0时,向百位借位,减一为99H MOV A,P1 CJNE A,#0,DECREACE_2 ;由于借位,P1不为0时,P1减一 MOV P1,#99H ;P1为0时,减一为99H AJ
10、MP WAIT DECREACE_1: ;十位个位减一 ADD A,#99H DA A MOV P2,ADECREACE_2:千位百位减一 ADD A,#99H DA A MOV P1 ,A MOV R6,#70 DJNZ R6,L2 END六、程序测试方法与结果、软件性能分析 1. 分支计算程序运行测试:如图所示,在片外0010H中给X赋值7FH,运行结果在片外0040H和0041中显示,为013F7FH取平方为3F01H,所以X执行取平方操作,正确。在Register中A和B都为3FH,因为执行代码 MOV B,A MUL AB DPTR 最后地址为0041H与存储地址相符分支功能测试:X
11、为7FH时,取平方,预期结果3F01X为07H时,取反, 预期结果FBX为15H时,除二, 预期结果0AX为27H时,除二,预期结果13X为28H时,取平方,预期结果0640X为14H时,取反, 预期结果EBX为F9H时,取反, 预期结果06X存于片外0010H中,取反和除二操作,结果都存于片外0040H中,平方操作低位存于0040H中,高位存于0041H中。所得结果均符合分支计算的预期结果,而且在7FH、28H、14H这三个转折点计算结果也正确。Program Size: data=8.0 xdata=0 code=48所以本程序性能良好,运行正常。总体运行测试:端口显示的是6分21秒,实际
12、精确运行时间为381.00312500s,相差0.003125s1s延迟子程序测试: 断点设置如下 两断点间运行时间为0.99999900s,说明1s延迟子程序误差为1us。60秒时直接显示1分钟0秒测试: 由图可知,由00:00:59直接变为00:01:00,符合要求。时钟误差测试:如上图,运行一分钟,误差为0.0005s如上图,运行一小时,误差为0.029422s如上图,运行24小时,误差为0.705901s data=8.0 xdata=0 code=81程序稍加改进,还可以添加计天,甚至计月的功能加法测试:P3.7=1如上图所示,从4799到4800,两端口间进位正常如上图所示,从9999到0000再到0001,加法进位正常减法测试:P3.7=0如上图,从0000到9999,减一借位正常如上图,从9600到9599,减一,两端口间借位正常 data=8.0 xdata=0 code=86七、思考题1实现多分支结构程序的主要方法有哪些?举例说明。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1