单片机及接口技术实验报告
实验一数据传送程序
一、实验目的
1、掌握汇编语言设计和调试方法。
2、掌握DVCC实验系统的操作步骤。
二、实验内容
1、编程实现,把7000H~70FFH单元的内容清零。
2、编程实现,把源地址为6000H开始的单元内容,传送到目的地址7000H开始的单元中,
传送个数为0FFFH个。
三、DVCC实验系统操作说明
1、接通DVCC实验系统电源,在DVCC实验箱上应显示闪动的“P”,否则按Reset
键。
2、运行DVCC软件。(程序DVCC598H实验系统DVCC实验系统)
3、单击工具栏上“新建”或“打开”按钮,编写源程序。单击“编译”按钮,
使其形成可执行文件。
4、单击工具栏上“联接”按钮,同时按下DVCC实验箱上PCDBG键(键盘上最
右边第2个),实现PC机和实验箱的联接。联机成功,屏幕上出现:.反汇编窗口、
寄存器标示位窗口。
5、在成功联机后,单击工具栏上“调试”按钮,把最终目标文件装载到实验系统
RAM区;或者通过单击菜单栏中的“动态调试”,选择“传送(.EXE)文件”来
实现。
6、单击工具栏上“运行”或“单步”按钮,运行实验程序。
7、单击工具栏上“窗口”,选择“显示内部数据窗口”或“显示外部数据窗口”
可显示数据窗口。鼠标右击数据窗口的数据,可设置数据块新地址;鼠标左键单
击数据,可修改数据数值。
8、运行完毕,先按实验箱上的复位按钮Reset键,再按PCDBG键,并且点击屏
幕上OK,即可退出运行状态。
四、实验程序代码
1、把7000H~70FFH单元的内容清零。
程序代码:
ORG 0000H
AJMP START
ORG 70H
START: MOV P2, #70H ;送地址高8位到P2端口
MOV R0, #00H ;R0=00H,表地址低8位
CLR A ;将累加器A清0
LOOP: MOVX @R0, A ;将A送入以R0内容为地址的外部RAM.
INC R0 ;R0+1-->R0
CJNE R0,#00H,LOOP;比较条件转移指令,若R0不等于0,则跳转到LOOP
AJMP $ ;暂停
END
2、编程实现,将源地址为6000H开始的单元,传送到目的地址7000H开始的单元,传送个数为0FFFH个。
程序代码:
ORG 0000H
AJMP START
ORG 50H
START: MOV DPTR, #6000H
MOV P2, #70H
MOV R0,#00H
LOOP: MOVX A, @DPTR
MOVX @R0, A
INC DPTR
INC R0
CJNE R0,#00H,LOOP;比较条件转移,若R0不等于0,则程序循环,执行loop.
INC P2
MOV R1,P2
CJNE R1,#80H,LOOP; 若R1不等与80h,则程序循环执行loop.
AJMP $
END
五、实验结果
1、把7000H~70FFH单元的内容清零。
2、编程实现,将源地址为6000H开始的单元,传送到目的地址7000H开始的单元,传送个数为0FFFH个。
上图是左下角的窗口显示的是存储器源地址为6000H开始的单元里的内容。
上图是程序运行后,存储器源地址为7000H开始的单元里的内容。
经比较可以看出传送成功。
六、问题与讨论
在做实验内容1时编译现在第10行出错,后来将第9和第10行后的注释都删除就编译通过了。
实验二并行口实验
一、实验目的
1、掌握P3口、P1口简单使用。
2、学习延时程序的编写和使用。
二、实验内容
1、编写程序用P1.0输出1kHz和500Hz的音频信号,以驱动扬声器作为报警信号。要求1kHz信号响100ms,500Hz信号响200ms,交替进行。P1.7接一开关,进行控制。当开关合上,报警信号响;当开关断开,报警信号停止。
(教材《单片机原理、接口及应用——嵌入式系统技术基础》P75 例4-3)
2、P3口做输入口,P1口做输出口。P3.3外接一脉冲,P1.0~P1.7接的8个发光二极管L1—L8。编写程序,使P3.3每输入一个脉冲,P1口按16进制加一方式逐次点亮发光二极管。
三、实验接线图(实验内容二接线图)
四、实验步骤
1、编写程序用P1.0输出1kHz和500Hz的音频信号,以驱动扬声器作为报警信号。要求1kHz信号响100ms,500Hz信号响200ms,交替进行。P1.7接一开关,进行控制。当开关合上,报警信号响;当开关断开,报警信号停止。
由于实验箱单片机P1.0是坏的,编程P1.1为输出,其他不变。
程序代码:
ORG 00h
START: SETB P1.7 ;P1. 7置1
JB P1.7, $;若P1.7为高电平,则循环检测,否则向下执行
MOV R1,#200;
LOOP: ACALL D500 ;
CPL P1.1 ; 产生1KHz的频率,P1.1取反输出
DJNZ R1,LOOP; R1减1,不为0时转移到LOOP,响100ms
MOV R2,#200
LOOP1: ACALL D500 ;
ACALL D500 ;
CPL P1.1 ; 产生500Hz的频率,P1.1取反输出
DJNZ R2,LOOP1; R2减1,不为0时转移到LOOP,响200ms
SJMP START ; 跳转至START
D500: MOV R6,#125 ; 延迟500us
DJNZ R6,$
RET
END
2、P3口做输入口,P1口做输出口。P3.3外接一脉冲,P1.0~P1.7接的8个发光二极管L1—L8。编写程序,使P3.3每输入一个脉冲,P1口按16进制加一方式逐次点亮发光二极管。
实验2接了4个口,从P1.1到P1.4,两次脉冲,灯变化
程序代码:
ORG 00H
CLR A
SETB P3.3 ;将P3.3置1
BEG: JB P3.3, $
ACALL D500;
JNB P3.3,$
ACALL D500
INC A
MOV P1,A ; P1口输出
SJMP BEG
D500: MOV R7,#125 ;延时500us(6Mhz)
DJNZ R7,$
RET
END
五.问题与讨论
1、做实验内容1时,刚开始用P1.0口输出,铃总是不响,接示波器也不输出波形。经测试铃是好的,怀疑程序有问题,就将程序改成一直只输出1KHz的频率,还是不出波形。最后换成P1.1口输出,调试程序运行铃就响了。
2、实验内容2要求P1口输出接8个LED管,为节省时间,接4个输出观察实验结果就
行了。我们实验箱接的是P1.1—P1.4,实验结果有所不同,P3.3每输入两个脉冲,P1口按4进制加一方式逐次点亮发光二极管。
实验三中断实验
一、实验目的
1)掌握中断程序的编程方法。
2)进一步掌握P1、P3口的双功能使用方法。
二、实验内容
正常情况下,仅绿灯亮。有故障发生时,绿灯灭,同时红灯闪烁;故障排除后,拨上总开关,恢复正常,绿灯亮,红灯灭。
可由P1.0 控制绿灯的亮灭;P3.3 接外部中断源,模拟故障发生;P1.1 控制红灯的亮灭;P1.2 读取总开头的状态。编写程序实现以上功能。
(P3.3 复用为外部中断1输入,即为INT1。其中断向量地址为0013H,使用下降沿触发中断。)
三、实验程序框图
主程序:
中断服务程序:
四、实验步骤
1、由P1.1 控制绿灯的亮灭;P3.3 接外部中断源,模拟故障发生;P1.2 控制红灯的亮灭;P1.3读取总开头的状态。P3.3 复用为外部中断1输入,即为INT1。其中断向量地址为0013H,使用下降沿触发中断。
程序代码:
ORG 0000h
AJMP MAIN ;主程序
ORG 0013H ;中断矢量表p211
AJMP IRPRO ;中断服务程序入口
ORG 0050H ;主程序
MAIN: CLR P1.2 ;红灯灭
SETB P1.1 ;绿灯亮
SETB IT1 ;设置INT1负边缘触发p206(定时器控制寄存器TCON)
SETB EX1 ;外部中断1有效p208(中断容许控制器IE)
SETB EA ;开中断p208(中断容许控制器IE)
LOOP1: JB P1.1, LOOP1
LOOP2: JNB P1.3,LOOP2
SETB P1.1
SJMP LOOP1
AL1: AJMP AL1
;中断服务程序
IRPRO: PUSH PSW
PUSH ACC
CLR P1.1; 灭绿灯
LOOP3: SETB P1.2;亮红灯
ACALL D500
CPL P1.2
ACALL D500
JNB P1.3,LOOP3 ;这里用P1.2进行监视,若开关没有闭合,则红灯一直闪烁。
POP ACC
POP PSW
RETI
D500: MOV R6,#255 ;延时子程序
DELAY: MOV R7,#0FFH
DJNZ R7,$
DJNZ R6,DELAY
RET
END
实验接线:P1.1 接绿灯;P1.2接红灯;P1.3 开关K1;P3.3 接点触开关SP
2、将实验内容1中的外部中断源换成INT0,其中断向量地址为0003H,使用下降沿触发中断。
程序代码:
ORG 0000h
AJMP MAIN ;主程序
ORG 0003H ;中断矢量表p211
AJMP IRPRO ;中断服务程序入口
ORG 0050H ;主程序
MAIN: CLR P1.2 ;红灯灭
SETB P1.1 ;绿灯亮
SETB IT0 ;设置INT0负边缘触发p206(定时器控制寄存器TCON)
SETB EX0 ;外部中断0有效p208(中断容许控制器IE)
SETB EA ;开中断p208(中断容许控制器IE)
LOOP1: JB P1.1, LOOP1
LOOP2: JNB P1.3,LOOP2
SETB P1.1
SJMP LOOP1
AL1: AJMP AL1
;中断服务程序
IRPRO: PUSH PSW
PUSH ACC
CLR P1.1; 灭绿灯
LOOP3: SETB P1.2;亮红灯
ACALL D500
CPL P1.2
ACALL D500
JNB P1.3,LOOP3 ;这里用P1.3进行监视,若开关没有闭合,则红灯一直闪烁。
POP ACC
POP PSW
RETI ; 中断返回
D500: MOV R6,#255 ;延时子程序
DELAY: MOV R7,#0FFH
DJNZ R7,$
DJNZ R6,DELAY
RET
END
实验接线:P1.1 接绿灯;P1.2接红灯;P1.3 开关K1;P3.2 接点触开关SP
3、在实验内容1的实现功能中加上有故障发生时,绿灯灭,红灯闪烁同时报警;
程序代码:
ORG 0000h
AJMP MAIN ;主程序
ORG 0013H ;中断矢量表p211
AJMP IRPRO ;中断服务程序入口
ORG 0050H ;主程序
MAIN: CLR P1.2 ;红灯灭
SETB P1.1 ;绿灯亮
SETB IT1 ;设置INT1负边缘触发p206(定时器控制寄存器TCON)
SETB EX1 ;外部中断1有效p208(中断容许控制器IE)
SETB EA ;开中断p208(中断容许控制器IE) LOOP1: JB P1.1, LOOP1
LOOP2: JNB P1.3,LOOP2
SETB P1.1
SJMP LOOP1
AL1: AJMP AL1
;中断服务程序
IRPRO: PUSH PSW
PUSH ACC
CLR P1.1; 灭绿灯
LOOP3: SETB P1.2;亮红灯
ACALL D500
CPL P1.2
MOV R1,#200;
LOOP: ACALL D500U ;
CPL P1.4 ;P1.4取反输出
DJNZ R1,LOOP ;R1减1,不为0时转移到LOOP
JNB P1.3,LOOP3 ;这里用P1.2进行监视,若开关没有闭合,则红灯一直闪烁。
POP ACC
POP PSW
RETI
D500: MOV R6,#255 ;延时子程序
DELAY: MOV R7,#0FFH
DJNZ R7,$
DJNZ R6,DELAY
RET
D500U: MOV R5,#125 ;延迟500us
DJNZ R5,$
RET
END
实验接线:P1.1 接绿灯;P1.2接红灯;P1.3 开关K1;P1.4接响铃;P3.3 接点触开关SP
五、问题与讨论
1、实验内容1要注意P3.3 复用为外部中断1输入,即为INT1。其中断向量地址为0013H,使用下降沿触发中断将IT1置1,开总中断将EA置1,开外部中断1将EX1置1.
2、实验内容2要注意P3.2 复用为外部中断0输入,即为INT0。其中断向量地址为0003H,使用下降沿触发中断将IT0置1,开总中断将EA置1,开外部中断1将EX0置1.
3、实验内容3要加上一个输出接响铃,加上的响铃代码必须加在中断服务程序中红灯闪烁的那一段。响铃的声音要大一点,输出频率就要变大,最简单的方法就是加上一个延时子程序,响铃时调用。因为原有的延时子程序是使红灯闪烁,频率很低。
实验四定时/计数实验
一、实验目的
1、熟悉8031定时/计数功能。
2、掌握定时/计数初始化编程方法。
二、实验内容
1、选择T1工作于模式0定时,在P1.0脚上输出周期为4ms的方波,单片机采用6MHZ 晶振。
分析:输出周期为4ms的方波,即高低电平的持续时间均为2ms,那么只要使P1.0脚上的电平每隔2ms取反一次,就可得到周期为4ms的方波。将T1设为定时方式0:GATE=0,C/T=0,M1M0=00;T0不用,可为任意,只要不使其进入方式3(此时,定时器1对外停止计数),一般取0即可。
计数初值的计算:
单片机系统默认的定时/计数器的工作时钟是晶振经12分频的,即T=12/(6*106),所以计数初值为
X=(213-2ms/T)=213-(2*10-3*6*106)/12=8192-1000=7192=1110000011000B
因为是13位计数器,所以X的高8位装入TH1,X的低5位装入TL1的低5位,即TH1=0E0H,TL1=18H。
思考:T1计数结束采用中断工作方式,程序应如何编写?
2、在P1.7端接一个发光二极管LED,要求利用定时器控制,使LED亮1秒、灭1秒,
f=6MHZ。
周而复始,设
osc
三、实验内容一参考程序框图:
四、实验步骤
1、选择T1工作于模式0定时,在P1.0脚上输出周期为4ms的方波,单片机采用6MHZ 晶振。(查询方式)
程序代码:
ORG 0000H
MOV TMOD,#00H ;设定Timer1工作在模式0下
LOOP2: MOV TH1,#0E0H ;向Timer1中载入计数的初始值
MOV TL1,#18H
SETB TR1 ;启动
AGAIN: JBC TF1,LOOP1 ;定时时间到否?没有则继续查询,到了则输出,并清TF1位等。
SJMP AGAIN
LOOP1: CPL P1.0
SJMP LOOP2
END
思考:T1计数结束采用中断工作方式
程序代码:
ORG 0000H ;中断方式:选择T1工作,方式0
AJMP MAIN
ORG 001BH
AJMP TIMER_1
ORG 0030H
MAIN: SETB P1.0; P1.0输出为高电平
MOV TMOD,#00H; 设置定时器1,工作在定时方式0
MOV TH1,# 0E0H; 输入时间初始常数
MOV TL1,#18H
SETB TR1;启动Timer1
SETB EA; 开中断
SETB ET1;容许Timer1中断
WAIT: SJMP WAIT
TIMER_1: CPL P1.0
MOV TH1,#0FCH
MOV TL1,#18H
RETI
END
2、在P1.7端接一个发光二极管LED,要求利用定时器控制,使LED亮1秒、灭1秒,
f=6MHZ。
周而复始,设
osc
程序代码:
ORG 00H ;查询方式
AJMP MAIN
MAIN: MOV TMOD,#10H; 选择T1工作,方式1
SETB P1.0
SETB TR1 ;启动定时器
LOOP1: MOV R2,#20 ;设置调用延时的次数为20次
LOOP2: CALL DELAY ;调用50ms的延时
DJNZ R2,LOOP2 ;若调用延时次数不到,则继续调用延时程序
CPL P1.0 ;取反,输出
AJMP LOOP1
DELAY: MOV TH1,#9EH ;50ms的延时子程序
MOV TL1,#58H
LOOP: JBC TF1,NEXT
SJMP LOOP
NEXT: RET
END
用中断方式实现:
ORG 0000H ;中断方式:选择T1工作,方式1 ,TEST4_4
AJMP MAIN
ORG 001BH
AJMP TIMER_1
ORG 0030H
MAIN: SETB P1.0 ;主程序
MOV TMOD,#10H
MOV TH1,#09eH
MOV TL1,#58H
SETB TR1
SETB EA
SETB ET1
MOV R2,#20; 设置循环次数
WAIT: SJMP WAIT
TIMER_1: DJNZ R2, LOOP;中断服务程序
MOV R2,#20
CPL P1.0
LOOP: MOV TH1,#9EH
MOV TL1,#58H
RETI
END
实验五串行口应用实验
一、实验目的
掌握串行口工作方式的程序设计,掌握单片机通信程序编制方法。
二、实验内容
1、重复发送同一个数据,观察TXD端输出的波形。
将8031串口设为工作方式1,即10位异步收发,发送时钟由计数器控制;计数器T1设为定时工作,工作方式2,即自动重装8位计数器;波特率取1200 bps,不加倍;单片机采用6MHZ晶振。计数初值的计算:TH1=256-[(1+0)*fosc]/(12*32*BPS) P3.1复用为串行发送端TXD,将其接至示波器,观察输出波形。注意观察8位数据位前后的起始位和停止位。
2、自发自收。将代码段中定义的10个数据0~9,通过串口发送和接收,存放在外部存储器7000H开始的单元中。
实验内容一参考程序框图:
三、实验步骤及结果
1、重复发送同一个数据,观察TXD端输出的波形。
程序代码:
ORG 00H
START: MOV SCON,#50H;设置串口工作在模式1,接收使能
MOV TMOD,#20H;使用T1工作在模式2下
MOV TH1,#0F3H;波特率1200bps
MOV TL1,#0F3H;
SETB TR1;
MOV A,#0DH ;将数据赋给ACC
MOV SBUF,A ;发送数据送缓冲区
WAIT: JNB TI,$;等待发送
CLR TI;若发送完,则清TI
MOV SBUF,A; 未发完,则继续发送
AJMP W AIT; 循环发送
END
结果:将P3.1口接到示波器观察会有二进制010*******的波形。
2、自发自收。将代码段中定义的10个数据0~9,通过串口发送和接收,存放在外部存储器7000H开始的单元中。
程序代码:
ORG 00H
START: MOV SCON,#50H;设置串口工作在模式1,接收使能MOV TMOD,#20H;使用T1工作在模式2下
MOV DPTR,#7000H;将外部存储器初始地址赋给DPTR
MOV R0,#00H; 将0赋给R0
MOV TH1,#0F3H; 波特率1200bps
MOV TL1,#0F3H;
SETB TR1;
CLR A; 清ACC
LOOP: MOV A,R0; 将待发数据赋给A
INC R0; R0+1→R0
CJNE R0,#0BH,W AIT;判断是否发送完
SJMP $; 停机
WAIT: MOV SBUF,A; 数据发送到缓冲区
JNB TI,$; 等待发送
CLR TI; 数据发送完,则清TI
MOV SBUF,A; 未发完,则继续发送
MOV A,SBUF; 接收数据
JNB RI,$; 等待接收
CLR RI; 接收完,则清RI
MOV A,SBUF; 未接收完,则继续接收
MOVX @DPTR,A; 将接收的数据送到指定位置
INC DPTR ;DPTR自增1
JMP LOOP;跳回到LOOP,向串行口载入新数据。
END
结果:
程序运行前
运行后