单片机实验讲义.docx

上传人:b****5 文档编号:29185386 上传时间:2023-07-21 格式:DOCX 页数:37 大小:950.79KB
下载 相关 举报
单片机实验讲义.docx_第1页
第1页 / 共37页
单片机实验讲义.docx_第2页
第2页 / 共37页
单片机实验讲义.docx_第3页
第3页 / 共37页
单片机实验讲义.docx_第4页
第4页 / 共37页
单片机实验讲义.docx_第5页
第5页 / 共37页
点击查看更多>>
下载资源
资源描述

单片机实验讲义.docx

《单片机实验讲义.docx》由会员分享,可在线阅读,更多相关《单片机实验讲义.docx(37页珍藏版)》请在冰豆网上搜索。

单片机实验讲义.docx

单片机实验讲义

实验一单片机监控程序实验(4学时)

实验预习要求:

1.按照附3学习使用Keil软件。

2.熟悉键盘和显示器接口及工作原理。

3.根据实验原理,读懂验证实验程序,并写出设计性实验源程序。

4.思考题:

(1)从附1.2监控程序可以看出:

六位数码管显示的数据存放在单片机中存储器哪些位置?

(2)参考图1.1A与监控程序,键盘上若数字键7被按下,单片机怎样判断该键被按下?

一、实验目的

1.掌握8031系统中,键盘和显示器的接口方法。

2.掌握键盘扫描和LED八段码显示器的工作原理。

3.掌握对单片机IO口的控制编程。

二、实验器材

PC机一台,Lab2000P教学实验系统一台,导线数根。

三、实验内容

1.验证性实验

利用实验仪提供的键盘扫描电路和显示电路,做一个扫描键盘和数码显示实验,把按键输

入的键码在八位数码管上显示出来。

2.设计性实验

用Lab2000P教学实验系统(见附2图),P1口产生一矩形波(周期可自己设定),设计的

程序加到验证实验程序中,放在单片机程序空间0280h开始位置。

程序运行时,把产生矩形波的P1口(P1.0~P1.7任意一个口)接到示波器,观察设计程序

运行时P1口产生的波形是否正确。

四、实验原理

1.实验仪器简介

实验设备中Lab2000P教学实验系统是核心部件,所有实验都通过计算机处理后下载到实验

箱中进行验证。

本实验系统提供了多个模块,本次实验使用的主要模块为:

单片机8031模块、

8255模块。

4×6键盘模块,六位LED显示模块等。

2.键盘扫描显示原理

键盘与六位LED显示器连接电路图见图1.1。

(1)芯片介绍

(1)芯片介绍

74HC245:

高速CMOS型8位双向总线收发器(三态)。

主要用于数据总线的同步双

向通信,起总线隔离驱动作用。

74HC374:

为八D触发器集成芯片,电路中起显示驱动作用。

(2)扫描键盘和LED显示原理

本实验仪的LED显示电路和键盘电路如图1.1(A)。

显示控制的位码由芯片74374

(1)

输出,经反向驱动后(反向驱动芯片MC1413),作为LED的位选通信号。

位选通信号也

同时作为键盘列扫描码,键盘扫描的行数据从芯片74245读回单片机,74374

(1)输出的列扫描码经245读入后,用来判断是否有键被按下,以及按下的是什么键。

如果没有键按下,由于上拉电阻的作用,经245读回的数据位均为高,如果有键按下,74374

(1)输出的低电平经过按键被接到245的端口上,这样从245读回的数据就会有低位,根据74374

(1)输出的列信号和245读回的行信号,就可以判断哪个键被按下。

LED显示的段码由74374输出。

(2)键盘和LED显示的地址译码见图1.1(B),做键盘和LED显示实验时,需将KEY/LEDCS

接到相应的地址译码上。

位码输出的地址为0X002H,段码输出的地址为0X004H,键盘行

码读回的地址为0X001H,此处X是由KEY/LEDCS决定,参见地址译码。

例如将KEY/LED

CS接到地址译码的CS0(如图1.2)上,那么位码输出的地址就为08002H,段码输出的地

址就是08004H,键盘行码读回的地址为08001H。

(3)Lab2000P实验仪单片机系统138译码电路

其中:

CS0:

08000H~08FFFHCS1:

09000H~09FFFHCS2:

0A000H~0AFFFH

CS3:

0B000H~0BFFFHCS4:

0C000H~0CFFFHCS5:

0D000H~0DFFFH

CS6:

0E000H~0EFFFHCS7:

0F000H~0FFFFH

