单片机第二次试验报告分支程序设计文档格式.docx
《单片机第二次试验报告分支程序设计文档格式.docx》由会员分享,可在线阅读,更多相关《单片机第二次试验报告分支程序设计文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
需要注意的是,在小时、分、秒达到59时,下一次应该为零。
程序运行时修改P3.0的值可以实现暂停和继续的功能。
3.加一减一程序
先初始化P1和P2,然后当P3低四位均为0作为开始计数的标志,每次计数中插一个延时程序。
P3.7为0时进行加1计数:
先把低2位从P2中取出至A,对A进行ADD加一计数并进行十进制修正,然后存进P2;
再把高2位从P1取出至A,对A进行ADDC的加进位操作并十进行进制修正,然后存进P1。
P3.7为1时进行减一计数:
只需改用ADD指令加上1的补码即可,高2位在第二位为99时进行同样的操作,最后分别用P1和P2输出高2位和低2位。
即可实现所需功能。
三、资源分配
1.分段函数
根据题目的条件,首先,设该8位无符号数为30H,把片外地址4000H分配给它,把片外地址4001H和4002H分配给经分段函数计算得到的结果Y。
按位取反计算结果存于4001H单元,而除法计算结果的商与余数和乘方计算中结果的高、低八位分开存储于4001H-4002H单元。
用寄存器A,B来存放在乘除运算中所得的中间结果。
2.二十四小时制时钟
工作寄存器R0、R1、R2分别用于秒、分、时循环次数的设定,R3、R4分别用于分与时的循环计数,R5-R7用于“一秒延时”中三重循环的循环次数设定。
秒、分、时数值分别由P2、P1、P0端口输出。
3.加、减1计数程序:
将十进制数的千位数和百位数存于P1,将十进制数的十位数和个位数存放于P2,P3.0至P3.3为是否进行计数的4个控制位,P3.7为选择加一或减一的计数方式的控制位
;
R3,R4,R5为计数中的延时程序指定循环次数。
4、流程图
N
Y
N
NY
YN
2.时钟程序
Y
N
Y
5.源代码
1.分段函数
ORG0000H
LJMPMAIN
ORG0100H
MAIN:
MOVA,#30H;
将8位无符号数赋给A
MOVDPTR,#4000H;
定义数据指针
MOVX@DPTR,A;
将X存于片外RAM
CLRC;
将进位位清零
KIND1:
CJNEA,#14H,KIND2;
将A与14H比较,若不等于14H,跳转至KIND2
OUT1:
CPLA;
对A中内容取反
MOVDPTR,#4001H;
将计算结果存于片外地址4001H
SJMPDONE
KIND2:
JNCKIND3;
判断进位位CY是否为0,若为0,跳转至KIND3
SJMPOUT1;
否则跳转至OUT1
KIND3:
CLRC;
CJNEA,#28H,KIND4;
将A中内容与28H比较,若不等于28H,跳转至KIND4
OUT2:
MOVB,A;
将A中内容赋给B
MULAB;
计算X的平方,将结果高八位存于B,低八位存于A
MOVX@DPTR,A;
将结果低八位存于片外地址4001H
INCDPTR;
数据指针加一
MOVA,B;
将B中内容赋给A
将结果高八位存于片外地址4002H
KIND4:
JNCOUT2;
判断进位位是否为0,若为0,跳转至OUT2
SJMPOUT3;
否则跳转至OUT3
OUT3:
MOVB,#02H
DIVAB;
计算X/2,将商存于A,余数存于B
MOVDPTR,#4001H;
将商存于片外地址4001H
数据指针加1
MOVA,B
将余数存于片外地址4002H
DONE:
SJMP$
END
MOVR0,#00H
MOVP0,#00H;
时钟位清零
MOVP1,#00H;
分钟位清零
MOVP2,#00H;
秒钟位清零
START:
JBP3.0,START;
P3.0为低电平开始计数,高电平停止计数
MOVR2,P2;
P2的值存入R2
CJNER2,#60H,DEL;
秒钟达到60继续,不足60跳转
秒钟清零
MOVA,P1
ADDA,#01H;
分钟位加1
DAA;
分钟位改为BCD码
MOVP1,A
MOVR1,P1;
P1的值存入寄存器R1
CJNER1,#60H,DEL;
分钟达到60继续,不足60跳转
分钟清零
MOVA,R0
时钟位加1
时钟位改为BCD码
MOVR0,A
MOVP0,A
CJNER0,#24H,DEL;
时钟达到24继续,不足24跳转
MOVR0,#00H
DEL:
MOVR7,#24;
延时程序
LOOP1:
MOVR6,#61
LOOP2:
MOVR5,#170
LOOP3:
NOP
NOP
DJNZR5,LOOP3
DJNZR6,LOOP2
DJNZR7,LOOP1
MOVA,P2
秒钟位加1
DAA
MOVP2,A
SJMPSTART
END
3.加一减一程序
MAIN:
MOVP1,#00H;
P1端口置零
MOVP2,#00H;
P2端口置零
MOVP3,#7FH;
P3端口置#7FH
JBP3.0,START
JBP3.1,START
JBP3.2,START
JBP3.3,START;
判断是否开始计时
LJMPDELAY;
跳转到延时子程序
DELAY:
MOVR7,#24
DEL1:
MOVR6,#61
DEL2:
MOVR5,#170
DEL3:
DJNZR5,DEL3
DJNZR6,DEL2
DJNZR7,DEL1;
延时1秒
JBP3.7,DOWN;
P3.7为0时,加1计数;
P3.7为1时,减1计数
LJMPUP
DOWN:
MOVA,P2
CLRC
SUBBA,#01H
MOVR1,A
ANLA,#0FH
MOVR7,A
MOVA,R1
ANLA,#0F0H
MOVA,P1
SUBBA,#00H
MOVR0,A
MOVR6,A
MOVA,R0
CJNER7,#0FH,LOOP1
MOVR7,#09H
LOOP1:
CJNER1,#0F0H,LOOP2
MOVR1,#90H
LOOP2:
CJNER6,#0FH,LOOP3
MOVR6,#09H
LOOP3:
CJNER0,#0F0H,LOOP4
MOVR0,#90H
LOOP4:
MOVA,R1
ADDA,R7
DAA
MOVP2,A
ADDA,R6
MOVP1,A
减1计数子程序
UP:
ADDA,#01H
ADDCA,#00H
LJMPDELAY;
加1计数子程序
6、程序测试方法与结果、软件性能分析
1.分段函数
对于分段函数的问题,可以将X设为某一值,运行程序,观察各个寄存器及有关地址中内容,进行验证。
截图如下:
(1)X=30H
(2)X=0AH
(3)X=18H
经验证,所有结果正确,且运行程序过程中并未出现任何问题,故源程序正确
2.24小时时钟程序
附加:
思考题
1.实现多分支结构程序的主要方法有哪些?
举例说明。
2.在编程上,十进制加1计数器与十六进制加1计数器的区别是什么?
怎样用十进制加法指令实现减1计数?
答:
1.一是利用条件转移指令实现,如DJNZ,JNC等等
例如:
例如,判断两个单字节无符号数的大小(分别存于片内RAM的40H和41H单元)并把大数存入42H单元。
可以用判断CY的转移指令JNC来实现,程序如下:
JUDGE:
MOVA,40H
CLRC
SUBBA,41H
JNCLP
MOV42H,41H
RET
LP:
MOV42H,40H