单片机实验程序.docx
《单片机实验程序.docx》由会员分享,可在线阅读,更多相关《单片机实验程序.docx(13页珍藏版)》请在冰豆网上搜索。
单片机实验程序
一
1.修改例程一的源程序
(1)将A寄存器的初值改为80H(正逻辑,数据位为1表示发光
二极管点亮),再对源程序进行简单修改,使程序运行后发光二极管情况与修改前相同。
(2)将LED向左循环移位点亮改为向右循环移位点亮
(3)加快LED循环移位点亮的速度
$include(C8051F020.inc);C8051F02x系列单片机信息头文件包含伪指令
INIT:
LCALLInit_Device调用初始设置子程序
(1)MOVA,#080H;赋初始值并在发光二极管上显示该数值
CPLA
MOVP3,A
LOOP:
CALLDELAY
CALLDELAY
CALLDELAY
CALLDELAY
CALLDELAY
CALLDELAY
CALLDELAY
(2)RLA;A寄存器内容右移1位并送1发光二极管显示MOVP3,A
AJMPLOOP;无限循环
DELAY:
MOVR5,#0H;延时子程序
D1:
MOVR6,#00H
DJNZR6,$
DJNZR5,D1
RET
$include(Init_Device.inc);初始设置子程序文件包含伪指令
END
(3)可删除几个
CALLDELAY语句即可加快循环速度
2.将例程二0——F的循环显示改为0——9的循环显示
$include(C8051F020.inc);C8051F02x系列单片机信息头文件包含伪指令ORG0000H
LJMPINIT
TAB:
DB0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H;字符段码表0-7DB080H,090H;字符段码表8-F
INIT:
lcallInit_Device;调用初始设置子程序
INIT1:
MOVR1,#00H;操作数据初始值
MOVA,R1
MAIN:
MOVDPTR,#TAB;读取与A中数值对应的显示段码
MOVCA,@A+DPTR
MOVP5,A;段码送并行口1显示
CALLDELAY
CALLDELAY
CALLDELAY
CALLDELAY
CALLDELAY
CALLDELAY
CALLDELAY
CALLDELAY
CALLDELAY
CALLDELAY
CALLDELAY
CALLDELAY
CALLDELAY
CALLDELAY
INCR1;操作数据(R1)增1
MOVA,R1
CCCCC,#0AH,MAIN;检查操作数据是否大于显示范围(F)SJMPINIT1;无限循环
DDDDD:
MOVR5,#0H;延时子程序
D1:
MOVR6,#0H
DJNZR6,$
DJNZR5,D1
RET
$include(Init_Device.inc);初始设置子程序文件包含伪指令
END
二
1.例程5程序修改
(1)
(2)
将KEY2、KEY4的功能对调
每次停下再启动以后,更改发光二极管点亮的循环方向
$include(C8051F020.inc);C8051F02x系列单片机信息头文件包含伪指令
ORG0000H
LJMPINITIAL;主程序入口
ORG0003H
LJMPSTOP;外中断0服务程序入口,开始键(STAR)ORG0013H
LJMPSTAR;外中断1服务程序入口ORG0100H
INITIAL:
LCALLInit_Device;调用初始设置子程序
停止键(STOP)
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;开放中断
LOOP:
CLREA;关闭中断
CJNER4,#0FH,LP
RLA
CJNER4,#0FH,LP
MOVP3,A
CJNER4,#0FH,LP
INCR1
CJNER4,#0FH,LP
SETBEA
LCALLDELAY1
LCALLDELAY1
LCALLDELAY1
LCALLDELAY1
CJNER1,#8H,LOOP
MOVR1,#0H
SJMPLOOP
LP:
CLREA
CJNER4,#0F0H,LOOP
RRA
CJNER4,#0F0H,LOOP
MOVP3,A
CJNER4,#0F0H,LOOP
DECR1
CJNER4,#0F0H,LOOP
SETBEA
LCALLDELAY1
LCALLDELAY1
LCALLDELAY1
LCALLDELAY1
CJNER1,#0H,LP
MOVR1,#8H
SJMPLP
;停止键的中断服务程序
STOP:
PUSHACC;保护A寄存器内容
MOVA,R1;读取发光二极管点亮位置计数值
MOVDPTR,#TAB
MOVCA,@A+DPTR;获取发光二极管点亮位置计数值的显示段码MOVDPTR,#7F80H
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
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.修改例程6,将计数范围由0-F扩展至00-FF(使用定时器/计时
器0),并在2位数码管上用10进制数显示计数结果(00-99)
$include(C8051F020.inc);C8051F02x系列单片机信息头文件包含伪指令DP2EQU07F80H
DP_LEQU30H;低位数值暂存器
DP_HEQU31H;高位数值暂存器
MAIN:
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
LOOP:
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的计数值
CALLDISPLAY;调用显示子程序显示计数值
SJMPLOOP;无限次循环
;显示子程序
DISPLAY:
MOVA,DP_L;读低位显示值
CALLDECODE;调用换码子程序
MOVDPTR,#DP2;显示段码送NUM2
MOVX@DPTR,A
MOVA,DP_H;读高位显示值
CALLDECODE;调用换码子程序
MOVP5,A
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
三
通过对例程8的程序进行修改和上机调试,改变源程序的功能
(1)
(2)
将发送1、2、3、4的ASCII码改为发送A、B、C、D的ASCII码
将接收的第2、第3字节数据的显示位置交换
$include(C8051F020.inc);C8051F02x系列单片机信息头文件包含伪指令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;转串行通信中断程序
;主程序
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,#40H;堆栈栈底设置
MOVTMOD,#00100000B;T/C1方式2
MOVTH1,#TIM_H;T/C1重装填值
MOVTL1,#TIM_L;T/C1计数值
SETBTR1;启动T/C1
MOVSCON0,#01010000B;串口方式1
SETBES;串口中断允许
SETBEA;开中断
;主循环
LOOP:
CALLKEYBOARD;调用案件状态分析子程序
CJNEA,#0F