4.段码表和键码表

(1)段码表

七段数码管的字符型代码表如下表:

(2)键码表

KeyTable:

;键码定义

功能键:

16h,15h,14h,0ffh分别对应MON,LAST,NEXT,RST

13h,12h,11h,10h分别对应TRACE/MODE,MOVE,HERE,EXEC

数字键:

0dh,0ch,0bh,0ah分别对应D,C,B,A

0eh,03h,06h,09h分别对应E,3,6,9

0fh,02h,05h,08h分别对应F,2,5,8

00h,01h,04h,07h分别对应0,1,4,7

3.验证实验程序流程

(1)主程序流程

(2)键盘扫描子程序流程图(如图1.4所示)。

五、实验步骤

1.运行Keil软件,按照附1.3“Keil软件使用的参考步骤”步骤1~10,建立工程、编

译、链接。

2、硬件连接:

(1)POD51/96模块中跳线设置:

S1:

接80C51,EA:

接地。

(2)连线:

连接片选信号,将KEY/LEDCS连接到CS0即可(具体的电路原理图请参

考图1.1);8255的片选连接到CS1。

(3)用串口线连接Lab2000P实验箱(右上角标有“仿真器串口”处)到PC机。

用电

源线连接实验箱到220V电源,开启实验箱的电源(电源开关在实验箱的左侧)。

3、按照附1.3步骤11~12下载目标文件,并全速运行程序,

4、程序全速运行时,从实验箱上的键盘输入0200,再按实验箱上的键盘“EXEC”键,

观察实验结果。

等到最左边的数码管显示“0”时,再从键盘输入0300,然后按“EXEC”

键,用示波器观察8255的PA、PB、PC口输出的波形。

或者把PA、PB、PC中的每位输出连

接到实验箱中“逻辑笔”输入,观察指示灯的变化。

5、开始做设计实验。

附1.2:

验证实验程序

/*监控程序:

包括键盘扫描、8字循环显示、8255三个口输出方波*/

OUTBITequ08002h;位控制口

OUTSEGequ08004h;段控制口

INequ08001h;键盘读入口

Ctrl_8255equ09003h;8255控制口地址

PA_8255equ09000h;8255A口地址

LEDBufequ60h;键盘输入数字显示缓冲

LEDBuf1equ70h;六位数码管循环显示缓存

LEDBuf2equ50h;键码缓存,用于跳转用

ljmpStart

LEDMap:

;八段管显示码

db3fh,06h,5bh,4fh,66h,6dh,7dh,07h

db7fh,6fh,77h,7ch,39h,5eh,79h,71h

;==============================延时子程序============================

Delay:

movr7,#0

DelayLoop:

djnzr7,DelayLoop

djnzr6,DelayLoop

ret

;========================6位数码管轮流显示子程序=======================

DisplayLED:

movr0,#020h

movr1,#6;共6个八段管

movr2,#00100000b;从左边开始显示

Loop:

movdptr,#OUTBIT

mova,#0

movx@dptr,a;关所有八段管

mova,@r0

movdptr,#OUTSEG

movx@dptr,a

movdptr,#OUTBIT

mova,r2

movx@dptr,a;显示一位八段管

mova,r2;显示下一位

rra

movr2,a

incr0

djnzr1,Loop

ret

;==========================单片机读入键盘行的状态子程序===============

TestKey:

movdptr,#OUTBIT

mova,#0

movx@dptr,a;输出线置为0

movdptr,#IN

movxa,@dptr;读入键状态

cpla

anla,#0fh;高四位不用

ret

KeyTable:

;键码定义

db16h,15h,14h,0ffh

db13h,12h,11h,10h

db0dh,0ch,0bh,0ah

db0eh,03h,06h,09h

db0fh,02h,05h,08h

db00h,01h,04h,07h

;==========================扫描键盘子程序===========================

GetKey:

movdptr,#OUTBIT

movP2,dph

movr0,#Low(IN)

movr1,#00100000b

movr2,#6

KLoop:

mova,r1;找出键所在列

cpla

movx@dptr,a

cpla

rra

movr1,a;下一列

movxa,@r0

cpla

anla,#0fh

jnzGoon1;该列有键入

djnzr2,KLoop

movr2,#0ffh;没有键按下,返回0ffh

sjmpExit

Goon1:

movr1,a;键值=(列-1)X4+(行-1),从第1列、第1行开始

mova,r2

deca

rla

rla

movr2,a;r2=(r2-1)*4

mova,r1;r1中为读入的行值

