当前位置:文档之家› 单片机及其接口技术实验报告

单片机及其接口技术实验报告

单片机及其接口技术实验报告
单片机及其接口技术实验报告

单片机及接口技术实验报告

实验一数据传送程序

一、实验目的

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

结果:

程序运行前

运行后

相关主题
文本预览
相关文档 最新文档