单片机实验程序文档格式.docx

上传人:b****6 文档编号:21559626 上传时间:2023-01-31 格式:DOCX 页数:13 大小:20KB
下载 相关 举报
单片机实验程序文档格式.docx_第1页
第1页 / 共13页
单片机实验程序文档格式.docx_第2页
第2页 / 共13页
单片机实验程序文档格式.docx_第3页
第3页 / 共13页
单片机实验程序文档格式.docx_第4页
第4页 / 共13页
单片机实验程序文档格式.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

单片机实验程序文档格式.docx

《单片机实验程序文档格式.docx》由会员分享,可在线阅读,更多相关《单片机实验程序文档格式.docx(13页珍藏版)》请在冰豆网上搜索。

单片机实验程序文档格式.docx

MOVR1,#00H;

操作数据初始值

MOVA,R1

MAIN:

MOVDPTR,#TAB;

读取与A中数值对应的显示段码

MOVCA,@A+DPTR

MOVP5,A;

段码送并行口1显示

INCR1;

操作数据(R1)增1

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

MOVP3,A

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

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

当前位置:首页 > 职业教育 > 职业技术培训

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

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