1、单片机实验讲义实验一 单片机监控程序实验(4 学时)实验预习要求: 1按照附3学习使用Keil软件。 2熟悉键盘和显示器接口及工作原理。 3根据实验原理,读懂验证实验程序,并写出设计性实验源程序。 4思考题: (1)从附1.2监控程序可以看出:六位数码管显示的数据存放在单片机中存储器哪些位置? (2)参考图1.1A与监控程序,键盘上若数字键7被按下,单片机怎样判断该键被按下? 一、实验目的 1掌握 8031 系统中,键盘和显示器的接口方法。 2掌握键盘扫描和 LED八段码显示器的工作原理。 3掌握对单片机 IO口的控制编程。 二、 实验器材PC 机一台,Lab2000P 教学实验系统一台,导线
2、数根。 三、实验内容 1验证性实验 利用实验仪提供的键盘扫描电路和显示电路,做一个扫描键盘和数码显示实验,把按键输入的键码在八位数码管上显示出来。 2设计性实验 用 Lab2000P 教学实验系统(见附 2图),P1 口产生一矩形波(周期可自己设定),设计的程序加到验证实验程序中,放在单片机程序空间 0280h 开始位置。 程序运行时,把产生矩形波的 P1 口(P1.0P1.7任意一个口)接到示波器,观察设计程序运行时 P1 口产生的波形是否正确。 四、实验原理 1 实验仪器简介 实验设备中Lab2000P教学实验系统是核心部件,所有实验都通过计算机处理后下载到实验箱中进行验证。本实验系统提供
3、了多个模块,本次实验使用的主要模块为:单片机8031模块、8255模块。46键盘模块,六位LED显示模块等。 2键盘扫描显示原理 键盘与六位 LED显示器连接电路图见图 1.1。 (1)芯片介绍 (1)芯片介绍 74HC245:高速 CMOS型 8 位双向总线收发器(三态)。主要用于数据总线的同步双向通信,起总线隔离驱动作用。 74HC374:为八 D触发器集成芯片,电路中起显示驱动作用。 (2)扫描键盘和 LED显示原理 本实验仪的 LED显示电路和键盘电路如图 1.1(A)。显示控制的位码由芯片 74374(1)输出,经反向驱动后(反向驱动芯片 MC1413),作为 LED 的位选通信号。
4、位选通信号也同时作为键盘列扫描码,键盘扫描的行数据从芯片 74245读回单片机,74374(1)输出的列扫描码经 245 读入后,用来判断是否有键被按下,以及按下的是什么键。如果没有键按下,由于上拉电阻的作用,经 245 读回的数据位均为高,如果有键按下,74374(1)输出的低电平经过按键被接到 245 的端口上,这样从 245 读回的数据就会有低位,根据 74374(1)输出的列信号和 245 读回的行信号,就可以判断哪个键被按下。LED显示的段码由 74374输出。 (2)键盘和LED显示的地址译码见图1.1(B),做键盘和LED显示实验时,需将KEY/LED CS 接到相应的地址译码上
5、。位码输出的地址为 0X002H,段码输出的地址为 0X004H,键盘行码读回的地址为 0X001H,此处 X是由 KEY/LED CS 决定,参见地址译码。例如将 KEY/LED CS 接到地址译码的 CS0(如图 1.2)上,那么位码输出的地址就为 08002H,段码输出的地址就是 08004H,键盘行码读回的地址为 08001H。 (3)Lab2000P实验仪单片机系统 138译码电路其中:CS0: 08000H08FFFH CS1: 09000H09FFFH CS2: 0A000H0AFFFH CS3: 0B000H0BFFFH CS4: 0C000H0CFFFH CS5: 0D000
6、H0DFFFH CS6: 0E000H0EFFFH CS7: 0F000H0FFFFH4. 段码表和键码表 (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
7、 00h, 01h, 04h, 07h 分别对应 0,1,4,73. 验证实验程序流程 (1)主程序流程(2)键盘扫描子程序流程图(如图1.4所示)。 五、实验步骤 1运行Keil软件,按照附1.3 “Keil软件使用的参考步骤”步骤110,建立工程、编译、链接。 2、硬件连接: (1)POD51/96模块中跳线设置:S1:接80C51,EA:接地。 (2)连线:连接片选信号,将KEY/LED CS连接到CS0即可(具体的电路原理图请参考图1.1);8255的片选连接到CS1。 (3)用串口线连接Lab2000P实验箱(右上角标有“仿真器串口”处)到PC机。用电源线连接实验箱到220V电源,开
8、启实验箱的电源(电源开关在实验箱的左侧)。 3、按照附1.3步骤1112下载目标文件,并全速运行程序, 4、程序全速运行时,从实验箱上的键盘输入0200,再按实验箱上的键盘“EXEC”键,观察实验结果。等到最左边的数码管显示“0”时,再从键盘输入0300,然后按“EXEC”键,用示波器观察8255的PA、PB、PC口输出的波形。或者把PA、PB、PC中的每位输出连接到实验箱中“逻辑笔”输入,观察指示灯的变化。 5、开始做设计实验。附 1.2:验证实验程序 /*监控程序:包括键盘扫描、8 字循环显示、8255三个口输出方波*/ OUTBIT equ 08002h ; 位控制口 OUTSEG eq
9、u 08004h ; 段控制口 IN equ 08001h ; 键盘读入口 Ctrl_8255 equ 09003h ; 8255 控制口地址 PA_8255 equ 09000h ; 8255A口地址 LEDBuf equ 60h ; 键盘输入数字显示缓冲 LEDBuf1 equ 70h ; 六位数码管循环显示缓存 LEDBuf2 equ 50h ; 键码缓存,用于跳转用 ljmp Start LEDMap: ; 八段管显示码 db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h
10、 ;= = 延时子程序= Delay: mov r7, #0 DelayLoop: djnz r7, DelayLoop djnz r6, DelayLoop ret ;=6 位数码管轮流显示子程序= DisplayLED: mov r0, #020h mov r1, #6 ; 共6 个八段管 mov r2, #00100000b ; 从左边开始显示 Loop: mov dptr, #OUTBIT mov a, #0 movx dptr, a ; 关所有八段管 mov a, r0 mov dptr, #OUTSEG movx dptr,a mov dptr, #OUTBIT mov a, r2
11、 movx dptr, a ; 显示一位八段管 mov a, r2 ; 显示下一位 rr a mov r2, a inc r0 djnz r1, Loop ret ;= 单片机读入键盘行的状态子程序 = TestKey: mov dptr, #OUTBIT mov a, #0 movx dptr, a ; 输出线置为 0 mov dptr, #IN movx a, dptr ; 读入键状态 cpl a anl a, #0fh ; 高四位不用 ret KeyTable: ; 键码定义 db 16h, 15h, 14h, 0ffh db 13h, 12h, 11h, 10h db 0dh, 0ch
12、, 0bh, 0ah db 0eh, 03h, 06h, 09h db 0fh, 02h, 05h, 08h db 00h, 01h, 04h, 07h ;=扫描键盘子程序 = GetKey: mov dptr, #OUTBIT mov P2, dph mov r0, #Low(IN) mov r1, #00100000b mov r2, #6 KLoop: mov a, r1 ; 找出键所在列 cpl a movx dptr, a cpl a rr a mov r1, a ; 下一列 movx a, r0 cpl a anl a, #0fh jnz Goon1 ; 该列有键入 djnz r2
13、, KLoop mov r2, #0ffh ; 没有键按下, 返回 0ffh sjmp Exit Goon1: mov r1, a ; 键值 = (列1) X 4 + (行1),从第 1 列、第 1 行开始 mov a, r2 dec a rl a rl a mov r2, a ; r2 = (r2-1)*4 mov a, r1 ; r1 中为读入的行值 mov r1, #4 LoopC: rrc a ; 移位找出所在行 jc Exit inc r2 ; r2 = r2+ 行值 djnz r1, LoopC Exit: mov a, r2 ; 取出键码 mov dptr, #KeyTable
14、movc a, a+dptr mov r2, a WaitRelease: mov dptr, #OUTBIT ; 等键释放 clr a movx dptr, a mov r6, #10 call Delay call TestKey jnz WaitRelease mov a, r2 ret ;=查找 A中存放的数所对应 LED显示段码子程序 = ToLED: mov dptr, #LEDMap movc a, a+dptr ret =将键码(在A中) 存放到 LEDBuf2 所指向的内部存储器单元= ToKeyTable: mov r1,LEDBuf2 mov r1,a ret ;=初始化
15、单片机内存子程序= InitLED: mov 20h, #3fh mov 21h, #0h mov 22h, #0h mov 23h, #0h mov 24h, #0h mov 25h, #0h ret / 主程序 / Start: mov LEDBuf,#020h mov LEDBuf2,#30h call InitLED mov LEDBuf1+0, #0ffh ; 六位循环显示 8.8.8.8.8.8. mov LEDBuf1+1, #0ffh mov LEDBuf1+2, #0ffh mov LEDBuf1+3, #0ffh mov LEDBuf1+4, #0ffh mov LEDBu
16、f1+5, #0ffh mov r4,#6 MLoop: call DisplayLED call TestKey ;有键入? jz MLoop ;无键入, 继续显示 call GetKey ;读入键码 jb 0e4h,commkey ;如果 ACC.4 为1,则为命令键,转到 commkey 处理 numkey: mov r0,a ;保存数据 a call ToKeyTable mov a,r0 anl a, #0fh ;显示键码 call ToLED mov r0,LEDBuf mov r0,a inc LEDBuf inc LEDBuf2 djnz r4,MLoop mov r4,#6
17、mov LEDBuf,#020h mov LEDBuf2,#030h ljmp MLoop commkey: ;处理命令键 cjne a,#13h,start ;如果按下的键不是 EXEC,则转向程序开始 call nextkey ;=把 dph、dpl 压入堆栈子程序= nextkey: acall pickdata push dpl push dph ret ;dph 与 dpl 弹出堆栈赋给 PC ;= ;单片机内部 RAM30h-33h 单元中存储的是从键盘输入的地址,用于改变 PC,执行相应的程序; pickdata: mov r0,#031h ;将 30H、31H 单元中的低4 位
18、数据赋给 DPH acall pickone mov dph,a mov r0,#033h ;将 32H、33H 单元中的 4 位数据赋给 DPL acall pickone mov dpl,a ret ;=取相邻内存单元低 4 位子程序= ;取出 r0 与 r0-1 所指向的单元中低 4 位数据,并保存到 A 中,只取低 4 位,键盘上输入的每位数据(0 到;F)最多只用到 4 位表示 pickone: mov a,r0 anl a,#0fh mov r1,a dec r0 mov a,r0 swap a anl a,#0f0h orl a,r1 ret /六位数码管轮流显示“8”字,从左到
19、右共循环 10 次/ org 0200h mov r0,#4 clr a mov r3,#10 ;循环次数,可自行设置 DisplayLED1: ;轮流显示 mov r0, #LEDBuf1 mov r1, #6 ; 共 6个八段管 mov r2, #00100000b ; 从左边开始显示 Loop1: mov dptr, #OUTBIT mov a, #0 movx dptr, a ; 关所有八段管 mov a, r0 mov dptr, #OUTSEG movx dptr, a mov dptr, #OUTBIT mov a, r2 movx dptr, a ; 显示一位八段管 mov r
20、6, #200 call Delay ; 延迟值如果设定的太大的话,就会检测不到按键 mov a, r2 ; 显示下一位 rr a mov r2, a inc r0 djnz r1, Loop1 djnz r3, DisplayLED1 acall InitLED ;重新从左边显示 mov r4,#6 mov LEDBuf,#020h mov LEDBuf2,#030h ajmp MLoop /8255 的 PA,PB,PC 口 分别循环输出方波程序/ org 0300h testPort: mov dptr,#Ctrl_8255 mov a,#80h movx dptr,a mov a,#5
21、5h mov r3,#20 ;循环次数,可自行设置 testPortA: mov dptr,#PA_8255 ;PA 口 movx dptr,a inc dptr movx dptr,a ;PB 口 inc dptr movx dptr,a ;PC 口 rr a mov r6, #200 ;输出延时,可自行设置延时时间 acall Delay djnz r3, testPortA ajmp MLoop end 附 1.3:Keil 的使用步骤参考 1、 点击”ProjectNew Project”,新建一个工程文件,在 Creat New Project窗口中输入工程名。2、Creat New
22、 Project 窗口中,点击“确定”,然后出现如下窗口,选择使用 CPU的厂家和型号,本实验选用芯片为 Intel 公司的 8051AH。3、点击“确定”后,在出现的如下窗口中选择“否”。4、新建文件,File-New或直接点击快捷按钮 Creat a New File ,然后编写程序。文件也可以在建立工程之前建立并编写。 5、保存文件,注意文件名必须有后缀名,若是汇编程序后缀名为.asm,C 程序为.c。6、把文件添加到建立的工程中,如下图,点击 Project Workspace 窗口中的 Source Group1,单击鼠标右键,在弹出的菜单中选择“Add Files Group “S
23、ource Group 1”7、找到程序文件保存的目录,在出现如下图所示的窗口中,单击“ADD”按钮。8、按照下图1.12 所示选择“Option for Target “Target 1”。 9、 单击选择Option for Target “Target 1”窗口中的Debug。设置.Use为“WAVE Emulator Driver”。 10、Project-Rebuild all target files,工程编译链接。注意:观察输出窗口,看是否有错误提示,若有错误,需修改程序中的错误,然后再编译链接直至没有错误提示。 11、下载程序到仿真系统,选择 Debug-start/stop
24、Debug Session。 12、运行程序 Debug-Go 或按快捷键 F5,若单步运行程序,可选择 Debug-Step。 提示:若需停止程序运行,选择 Debug-Stop Running,然后再选择 Debug-start/stop Debug Session 实验二 A/D 转换实验 (3 学时)实验预习要求: 1熟悉AD0809工作原理,熟悉单片机中断编程方法。 2写出设计性实验源程序。 3思考题: 参考ADC0809转换电路图,ADC0809的控制引脚ALE、ENABLE、START怎样和单片机连接?叙述其原理。 一、实验目的 1理解 A/D转换的基本原理。 2掌握 A/D转换
25、芯片 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转换器大致有三
26、类:一是双积分 A/D转换器,优点是精度高,抗干扰性好;价格便宜,但速度慢;二是逐次逼近 A/D转换器,精度,速度,价格适中;三是并行 A/D转换器,速度快,价格也昂贵。 实验用的 ADC0809属第二类,是八位 A/D转换器。每采集一次一般需 100us。本程序是用延时查询方式读入 A/D转换结果。验证程序流程图如图 2.4 所示。 五、实验步骤 1验证实验 (1)导线连接 a . 将KEY/LED CS连接到CS0; b . AD_CS连接到CS3; c . 8255片选8255 CS连接到CS1; d . PA口PA0PA7连接到LED模块中的L0L7对应插孔; e . ADC0809模
27、拟输入连接到电位器模块中的“输入”。 (2)连接Lab2000P仿真器串口到PC机;连接实验箱的电源并开启。 (3)运行Keil软件,按照实验一附1.3“Keil的使用步骤参考”建立工程、添加实验程序、编译链接。注意:Project下Option for Target Debug下设置use仿真器为WAVE Emulater Driver。 (4)程序下载后全速运行,从实验箱上的键盘输入“0340”,然后按“EXEC”键,用电位器调节ADC0809的模拟输入,观察发光二极管的状态,思考状态变化的原因。用万用表测量模拟输入的电压值并记录,从发光二极管的状态读出AD转换后的数字量并记录。再调节ADC0809的模拟输入,从发光二极管的状态读出AD转换后的数字量并记录。如此重复,共记录8组数据。 2设计实验 (1)导线连接: a . 将E
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1