北京工业大学8051单片机实验报告.docx

上传人:b****8 文档编号:10542683 上传时间:2023-02-21 格式:DOCX 页数:21 大小:22.20KB
下载 相关 举报
北京工业大学8051单片机实验报告.docx_第1页
第1页 / 共21页
北京工业大学8051单片机实验报告.docx_第2页
第2页 / 共21页
北京工业大学8051单片机实验报告.docx_第3页
第3页 / 共21页
北京工业大学8051单片机实验报告.docx_第4页
第4页 / 共21页
北京工业大学8051单片机实验报告.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

北京工业大学8051单片机实验报告.docx

《北京工业大学8051单片机实验报告.docx》由会员分享,可在线阅读,更多相关《北京工业大学8051单片机实验报告.docx(21页珍藏版)》请在冰豆网上搜索。

北京工业大学8051单片机实验报告.docx

北京工业大学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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 法学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1