movr1,#4

LoopC:

rrca;移位找出所在行

jcExit

incr2;r2=r2+行值

djnzr1,LoopC

Exit:

mova,r2;取出键码

movdptr,#KeyTable

movca,@a+dptr

movr2,a

WaitRelease:

movdptr,#OUTBIT;等键释放

clra

movx@dptr,a

movr6,#10

callDelay

callTestKey

jnzWaitRelease

mova,r2

ret

;================查找A中存放的数所对应LED显示段码子程序==============

ToLED:

movdptr,#LEDMap

movca,@a+dptr

ret

===========将键码(在A中)存放到LEDBuf2所指向的内部存储器单元===========

ToKeyTable:

movr1,LEDBuf2

mov@r1,a

ret

;==========================初始化单片机内存子程序=====================

InitLED:

mov20h,#3fh

mov21h,#0h

mov22h,#0h

mov23h,#0h

mov24h,#0h

mov25h,#0h

ret

////////////////////////////////////////////////////////////主程序///////////////////////////////////////////////////////////////

Start:

movLEDBuf,#020h

movLEDBuf2,#30h

callInitLED

movLEDBuf1+0,#0ffh;六位循环显示8.8.8.8.8.8.

movLEDBuf1+1,#0ffh

movLEDBuf1+2,#0ffh

movLEDBuf1+3,#0ffh

movLEDBuf1+4,#0ffh

movLEDBuf1+5,#0ffh

movr4,#6

MLoop:

callDisplayLED

callTestKey;有键入?

jzMLoop;无键入,继续显示

callGetKey;读入键码

jb0e4h,commkey;如果ACC.4为1,则为命令键,转到commkey处理

numkey:

movr0,a;保存数据a

callToKeyTable

mova,r0

anla,#0fh;显示键码

callToLED

movr0,LEDBuf

mov@r0,a

incLEDBuf

incLEDBuf2

djnzr4,MLoop

movr4,#6

movLEDBuf,#020h

movLEDBuf2,#030h

ljmpMLoop

commkey:

;处理命令键

cjnea,#13h,start;如果按下的键不是EXEC,则转向程序开始

callnextkey

;==========================把dph、dpl压入堆栈子程序====================

nextkey:

acallpickdata

pushdpl

pushdph

ret;dph与dpl弹出堆栈赋给PC

;========

;单片机内部RAM30h-33h单元中存储的是从键盘输入的地址,用于改变PC,执行相应的程

序;

pickdata:

movr0,#031h;将30H、31H单元中的低4位数据赋给DPH

acallpickone

movdph,a

movr0,#033h;将32H、33H单元中的4位数据赋给DPL

acallpickone

movdpl,a

ret

;=============================取相邻内存单元低4位子程序================

;取出r0与r0-1所指向的单元中低4位数据,并保存到A中,只取低4位,键盘上输入的每

位数据(0到;F)最多只用到4位表示

pickone:

mova,@r0

anla,#0fh

movr1,a

decr0

mova,@r0

swapa

anla,#0f0h

orla,r1

ret

////////////////////////////////////六位数码管轮流显示“8”字,从左到右共循环10次////////////////////////////

org0200h

movr0,#4

clra

movr3,#10;循环次数,可自行设置

DisplayLED1:

;轮流显示

movr0,#LEDBuf1

movr1,#6;共6个八段管

movr2,#00100000b;从左边开始显示

Loop1:

movdptr,#OUTBIT

mova,#0

movx@dptr,a;关所有八段管

mova,@r0

movdptr,#OUTSEG

movx@dptr,a

movdptr,#OUTBIT

mova,r2

movx@dptr,a;显示一位八段管

movr6,#200

callDelay;延迟值如果设定的太大的话,就会检测不到按键

mova,r2;显示下一位

rra

movr2,a

incr0

djnzr1,Loop1

djnzr3,DisplayLED1

acallInitLED;重新从左边显示

movr4,#6

movLEDBuf,#020h

movLEDBuf2,#030h

ajmpMLoop

//////////////////////////////////////8255的PA,PB,PC口分别循环输出方波程序///////////////////////////

org0300h

testPort:

movdptr,#Ctrl_8255

mova,#80h

movx@dptr,a

mova,#55h

movr3,#20;循环次数,可自行设置

testPortA:

movdptr,#PA_8255;PA口

movx@dptr,a

incdptr

movx@dptr,a;PB口

incdptr

movx@dptr,a;PC口

rra

movr6,#200;输出延时,可自行设置延时时间

