北京工业大学8051单片机实验报告.docx
《北京工业大学8051单片机实验报告.docx》由会员分享,可在线阅读,更多相关《北京工业大学8051单片机实验报告.docx(21页珍藏版)》请在冰豆网上搜索。
北京工业大学8051单片机实验报告
8051单片机实验报告
专业:
电子科学与技术
姓名:
学号:
120231
指导教师:
金冬月
第一单元单片机程序调试环境使用及并行数据传送操作训练
1-1修改例程一的源程序:
将A寄存器的初值改为80H(正逻辑,数据位为1表示发光二极管点亮),再对源程序进行简单修改,使程序运行后发光二极管点亮情况与修改前相同。
$include(C8051F020.inc);C8051F02x系列单片机信息头文件包含伪指令
LCALLInit_Device;调用初始设置子程序
MOVA,#080H;赋初始值并在发光二极管上显示该数值
CPLA
MOVP3,A
LOOP:
CALLDELAY
CALLDELAY
CALLDELAY
CALLDELAY
CALLDELAY
RRA;A寄存器内容右移1位并送发光二极管显示
MOVP3,A
AJMPLOOP;无限循环
DELAY:
MOVR5,#0H;延时子程序
D1:
MOVR6,#0H
DJNZR6,$
DJNZR5,D1
RET
$include(Init_Device.inc);初始设置子程序文件包含伪指令
END
将LED向左循环移位点亮改为向右循环移位点亮。
$include(C8051F020.inc);C8051F02x系列单片机信息头文件包含伪指令
LCALLInit_Device;调用初始设置子程序
MOVA,#07FH;赋初始值并在发光二极管上显示该数值
MOVP3,A
LOOP:
CALLDELAY
CALLDELAY
CALLDELAY
CALLDELAY
CALLDELAY
RLA;A寄存器内容右移1位并送发光二极管显示
MOVP3,A
AJMPLOOP;无限循环
DELAY:
MOVR5,#0H;延时子程序
D1:
MOVR6,#0H
DJNZR6,$
DJNZR5,D1
RET
$include(Init_Device.inc);初始设置子程序文件包含伪指令
END
加快LED循环移位点亮的速度。
(删除几个延迟指令!
)
$include(C8051F020.inc);C8051F02x系列单片机信息头文件包含伪指令
LCALLInit_Device;调用初始设置子程序
MOVA,#07FH;赋初始值并在发光二极管上显示该数值
MOVP3,A
LOOP:
CALLDELAY
CALLDELAY
RRA;A寄存器内容右移1位并送发光二极管显示
MOVP3,A
AJMPLOOP;无限循环
DELAY:
MOVR5,#0H;延时子程序
D1:
MOVR6,#0H
DJNZR6,$
DJNZR5,D1
RET
$include(Init_Device.inc);初始设置子程序文件包含伪指令
END
1-2将例程二0-F的循环显示改为0-9的循环显示。
$include(C8051F020.inc)
ORG0000H
LJMPINIT
TAB:
DB0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H;段码0-7
DB080H,090H,088H,083H,0C6H,0A1H,086H,08EH;段码8-F
INIT:
LCALLInit_Device
MOVR1,#00H;操作数据初始值
MOVA,R1
MAIN:
MOVDPTR,#TAB;读取与A中数值对应的显示段码
MOVCA,@A+DPTR
MOVP5A;段码送并行口5显示
CALLDELAY
CALLDELAY
CALLDELAY
CALLDELAY
CALLDELAY
CALLDELAY
CALLDELAY
CALLDELAY
CALLDELAY
CALLDELAY
INCR1;操作数据(R1)增1
MOVA,R1
CJNEA,#0AH,MAIN.;检查操作数据是否大于显示范围(F)
SJMPINIT;无限循环
DELAY:
MOVR5,#0H;延时子程序
D1:
MOVR6,#0H
DJNZR6,$
DJNZR5,D1
RET
$include(Init_Device.inc)
END
实验2.中断控制及定时器/计数器操作训练
2-1通过对例程5的程序进行修改和上机调试,改变原程序的功能。
(1)将KEY2,KEY4的功能对调。
(2)每次停下再启动后,更改发光二极管点亮的循环方向。
$include(C8051F020.inc);C8051F02x单片机信息头文件包含伪指令
ORG0000H
LJMPINITIAL;主程序入口
ORG0013H
LJMPSTAR;外中断0服务程序入口,开始键(STAR)
ORG0003H
LJMPSTOP;外中断1服务程序入口停止键(STOP)
ORG0100H
INITIAL:
LCALLInit_Device;调用初始设置子程序
MOVP3,#0FFH;熄灭全部发光二极管
MOVA,#0FFH
MOVDPTR,#7F80H
MOVX@DPTR,A;清除数码管2(NUM2)显示
MOVA,#0FEH;点亮发光二极管的初始数据
MOVR1,#1H;发光二极管点亮位置初值
MOVIP,#04H;设置INT0(开始键STAR)为高优先级
MOVTCON,#05H;外中断采用边沿触发
SETBEX1;INT1(停止键STOP)开中断
SETBEA;开放中断LOOP:
LOOP:
CLREA;关闭中断
RLA
MOVP3,A;刷新发光二极管控制数据
INCR1;发光二极管点亮位置计数值增1
SETBEA;开放中断
LCALLDELAY1;延时
LCALLDELAY1
CJNER1,#8,LOOP;发光二极管点亮位置计数值有效性检测
MOVR1,#0H;发光二极管点亮位置计数值等于8则回0
SJMPLOOP;无限次循环
;停止键的中断服务程序
STOP:
PUSHACC;保护A寄存器内容
MOVA,R1;读取发光二极管点亮位置计数值
MOVDPTR,#TAB
MOVCA,@A+DPTR;获取发光二极管点亮位置计数值的显示段码
MOVDPTR,#7F80H
MOVX@DPTR,A;发光二极管点亮位置计数值的显示数据送显示
SETBEX1;INT0(启动键STAR)开中断
JNZ$;等待重新启动条件--A=0
MOVA,#0FFH
MOVX@DPTR,A;清除数码管2(DS2)显示
CLREX1;禁止INT0中断(避免程序误动作)
POPACC;恢复A寄存器内容
CLRIE0;清除INT1中断标志(避免程序误动作)
RETI;中断返回
;启动键的中断服务程序
STAR:
MOVA,#00H;设置启动条件--A=0
CLRIE1;清除INT0中断标志(避免程序误动作)
RETI;中断返回
TAB:
DB0C0H,0F9H,0A4H,0B0H,099H;0--4段码
DB092H,082H,0F8H,080H;5--8段码
DELAY1:
MOVR6,#0;延时子程序
D1:
MOVR7,#0
DJNZR7,$
DJNZR6,D1
RET
$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)
DP2EQU07F80H
DP1EQU07F90H;增加一个
DP_LEQU30H
DP_HEQU31H
MAIN:
LCALLInit_Device
MOVTMOD,#00000110B;使计数器工作在模式2
MOVA,#0
MOVDP_L,A;显示计数的低位
MOVDP_H,A;显示计数高位
CALLDISPLAY
MOVTL0,#0;使TL0的初值为0
SETBTR0;启用定时器0
LOOP:
MOVA,TL0
CJNEA,#100,L1;A不等于100时,转到L1显示
MOVTL0,#0;当A等于100时,TL0清零
MOVA,TL0
L1:
MOVB,#10
DIVAB;将16进制数转化为10进制数
MOVDP_L,B
MOVB,#10
DIVAB
MOVDP_H,B;将B显示为高位
CALLDISPLAY
SJMPLOOP;循环LOOP
DISPLAY:
MOVA,DP_L
CALLDECODE
MOVDPTR,#DP1
MOVX@DPTR,A
MOVA,DP_H
CALLDECODE
MOVDPTR,#DP2
MOVX@DPTR,A
MOVP5,A
RET
DECODE:
MOVDPTR,#TAB
MOVCA,@A+DPTR
RET
TAB:
DB0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H
DB080H,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;数据接收缓冲器0
REC_BUF1EQU33H;数据接收缓冲器1
REC_BUF2EQU34H;数据接收缓冲器2
FLAGBIT01H;数据发送完成标志
ORG0000H
LJMPMAIN;转主程序
ORG0023H
LJMPRECE;转串行通信中断程序
MAIN:
lcallInit_Device
MOVA,#0FFH
MOVP5,A;清除数码管NUM1的显示
MOVDPTR,#NUM2
MOVX@DPTR,A;清除数码管NUM2的显示
MOVDPTR,#NUM3
MOVX@DPTR,A;清除数码管NUM3的显示
MOVDPTR,#NUM4
MOVX@DPTR,A;清除数码管NUM4的显示
MOVDPTR,#NUM5
MOVX@DPTR,A;清除数码管NUM5的显示
MOVR6,#0;通信操作状态寄存器清除
MOVSP,#40H;堆栈栈底设置
MOVTMOD,#00100000B;T/C1方式2
MOVTH1,#TIM_H;T/C1重装填值
MOVTL1,#TIM_L;T/C1计数值
SETBTR1;启动T/C1
MOVSCON0,#01010000B;串口方式1
SETBES;串口中断允许
SETBEA;开中断
LOOP:
CALLKEYBOARD;调用案件状态分析子程序
CJNEA,#0FFH,L0;按键状态发生变化转L0
CLRFLAG;按键状态无变化,清除发送完成标志
SJMPLOOP;
L0:
JBFLAG,LOOP;数据发送完成,返回主循环
MOVR7,A;否则,键值暂存R7
MOVA,#043H;C
MOVSBUF0,A;发送字符C的ASCII码值
CALLDELAY;
MOVA,#04FH;O
MOVSBUF0,A;发送字符O的ASCII码值
CALLDELAY;
MOVA,#04DH;M
MOVSBUF0,A;发送字符M的ASCII码值
CALLDELAY;
MOVA,#04BH;K
MOVSBUF0,A;发送字符K的ASCII码值
CALLDELAY;
MOVA,#30H;发送数字0的ASCII码值
MOVSBUF0,A
CALLDELAY;
MOVA,R7;
ADDA,#40H;生成键值的ASCII码值
MOVSBUF0,A;发送键值的ASCII码值
SETBFLAG;置位发送完成标志
SJMPLOOP;中断服务程序
RECE:
JNBTI,REC1;非发送转接收处理
CLRTI;否则,清除发送中断标志
RETI;中断返回
REC1:
PUSHACC;保护累加器A
MOVA,SBUF0;读接收缓冲器
CJNER6,#0,REC2;
CJNEA,#43H,REC6;接收状态为0,进行字符C的过滤处理
MOVR6,#1;接收状态改为1
SJMPREC6;
REC2:
CJNER6,#1,REC3;
CJNEA,#4FH,REC5;接收状态为1,进行字符O的过滤处理
MOVR6,#2;接收状态改为2
SJMPREC6;
REC3:
CJNER6,#2,REC4;
CJNEA,#4DH,REC5;接收状态为2,进行字符M的过滤处理
MOVR6,#3;接收状态改为3
MOVR5,#3;数据接收计数器设置为3
SJMPREC6;
REC4:
CJNER6,#3,REC6;
PUSHACC;接收状态为3,暂存接收的内容
MOVA,#REC_BUF0
ADDA,R5
MOVR0,A;生成接收数据存放缓冲器地址
POPACC;恢复接收数据至A寄存器
MOV@R0,A;保存接收的数据
DECR5;接收数据计数器减1
CJNER5,#0,REC6;
CALLDISPLAY;接收数据计数器减为0,进行接收结果的显示
REC5:
MOVR6,#0;接收状态恢复为0(就绪状态)
REC6:
POPACC;恢复累加器A
CLRRI;清除接收中断标志
RETI;中断返回
KEYBOARD:
MOVA,P2;读按键状态输入端口
RRA
RRA
RRCA;KEY1有效键值移入位累加器C
JCK1;键值无效转KEY2键值的分析
MOVA,#1;否则,KEY1代码送A寄存器
SJMPK5
K1:
RRCA;KEY2有效键值移入位累加器C
JCK2;键值无效转KEY3键值的分析
MOVA,#2;否则,KEY2代码送A寄存器
SJMPK5
K2:
RRCA;KEY3有效键值移入位累加器C
JCK3;键值无效转KEY4键值的分析
MOVA,#3;否则,KEY3代码送A寄存器
SJMPK5
K3:
RRCA;KEY4有效键值移入位累加器C
JCK4;键值无效转按键无效处理
MOVA,#4;否则,KEY4代码送A寄存器
SJMPK5
K4:
MOVA,#0FFH;按键无效代码送A寄存器
K5:
RET
DISPLAY:
MOVA,REC_BUF1;读取接收的第2字节数据
SWAPA;高、低4位交换
ANLA,#0FH;分离高4位有效数值
CALLDECODE;换码
MOVDPTR,#NUM2
MOVX@DPTR,A;NUM2显示第2字节数据高4位数值
MOVA,REC_BUF1;读取接收的第2字节数据
ANLA,#0FH;提取低4位有效数值
CALLDECODE;换码
MOVDPTR,#NUM3
MOVX@DPTR,A;NUM3显示第2字节数据低4位数值
MOVA,REC_BUF2;读取接收的第3字节数据
SWAPA;高、低4位交换
ANLA,#0FH;分离高4位有效数值
CALLDECODE;换码
MOVDPTR,#NUM4
MOVX@DPTR,A;NUM4显示第3字节数据高4位数值
MOVA,REC_BUF2;读取接收的第3字节数据
ANLA,#0FH;提取低4位有效数值
CALLDECODE;换码
MOVDPTR,#NUM5
MOVX@DPTR,A;NUM5显示第3字节数据低4位数值
RET
;换码程序
DECODE:
MOVDPTR,#TAB
MOVCA,@A+DPTR
RET;延时程序
DELAY:
MOVR5,#80H
D1:
MOVR6,#0H
DJNZR6,$
DJNZR5,D1
RET
TAB:
DB0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H
DB080H,090H,088H,083H,0C6H,0A1H,086H,08EH
$include(Init_Device.inc)
END
(2)将第二字节和第三字节互换位置
$include(C8051F020.inc)
NUM2EQU07F80H;NUM2地址
NUM3EQU07F90H;NUM3地址
NUM4EQU07FA0H;NUM4地址
NUM5EQU07FB0H;NUM5地址
TIM_LEQU0FDH;T/C1低字节计数值
TIM_HEQU0FDH;T/C1高字节计数值
REC_BUF0EQU32H;数据接收缓冲器0
REC_BUF1EQU33H;数据接收缓冲器1
REC_BUF2EQU34H;数据接收缓冲器2
FLAGBIT01H;数据发送完成标志
ORG0000H
LJMPMAIN;转主程序
ORG0023H
LJMPRECE;转串行通信中断程序
MAIN:
lcallInit_Device
MOVA,#0FFH
MOVP5,A;清除数码管NUM1的显示
MOVDPTR,#NUM2
MOVX@DPTR,A;清除数码管NUM2的显示
MOVDPTR,#NUM3
MOVX@DPTR,A;清除数码管NUM3的显示
MOVDPTR,#NUM4
MOVX@DPTR,A;清除数码管NUM4的显示
MOVDPTR,#NUM5
MOVX@DPTR,A;清除数码管NUM5的显示
MOVR6,#0;通信操作状态寄存器清除
MOVSP,#30H;堆栈栈底设置
MOVTMOD,#00100000B;T/C1方式2
MOVTH1,#TIM_H;T/C1重装填值
MOVTL1,#TIM_L;T/C1计数值
SETBTR1;启动T/C1
MOVSCON0,#01010000B;串口方式1
SETBES;串口中断允许
SETBEA;开中断
LOOP:
CALLKEYBOARD;调用案件状态分析子程序
CJNEA,#0FFH,L0;按键状态发生变化转L0
CLRFLAG;按键状态无变化,清除发送完成标志
SJMPLOOP;
L0:
JBFLAG,LOOP;数据发送完成,返回主循环
MOVR7,A;否则,键值暂存R7
MOVA,#043H;C
MOVSBUF0,A;发送字符C的ASCII码值
CALLDELAY;
MOVA,#04FH;O
MOVSBUF0,A;发送字符O的ASCII码值
CALLDELAY;
MOVA,#04DH;M
MOVSBUF0,A;发送字符M的ASCII码值
CALLDELAY;
MOVA,#04BH;K
MOVSBUF0,A;发送字符K的ASCII码值
CALLDELAY;
MOVA,#30H;发送数字0的ASCII码值
MOVSBUF0,A
CALLDELAY;
MOVA,R7;
ADDA,#30H;生成键值的ASCII码值
MOVSBUF0,A;发送键值的ASCII码值
SETBFLAG;置位发送完成标志
SJMPLOOP;中断服务程序
RECE:
JNBTI,REC1;非发送转接收处理
CLRTI;否则,清除发送中断标志
RETI;中断返回
REC1:
PUSHACC;保护累加器A
MOVA,SBUF0;读接收缓冲器
CJNER6,#0,REC2;
CJNEA,#43H,REC6;接收状态为0,进行字符C的过滤处理
MOV