8051单片机实验报告
1
目录
第一单元 单片机程序调试环境使用及并行数据传送操作训练 .................................. 3
1-1修改例程一的源程序: ............................................................................ 3
(1)将A寄存器的初值改为80H(正逻辑,数据位为1表示发光二极管点亮),再对源程序进行简单修改,使程序运行后发光二极管点亮情况与修改前相同。
............................................................................................................ 3
(2)将LED向左循环移位点亮改为向右循环移位点亮 .............................. 3
(3)加快LED循环移位点亮的速度。 ..................................................... 4
1-2将例程二0-F的循环显示改为0-9的循环显示。 ............................................... 5
第二单元 中断控制及定时器/计数器操作训练 ........................................................ 6
2-1通过对例程5的程序进行修改和上机调试,改变原程序的功能。 ................. 6
(1)将KEY2,KEY4的功能对调。 ......................................................... 6
(2)每次停下再启动后,更改发光二极管点亮的循环方向。 ..................... 7
2-2修改例程6, .......................................................................................... 9
第三单元 串行数据传送操作程序调试练习 .......................................................... 11
3-1通过对例程8的程序进行修改和上几条是,改变原程序的功能 .................. 11
(1)将发送1,2,3,4的ASC码改为发送A,B,C,D的ASC码 .......................... 11
(2)将第二字节和第三字节互换位置........................................................ 16
2
第一单元 单片机程序调试环境使用及并行数据传送操作训练 1-1修改例程一的源程序:
(1)将A寄存器的初值改为80H(正逻辑,数据位为1表示发光二极管点亮),再对源程序进行简单修改,使程序运行后发光二极管点亮情况与修改前相同。
$include (C8051F020.inc) ;C8051F02x系列单片机信息头文件包含
伪指令
LCALL Init_Device ;调用初始设置子程序
MOV A,#080H ;赋初始值并在发光二极管上显示该数值
DEC A
MOV P3,A
LOOP: CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
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)将LED向左循环移位点亮改为向右循环移位点亮。
$include (C8051F020.inc) ;C8051F02x系列单片机信息头文件包含
伪指令
LCALL Init_Device ;调用初始设置子程序
MOV A,#07FH ;赋初始值并在发光二极管上显示该数值
MOV P3,A
3
LOOP: CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY CALL DELAY
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)加快LED循环移位点亮的速度。
删除几个延迟指令
$include (C8051F020.inc) ;C8051F02x
含伪指令
LCALL Init_Device ;
MOV A,#07FH ;
MOV P3,A
LOOP: CALL DELAY
CALL DELAY
RR A ;A
显示
MOV P3,A
AJMP LOOP ;
DELAY: MOV R5,#0H ;
D1: MOV R6,#0H
DJNZ R6,$
DJNZ R5,D1
RET
$include (Init_Device.inc)
END
4 初始设置子程序文件包含伪指令 系列单片机信息头文件包调用初始设置子程序 赋初始值并在发光二极管上显示该数值 寄存器内容右移1位并送发光二极管无限循环 延时子程序 初始设置子程序文件包含伪指令 ;( ;
1-2将例程二0-F的循环显示改为0-9的循环显示。
$include (C8051F020.inc) ORG 0000H LJMP INIT TAB:
DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H DB 080H,090H,088H,083H,0C6H,0A1H,086H,08EH INIT: LCALL Init_Device MOV R1,#00H MOV A,R1 MAIN: MOV DPTR,#TAB 显示段码 MOVC A,@A+DPTR MOV P5A CALL DELAY CALL DELAY CALL DELAY CALL DELAY CALL DELAY CALL DELAY CALL DELAY CALL DELAY CALL DELAY
5
段码0-7 段码8-F
操作数据初始值 读取与A中数值对应的
段码送并行口5显示
; ; ;
;;
CALL DELAY
INC R1
MOV A,R1
CJNE A,#0AH,MAIN.
显示范围(F)
SJMP INIT
DELAY:
MOV R5,#0H
D1:
MOV R6,#0H
DJNZ R6,$
DJNZ R5,D1
RET
$include (Init_Device.inc)
END
;延时子程序 ;检查操作数据是否大于 ;操作数据(R1)增1 ;无限循环
第二单元 中断控制及定时器/计数器操作训练
2-1通过对例程5的程序进行修改和上机调试,改变原程序的功能。
(1)将KEY2,KEY4的功能对调。
将ORG 0003H改为0013H,将ORG 0013H改为0003H;将MOV IP,#01H改为MOV IP,#04H;将SETB EX1改为SETB EX0,将SETB EX0改为SETB EX1,将CLR EX0改为CLR EX1;将CLR IE1改为CLR IE0,将CLR IE0改为CLR IE1;
6
(2)每次停下再启动后,更改发光二极管点亮的循环方向。
$include (C8051F020.inc) ;C8051F02x单片机信息头文件包含伪指令
ORG 0000H LJMP INITIAL ORG 0013H LJMP STAR ;外中断0服务程序入口,开始键(STAR) ORG 0003H LJMP STOP ;外中断1服务程序入口 停止键(STOP) ORG 0100H ;主程序入口
INITIAL: LCALL Init_Device ;调用初始设置子程序
MOV P3,#0FFH ;熄灭全部发光二极管
MOV A,#0FFH
MOV DPTR,#7F80H MOVX @DPTR,A ;清除数码管2(NUM2)显示 MOV A,#0FEH ;点亮发光二极管的初始数据 MOV R1,#1H ;发光二极管点亮位置初值 MOV IP,#04H ;设置INT0(开始键STAR)为高优先级 MOV TCON,#05H ;外中断采用边沿触发
;INT1(停止键STOP)开中断
;开放中断LOOP: ;关闭中断
SETB EX1 SETB EA LOOP: CLR EA
RL A MOV P3,A INC R1 ;刷新发光二极管控制数据 ;发光二极管点亮位置计数值增1 SETB EA ;开放中断 LCALL DELAY1 ;延时 LCALL DELAY1 7
CJNE R1,#8,LOOP ;发光二极管点亮位置计数值有效性检测 MOV R1,#0H ;发光二极管点亮位置计数值等于8则回0 SJMP LOOP ;无限次循环 ;停止键的中断服务程序
;保护A寄存器内容 ;读取发光二极管点亮位置计数值 STOP: PUSH ACC
MOV A,R1 MOV DPTR,#TAB MOVC A,@A+DPTR ;获取发光二极管点亮位置计数值的显示段码 MOV DPTR,#7F80H MOVX @DPTR,A ;发光二极管点亮位置计数值的显示数据送显示 SETB EX1
$ ;INT0(启动键STAR)开中断 JNZ ;等待重新启动条件--A=0
MOV A,#0FFH
MOVX @DPTR,A ;清除数码管2(DS2)显示 CLR EX1 POP ACC CLR IE0 RETI ;禁止INT0中断(避免程序误动作) ;恢复A寄存器内容 ;清除INT1中断标志(避免程序误动作) ;中断返回 ;启动键的中断服务程序
STAR: MOV A,#00H ;设置启动条件--A=0
CLR IE1 RETI ;清除INT0中断标志(避免程序误动作) ;中断返回 TAB:
DB 0C0H,0F9H,0A4H,0B0H,099H ;0--4段码 DB 092H,082H,0F8H,080H ;5--8段码 DELAY1: MOV R6,#0 ;延时子程序
D1: MOV R7,#0
DJNZ R7,$ DJNZ R6,D1 RET 8
$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) DP2 EQU 07F80H
DP1 EQU 07F90H DP_L EQU 30H DP_H EQU 31H MAIN: LCALL Init_Device
MOV TMOD,#00000110B MOV A,#0
MOV DP_L,A MOV DP_H,A CALL DISPLAY
MOV TL0,#0 SETB TR0 LOOP: MOV A,TL0
CJNE A,#100,L1 MOV TL0,#0 MOV A,TL0 L1: MOV B,#10
DIV AB MOV DP_L,B
MOV B,#10 DIV AB
MOV DP_H,B
CALL DISPLAY
SJMP LOOP
;增加一个
;使计数器工作在模式2 ;显示计数的低位 ;显示计数高位 ;使TL0的初值为0 ;启用定时器0 ;A不等于100时,转到L1显示 ;当A等于100时,TL0清零 ;将16进制数转化为10进制数
;将B显示为高位 ;循环LOOP
9
DISPLAY: MOV A,DP_L
CALL DECODE
MOV DPTR,#DP1
MOVX @DPTR,A
MOV A,DP_H
CALL DECODE
MOV DPTR,#DP2
MOVX @DPTR,A
MOV P5,A
RET
DECODE: MOV DPTR,#TAB
MOVC A,@A+DPTR
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H DB 080H,090H,088H,083H,0C6H,0A1H,086H,08EH $include (Init_Device.inc)
END
10
第三单元 串行数据传送操作程序调试练习
3-1通过对例程8的程序进行修改和上几条是,改变原程序的功能
(1)将发送1,2,3,4的ASC码改为发送A,B,C,D的ASC码 $include (C8051F020.inc)
NUM2
NUM3
NUM4
NUM5 EQU 07F80H EQU 07F90H ;NUM2地址 ;NUM3地址 EQU 07FA0H ;NUM4地址 EQU 07FB0H
EQU 0FDH ;NUM5地址 ; T/C1低字节计数值
;T/C1高字节计数值 TIM_L TIM_H
REC_BUF0
REC_BUF1
REC_BUF2
FLAG
EQU 0FDH EQU 32H EQU 33H EQU 34H BIT 01H ;数据接收缓冲器0 ;数据接收缓冲器1 ;数据接收缓冲器2 ;数据发送完成标志 ORG 0000H LJMP MAIN ;转主程序 ORG 0023H LJMP RECE ;转串行通信中断程序
MAIN: lcall Init_Device
MOV A,#0FFH MOV P5,A ;清除数码管NUM1的显示 MOV DPTR,#NUM2 MOVX @DPTR,A ;清除数码管NUM2的显示
11
MOV DPTR,#NUM3 MOVX @DPTR,A ;清除数码管NUM3的显示 MOV DPTR,#NUM4 MOVX @DPTR,A ;清除数码管NUM4的显示 MOV DPTR,#NUM5 MOVX @DPTR,A ;清除数码管NUM5的显示 MOV R6,#0 ;
MOV SP,#40H
MOV TMOD,#00100000B
MOV TH1,#TIM_H ;T/C1
MOV TL1,#TIM_L
SETB TR1
MOV SCON0,#01010000B
SETB ES
SETB EA
LOOP: CALL KEYBOARD ;
CJNE A,#0FFH,L0 ;
CLR FLAG ;
SJMP LOOP ;
L0: JB FLAG,LOOP ;
MOV R7,A ;
MOV A,#043H ;C
MOV SBUF0,A ;
CALL DELAY ;
MOV A,#04FH ;O
MOV SBUF0,A ;
CALL DELAY ;
MOV A,#04DH ;M
MOV SBUF0,A ;
通信操作状态寄存器清除 堆栈栈底设置 方式2 重装填值 计数值 启动T/C1 串口方式1 串口中断允许 ;开中断 调用案件状态分析子程序 按键状态发生变化转L0 按键状态无变化,清除发送完成标志数据发送完成,返回主循环 否则,键值暂存R7 发送字符C的ASCII码值 发送字符O的ASCII码值 发送字符M的ASCII码值 12 ;;T/C1 ;T/C1;; ;
CALL DELAY ; MOV A,#04BH ;K MOV SBUF0,A ;发送字符K的ASCII码值 CALL DELAY ; MOV A,#30H ;发送数字0的ASCII码值 MOV SBUF0,A
CALL DELAY ;
MOV A,R7 ;
ADD A,#40H ;
MOV SBUF0,A ;
SETB FLAG ;
SJMP LOOP ;
RECE: JNB TI,REC1 ;
CLR TI ;
RETI
REC1: PUSH ACC
MOV A,SBUF0 ;
CJNE R6,#0,REC2 ;
CJNE A,#43H,REC6 ;
MOV R6,#1 ;
SJMP REC6 ;
REC2: CJNE R6,#1,REC3
CJNE A,#4FH,REC5 ;
MOV R6,#2 ;
SJMP REC6 ;
REC3: CJNE R6,#2,REC4
CJNE A,#4DH,REC5 ;
MOV R6,#3 ;
MOV R5,#3 ;
生成键值的ASCII码值 发送键值的ASCII码值 置位发送完成标志 中断服务程序 非发送转接收处理 否则,清除发送中断标志 中断返回 保护累加器A 读接收缓冲器 接收状态为0,进行字符C的过滤处理 接收状态改为1 接收状态为1,进行字符O的过滤处理 接收状态改为2 接收状态为2,进行字符M的过滤处理 接收状态改为3 数据接收计数器设置为3 13 ;; ; ;
SJMP REC6 ;
REC4: CJNE
PUSH R6,#3,REC6 ; ;接收状态为3,暂存接收的内容 ACC MOV A,#REC_BUF0 ADD A,R5 MOV R0,A ;生成接收数据存放缓冲器地址 POP ACC ;
MOV @R0,A ;
DEC R5 ;
CJNE R5,#0,REC6
CALL DISPLAY
REC5: MOV R6,#0
REC6: POP ACC
CLR RI
RETI ;
KEYBOARD: MOV A,P2
RR A
RR A
RRC A ;KEY1
JC K1
MOV A,#1 ;
SJMP K5
K1: RRC A ;KEY2
JC K2 ;
MOV A,#2 ;
SJMP K5
K2: RRC A ;KEY3
JC K3 ;
MOV A,#3 ;
恢复接收数据至A寄存器 保存接收的数据 接收数据计数器减1 ; ;接收数据计数器减为0,进行接收结果的显示;接收状态恢复为0(就绪状态) ;恢复累加器A ;清除接收中断标志 中断返回 ;读按键状态输入端口 有效键值移入位累加器C ;键值无效转KEY2键值的分析 否则,KEY1代码送A寄存器 有效键值移入位累加器C 键值无效转KEY3键值的分析 否则,KEY2代码送A寄存器 有效键值移入位累加器C 键值无效转KEY4键值的分析 否则,KEY3代码送A寄存器 14
SJMP K5 K3:
RRC A ;KEY4有效键值移入位累加器C JC K4 ;键值无效转按键无效处理 MOV A,#4 SJMP ;否则,KEY4代码送A寄存器 K5
K4:
K5: MOV A,#0FFH ;按键无效代码送A寄存器 RET
MOV A,REC_BUF1 ;读取接收的第2字节数据
A ;高、低4位交换
;分离高4位有效数值 DISPLAY:
SWAP ANL A,#0FH CALL DECODE ;换码 MOV DPTR,#NUM2 MOVX @DPTR,A ; NUM2显示第2字节数据高4位数值 MOV A,REC_BUF1 ;读取接收的第2字节数据 ANL A,#0FH CALL ;提取低4位有效数值 DECODE ;换码 MOV DPTR,#NUM3 MOVX @DPTR,A ; NUM3显示第2字节数据低4位数值 MOV A,REC_BUF2 ;读取接收的第3字节数据 SWAP A ;高、低4位交换 ;分离高4位有效数值 ANL A,#0FH CALL DECODE ;换码 MOV DPTR,#NUM4 MOVX @DPTR,A ; NUM4显示第3字节数据高4位数值 MOV A,REC_BUF2 ;读取接收的第3字节数据 ANL A,#0FH CALL ;提取低4位有效数值 DECODE ;换码 MOV DPTR,#NUM5 MOVX @DPTR,A ; NUM5显示第3字节数据低4位数值 15
RET ;换码程序
DECODE: MOV DPTR,#TAB
MOVC A,@A+DPTR RET ;延时程序
DELAY: MOV R5,#80H D1:
MOV R6,#0H DJNZ DJNZ RET
R6,$ R5,D1 TAB: DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H
DB 080H,090H,088H,083H,0C6H,0A1H,086H,08EH $include (Init_Device.inc)
END
(2)将第二字节和第三字节互换位置 $include (C8051F020.inc)
NUM2
NUM3
NUM4
NUM5 EQU 07F80H EQU 07F90H ;NUM2地址 ;NUM3地址 EQU 07FA0H ;NUM4地址 EQU 07FB0H
EQU 0FDH ;NUM5地址 ; T/C1低字节计数值
;T/C1高字节计数值 TIM_L TIM_H
REC_BUF0
REC_BUF1
REC_BUF2 EQU 0FDH EQU 32H EQU 33H EQU 34H ;数据接收缓冲器0 ;数据接收缓冲器1 ;数据接收缓冲器2
16
FLAG
BIT 01H ;数据发送完成标志 ORG 0000H LJMP MAIN ;转主程序 ORG 0023H LJMP RECE ;转串行通信中断程序 MAIN: lcall Init_Device
MOV A,#0FFH MOV P5,A ;清除数码管NUM1的显示 MOV DPTR,#NUM2 MOVX @DPTR,A ;清除数码管NUM2的显示 MOV DPTR,#NUM3 MOVX @DPTR,A ;清除数码管NUM3的显示 MOV DPTR,#NUM4 MOVX @DPTR,A ;清除数码管NUM4的显示 MOV DPTR,#NUM5 MOVX @DPTR,A ;清除数码管NUM5的显示 ;通信操作状态寄存器清除 ;堆栈栈底设置 ;T/C1方式2 MOV R6,#0 MOV SP,#30H MOV TMOD,#00100000B MOV TH1,#TIM_H ;T/C1重装填值 MOV TL1,#TIM_L SETB TR1 ;T/C1计数值 ;启动T/C1 MOV SCON0,#01010000B ;串口方式1 SETB ES SETB EA ;串口中断允许 ;开中断 LOOP: CALL
KEYBOARD ;调用案件状态分析子程序 CJNE A,#0FFH,L0 ;按键状态发生变化转L0 ;按键状态无变化,清除发送完成标志 ; 17 CLR FLAG SJMP LOOP
L0: JB FLAG,LOOP ;数据发送完成,返回主循环
MOV R7,A ;否则,键值暂存R7 MOV A,#043H ;C MOV SBUF0,A ;发送字符C的ASCII码值 CALL DELAY ; MOV A,#04FH ;O MOV SBUF0,A ;发送字符O的ASCII码值 CALL DELAY ; ;M MOV A,#04DH MOV SBUF0,A ;发送字符M的ASCII码值 CALL DELAY ; MOV A,#04BH ;K MOV SBUF0,A ;发送字符K的ASCII码值 CALL DELAY ; MOV A,#30H MOV SBUF0,A
DELAY
;发送数字0的ASCII码值 CALL
; ; ;生成键值的ASCII码值 MOV A,R7 ADD A,#30H MOV SBUF0,A ;发送键值的ASCII码值 SETB SJMP FLAG ;置位发送完成标志 LOOP ;中断服务程序
RECE: JNB TI,REC1 ;非发送转接收处理
CLR TI ;否则,清除发送中断标志 RETI ;中断返回
REC1: PUSH ACC ;保护累加器A
MOV A,SBUF0 ;读接收缓冲器 CJNE CJNE R6,#0,REC2 ; A,#43H,REC6 ;接收状态为0,进行字符C的过滤处理 18
MOV R6,#1 SJMP REC6 ;接收状态改为1 ;
REC2: CJNE
CJNE R6,#1,REC3 ; A,#4FH,REC5 ;接收状态为1,进行字符O的过滤处理 ;接收状态改为2 ; MOV R6,#2 SJMP REC6
REC3: CJNE
CJNE R6,#2,REC4 ; A,#4DH,REC5 ;接收状态为2,进行字符M的过滤处理 ;接收状态改为3 ;数据接收计数器设置为3 ; MOV R6,#3 MOV R5,#3 SJMP REC6
REC4: CJNE
PUSH R6,#3,REC6 ; ;接收状态为3,暂存接收的内容 ACC MOV A,#REC_BUF0 ADD A,R5 MOV R0,A POP ACC ;生成接收数据存放缓冲器地址 ;恢复接收数据至A寄存器 ;保存接收的数据 MOV @R0,A DEC R5 CJNE CALL ;接收数据计数器减1 R5,#0,REC6 ; DISPLAY ;接收数据计数器减为0,进行接收结果的显示
;接收状态恢复为0(就绪状态) REC5: MOV R6,#0
REC6: POP ACC ;恢复累加器A
CLR RI ;清除接收中断标志 RETI ;中断返回
;读按键状态输入端口
KEYBOARD: MOV A,P2
RR A RR A RRC A ;KEY1有效键值移入位累加器C 19
JC K1 ;键值无效转KEY2键值的分析 MOV A,#1 SJMP ;否则,KEY1代码送A寄存器 K5
K1:
RRC A ;KEY2有效键值移入位累加器C JC K2 ;键值无效转KEY3键值的分析 MOV A,#2 SJMP ;否则,KEY2代码送A寄存器 K5
K2:
RRC A ;KEY3有效键值移入位累加器C JC K3 ;键值无效转KEY4键值的分析 MOV A,#3 SJMP ;否则,KEY3代码送A寄存器 K5
K3:
RRC A ;KEY4有效键值移入位累加器C JC K4 ;键值无效转按键无效处理 MOV A,#4 SJMP ;否则,KEY4代码送A寄存器 K5
K4:
K5: MOV A,#0FFH ;按键无效代码送A寄存器 RET
MOV A,REC_BUF1 ;读取接收的第2字节数据
A ;高、低4位交换
;分离高4位有效数值 DISPLAY:
SWAP ANL A,#0FH CALL DECODE ;换码 MOV DPTR,#NUM4 MOVX @DPTR,A ; NUM2显示第2字节数据高4位数值 MOV A,REC_BUF1 ;读取接收的第2字节数据 ANL A,#0FH CALL ;提取低4位有效数值 DECODE ;换码 MOV DPTR,#NUM5 MOVX @DPTR,A ; NUM3显示第2字节数据低4位数值 MOV A,REC_BUF2 ;读取接收的第3字节数据 20
SWAP A ;高、低4位交换 ;分离高4位有效数值 ANL A,#0FH CALL DECODE ;换码 MOV DPTR,#NUM2 MOVX @DPTR,A ; NUM4显示第3字节数据高4位数值 MOV A,REC_BUF2 ;读取接收的第3字节数据 ANL A,#0FH CALL ;提取低4位有效数值 DECODE ;换码 MOV DPTR,#NUM3 MOVX RET ;换码程序 @DPTR,A ; NUM5显示第3字节数据低4位数值
DECODE: MOV DPTR,#TAB
MOVC A,@A+DPTR RET ;延时程序
DELAY: MOV R5,#80H D1:
MOV R6,#0H DJNZ DJNZ RET
R6,$ R5,D1 TAB: DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H
DB 080H,090H,088H,083H,0C6H,0A1H,086H,08EH
$include (Init_Device.inc)
END
21