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