8051单片机实验报告专业:电子科学与技术姓名:学号:120231指导教师:金冬月第一单元单片机程序调试环境使用及并行数据传送操作训练1-1修改例程一的源程序:将A寄存器的初值改为80H(正逻辑,数据位为1表示发光二极管点亮),再对源程序进行简单修改,使程序运行后发光二极管点亮情况与修改前相同。$include(C8051F020.inc);C8051F02x系列单片机信息头文件包含伪指令LCALLInit_Device;调用初始设置子程序MOVA,#080H;赋初始值并在发光二极管上显示该数值CPLAMOVP3,ALOOP:CALLDELAYCALLDELAYCALLDELAYCALLDELAYCALLDELAYRRA;A寄存器内容右移1位并送发光二极管显示MOVP3,AAJMPLOOP;无限循环DELAY:MOVR5,#0H;延时子程序D1:MOVR6,#0HDJNZR6,$DJNZR5,D1RET$include(Init_Device.inc);初始设置子程序文件包含伪指令END将LED向左循环移位点亮改为向右循环移位点亮。$include(C8051F020.inc);C8051F02x系列单片机信息头文件包含伪指令LCALLInit_Device;调用初始设置子程序MOVA,#07FH;赋初始值并在发光二极管上显示该数值MOVP3,ALOOP:CALLDELAYCALLDELAYCALLDELAYCALLDELAYCALLDELAYRLA;A寄存器内容右移1位并送发光二极管显示MOVP3,AAJMPLOOP;无限循环DELAY:MOVR5,#0H;延时子程序D1:MOVR6,#0HDJNZR6,$DJNZR5,D1RET$include(Init_Device.inc);初始设置子程序文件包含伪指令END加快LED循环移位点亮的速度。(删除几个延迟指令!)$include(C8051F020.inc);C8051F02x系列单片机信息头文件包含伪指令LCALLInit_Device;调用初始设置子程序MOVA,#07FH;赋初始值并在发光二极管上显示该数值MOVP3,ALOOP:CALLDELAYCALLDELAYRRA;A寄存器内容右移1位并送发光二极管显示MOVP3,AAJMPLOOP;无限循环DELAY:MOVR5,#0H;延时子程序D1:MOVR6,#0HDJNZR6,$DJNZR5,D1RET$include(Init_Device.inc);初始设置子程序文件包含伪指令END1-2将例程二0-F的循环显示改为0-9的循环显示。$include(C8051F020.inc)ORG0000HLJMPINITTAB:DB0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H;段码0-7DB080H,090H,088H,083H,0C6H,0A1H,086H,08EH;段码8-FINIT:LCALLInit_DeviceMOVR1,#00H;操作数据初始值MOVA,R1MAIN:MOVDPTR,#TAB;读取与A中数值对应的显示段码MOVCA,@A+DPTRMOVP5A;段码送并行口5显示CALLDELAYCALLDELAYCALLDELAYCALLDELAYCALLDELAYCALLDELAYCALLDELAYCALLDELAYCALLDELAYCALLDELAYINCR1;操作数据(R1)增1MOVA,R1CJNEA,#0AH,MAIN.;检查操作数据是否大于显示范围(F)SJMPINIT;无限循环DELAY:MOVR5,#0H;延时子程序D1:MOVR6,#0HDJNZR6,$DJNZR5,D1RET$include(Init_Device.inc)END实验2.中断控制及定时器/计数器操作训练2-1通过对例程5的程序进行修改和上机调试,改变原程序的功能。(1)将KEY2,KEY4的功能对调。(2)每次停下再启动后,更改发光二极管点亮的循环方向。$include(C8051F020.inc);C8051F02x单片机信息头文件包含伪指令ORG0000HLJMPINITIAL;主程序入口ORG0013HLJMPSTAR;外中断0服务程序入口,开始键(STAR)ORG0003HLJMPSTOP;外中断1服务程序入口停止键(STOP)ORG0100HINITIAL:LCALLInit_Device;调用初始设置子程序MOVP3,#0FFH;熄灭全部发光二极管MOVA,#0FFHMOVDPTR,#7F80HMOVX@DPTR,A;清除数码管2(NUM2)显示MOVA,#0FEH;点亮发光二极管的初始数据MOVR1,#1H;发光二极管点亮位置初值MOVIP,#04H;设置INT0(开始键STAR)为高优先级MOVTCON,#05H;外中断采用边沿触发SETBEX1;INT1(停止键STOP)开中断SETBEA;开放中断LOOP:LOOP:CLREA;关闭中断RLAMOVP3,A;刷新发光二极管控制数据INCR1;发光二极管点亮位置计数值增1SETBEA;开放中断LCALLDELAY1;延时LCALLDELAY1CJNER1,#8,LOOP;发光二极管点亮位置计数值有效性检测MOVR1,#0H;发光二极管点亮位置计数值等于8则回0SJMPLOOP;无限次循环;停止键的中断服务程序STOP:PUSHACC;保护A寄存器内容MOVA,R1;读取发光二极管点亮位置计数值MOVDPTR,#TABMOVCA,@A+DPTR;获取发光二极管点亮位置计数值的显示段码MOVDPTR,#7F80HMOVX@DPTR,A;发光二极管点亮位置计数值的显示数据送显示SETBEX1;INT0(启动键STAR)开中断JNZ$;等待重新启动条件--A=0MOVA,#0FFHMOVX@DPTR,A;清除数码管2(DS2)显示CLREX1;禁止INT0中断(避免程序误动作)POPACC;恢复A寄存器内容CLRIE0;清除INT1中断标志(避免程序误动作)RETI;中断返回;启动键的中断服务程序STAR:MOVA,#00H;设置启动条件--A=0CLRIE1;清除INT0中断标志(避免程序误动作)RETI;中断返回TAB:DB0C0H,0F9H,0A4H,0B0H,099H;0--4段码DB092H,082H,0F8H,080H;5--8段码DELAY1:MOVR6,#0;延时子程序D1:MOVR7,#0DJNZR7,$DJNZR6,D1RET$include(Init_Device.inc);初始设置子程序文件包含伪指令2-2修改例程6,将计数范围由0-F扩展至00-FF(使用定时器/计时器0),并在2位数码管上用10进制数显示计数结果(00-99)。16进制→10进制方法Hex/10:商=10进制十位,余数=10进制个位$include(C8051F020.inc)DP2EQU07F80HDP1EQU07F90H;增加一个DP_LEQU30HDP_HEQU31HMAIN:LCALLInit_DeviceMOVTMOD,#00000110B;使计数器工作在模式2MOVA,#0MOVDP_L,A;显示计数的低位MOVDP_H,A;显示计数高位CALLDISPLAYMOVTL0,#0;使TL0的初值为0SETBTR0;启用定时器0LOOP:MOVA,TL0CJNEA,#100,L1;A不等于100时,转到L1显示MOVTL0,#0;当A等于100时,TL0清零MOVA,TL0L1:MOVB,#10DIVAB;将16进制数转化为10进制数MOVDP_L,BMOVB,#10DIVABMOVDP_H,B;将B显示为高位CALLDISPLAYSJMPLOOP;循环LOOPDISPLAY:MOVA,DP_LCALLDECODEMOVDPTR,#DP1MOVX@DPTR,AMOVA,DP_HCALLDECODEMOVDPTR,#DP2MOVX@DPTR,AMOVP5,ARETDECODE:MOVDPTR,#TABMOVCA,@A+DPTRRETTAB:DB0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8HDB080H,090H,088H,083H,0C6H,0A1H,086H,08EH$include(Init_Device.inc)END实验三.串行数据传送操作程序调试练习(1)将发送1,2,3,4的ASC码改为发送A,B,C,D的ASC码$include(C8051F020.inc)NUM2EQU07F80H;NUM2地址NUM3EQU07F90H;NUM3地址NUM4EQU07FA0H;NUM4地址NUM5EQU07FB0H;NUM5地址TIM_LEQU0FDH;T/C1低字节计数值TIM_HEQU0FDH;T/C1高字节计数值REC_BUF0EQU32H;数据接收缓冲器0REC_BUF1EQU33H;数据接收缓冲器1REC_BUF2EQU34H;数据接收缓冲器2FLAGBIT01H;数据发送完成标志ORG0000HLJMPMAIN;转主程序ORG0023HLJMPRECE;转串行通信中断程序MAIN:lcallInit_DeviceMOVA,#0FFHMOVP5,A;清除数码管NUM1的显示MOVDPTR,#NUM2MOVX@DPTR,A;清除数码管NUM2的显示MOVDPTR,#NUM3MOVX@DPTR,A;清除数码管NUM3的显示MOVDPTR,#NUM4MOVX@DPTR,A;清除数码管NUM4的显示MOVDPTR,#NUM5MOVX@DPTR,A;清除数码管NUM5的显示MOVR6,#0;通信操作状态寄存器清除MOVSP,#40H;堆栈栈底设置MOVTMOD,#00100000B;T/C1方式2MOVTH1,#TIM_H;T/C1重装填值MOVTL1,#TIM_L;T/C1计数值SETBTR1;启动T/C1MOVSCON0,#01010000B;串口方式1SETBES;串口中断允许SETBEA;开中断LOOP:CALLKEYBOARD;调用案件状态分析子程序CJNEA,#0FFH,L0;按键状态发生变化转L0CLRFLAG;按键状态无变化,清除发送完成标志SJMPLOOP;L0:JBFLAG,LOOP;数据发送完成,返回主循环MOVR7,A;否则,键值暂存R7MOVA,#043H;CMOVSBUF0,A;发送字符C的ASCII码值CALLDELAY;MOVA,#04FH;OMOVSBUF0,A;发送字符O的ASCII码值CALLDELAY;MOVA,#04DH;MMOVSBUF0,A;发送字符M的ASCII码值CALLDELAY;MOVA,#04BH;KMOVSBUF0,A;发送字符K的ASCII码值CALLDELAY;MOVA,#30H;发送数字0的ASCII码值MOVSBUF0,ACALLDELAY;MOVA,R7;ADDA,#40H;生成键值的ASCII码值MOVSBUF0,A;发送键值的ASCII码值SETBFLAG;置位发送完成标志SJMPLOOP;中断服务程序RECE:JNBTI,REC1;非发送转接收处理CLRTI;否则,清除发送中断标志RETI;中断返回REC1:PUSHACC;保护累加器AMOVA,SBUF0;读接收缓冲器CJNER6,#0,REC2;CJNEA,#43H,REC6;接收状态为0,进行字符C的过滤处理MOVR6,#1;接收状态改为1SJMPREC6;REC2:CJNER6,#1,REC3;CJNEA,#4FH,REC5;接收状态为1,进行字符O的过滤处理MOVR6,#2;接收状态改为2SJMPREC6;REC3:CJNER6,#2,REC4;CJNEA,#4DH,REC5;接收状态为2,进行字符M的过滤处理MOVR6,#3;接收状态改为3MOVR5,#3;数据接收计数器设置为3SJMPREC6;REC4:CJNER6,#3,REC6;PUSHAC