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

上传人:b****4 文档编号:4884505 上传时间:2022-12-11 格式:DOCX 页数:24 大小:26.70KB
下载 相关 举报
北工大8051单片机实验报告.docx_第1页
第1页 / 共24页
北工大8051单片机实验报告.docx_第2页
第2页 / 共24页
北工大8051单片机实验报告.docx_第3页
第3页 / 共24页
北工大8051单片机实验报告.docx_第4页
第4页 / 共24页
北工大8051单片机实验报告.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

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

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

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

北工大8051单片机实验报告

北京工业大学

8051单片机实验

实验报告

学号:

********

******

*******

2017年10月

目录可以使用Word的目录自动生成功能生成。

引用->目录(或者更新目录),使用缺省三级即可。

第一单元单片机程序调试环境使用及并行数据传送操作训练

1.1修改例程一的源程序:

(1)将A寄存器的初值改为80H(正逻辑,数据位为1表示发光二极管点亮),再对源程序进行简单修改,使程序运行后发光二极管点亮情况与修改前相同。

(2)将LED向左循环移位点亮改为向右循环移位点亮。

(3)加快LED循环移位点亮速度。

1.2将例程二0-F的循环显示改为0-9的循环显示

1.3实验过程

修改部分用粗体显示

1.1

(1)修改后的源程序:

$include(C8051F020.inc);C8051F02x系列单片机信息头文件包含伪指令  

LCALL  Init_Device        ;调用初始设置子程序         

MOV   A,#080H     ;赋初始值并在发光二极管上显示该数值   

CPL A ;将A内容按逻辑取反

     MOV   P3,A 

LOOP:

CALLDELAY

CALLDELAY

CALLDELAY

CALLDELAY

CALLDELAY

CALLDELAY

CALLDELAY

     RR   A    ;A寄存器内容右移1位并送发光二极管显示

MOV   P3,A 

     AJMP  LOOP          ;无限循环

DELAY:

  MOV   R5,#0H  ;延时子程序D1:

   MOV   R6,#0H      

  DJNZ  R6,$     

   DJNZ  R5,D1    

   RET 

$include (Init_Device.inc) ;初始设置子程序文件包含伪指令        

 END 

(2)修改后的源程序:

$include(C8051F020.inc);C8051F02x系列单片机信息头文件包含伪指令  

LCALL  Init_Device        ;调用初始设置子程序         

MOV   A,#07FH     ;赋初始值并在发光二极管上显示该数值   

     MOV   P3,A 

LOOP:

CALLDELAY

CALLDELAY

CALLDELAY

CALLDELAY

CALLDELAY

CALLDELAY

CALLDELAY

     RL   A    ;A寄存器内容左移1位并送发光二极管显示

MOV   P3,A 

     AJMP  LOOP          ;无限循环

DELAY:

  MOV   R5,#0H  ;延时子程序D1:

   MOV   R6,#0H      

  DJNZ  R6,$     

   DJNZ  R5,D1    

   RET 

$include (Init_Device.inc) ;初始设置子程序文件包含伪指令        

 END 

(3)修改后的源程序:

$include(C8051F020.inc);C8051F02x系列单片机信息头文件包含伪指令  

LCALL  Init_Device        ;调用初始设置子程序         

MOV   A,#07FH     ;赋初始值并在发光二极管上显示该数值   

     MOV   P3,A 

LOOP:

CALLDELAY

CALLDELAY;删除部分延时指令

     RR   A    ;A寄存器内容右移1位并送发光二极管显示

MOV   P3,A 

     AJMP  LOOP          ;无限循环

DELAY:

  MOV   R5,#0H  ;延时子程序D1:

   MOV   R6,#0H      

  DJNZ  R6,$     

   DJNZ  R5,D1    

   RET 

$include (Init_Device.inc) ;初始设置子程序文件包含伪指令        

 END 

1.2修改后的源程序:

$include    (C8051F020.inc) ;C8051F02x系列单片机信息头文件包含伪指令

ORG  0000H

LJMP     INIT 

TAB:

 

DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H ;段码0-7

DB 080H,090H,088H,083H,0C6H,0A1H,086H,08EH ; 段码8-F 

INIT:

    LCALL  Init_Device ;调试初始设置子程序

INIT1:

MOV     R1,#00H ;操作数据初始值 

MOV     A,R1  

MAIN:

   MOV DPTR,#TAB ;读取与A中数值对应的显示段码 

MOVC   A,@A+DPTR 

MOV    P5,A ;段码送并行口5显示 

CALL   DELAY 

CALL   DELAY 

CALL   DELAY 

CALL   DELAY 

CALL   DELAY 

CALL  DELAY 

CALL   DELAY 

CALL   DELAY 

CALL   DELAY 

CALL   DELAY 

INC  R1   ;操作数据(R1)增1 

MOV A,R1 

