《北京工业大学8051单片机实验报告.docx》由会员分享,可在线阅读,更多相关《北京工业大学8051单片机实验报告.docx(24页珍藏版)》请在三一办公上搜索。
1、8051单片机实验报告专业:电子科学与技术姓名:学号:120231指导教师:金冬月第一单元单片机程序调试环境使用及并行数据传送操作训练1-1修改例程一的源程序:将A存放器的初值改为80H(正逻辑,数据位为1表示发光二极管点亮),再对源程序进展简单修改,使程序运行后发光二极管点亮情况与修改前一样。Sinclude(C8051F020.inc);C8051F02x系列单片机信息头文件包含伪指令1.CALLInit.Device;调用初始设置子程序MOVA,#080H;赋初始值并在发光二极管上显示该数值CPLAMOVP3,ALOOP:CALLDELAYCALLDELAYCALLDELAYCALLDE
2、LAYCALLDELAYRRA;A存放器内容右移1位并送发光二极管显示MOVP3,AAJMPLOOP;无限循环DELAY:MOVR5,#0H;延时子程序Dl:MOVR6,SOHDJNZR6,$DJNZR5,D1RETSinclude(IniLDeViCe.inc);初始设置子程序文件包含伪指令END将LED向左循环移位点亮改为向右循环移位点亮。Sinclude(C8051F020.inc);C8051F02x系列单片机信息头文件包含伪指令1.CALLInit_Dcvice;调用初始设置子程序MOVA,#07FH;赋初始值并在发光二极管上显示该数值MOVP3,ALOOP:CALLDELAYCAL
3、LDELAYCALLDELAYCALLDELAYCALLDELAYRLA;A存放器内容右移1位并送发光二极管显示MOVP3,AAJMPLOOP;无限循环DELAY:MOVR5,#0H;延时子程序Dl:MOVR6,#0HDJNZR6,$DJNZR5,D1RET$include(Init_Device.inc);初始设置子程序文件包含伪指令END加快LED循环移位点亮的速度。(删除几个延迟指令!)Sinclude(C8051F020.inc);C8051F02x系列单片机信息头文件包含伪指令LCALLIniJDevice;调用初始设置子程序MOVA,#07FH;赋初始值并在发光二极管上显示该数值M
4、OVP3,ALOOP:CALLDELAYCALLDELAYRRA;A存放器内容右移1位并送发光二极管显示MOVP3,AAJMPLOOP;无限循环DELAY:MOVR5,ttOH;延时子程序Dl:MOVR6,#0HDJNZR6,$DJNZR5,D1RETSinclude(Init_Dcvice.inc);初始设置子程序文件包含伪指令END1-2将例程二O-F的循环显示改为0-9的循环显示。Sinclude(C8051F020.inc)0RG0000HLJMPINITTAB:DBOCOH,0F9H,04H,OBOH,099H,092H,082H,0E8HDB080H,090H,088H,083H,
5、0C6H,OAlH,086H,08EHINIT:LCALLInit_DeviceMOVRI,#OOHMOVA,RlM1N:MOVDPTR,#TAB显示段码MOVCA,+DPTRMOVP5ACALLDELAYCALLDELAYCALLDELAYCALLDELAYCALLDELAYCALLDELAYCALLDELAYCALLDELAYCALLDELAYCALLDELAYINCRlMOV,RlCJNEA,#OAH,MAIN.显示范围(F)SJMPINITDELAY:M0VR5,#0HDl:;段码0-7;段码8-F;操作数据初始值;读取与A中数值对应的;段码送并行口5显示;操作数据(RI)增1;检查操
6、作数据是否大于;无限循环;延时子程序M0VR6,#0HDJNZR6,$DJNZR5,DlRETSinclude(Init_Device.inc)END实验2.中断控制及定时器/计数器操作训练2-1通过对例程5的程序进展修改和上机调试,改变原程序的功能。(1)将KEY2,KEY4的功能对调。(2)每次停下再启动后,更改发光二极管点亮的循环方向。Sinclude(C8051F020.inc);C8051F02x单片机信息头文件包含伪指令ORG1.JMP0000HINITIAL;主程序入口ORGORGORG0013H1.JMP0003H1.JMPOlOOHSTAR;外中断。服务程序入口,开场键(ST
7、AR)STOP;外中断1服务程序入口停顿键(SToP)INITIAL:MOVLCLLInit_Device;调用初始设置子程序MOVP3,#0FFH;熄灭全部发光二极管A,#0FFHMOVDPTR,#7F80HMOVXDPTR,A;去除数码管2(NUM2)显示MOVA,#0FEH;点亮发光二极管的初始数据MOVRl,tlH;发光二极管点亮位置初值MOVIP,#04HMOV;设置INTo(开场键STAR)为高优先级TCON,#05H;外中断采用边沿触发SETBEXl;INT1(停顿键STOP)开中断SETBEA;开放中断LOoP:AMOVP3,A;刷新发光二极管控制数据INCRl;发光二极管点亮
8、位置计数值增1SETBEA;开放中断LCALLDELAYl;延时LCALLDELAYlLOOP: CLREA;关闭中断SJMPSTOP:MOVJNZCLRPOPCLRRETISTAR:CJNERl,#8,LOOP;发光二极管点亮位置计数值有效性检测MOVRl,#011;发光二极管点亮位置计数值等于8那么回01.OOP;无限次循环;停顿键的中断服务程序PUSHACC;保护A存放器内容MOV,Rl;读取发光二极管点亮位置计数值MOVDPTR,#TABMOVCA,A+DPTR;获取发光二极管点亮位置计数值的显示段码DPTR,#7F80HMOVXDPTR,A;发光二极管点亮位置计数值的显示数据送显示S
9、ETBEXl;INTO(启动键STAR)开中断$;等待重新启动条件一A=OMOVA,#0FFHMOVXDPTR,A;去除数码管2(DS2)显示EXl;制止INTO中断(防止程序误动作)ACC;恢复A存放器内容IEO;去除INTl中断标志(防止程序误动作);中断返回;启动键的中断服务程序MOVA,#OOH;设置启动条件一A=OCLRIEl;去除INTO中断标志(防止程序误动作)RETI;中断返回TAB:DBOCOH,0F9H,0A4H,OBOH,099H;04段码DB092H,082H,0E8H,080H;58段码DELAYl:MOVR6,#0;延时子程序Dl:MOVR7,#0DJNZR7,$D
10、JNZR6,D1RET$include(Init_Device.inc);初始设置子程序文件包含伪指令2-2修改例程6,将计数范围由O-F扩展至OO-FF(使用定时器/计时器0),并在2位数码管上用10进制数显示计数结果(00-99)。16进制-10进制方法Hex/10:商=10进制十位,余数=10进制个位Sinclude(C8051F020.inc)DP2EQU07F80HDPlEQU07F90H:增加一个DP_LEQU30HDP_HEQU31HMAIN:LCALLInit_DeviceMOVTMOD,#0000011OB;使计数器工作在模式2MOVA,#0MOVDP_L,:显示计数的低位M
11、OVDP_H,A;显示计数高位CALLDISPLAYMOVTLO,#0使TLO的初值为0SETBTRO9启用定时器0LOOP:MOVA,TLOCJNEA,#100,LlA不等于100时,转到Ll显示MOVTLO,#05当A等于100时,TLO清零MOV,TLOLI:MOVB,#10DTVAB:将16进制数转化为10进制数MOVDP_L,BMOVB,#10DTVABMOVDP_H,B;将B显示为高位CALLDISPLAYSJMPLOOP;循环LOOPDISPLAY:MOVA,DP_LCALLDECODEMOVDPTR,#DPIMOVXDPTR,AMOVA,DPJICALLDECODEMOVDPT
12、R,#DP2MOVXDPTR,AMOVP5,ARETDECODE:MOVDPTR,#TABMOVCA,A+DPTRRETTAB:DBOCOH,0E9H,04H,OBOH,099H,092H,082H,0F8HDB080H,090H,088H,083H,0C6H,OAlH,086H,08EHSinclude(Init_Device.inc)END实验三.串行数据传送操作程序调试练习(1)将发送1,2,3,4的ASC码改为发送A,B,C,D的ASC码$include(C8051F020.inc)NUM2EQU07E80H;NUM2地址NUM3EQU07F90H;NUM3地址NUM4EQU07F0H
13、;NUM4地址NUM5EQU07FB0H;NUM5地址TTM_LEQUOFDH;TC1低字节计数值TIM_HEQUOFDH;T/C1高字节计数值REC_BUFOEQU32H;数据接收缓冲器0RECBUF1EQU33H;数据接收缓冲器1REC_BUF2EQU34H;数据接收缓冲器2FLAGBITOlH;数据发送完成标志ORGOOOOHLJMPMAIN;转主程序ORG0023HLJMPRECE;转串行通信中断程序MAIN:IcallInitDeviceMOV,#0FFHMOVP5,A;去除数码管NUMl的显示MOVDPTR,#NiJM2MOVXDPTR,A;去除数码管NUM2的显示MOVDPTR,
14、#NUM3MOVXDPTR,A;去除数码管NuM3的显示MOVDPTR,#NUM4MOVXDPTR,A;去除数码管NUM4的显示MOVDPTR,#NUM5MOVXDPTR,A;去除数码管NUM5的显示MOVR6,#0;通信操作状态存放器去除MOVSP,#40H;堆栈栈底设置MOVTMOD,Soo100ooob;t/ci方式2MOVTHi,#TnLH;T/C1重装填值MOVTL1,#TIML;T/C1计数值SETBTRl;启动TC1MovscoNO,soio100oob;串口方式SETBES;串口中断允许SETBEA;开中断1.OOP:CALLKEYBOARD;调用案件状态分析子程序CJNEA,
15、#OFFH,LO;按键状态发生变化转LOCLRFLAG;按键状态无变化,去除发送完成标志SJMPLOOP;1.0:JBFLAG,LOOP;数据发送完成,返回主循环MOVR7,;否那么,键值暂存R7MOVA,#043H;CMOVSBUFO,A;发送字符C的ASCII码值CALLDELAY;MOVA,#04FH;0MOVSBUFO,A;发送字符0的ASCII码值CALLDELAY;MOVA,#04DH;MMOVSBUFO,A;发送字符M的ASCII码值CALLDELAY;MOVA,#04BH;KMOVSBUFO,A;发送字符K的ASCII码值CALLDELAY;MOVA,#30H;发送数字0的AS
16、CII码值MOVSBUFo,ACALLDELAY;MOVA,R7;ADDA,#40H;生成键值的ASCII码值MOVSBUFO,A;发送键值的ASCIl码值SETBFLAG;置位发送完成标志SJMPLOOP;中断服务程序RECE:JNBTl,RECl;非发送转接收处理CLR TI;否那么,去除发送中断标志;中断返回RECl: PUSH ACC;保护累加器AMOVA,SBUFO;读接收缓冲器CJNER6,#0,REC2;CJNEA,#43H,REC6;接收状态为0,进展字符C的过滤处理MOVR6,ftl;接收状态改为1SJMPREC6;REC2:CJNER6,ftl,REC3;CJNEA,#4F
17、H,REC5;接收状态为1,进展字符0的过滤处理MOvR6,#2;接收状态改为2SJMPREC6;REC3:CJNER6,#2,REC4;CJNEA,#4DH,REC5;接收状态为2,进展字符M的过滤处理MOVR6,#3;接收状态改为3MOVR5,#3;数据接收计数器设置为3SJMPREC6;REC4:CJNER6,#3,REC6;PUSHCC;接收状态为3,暂存接收的内容MOVA,#REC_BUFOADDA,R5MOVRO,A;生成接收数据存放缓冲器地址POPACC;恢复接收数据至A存放器MOVRO,A;保存接收的数据DECR5;接收数据计数器减1CJNER5,#0,REC6;CALLDIS
18、PLAY;接收数据计数器减为0,进展接收结果的显示REC5:MOVR6,#0;接收状态恢复为O(就绪状态)REC6:POPACC;恢复累加器ACLRRI;去除接收中断标志RETI;中断返回KEYBOARD:MOVA,P2;读按键状态输入端口RRARRARRCA;KEY1有效键值移入位累加器CJCKl;键值无效转KEY2键值的分析MOV,#1;否那么,KEYl代码送存放器SJMPK5Kl:RRCA;KEY2有效键值移入位累加器CJCK2;键值无效转KEY3键值的分析MOVA,#2;否那么,KEY2代码送A存放器SJMPK5K2:RRCA;KEY3有效键值移入位累加器CJCK3;键值无效转KEY4
19、键值的分析MOVA,#3;否那么,KEY3代码送A存放器SJMPK5K3:RRCA;KEY4有效键值移入位累加器CJCK4;键值无效转按键无效处理MOVA,#4;否那么,KEY4代码送A存放器SJMPK5K4:MOVA,#OFFH;按键无效代码送A存放器K5:RETDISPLAY:MOVA,REJBUF1;读取接收的第2字节数据SWAPA;高、低4位交换ANLA,#0FH;别离高4位有效数值CALLDECODE;换码MOVDPTR,#NUM2MOVXDPTR,A;NUM2显示第2字节数据高4位数值MOVA,REJBUF1;读取接收的第2字节数据ANLA,#0FH;提取低4位有效数值CALLDE
20、CODEMOVDPTR,#NUM3MOVXWTR,A;NUM3显示第2字节数据低4位数值MOVA,REC_BUF2;读取接收的第3字节数据SWAPA;高、低4位交换ANL,#0FH;别离高4位有效数值CALLDECODEMOVDPTR,#NUM4MOVXDPTR,A;NUM4显示第3字节数据高4位数值MOVA,REjBUF2;读取接收的第3字节数据NLA,#0FH;提取低4位有效数值CALLDECODEMOVDPTR,#NUM5MOVXDPTR,A;NUM5显示第3字节数据低4位数值RET;换码程序DECODE:DELAY:Dl:TAB:MOVDPTR,#TABMOVCA,A+DPTRRET;
21、延时程序MOVR5,#80HMOVR6,#0HDJNZR6,$DJNZR5,DlRETDBOCOH,0E9H,04H,OBOH,099H,092H,082H,0F8HDB080H,090ll,088II,083H,0C6U,OAlH,086H,08EIISinclude(Init.Device,inc)END(2)将第二字节和第三字节互换位置$include(C8051F020.inc)NUM2EQU07F80H;NUM2地址NUM3EQU07F90H;NUM3地址NUM4EQU07F0H;NUM4地址NUM5EQU07FB0H;NUM5地址TIM_LEQUOFDH;TC1低字节计数值TIMH
22、EQUOFDH;T/C1高字节计数值REC_BUFOEQU32H;数据接收缓冲器0REC_BUF1EQU33H;数据接收缓冲器1REJBUF2EQU34H;数据接收缓冲器2FLAGBITOlH;数据发送完成标志ORGOOOOHLJMPMAIN;转主程序ORG0023HLJMPRECE;转串行通信中断程序MAIN:IcallInit_DeviceMOVA,#0FFHMOVP5,A;去除数码管NUMI的显示MOVDPTR,#NUM2MOVXDPTR,A;去除数码管NUM2的显示MOVDPTR,#NUM3MOVX如PTR,A;去除数码管、UM3的显示MOVDPTR,#NuM4MOVXDPTR,A;去
23、除数码管NUM4的显示MOVXDPTR,A;去除数码管NUM5的显示MOVR6,#0;通信操作状态存放器去除MOVSP,#30H;堆栈栈底设置MOVTMOD,#00100000B;T/C1方式2MOVTHl,#TnLH;T/C1重装填值MOVTL1,#TnLL;T/C1计数值SETBTRl;启动T/C1MOVSCONO,#01010000B;串口方式1SETBES:串口中断允许SETBEA;开中断LOOP:CALLKEYBOARD;调用案件状态分析子程序CJNEA,#OFFH,LO;按键状态发生变化转LOCLRFLAG;按键状态无变化,去除发送完成标志SJMPLOOPL0:JBFLAG,LOO
24、P;数据发送完成,返回主循环MOVR7,A;否那么,键值暂存R7MOVA,#043H;CMOVSBUFO,A;发送字符C的ASCII码值CALLDELAYMOVA,#04FH;0MOVSBUEO,A;发送字符0的ASCII码值CALLDELAY;MOVA,#04DH;MMOVSBUFO,A;发送字符M的ASCII码值CALLDELAY;MOVA,#04BH;KMOVSBUFO,A;发送字符K的ASCII码值CALLDELAY;MOVSBUFO,ACALLDELAY;MOVA,R7;ADDA,#30H;生成键值的ASCII码值MOVSBUFO,A;发送键值的ASCIl码值SETBFLAG;置位发
25、送完成标志SJMPLOOP;中断服务程序RECE:JNBTLREC1;非发送转接收处理CLRTI;否那么,去除发送中断标志RETI;中断返回RECl:PUSHACC;保护累加器AMOVA,SBUFO;读接收缓冲器CJNER6,#0,REC2;CJNEA,#43H,REC6;接收状态为0,进展字符C的过滤处理MOVR6,ttl;接收状态改为1SJMPREC6;REC2:CJNER6,ttl,REC3;CJNE,#4FH,REC5;接收状态为1,进展字符0的过滤处理MoVR6,#2;接收状态改为2SJMPREC6;REC3:CJNER6,#2,REC4;CJNEA,#4DH,REC5;接收状态为2
26、,进展字符M的过滤处理MOVR6,#3;接收状态改为3MOVR5,#3;数据接收计数器设置为3SJMPREC6;REC4:CJNER6,#3,REC6;PUSHACC;接收状态为3,暂存接收的内容MOVA,#REC_BUFOADD,R5MOV RO, A;生成接收数据存放缓冲器地址POPACC;恢复接收数据至A存放器MOVRO,A;保存接收的数据DECR5;接收数据计数器减1CJNER5,#0,REC6;CALLDlSPLAY;接收数据计数器减为0,进展接收结果的显示REC5:MOVR6,#0;接收状态恢复为0(就绪状态)REC6:POPACC;恢复累加器ACLRRI;去除接收中断标志RETI
27、;中断返回KEYBOARD:MOVA,P2;读按键状态输入端口RRARRARRCA;KEY1有效键值移入位累加器CJCKl;键值无效转KEY2键值的分析MOVA,#1;否那么,KEYl代码送A存放器SJMPK5Kl:RRC;KEY2有效键值移入位累加器CJCK2;键值无效转KEY3键值的分析MOVA,#2;否那么,KEY2代码送A存放器SJMPK5K2:RRCA;KEY3有效键值移入位累加器CJCK3;键值无效转KEY4键值的分析MOVA,#3;否那么,KEY3代码送A存放器SJMPK5K3:RRCA;KEY4有效键值移入位累加器CJCK4;键值无效转按键无效处理MOVA,#4;否那么,KEY
28、4代码送A存放器SJMPK5K4:MOVA,#OFFH;按键无效代码送A存放器K5:RETDISPLAY:MOVA,REC_BUF1;读取接收的第2字节数据SWAPA;高、低4位交换ANLA,#0FH;别离高4位有效数值CALLDECODE;换码MOVDPTR,#NUM4MOVXDPTR,A;NUM2显示第2字节数据高4位数值MOVA,RECJUF1;读取接收的第2字节数据ANL,#0FH;提取低4位有效数值CALLDECODE;换码MOVDPTR,#NUM5MOVXDPTR,A;NUM3显示第2字节数据低4位数值MOVA,REC_BUF2;读取接收的第3字节数据SWAP;高、低4位交换ANL
29、A,#0FH;别离高4位有效数值CALLDECODE;换码MOVDPTR,#NUM2MOVXDPTR,A;NUM4显示第3字节数据高4位数值MOVA,REJBUF2;读取接收的第3字节数据ANLA,#0FH;提取低4位有效数值CALLDECODE;换码MOVDPTR,#NUM3MOVXDPTR,A;NUM5显示第3字节数据低4位数值RET;换码程序DECODE:MOVDPTR,#TABMOVCA,A+DPTRRET;延时程序DELAY:MOVR5,#8011Dl:MOVR6,ttOHDJNZR6,$DJNZR5,DlRETTAB:DBOCOH,OF9H,0A4H,OBOH,099H,092H,082H,0F8HDB080H,090H,088H,083H,0C6H,O1H,086H,08EHSinclude(Init_Device.inc)END