51单片机实验代码
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(三)实验结果
交通信号灯模拟控制系统程序流程图
程序:BANK0_REGEQU00H;选择第0组寄存器
BANK1_REGEQU08H;选择第1组寄存器
BANK2_REGEQU10H;选择第2组寄存器
BANK3_REGEQU18H;选择第3组寄存器
ORG0000H
LJMPMAIN;指向主程序
ORG0003H
因此,我们设定TMOD=00000001B,即TMOD=01H
下面我们要给T0定时/计数器的TH0,TL0装入预置初值,通过下面的公式可以计算出
TH0=(216-50000)/256
TL0=(216-50000)MOD256
当T0在工作的时候,我们如何得知50ms的定时时间已到,这回我们通过检测TCON特殊功能寄存器中的TF0标志位,如果TF0=1表示定时时间已到。
四、实验步骤在R2、R3中输入源首址(例如0000H),R4、R5中输入的目的地址(例如2000H),R6、R7中输入字节数(例如1FFFH),运行程序,检查0000H~1FFFH中内容是否和2000H~3FFFH中内容完全一致。
五、程序清单文件名SW04.ASM
ORG 0000H
LJMP SE22
LED_PORTEQUP1
ORG0000H
LJMPSTART
ORG0100H
START:
CLREA;关闭所有中断
MOVP3,#11111111B;使P3口锁存器置位
MOVA,P3;读P3口引脚线信号
ANLA,#00010000B;逻辑与操作,屏蔽掉无关位
JZDDPING;判断P3.4是否接地,若是,跳转到DDPING执行
LOOP: SJMP LOOP
END
实验三拆字程序
一、实验目的掌握汇编语言设计和调试方法
二、实验内容把2000H的内容拆开,高位送2001H低位,低位送2002H低位,2001H、2002H高位清零,一般本程序用于把数据送显示缓冲区时用。
三、实验程序框图
四、实验步骤用连续或单步方式运行程序,检查2000H~2002H中内容变化情况。
实验原理
用8051单片机设计一交通信号灯模拟控制系统,能够完成正常情况下的轮流放行以及特殊情况和紧急情况下的红绿灯控制
1.掌握单片机中断系统、定时/计数器的编程应用。
2.通过对交通灯控制程序的编写与调试,掌握中断程序的结构。
3.正常情况下A、B道(A、B道交叉组成十字路口,A是主道,B是支道)轮流放行,A道放行1分钟(其中5秒用于警告),B道放行30秒(其中5秒用于警告)。
红灯
1
1
1
1
1
1
1
1
1
1
0
1
1
1
1
0
0
0
1
1
0
1
1
1
1
0
1
1
1
1
0
0
F3H
F5H
DEH
EEH
A线放行,B线禁止
A线警告,B线禁止
A线禁止,B线放行
A线禁止,B线警告
(二) 实验连线表
单片机
发光二极管
按键
连接1
P1.0-P1.5
L0-L5
连接2
INT0
KR1
连接3
T0
KR2
连接4
T1
KR3
连接5
INT1
LJMPEMERG;指向紧急车辆出现中断程序 外部中断0
ORG0013H
LJMPONEBUSY;指向一道有车另一道无车中断程序 外部中断1
ORG0100H
MAIN:
MOVPSW,#BANK0_REG
MOVSP,#0DFH
SETBPX0;置外部中断0为高优先级中断
MOVTCON,#00H;置外部中断0,1为电平触发
三、思想描述:
系统板上硬件连线
(1.把“单片机系统”区域中的P0.0-P0.7端口用8芯排线连接到“动态静态数码显示模块”区域中的a-h端口上;要求:P0.0对应着a,P0.1对应着b,……,P0.7对应着h。
(2.把“单片机系统”区域中的P2.0端口用8芯排线连接到“动态数码显示模块”区域中的任一个公共端上。
MOV TL0,#(65536-50000) MOD 256
INC TCOUNT
MOV A,TCOUNT
CJNE A,#20,NEXT
MOV TCOUNT,#00H
INC SECOND
MOV A,SECOND
ANL A,#0FH
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
DELAY:
MOVR3,#7FH;延时子程序
DEL2:
MOVR4,#0FFH
DEL1:
NOP
DJNZR4,DEL1
DJNZR3,DEL2
RET
END
;------------------------------------------------------
;程序:用于关控制发二极管的显示方式
;------------------------------------------------------
NEXT:RETI
TABLE:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END
实验7外部中断实验
一、实验目的中断实验输出控制,学习中断程序设计方法,理解中断机制理解下降沿中断和低电平中断的区别。
二、实验要求编写主程序 实现系统的初始化,若有不同的初始化方式,应有状态指示;编写中断服务程序,服务程序操作以能明确判断发生一次中断为准,且有声光指示作为人机界面。实验前必须认真复习中断相关内容,并在实验报告上写出预习报告,给出实验方案,经过实验指导教师检查合格后,方可进行实验。实验结束后撰写实验报告画出实验原理图,给出程序流程及实现的全部代码。
INC DPTR
MOV A,B
ANL A,#0FH;(2000)内容屏蔽高位
MOVX @DPTR,A;送2002H
LOOP: JMP LOOP
END
实验四数据区传送子程序
一、实验目的掌握RAM中的数据操作
二、实验内容把R2、R3源RAM区首地址内的R6、R7字节数据传送到R4、R5目的RAM区。
三、实验程序框图
MOV P0,A
MOV TCOUNT,#00H
MOV TMOD,#01H
MOV TH0,#(65536-50000) / 256
MOV TL0,#(65536-50000) MOD 256
SETB TR0
SETB ET0
SETB EA
SJMP $
INT0X:
MOV TH0,#(65536-50000) / 256
END
汇编源程序(中断法)
SECONDEQU 30H
TCOUNTEQU 31H
ORG 00H
LJMP START
ORG 0BH
LJMP INT0X
START:SETB P2.0
MOV SECOND,#00H
MOV A,SECOND
ANL A,#0FH
MOV DPTR,#TABLE
MOVC A,@A+DPTR
INC TCOUNT
MOV A,TCOUNT
CJNE A,#20,NEXT
MOV TCOUNT,#00H
INC SECOND
MOV A,SECOND
CJNE A,#60,NEX
MOV SECOND,#00H
NEX:LJMP DISP
NEXT:LJMP WAIT
TABLE:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
实验原理
AT89S51单片机的内部16位定时/计数器是一个可编程定时/计数器,它既可以工作在13位定时方式,也可以工作在16位定时方式和8位定时方式。只要通过设置特殊功能寄存器TMOD,即可完成。定时/计数器何时工作也是通过软件来设定TCON特殊功能寄存器来完成的。
现在我们选择16位定时工作方式,对于T0来说,最大定时也只有65536us,即65.536ms,无法达到我们所需要的1秒的定时,因此,我们必须通过软件来处理这个问题,假设我们取T0的最大定时为50ms,即要定时1秒需要经过20次的50ms的定时。对于这20次我们就可以采用软件的方法来统计了。
ORG 0000H
LJMP SE01
ORG 0640H
SE01: MOV R0,#00H
MOV DPTR,#2000H;(0000H)送DPTR
LOO1: CLR A
MOVX @DPTR,A;0送(DPTR)
INC DPTR;DPTR+1
INC R0;字节数加1
CJNE R0,#00H,LOO1;不到FF个字节再清
4.一道有车而另一道无车时,使有车车道放行,K5键按下表示A道有车,K1键按下表示B道有车。
5.K9键按下表示有紧急车辆通过时,A、B道均为红灯。
控制码表
P1.7
P1.6
P1.5
P1.4
P1.3
P1.2
P1.1
P1.0
控制码
(P1口数据)
状态说明
(空)
(空)
B线
绿灯
B线
黄灯
B线
红灯
A线
绿灯
A线
黄灯
A线
五、思考如何用断点方式调试本程序
六、程序清单文件名:SW02.ASM
ORG 0000H
LJMP SE02
ORG 0660H
SE02: MOV DPTR,#2000H
MOVX A,@DPTR
MOV B,A;(2000)→A→B
SWAP A;交换
ANL A,#0FH;屏蔽高位
INC DPTR
MOVX @DPTR,A;送2001H
ORG 07B0H
SE22: MOV DPL,R3
MOV DPH,R2;建立源程序首址
MOVX A,@DPTR;取数
MOV DPL,R5
MOV DPH,R4;目的地首址
MOVX @DPTR,A;传送
CNE R3,#0FFH,LO42
INC R2
LO42: INC R3;源地址加1
CJNE R5,#0FFH,LO43
MOVLED_PORT,#00H;否则,P3.4高电平,点亮所有发光二极管
SJMPSTART
DDPING:
MOVLED_PORT,#55H;P3.4接地,发光二极管交叉亮灭
SJMPSTART
END
实验六 P3口输入P1口输出实验
一、实验目的P3口输入P1口输出,实现I/O控制。
二、实验要求撰写实源自文库报告,给出输入输出实现方式,画出实验原理图,给出程序流程及实现的全部代码。
LED_PORTEQUP1
ORG0000H;程序从地址0000H开始存放
LJMPSTART
ORG0100H
START:
CLREA;关闭所有中断
MOVLED_PORT,#00H;点亮所有发光二极管
LCALLDELAY;延时
MOVLED_PORT,#0FFH;灭掉所有发光二极管
LCALLDELAY
SJMPSTART;重复闪动
INC R4
LO43:INC R5;目的地址加1
CJNE R7,#00H,LO44
CJNE R6,#00H,LO45;字节数减1
LOOP: SJMP LOOP
NOP
LO44:DEC R7
SJMP SE22
LO45:DEC R7
DEC R6
SJMP SE22;未完继续
END
实验五 简单I/O口应用
一、实验目的 掌握P1口作为I/O口的使用方法,理解读引脚和读锁存器的区别。
实验二清零程序
一、实验目的掌握汇编语言设计和调试方法,熟悉键盘操作。
二、实验内容把2000H~20FFH的内容清零。
三、实验程序框图
四、实验步骤用连续或单步的方式运行程序,检查2000~20FF中执行程序前后的内容变化。
五、思考假使把2000H~20FFH中的内容改成FF,如何修改程序。
六、程序清单文件名:SW01.ASM
二、实验要求 运行不同的程序,观察发光二极管的亮灭状态,比较程序的特点,了解汇编语言设计的基本思路和指令应用。
三、思想描述
流程图:
;------------------------------------------------------
;程序:所有发光二极管不停地闪动
;-------------------- ----------------------------------
实验结果
汇编源程序(查询法)
SECONDEQU 30H
TCOUNTEQU 31H
ORG 00H
START:SETB P2.0
MOV SECOND,#00H
MOV TCOUNT,#00H
MOV TMOD,#01H
MOV TH0,#(65536-50000) / 256
MOV TL0,#(65536-50000) MOD 256
SETB TR0
DISP:MOV A,SECOND
ANL A,#0FH
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
WAIT:JNB TF0,WAIT
CLR TF0
MOV TH0,#(65536-50000) / 256
MOV TL0,#(65536-50000) MOD 256
MOVTMOD,#10H;置定时器1为方式1
MOVIE,#85H;开CPU中断,开外中断0,1中断
DISP:
MOVP1,#0F3H;A绿灯放行,B红灯禁止
MOVR2,#6EH;置0.5秒循环次数
DISP1:
LCALLDELAY;调用0.5秒延时子程序
DJNZR2,DISP1;55秒不到继续循环
交通信号灯模拟控制系统程序流程图
程序:BANK0_REGEQU00H;选择第0组寄存器
BANK1_REGEQU08H;选择第1组寄存器
BANK2_REGEQU10H;选择第2组寄存器
BANK3_REGEQU18H;选择第3组寄存器
ORG0000H
LJMPMAIN;指向主程序
ORG0003H
因此,我们设定TMOD=00000001B,即TMOD=01H
下面我们要给T0定时/计数器的TH0,TL0装入预置初值,通过下面的公式可以计算出
TH0=(216-50000)/256
TL0=(216-50000)MOD256
当T0在工作的时候,我们如何得知50ms的定时时间已到,这回我们通过检测TCON特殊功能寄存器中的TF0标志位,如果TF0=1表示定时时间已到。
四、实验步骤在R2、R3中输入源首址(例如0000H),R4、R5中输入的目的地址(例如2000H),R6、R7中输入字节数(例如1FFFH),运行程序,检查0000H~1FFFH中内容是否和2000H~3FFFH中内容完全一致。
五、程序清单文件名SW04.ASM
ORG 0000H
LJMP SE22
LED_PORTEQUP1
ORG0000H
LJMPSTART
ORG0100H
START:
CLREA;关闭所有中断
MOVP3,#11111111B;使P3口锁存器置位
MOVA,P3;读P3口引脚线信号
ANLA,#00010000B;逻辑与操作,屏蔽掉无关位
JZDDPING;判断P3.4是否接地,若是,跳转到DDPING执行
LOOP: SJMP LOOP
END
实验三拆字程序
一、实验目的掌握汇编语言设计和调试方法
二、实验内容把2000H的内容拆开,高位送2001H低位,低位送2002H低位,2001H、2002H高位清零,一般本程序用于把数据送显示缓冲区时用。
三、实验程序框图
四、实验步骤用连续或单步方式运行程序,检查2000H~2002H中内容变化情况。
实验原理
用8051单片机设计一交通信号灯模拟控制系统,能够完成正常情况下的轮流放行以及特殊情况和紧急情况下的红绿灯控制
1.掌握单片机中断系统、定时/计数器的编程应用。
2.通过对交通灯控制程序的编写与调试,掌握中断程序的结构。
3.正常情况下A、B道(A、B道交叉组成十字路口,A是主道,B是支道)轮流放行,A道放行1分钟(其中5秒用于警告),B道放行30秒(其中5秒用于警告)。
红灯
1
1
1
1
1
1
1
1
1
1
0
1
1
1
1
0
0
0
1
1
0
1
1
1
1
0
1
1
1
1
0
0
F3H
F5H
DEH
EEH
A线放行,B线禁止
A线警告,B线禁止
A线禁止,B线放行
A线禁止,B线警告
(二) 实验连线表
单片机
发光二极管
按键
连接1
P1.0-P1.5
L0-L5
连接2
INT0
KR1
连接3
T0
KR2
连接4
T1
KR3
连接5
INT1
LJMPEMERG;指向紧急车辆出现中断程序 外部中断0
ORG0013H
LJMPONEBUSY;指向一道有车另一道无车中断程序 外部中断1
ORG0100H
MAIN:
MOVPSW,#BANK0_REG
MOVSP,#0DFH
SETBPX0;置外部中断0为高优先级中断
MOVTCON,#00H;置外部中断0,1为电平触发
三、思想描述:
系统板上硬件连线
(1.把“单片机系统”区域中的P0.0-P0.7端口用8芯排线连接到“动态静态数码显示模块”区域中的a-h端口上;要求:P0.0对应着a,P0.1对应着b,……,P0.7对应着h。
(2.把“单片机系统”区域中的P2.0端口用8芯排线连接到“动态数码显示模块”区域中的任一个公共端上。
MOV TL0,#(65536-50000) MOD 256
INC TCOUNT
MOV A,TCOUNT
CJNE A,#20,NEXT
MOV TCOUNT,#00H
INC SECOND
MOV A,SECOND
ANL A,#0FH
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
DELAY:
MOVR3,#7FH;延时子程序
DEL2:
MOVR4,#0FFH
DEL1:
NOP
DJNZR4,DEL1
DJNZR3,DEL2
RET
END
;------------------------------------------------------
;程序:用于关控制发二极管的显示方式
;------------------------------------------------------
NEXT:RETI
TABLE:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END
实验7外部中断实验
一、实验目的中断实验输出控制,学习中断程序设计方法,理解中断机制理解下降沿中断和低电平中断的区别。
二、实验要求编写主程序 实现系统的初始化,若有不同的初始化方式,应有状态指示;编写中断服务程序,服务程序操作以能明确判断发生一次中断为准,且有声光指示作为人机界面。实验前必须认真复习中断相关内容,并在实验报告上写出预习报告,给出实验方案,经过实验指导教师检查合格后,方可进行实验。实验结束后撰写实验报告画出实验原理图,给出程序流程及实现的全部代码。
INC DPTR
MOV A,B
ANL A,#0FH;(2000)内容屏蔽高位
MOVX @DPTR,A;送2002H
LOOP: JMP LOOP
END
实验四数据区传送子程序
一、实验目的掌握RAM中的数据操作
二、实验内容把R2、R3源RAM区首地址内的R6、R7字节数据传送到R4、R5目的RAM区。
三、实验程序框图
MOV P0,A
MOV TCOUNT,#00H
MOV TMOD,#01H
MOV TH0,#(65536-50000) / 256
MOV TL0,#(65536-50000) MOD 256
SETB TR0
SETB ET0
SETB EA
SJMP $
INT0X:
MOV TH0,#(65536-50000) / 256
END
汇编源程序(中断法)
SECONDEQU 30H
TCOUNTEQU 31H
ORG 00H
LJMP START
ORG 0BH
LJMP INT0X
START:SETB P2.0
MOV SECOND,#00H
MOV A,SECOND
ANL A,#0FH
MOV DPTR,#TABLE
MOVC A,@A+DPTR
INC TCOUNT
MOV A,TCOUNT
CJNE A,#20,NEXT
MOV TCOUNT,#00H
INC SECOND
MOV A,SECOND
CJNE A,#60,NEX
MOV SECOND,#00H
NEX:LJMP DISP
NEXT:LJMP WAIT
TABLE:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
实验原理
AT89S51单片机的内部16位定时/计数器是一个可编程定时/计数器,它既可以工作在13位定时方式,也可以工作在16位定时方式和8位定时方式。只要通过设置特殊功能寄存器TMOD,即可完成。定时/计数器何时工作也是通过软件来设定TCON特殊功能寄存器来完成的。
现在我们选择16位定时工作方式,对于T0来说,最大定时也只有65536us,即65.536ms,无法达到我们所需要的1秒的定时,因此,我们必须通过软件来处理这个问题,假设我们取T0的最大定时为50ms,即要定时1秒需要经过20次的50ms的定时。对于这20次我们就可以采用软件的方法来统计了。
ORG 0000H
LJMP SE01
ORG 0640H
SE01: MOV R0,#00H
MOV DPTR,#2000H;(0000H)送DPTR
LOO1: CLR A
MOVX @DPTR,A;0送(DPTR)
INC DPTR;DPTR+1
INC R0;字节数加1
CJNE R0,#00H,LOO1;不到FF个字节再清
4.一道有车而另一道无车时,使有车车道放行,K5键按下表示A道有车,K1键按下表示B道有车。
5.K9键按下表示有紧急车辆通过时,A、B道均为红灯。
控制码表
P1.7
P1.6
P1.5
P1.4
P1.3
P1.2
P1.1
P1.0
控制码
(P1口数据)
状态说明
(空)
(空)
B线
绿灯
B线
黄灯
B线
红灯
A线
绿灯
A线
黄灯
A线
五、思考如何用断点方式调试本程序
六、程序清单文件名:SW02.ASM
ORG 0000H
LJMP SE02
ORG 0660H
SE02: MOV DPTR,#2000H
MOVX A,@DPTR
MOV B,A;(2000)→A→B
SWAP A;交换
ANL A,#0FH;屏蔽高位
INC DPTR
MOVX @DPTR,A;送2001H
ORG 07B0H
SE22: MOV DPL,R3
MOV DPH,R2;建立源程序首址
MOVX A,@DPTR;取数
MOV DPL,R5
MOV DPH,R4;目的地首址
MOVX @DPTR,A;传送
CNE R3,#0FFH,LO42
INC R2
LO42: INC R3;源地址加1
CJNE R5,#0FFH,LO43
MOVLED_PORT,#00H;否则,P3.4高电平,点亮所有发光二极管
SJMPSTART
DDPING:
MOVLED_PORT,#55H;P3.4接地,发光二极管交叉亮灭
SJMPSTART
END
实验六 P3口输入P1口输出实验
一、实验目的P3口输入P1口输出,实现I/O控制。
二、实验要求撰写实源自文库报告,给出输入输出实现方式,画出实验原理图,给出程序流程及实现的全部代码。
LED_PORTEQUP1
ORG0000H;程序从地址0000H开始存放
LJMPSTART
ORG0100H
START:
CLREA;关闭所有中断
MOVLED_PORT,#00H;点亮所有发光二极管
LCALLDELAY;延时
MOVLED_PORT,#0FFH;灭掉所有发光二极管
LCALLDELAY
SJMPSTART;重复闪动
INC R4
LO43:INC R5;目的地址加1
CJNE R7,#00H,LO44
CJNE R6,#00H,LO45;字节数减1
LOOP: SJMP LOOP
NOP
LO44:DEC R7
SJMP SE22
LO45:DEC R7
DEC R6
SJMP SE22;未完继续
END
实验五 简单I/O口应用
一、实验目的 掌握P1口作为I/O口的使用方法,理解读引脚和读锁存器的区别。
实验二清零程序
一、实验目的掌握汇编语言设计和调试方法,熟悉键盘操作。
二、实验内容把2000H~20FFH的内容清零。
三、实验程序框图
四、实验步骤用连续或单步的方式运行程序,检查2000~20FF中执行程序前后的内容变化。
五、思考假使把2000H~20FFH中的内容改成FF,如何修改程序。
六、程序清单文件名:SW01.ASM
二、实验要求 运行不同的程序,观察发光二极管的亮灭状态,比较程序的特点,了解汇编语言设计的基本思路和指令应用。
三、思想描述
流程图:
;------------------------------------------------------
;程序:所有发光二极管不停地闪动
;-------------------- ----------------------------------
实验结果
汇编源程序(查询法)
SECONDEQU 30H
TCOUNTEQU 31H
ORG 00H
START:SETB P2.0
MOV SECOND,#00H
MOV TCOUNT,#00H
MOV TMOD,#01H
MOV TH0,#(65536-50000) / 256
MOV TL0,#(65536-50000) MOD 256
SETB TR0
DISP:MOV A,SECOND
ANL A,#0FH
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
WAIT:JNB TF0,WAIT
CLR TF0
MOV TH0,#(65536-50000) / 256
MOV TL0,#(65536-50000) MOD 256
MOVTMOD,#10H;置定时器1为方式1
MOVIE,#85H;开CPU中断,开外中断0,1中断
DISP:
MOVP1,#0F3H;A绿灯放行,B红灯禁止
MOVR2,#6EH;置0.5秒循环次数
DISP1:
LCALLDELAY;调用0.5秒延时子程序
DJNZR2,DISP1;55秒不到继续循环