当前位置:文档之家› 《单片机原理及应用》实验指导书.

《单片机原理及应用》实验指导书.

单片机原理及应用实验指导书罗钧付丽编重庆大学光电工程学院2010年5月目录实验规则 (2实验一单片机监控程序实验(4学时 (3 附1.1:LAB2000P实验仪 (9附1.2:验证实验程序 (10附1.3:K EIL的使用步骤参考 (17实验二 A/D转换实验 (3学时 (21附2.1:验证实验程序 (24实验三 D/A转换实验 (2学时 (25附3.1:DA转换实验程序 (27实验四单片机系统综合实验( 3学时 (28附4.1:实验仪中的温度传感器电路 (30附4.2:直流电机和步进电机控制接口电路 (31实验规则为了维护正常的实验教学次序,提高实验课的教学质量,顺利的完成各项实验任务,确保人身、设备安全,特制定如下实验规则:一、实验前必须充分预习,完成指定的预习内容,预习要求如下:1.认真阅读本实验指导书,分析掌握本次实验的基本原理;2.完成各实验预习要求中指定的内容;3.明确实验任务。

二、实验时,认真、仔细的写出源程序,进行调试,有问题向指导老师举手提问;三、实验时注意观察,如发现有异常现象(电脑故障或实验箱故障,必须及时报告指导老师,严禁私自乱动。

四、实验过程中应仔细观察实验现象,认真记录实验数据、波形、逻辑关系及其它现象,记录的原始结果必须经指导教师审阅签字后,方可离开。

五、自觉保持实验室的肃静、整洁;实验结束后,必须清理实验桌,将实验设备、工具、导线按规定放好,并填写仪器设备使用记录。

六、凡有下列情况之一者,不准做实验:1.实验开始后迟到10 分钟以上者;2.实验中不遵守实验室有关规定,不爱护仪器,表现不好而又不服从教育者;七、实验后,必须认真作好实验报告,在规定时间里必须交给实验指导老师,没交实验报告者,视为缺做一次实验。

实验报告要求必须包括:1.写出设计实验程序;2.总结实验步骤和实验结果;八、一次未做实验,本实验课成绩视为不及格。

以上实验规则,请同学们自觉遵守,并互相监督。

实验一单片机监控程序实验(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芯片介绍74HC245:高速CMOS 型8位双向总线收发器(三态。

主要用于数据总线的同步双向通信,起总线隔离驱动作用。

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

图1.1(A图1.1(B图1.1 键盘及LED 显示电路(2扫描键盘和LED 显示原理(1(2MC1413(2本实验仪的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/LED CS 接到相应的地址译码上。

位码输出的地址为0X002H,段码输出的地址为0X004H,键盘行码读回的地址为0X001H,此处X是由KEY/LED CS 决定,参见地址译码。

例如将KEY/LED CS接到地址译码的CS0(如图1.2上,那么位码输出的地址就为08002H,段码输出的地址就是08004H,键盘行码读回的地址为08001H。

(3Lab2000P实验仪单片机系统138译码电路图1.2 译码电路图其中:CS0: 08000H~08FFFH CS1: 09000H~09FFFH CS2: 0A000H~0AFFFHCS3: 0B000H~0BFFFH CS4: 0C000H~0CFFFH CS5: 0D000H~0DFFFHCS6: 0E000H~0EFFFH CS7: 0F000H~0FFFFH4. 段码表和键码表(1段码表七段数码管的字符型代码表如下表:(2键码表键码表如下:KeyTable: ; 键码定义功能键:16h, 15h, 14h, 0ffh 分别对应 MON ,LAST,NEXT,RST13h, 12h, 11h, 10h 分别对应TRACE/MODE,MOVE,HERE,EXEC 数字键:0dh, 0ch, 0bh, 0ah 分别对应D,C,B,A0eh, 03h, 06h, 09h 分别对应E,3,6,90fh, 02h, 05h, 08h 分别对应F,2,5,800h, 01h, 04h, 07h 分别对应0,1,4,73. 验证实验程序流程(1主程序流程图1.3 监控实验主程序流程图(2键盘扫描子程序流程图图1.4 键盘输入子程序流程图五、实验步骤1.运行Keil软件,按照附1.3 “Keil软件使用的参考步骤”步骤1~10,建立工程、编译、链接。

2、硬件连接:(1连接片选信号,将KEY/LED CS连接到CS0即可(具体的电路原理图请参考图1.1; 8255的片选连接到CS1。

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

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

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

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

等到最左边的数码管显示“0”时,再从键盘输入0300,然后按“EXEC”键,用示波器观察8255的PA、PB、PC口输出的波形。

或者把PA、PB、PC中的每位输出连接到实验箱中“逻辑笔”输入,观察指示灯的变化,记录实验结果。

5、开始做设计实验。

附1.1:lab2000P实验仪仿真器串口输入附1.2:验证实验程序/*监控程序:包括键盘扫描、8字循环显示、8255三个口输出方波*/OUTBIT equ 08002h ; 位控制口OUTSEG equ 08004h ; 段控制口IN equ 08001h ; 键盘读入口Ctrl_8255 equ 09003h ; 8255控制口地址PA_8255 equ 09000h ; 8255A口地址LEDBuf equ 60h ; 键盘输入数字显示缓冲LEDBuf1 equ 70h ; 六位数码管循环显示缓存LEDBuf2 equ 50h ; 键码缓存,用于跳转用ljmp StartLEDMap: ; 八段管显示码db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07hdb 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h;============================= = 延时子程序============================ Delay:mov r7, #0DelayLoop:djnz r7, DelayLoopdjnz r6, DelayLoopret;========================6位数码管轮流显示子程序======================= DisplayLED:mov r0, #020hmov r1, #6 ; 共6个八段管mov r2, #00100000b ; 从左边开始显示Loop:mov dptr, #OUTBITmov a, #0movx @dptr, a ; 关所有八段管mov a, @r0mov dptr, #OUTSEGmovx @dptr,amov dptr, #OUTBITmov a, r2movx @dptr, a ; 显示一位八段管mov a, r2 ; 显示下一位rr amov r2, ainc r0djnz r1, Loopret;========================== 单片机读入键盘行的状态子程序=============== TestKey:mov dptr, #OUTBITmov a, #0movx @dptr, a ; 输出线全置为0mov dptr, #IN ; IN =08001hmovx a, @dptr ; 读入键状态cpl aanl a, #0fh ; 高四位不用retKeyTable: ; 键码定义db 16h, 15h, 14h, 0ffhdb 13h, 12h, 11h, 10hdb 0dh, 0ch, 0bh, 0ahdb 0eh, 03h, 06h, 09hdb 0fh, 02h, 05h, 08hdb 00h, 01h, 04h, 07h;==========================扫描键盘子程序=========================== GetKey:mov dptr, #OUTBITmov P2, dphmov r0, #Low(INmov r1, #00100000bmov r2, #6KLoop:mov a, r1 ; 找出键所在列cpl amovx @dptr, acpl arr amov r1, a ; 下一列movx a, @r0cpl aanl a, #0fhjnz Goon1 ; 该列有键入djnz r2, KLoopmov r2, #0ffh ; 没有键按下, 返回 0ffhsjmp ExitGoon1:mov r1, a ; 按下键的键码在键码表中的位置偏移量=(列-1 X 4 + (行-1 ;从第6列开始mov a, r2dec arl arl amov r2, a ; r2 = (r2-1*4mov a, r1 ; r1中为读入的行值mov r1, #4LoopC:rrc a ; 移位找出所在行jc Exitinc r2 ; r2 = r2+ 行值djnz r1, LoopCExit:mov a, r2 ;r2中为按下键的键码在键码表中的位置偏移量mov dptr, #KeyTablemovc a, @a+dptrmov r2, a ; 取出键码WaitRelease:mov dptr, #OUTBIT ; 等键释放clr amovx @dptr, amov r6, #10call Delaycall TestKeyjnz WaitReleasemov a, r2ret;================查找A中存放的数所对应LED显示段码子程序============== ToLED:mov dptr, #LEDMapmovc a, @a+dptrret;===========将键码(在A中存放到LEDBuf2所指向的内部存储器单元===========ToKeyTable:mov r1,LEDBuf2mov @r1,aret;==========================初始化单片机内存子程序=====================InitLED:mov 20h, #3fhmov 21h, #0hmov 22h, #0hmov 23h, #0hmov 24h, #0hmov 25h, #0hret//////////////////////////////////////////////////////////// 主程序/////////////////////////////////////////////////////////////// Start:mov LEDBuf,#020hmov LEDBuf2,#30hcall InitLEDmov LEDBuf1+0, #0ffh ; 8字循环显示模块程序用到,0ffh为8.的段码mov LEDBuf1+1, #0ffhmov LEDBuf1+2, #0ffhmov LEDBuf1+3, #0ffhmov LEDBuf1+4, #0ffhmov LEDBuf1+5, #0ffhmov r4,#6MLoop:call DisplayLEDcall TestKey ;有键入?jz MLoop ;无键入, 继续显示call GetKey ;读入键码jb 0e4h,commkey ;如果ACC.4为1,则为命令键,转到commkey处理numkey: mov r0,a ;保存数据acall ToKeyTable ; 键码保存在LEDBuf2(初始值30h指向的单元中 mov a,r0 anl a, #0fh ;显示键码call ToLED ;查找A的段码并把段码保存在A中mov r0,LEDBufmov @r0,a ;段码保存在LEDBuf(初始值20h指向的单元中inc LEDBufinc LEDBuf2djnz r4,MLoopmov r4,#6mov LEDBuf,#020hmov LEDBuf2,#030hljmp MLoopcommkey: ;处理命令键cjne a,#13h,start ;如果按下的键不是EXEC,则转向程序开始call nextkey;==========================把dph、dpl压入堆栈子程序====================nextkey:acall pickdatapush dplpush dphret ;dph与dpl弹出堆栈赋给PC;=================================子程序==============================; ;单片机内部RAM30h-33h单元中存储的是从键盘输入的地址,用于改变PC,执行相应的程序;pickdata:mov r0,#031h ;将30H、31H 单元中的低4 位数据赋给DPHacall pickonemov dph,amov r0,#033h ;将32H、33H 单元中的4 位数据赋给DPLacall pickonemov dpl,aret;=============================取相邻内存单元低4位子程序================ ;取出r0 与r0-1所指向的单元中低4 位数据,并保存到A中,只取低4 位,键盘上输入的每位数据(0到;F最多只用到4位表示pickone:mov a,@r0anl a,#0fhmov r1,adec r0mov a,@r0swap aanl a,#0f0horl a,r1ret////////////////////////////////////六位数码管轮流显示“8”字,从左到右共循环10次//////////////////////////// org 0200hmov r0,#4clr amov r3,#10 ;循环次数,可自行设置DisplayLED1: ;轮流显示mov r0, #LEDBuf1mov r1, #6 ; 共6个八段管mov r2, #00100000b ; 从左边开始显示Loop1:mov dptr, #OUTBITmov a, #0movx @dptr, a ; 关所有八段管mov a, @r0mov dptr, #OUTSEGmovx @dptr, amov dptr, #OUTBITmov a, r2movx @dptr, a ; 显示一位八段管mov r6, #200call Delay ; 延迟值如果设定的太大的话,就会检测不到按键mov a, r2 ; 显示下一位rr amov r2, ainc r0djnz r1, Loop1djnz r3, DisplayLED1acall InitLED ;重新从左边显示mov r4,#6mov LEDBuf,#020hmov LEDBuf2,#030hajmp MLoop//////////////////////////////////////8255 的PA,PB,PC 口分别循环输出方波程序/////////////////////////// org 0300htestPort:mov dptr,#Ctrl_8255mov a,#80hmovx @dptr,amov a,#55hmov r3,#20 ;循环次数,可自行设置testPortA:mov dptr,#PA_8255 ;PA 口movx @dptr,ainc dptrmovx @dptr,a ;PB 口inc dptrmovx @dptr,a ;PC 口rr amov r6, #200 ;输出延时,可自行设置延时时间acall Delaydjnz r3, testPortAajmp MLoopend附1.3:Keil的使用步骤参考1、点击”ProjectÆNew Project……”,新建一个工程文件,在Creat New Project窗口中输入工程名。

相关主题