CJNE A,#0AH,MAIN ;检查操作数据是否大于显示范围(9) 

SJMP    INIT ;无限循环   

DELAY:

   MOV R5,#0H ;延时子程序 

D1:

     MOV R6,#0H 

DJNZ   R6,$ 

DJNZ  R5,D1 

RET 

$include   (Init_Device.inc)   ;初始设置子程序文件包含伪指令 

END 

1.4实验总结与心得体会

第一次上机实验,比较简单,程序段也很短比较容易读懂。

第一题的第一问,原程序位07FH,即01111111,修改后为80H,即10000000,显然是由各位取反可以得到,因此在初值修改后加了一句CPLA对A地址数据取反就解决问题了;第二问,原程序为左循环灯,在RR为右移显示,因此改为RL左移显示,走马灯就可以右移循环了;第三问,DELAY延时程序控制走马灯循环速度,故删除部分延时程序即可。

第二题,在检查操作数是否超过范围时,原程序范围控制在0-F,10H为0FH进位后结果,所以0-9时应为0AH。

第一次实验都是在考察对语句的理解,平时多读一些程序比较快的做出来。

第二单元中断控制及定时器/计数器操作训练

2

3

3.1通过对例程5法人程序进行修改和上机调试,改变原程序的功能。

(1)将KEY2、KEY4的功能对调。

(2)每次停下再启动以后,更改发光二极管点亮的循环方向。

3.2修改例程6,将计数范围由0-F扩展至00-FF(使用定时器/计时器0),并在2位数码管上用10进制数显示计数结果(00-99)。

16进制→10进制方法

Hex/10:

商=10进制十位,余数=10进制个位

3.3实验步骤

修改部分用粗体显示

2.1

(1)修改后的源程序:

$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为高优先级

MOVTCON,#05H;外中断采用边沿触发

SETBEX0;INT0开中断

SETBEA;开放中断

LOOP:

CLREA;关闭中断

RLA

MOVP3,A;刷新发光二极管控制数据

INCR1;发光二极管点亮位置计数值增1

SETBEA;开放中断

LCALLDELAY1;延时

LCALLDELAY1

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;INT1开中断

JNZ$;等待重新启动条件--A=0

MOVA,#0FFH

MOVX@DPTR,A;清除数码管2(NUM2)显示

CLREX1;禁止INT1中断(避免程序误动作)

POPACC;恢复A寄存器内容

CLRIE0;清除INT0中断标志(避免程序误动作)

RETI;中断返回

;启动键的中断服务程序

STAR:

MOVA,#00H;设置启动条件--A=0

CLRIE1;清除INT1中断标志(避免程序误动作)

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);初始设置子程序文件包含伪指令

END

(2)修改后的源程序:

$include(C8051F020.inc);C8051F02x系列单片机信息头文件包含伪指令

ORG0000H

LJMPINITIAL;主程序入口

ORG0003H

LJMPSTAR;外中断0服务程序入口,开始键(STAR)

ORG0013H

LJMPSTOP;外中断1服务程序入口停止键(STOP)

ORG0100H

INITIAL:

LCALLInit_Device;调用初始设置子程序

MOVP3,#0FFH;熄灭全部发光二极管

MOVA,#0FFH

MOVDPTR,#7F80H

MOVX@DPTR,A;清除数码管2(NUM2)显示

MOVA,#0FEH;点亮发光二极管的初始数据

MOVR1,#1H;发光二极管点亮位置初值

MOVR4,#0F0H;转换标志

MOVIP,#01H;设置INT0(开始键STAR)为高优先级

MOVTCON,#05H;外中断采用边沿触发

SETBEX1;INT1(停止键STOP)开中断

SETBEA;开放中断

LOOP:

CLREA;关闭中断

CJNER4,#0F0H,LOOP1;判断是否转向

RLA

CJNER4,#0F0H,LOOP1;判断是否转向

MOVP3,A;刷新发光二极管控制数据

CJNER4,#0F0H,LOOP1;判断是否转向

INCR1;发光二极管点亮位置计数值增1

CJNER4,#0F0H,LOOP1;判断是否转向

SETBEA;开放中断

LCALLDELAY1;延时

LCALLDELAY1

LCALLDELAY1

LCALLDELAY1

CJNER1,#8,LOOP;发光二极管点亮位置计;数值有效性检测

MOVR1,#0H;发光二极管点亮位置计数值等于8则回0

SJMPLOOP;无限次循环

LOOP1:

CLREA;关闭中断

CJNER4,#0FH,LOOP;判断是否转向

RRA

CJNER4,#0FH,LOOP;判断是否转向

MOVP3,A;刷新发光二极管控制数据减

CJNER4,#0FH,LOOP;判断是否转向

DECR1;发光二极管点亮位置计数值1

CJNER4,#0FH,LOOP;判断是否转向

SETBEA;开放中断

