单片机实验程序文档格式.docx
《单片机实验程序文档格式.docx》由会员分享,可在线阅读,更多相关《单片机实验程序文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
MOVR1,#00H;
操作数据初始值
MOVA,R1
MAIN:
MOVDPTR,#TAB;
读取与A中数值对应的显示段码
MOVCA,@A+DPTR
MOVP5,A;
段码送并行口1显示
INCR1;
操作数据(R1)增1
MOVA,R1
CJNEA,#0AH,MAIN;
检查操作数据是否大于显示范围(F)
SJMPINIT1;
MOVR6,#0H
$include(Init_Device.inc);
END
二
1.例程5程序修改
(1)将KEY2、KEY4的功能对调
(2)每次停下再启动以后,更改发光二极管点亮的循环方向
$include(C8051F020.inc);
ORG0000H
LJMPINITIAL;
主程序入口
ORG0003H
LJMPSTOP;
外中断0服务程序入口,开始键(STAR)
ORG0013H
LJMPSTAR;
外中断1服务程序入口停止键(STOP)
ORG0100H
INITIAL:
LCALLInit_Device;
MOVP3,#0FFH;
熄灭全部发光二极管
MOVA,#0FFH
MOVDPTR,#7F80H
MOVX@DPTR,A;
清除数码管2(NUM2)显示
MOVA,#0FEH;
点亮发光二极管的初始数据
MOVR1,#1H;
发光二极管点亮位置初值
MOVR4,#0FH
MOVIP,#04H;
设置INT0(开始键STAR)为高优先级
MOVTCON,#05H;
外中断采用边沿触发
SETBEX0;
INT1(停止键STOP)开中断
SETBEA;
开放中断
CLREA;
关闭中断
CJNER4,#0FH,LP
RLA
CJNER4,#0FH,LP
MOVP3,A
CJNER4,#0FH,LP
INCR1
CJNER4,#0FH,LP
SETBEA
LCALLDELAY1
CJNER1,#8H,LOOP
MOVR1,#0H
SJMPLOOP
LP:
CLREA
CJNER4,#0F0H,LOOP
RRA
CJNER4,#0F0H,LOOP
CJNER4,#0F0H,LOOP
DECR1
CJNER1,#0H,LP
MOVR1,#8H
SJMPLP
;
停止键的中断服务程序
STOP:
PUSHACC;
保护A寄存器内容
MOVA,R1;
读取发光二极管点亮位置计数值
MOVDPTR,#TAB
MOVCA,@A+DPTR;
获取发光二极管点亮位置计数值的显示段码
MOVX@DPTR,A;
发光二极管点亮位置计数值的显示数据送显示
SETBEX1;
INT0(启动键STAR)开中断
JNZ$;
等待重新启动条件--A=0
MOVA,#0FFH
MOVX@DPTR,A;
清除数码管2(NUM2)显示
CLREX1;
禁止INT0中断(避免程序误动作)
POPACC;
恢复A寄存器内容
CLRIE1;
清除INT1(停止键STOP)中断标志(避免程序误动作)
RETI;
中断返回
启动键的中断服务程序
STAR:
MOVA,#00H;
设置启动条件--A=0
CLRIE0;
清除INT0(启动键STOP)中断标志(避免程序误动作)
PUSHACC
MOVA,R4
CPLA
MOVR4,A
POPACC
中断返回
DB0C0H,0F9H,0A4H,0B0H,099H;
0--4段码
DB092H,082H,0F8H,080H;
5--8段码
DELAY1:
MOVR6,#0;
MOVR7,#0
DJNZR7,$
DJNZR6,D1
RET
$include(Init_Device.inc);
初始设置子程序文件包含伪指令
END
2.修改例程6,将计数范围由0-F扩展至00-FF(使用定时器/计时器0),并在2位数码管上用10进制数显示计数结果(00-99)
$include(C8051F020.inc);
DP2EQU07F80H
DP_LEQU30H;
低位数值暂存器
DP_HEQU31H;
高位数值暂存器
LCALLInit_Device;
MOVTMOD,#00000101B;
C/T0工作于方式2
MOVA,#0;
显示初值为0
MOVDP_L,A
MOVDP_H,A
CALLDISPLAY;
调用显示子程序显示初值0
MOVTL0,#0;
C/T0置初值0
SETBTR0;
启动计数器0
MOVA,TL0;
读计数器0的计数值
CJNEA,#0AH,L1
MOVTL0,#0
MOVA,#0
INCDP_H
MOVA,DP_H
CJNEA,#0AH,MM
MOVDP_H,#0
MM:
MOVA,#0
L1:
MOVDP_L,A;
在NUM2显示计数器0的计数值
调用显示子程序显示计数值
SJMPLOOP;
无限次循环
;
显示子程序
DISPLAY:
MOVA,DP_L;
读低位显示值
CALLDECODE;
调用换码子程序
MOVDPTR,#DP2;
显示段码送NUM2
MOVX@DPTR,A
MOVA,DP_H;
读高位显示值
MOVP5,A
RET
换码子程序
DECODE:
MOVDPTR,#TAB
MOVCA,@A+DPTR
RET
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
三
通过对例程8的程序进行修改和上机调试,改变源程序的功能
(1)将发送1、2、3、4的ASCII码改为发送A、B、C、D的ASCII码
(2)将接收的第2、第3字节数据的显示位置交换
$include(C8051F020.inc);
NUM2EQU07F80H;
NUM2地址
NUM3EQU07F90H;
NUM3地址
NUM4EQU07FA0H;
NUM4地址
NUM5EQU07FB0H;
NUM5地址
TIM_LEQU0FDH;
T/C1低字节计数值
TIM_HEQU0FDH;
T/C1高字节计数值
REC_BUF0EQU32H;
数据接收缓冲器0
REC_BUF1EQU34H;
数据接收缓冲器1
REC_BUF2EQU33H;
数据接收缓冲器2
FLAGBIT01H;
数据发送完成标志
ORG0000H
LJMPMAIN;
转主程序
ORG0023H
LJMPRECE;
转串行通信中断程序
;
主程序
lcallInit_Device;
MOVA,#0FFH
MOVP5,A
MOVDPTR,#NUM2
MOVX@DPTR,A;
清除数码管NUM1的显示
MOVDPTR,#NUM3
清除数码管NUM2的显示
MOVDPTR,#NUM4
清除数码管NUM3的显示
MOVDPTR,#NUM5
清除数码管NUM4的显示
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;
开中断
主循环
CALLKEYBOARD;
调用案件状态分析子程序
CJNEA,#0FFH,L0;
按键状态发生变化转L0
CLRFLAG;
按键状态无变化,清除发送完成标志
SJMPLOOP
L0:
JBFLAG,LOOP;
数据发送完成,返回主循环
MOVR7,A;
否则,键值暂存R7
MOVA,#043H;
C
MOVSBUF0,A;
发送字符C的ASCII码值
CALLDELAY
MOVA,#04FH;
O
发送字符O的ASCII码值
MOVA,#04DH;
M
发送字符M的ASCII码值
MOVA,#04BH;
K
发送字符K的ASCII码值
MOVA,#40H;
发送数字0的ASCII码值
MOVSBUF0,A
MOVA,R7
ADDA,#40H;
生成键值的ASCII码值
发送键值的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
REC3:
CJNER6,#2,REC4
CJNEA,#4DH,REC5;
接收状态为2,进行字符M的过滤处理
MOVR6,#3;
接收状态改为3
MOVR5,#3;
数据接收计数器设置为3
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
RRCA;
KEY1有效键值移入位累加器C
JCK1;
键值无效转KEY2键值的分析
MOVA,#1;
否则,KEY1代码送A寄存器
SJMPK5
K1:
KEY2有效键值移入位累加器C
JCK2;
键值无效转KEY3键值的分析
MOVA,#2;
否则,KEY2代码送A寄存器
SJMPK5
K2:
KEY3有效键值移入位累加器C
JCK3;
键值无效转KEY4键值的分析
MOVA,#3;
否则,KEY3代码送A寄存器
K3:
KEY4有效键值移入位累加器C
JCK4;
键值无效转按键无效处理
MOVA,#4;
否则,KEY4代码送A寄存器
K4:
MOVA,#0FFH;
按键无效代码送A寄存器
K5:
RET
MOVA,REC_BUF2;
读取接收的第2字节数据
SWAPA;
高、低4位交换
ANLA,#0FH;
分离高4位有效数值
CALLDECODE;
换码
在数码管NUM2显示第2字节数据高4位数值
MOVA,REC_BUF2;
ANLA,#0FH;
提取低4位有效数值
CALLDECODE;
在数码管NUM3显示第2字节数据低4位数值
MOVA,REC_BUF1;
读取接收的第3字节数据
SWAPA;
在数码管NUM4显示第3字节数据高4位数值
提取低4位有效数值
MOVX@DPTR,A;
在数码管NUM5显示第3字节数据低4位数值
RET
------DECODEPROGRAM-------
MOVCA,@A+DPTR
------DELAYPROGRAM------
MOVR5,#80H
MOVR6,#0H
DJNZR6,$
DJNZR5,D1
DB0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H
DB080H,090H,088H,083H,0C6H,0A1H,086H,08EH
$include(Init_Device.inc);
END