单片机实验讲义.docx
《单片机实验讲义.docx》由会员分享,可在线阅读,更多相关《单片机实验讲义.docx(37页珍藏版)》请在冰豆网上搜索。
单片机实验讲义
实验一单片机监控程序实验(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