acallDelay

djnzr3,testPortA

ajmpMLoop

end

附1.3:

Keil的使用步骤参考

1、点击”ProjectNewProject……”,新建一个工程文件,在CreatNewProject窗口

中输入工程名。

2、CreatNewProject窗口中,点击“确定”,然后出现如下窗口,选择使用CPU的

厂家和型号,本实验选用芯片为Intel公司的8051AH。

3、点击“确定”后,在出现的如下窗口中选择“否”。

4、新建文件,File->New……或直接点击快捷按钮CreataNewFile,然后编写程序。

文件也可以在建立工程之前建立并编写。

5、保存文件,注意文件名必须有后缀名,若是汇编程序后缀名为.asm,C程序为.c。

6、把文件添加到建立的工程中,如下图,点击ProjectWorkspace窗口中的Source

Group1,单击鼠标右键,在弹出的菜单中选择“AddFilesGroup“SourceGroup1””

7、找到程序文件保存的目录,在出现如下图所示的窗口中,单击“ADD”按钮。

8、按照下图1.12所示选择“OptionforTarget“Target1””。

9、单击选择OptionforTarget“Target1”窗口中的Debug。

设置.Use为“WAVEEmulator

Driver”。

10、Project->Rebuildalltargetfiles,工程编译链接。

注意:

观察输出窗口,看是否有

错误提示,若有错误,需修改程序中的错误,然后再编译链接直至没有错误提示。

11、下载程序到仿真系统,选择Debug->start/stopDebugSession。

12、运行程序Debug->Go或按快捷键F5,若单步运行程序,可选择Debug->Step。

提示:

若需停止程序运行,选择Debug->StopRunning,然后再选择Debug->start/stop

DebugSession

实验二A/D转换实验(3学时)

实验预习要求:

1.熟悉AD0809工作原理,熟悉单片机中断编程方法。

2.写出设计性实验源程序。

3.思考题:

参考ADC0809转换电路图,ADC0809的控制引脚ALE、ENABLE、START怎样和单片机

连接?

叙述其原理。

一、实验目的

1.理解A/D转换的基本原理。

2.掌握A/D转换芯片0809的性能及编程方法。

3.掌握单片机系统中扩展A/D和8255的基本方法。

4.掌握单片机外部中断编程方法。

二、实验器材

PC机一台,Lab2000P教学实验系统一台,导线数根

三、实验内容

1.验证性实验

利用实验箱上的ADC0809做A/D转换实验,实验板上的电位器提供模拟量输入,验证

程序将模拟量转换成二进制数字量,用8255的PA口输出到发光二极管显示。

2.设计性实验

ADC0809芯片A/D转换结束后会自动产生EOC信号,将EOC与CPU的外部中断相

接,在验证实验基础上,用中断方式编程读回A/D结果。

四、实验原理

A/D转换器大致有三类:

一是双积分A/D转换器,优点是精度高,抗干扰性好;价格

便宜,但速度慢;二是逐次逼近A/D转换器,精度,速度,价格适中;三是并行A/D转换

器,速度快,价格也昂贵。

实验用的ADC0809属第二类,是八位A/D转换器。

每采集一次一般需100us。

本程序是用延时查询方式读入A/D转换结果。

验证程序流程图如图2.4所示。

五、实验步骤

1.验证实验

(1)导线连接

a.将KEY/LEDCS连接到CS0;

b.AD_CS连接到CS3;

c.8255片选8255CS连接到CS1;

d.PA口PA0~PA7连接到LED模块中的L0~L7对应插孔;

e.ADC0809模拟输入连接到电位器模块中的“输入”。

(2)连接Lab2000P仿真器串口到PC机;连接实验箱的电源并开启。

(3)运行Keil软件,按照实验一附1.3“Keil的使用步骤参考”建立工程、添加实验程

序、编译链接。

注意:

Project下OptionforTarget…->Debug下设置use仿真器为WAVE

EmulaterDriver。

(4)程序下载后全速运行,从实验箱上的键盘输入“0340”,然后按“EXEC”键,

用电位器调节ADC0809的模拟输入,观察发光二极管的状态,思考状态变化的原因。

用万

用表测量模拟输入的电压值并记录,从发光二极管的状态读出AD转换后的数字量并记录。

再调节ADC0809的模拟输入,从发光二极管的状态读出AD转换后的数字量并记录。

如此重

复,共记录8组数据。

2.设计实验

(1)导线连接:

a.将E

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

当前位置:首页 > 初中教育 > 英语

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

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