LCALLDELAY1;延时

LCALLDELAY1

LCALLDELAY1

LCALLDELAY1

CJNER1,#0,LOOP;发光二极管点亮位置计数值有效性检测

MOVR1,#8H;发光二极管点亮位置计数值等于0则回8

SJMPLOOP

;停止键的中断服务程序

STOP:

PUSHACC;保护A寄存器内容

MOVA,R1;读取发光二极管点亮位置计数值

MOVDPTR,#TAB

MOVCA,@A+DPTR;获取发光二极管点亮位置计数值的显示段码

MOVDPTR,#7F80H

MOVX@DPTR,A;发光二极管点亮位置计数值的显示数据送显示

SETBEX0;INT0(启动键STAR)开中断

JNZ$;等待重新启动条件--A=0

MOVA,#0FFH

MOVX@DPTR,A;清除数码管2(NUM2)显示

CLREX0;禁止INT0中断(避免程序误动作)

POPACC;恢复A寄存器内容

CLRIE1;清除INT1(停止键STOP)中断标志(避免程序误动作)

RETI;中断返回

;启动键的中断服务程序

STAR:

MOVA,#00H;设置启动条件--A=0

PUSHACC

MOVA,R4

CPLA

MOVR4,A

POPACC

CLRIE0;清除INT0(启动键STOP)中断标志(避免程序误动作)

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);初始设置子程序文件包含伪指令

END

2.2修改后的源程序

$include(C8051F020.inc);C8051F02x系列单片机信息头文件包含伪指令

DP2EQU07F80H

DP1    EQU  07F90H  ;增加一个 

DP_LEQU30H;低位数值暂存器

DP_HEQU31H;高位数值暂存器

MAIN:

LCALLInit_Device;调用初始设置子程序

MOVTMOD,#00000110B;C/T0工作于方式2

MOVA,#0;显示初值为0

MOVDP_L,A

MOVDP_H,A

CALLDISPLAY;调用显示子程序显示初值0

MOVTL0,#0;C/T0置初值0

SETBTR0;启动计数器0

LOOP:

MOVA,TL0;读计数器0的计数值

CJNEA,#10H,L1;如果A中不为16转L1

MOVTL0,#0;计数器0清0

MOVA,TL0

L1:

MOVB,#0AH;在NUM2显示计数器0的计数值

DIVAB

MOVDP_L,B

MOVDP_H,A

CALLDISPLAY;调用显示子程序显示计数值

SJMPLOOP;无限次循环

;显示子程序

DISPLAY:

MOVA,DP_L;读低位显示值

CALLDECODE;调用换码子程序

MOVDPTR,#DP2;显示段码送NUM2

MOVX@DPTR,A

MOVA,DP_H;读高位显示值

CALLDECODE;调用换码子程序

MOVP5,A;显示段码送NUM1

RET

;换码子程序

DECODE:

MOVDPTR,#TAB

MOVCA,@A+DPTR

RET

TAB:

DB0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H;显示段码0-7

DB080H,090H,088H,083H,0C6H,0A1H,086H,08EH;显示段码8-F

$include(Init_Device.inc);初始设置子程序文件包含伪指令

END

3.4实验总结与心得体会

相比第一次实验,这次的程序相对长了一些,而且比较难懂。

有不少要上网找一些答案才能做出来。

第一题第一问,将两个键位对调,实际上是将INT0和INT1功能对调,因此主要在各中断控制的代码上进行修改;第二问,每次将循环顺序改变,意味着每次停下后要改变一次循环顺序,因此添加了一个比较和反向循环的程序段,就解决了。

第二题,第一个难点是将一位显示改为两位显示,意味着要添加一个数码管显示;第二个难点是16进制改为10进制,在指导书上有提示用DIV字码操作,具体要看课本上具体的使用方法。

第三单元串行数据传送操作训练

4

4.1通过对例程8的程序进行修改和上机调试,改变原程序的功能。

(1)将发送1、2、3、4的ASCⅡ码改为发送A、B、C、D的ASCⅡ码。

(2)将接收的第2、第3字节数据的显示位置交换。

4.2实验步骤

修改部分用粗体显示

3.1

(1)修改后的源程序:

$include(C8051F020.inc);C8051F02x系列单片机信息头文件包含伪指令

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;C8051F02x系列单片机信息头文件包含伪指令

MOVA,#0FFH

MOVP5,A

MOVDPTR,#NUM2

MOVX@DPTR,A;清除数码管NUM1的显示

MOVDPTR,#NUM3

MOVX@DPTR,A;清除数码管NUM2的显示

MOVDPTR,#NUM4

MOVX@DPTR,A;清除数码管NUM3的显示

MOVDPTR,#NUM5

MOVX@DPTR,A;清除数码管NUM4的显示

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;串口中断

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

当前位置:首页 > 求职职场 > 简历

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

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