资源描述
单片机原理及应用
实验报告
姓 名: 学 号
班 级:
指导教师: 许 强
单 片 机 原 理 及 应 用 实 验 报 告
实验项目名称: 键盘、数码管显示综合实验
实验日期: 2013.12.10 实验成绩:
实验评定标准:
1)实验报告是否按照规定格式
A( )B( )C( )
2)实验内容及说明是否完整
A( )B( )C( )
3)实验步骤及说明是否正确
A( )B( )C( )
4)实验结果及分析是否合理
A( )B( )C( )
一、 实验目的
通过实验,掌握单片机在输入输出口线不够用时,怎样扩展接口的方法来支持8位LED显示和16键盘集成实现。 熟悉8155、8279等芯片性能;掌握其编程方法。掌握键盘子程序调试方法,掌握按一个键并将键值显示出来的编程方法,这是诊断硬件、测试硬件、产品开发、软件编程必须掌握的方法。
二、 实验器材
安装有keil uVision和proteus软件的PC机一台
以8155为扩展方式的器件
80C51.BUS
CRYSTAL
PHYC0402NP022P
7404
7SEG-MPX6-CC-BLUE
RESPACK-8
8155
HITEMP10U50V
BUTTON
MINRES10K
三、 实验内容
① 编写并调试出一个键盘实验子程序;
② 用子程序调用方法,分别调用键盘子程序和显示子程序,将按一个键的键值(0- F),在数码管上显示出来。
四、 实验步骤
(1)仿真实验过程: 打开Keil程序,执行菜单命令“Project”‡“New Project”创建“键盘数码管显示综合实验”项目,并选择单片机型号为AT89C52.BUS。
执行菜单命令“File”‡“New”创建文件,输入源程序,保存为“键盘数码管显示综合实验.A51或键盘数码管显示综合实验.c”。在“Project”栏的File项目管理窗口中右击文件组,选择“Add Files to Group ‘Source Group1’”将源程序“键盘数码管显示综合实验.A51或键盘数码管显示综合实验.c”添加到项目中。
执行菜单命令“Project”‡“Options for Target ‘Target 1’”,在弹出的对话框中选择“Output”选项卡,选中“Greate HEX File”。
执行菜单命令“Project” ‡ “Build Target” , 编译源程序。 如果编译成功, 则在 “Output Window”窗口中显示没有错误,并创建了“键盘数码管显示综合实验.HEX”文件。
在proteus仿真平台上建立如图2.5.5(1)或图2.5.5(2)参考图系统,并将程序上载到虚拟芯片上调试及运行。
(2)实作实验
(1)线路连接
按图2.5.5(1)或图2.5.5(2)将组合最小系统板、14 脚插座板、20 脚插座板、六位数显板、按键拼集成焊接,并连好每条线,检查无误后,进行下一步。
(2)硬件好坏诊断
由于键盘电路比较特殊,按键有没有效,要用软硬件综合考虑、检测,一般的方法是先用万用表欧姆档测量一下,线是否连好,若连好了,就编一段测试程序,仿真测试或固化测试均行,下面分别叙述。
①仿真调试 在PE 状态下输入以下程序
②固化调试 固化后,按0-F 键数码管应有显示。
五、 实验结果及分析
8255修改后:
8155汇编程序:
ORG 0000H
START: LJMP MAIN
ORG 0030H
MAIN: MOV SP,#60H
MOV 7AH,#00
MOV 7BH,#01
MOV 7CH,#02
MOV 7DH,#03
MOV 7EH,#04
MOV 7FH,#05
MOV DPTR,#7F00H;8155命令口地址
MOV A,#03H
MOVX @DPTR,A
LOOP: LCALL DISP
LCALL KEY
MOV A,R4
CJNE A,#88H,DSP
SJMP LOOP
DSP: MOV 7AH,A ;键值送入显示缓存区单元7AH
MOV 7BH,#010H
MOV 7CH,#010H
MOV 7DH,#010H
MOV 7EH,#010H
MOV 7FH,#010H
SJMP LOOP
;按键识别子程序
KEY: MOV R4,#00H
MOV R2,#01H
KEY1: MOV DPTR,#7F02H
MOV A,R2
MOVX @DPTR,A
INC DPTR
MOVX A,@DPTR
JB ACC.0,KEY2
MOV A,#00H
AJMP KEY5
KEY2: JB ACC.1,KEY3
MOV A,#01H
AJMP KEY5
KEY3: JB ACC.2,KEY4
MOV A,#02H
AJMP KEY5
KEY4: JB ACC.3,NEXT
MOV A,#03H
KEY5: ADD A,R4
MOV R4,A
RET
NEXT: MOV A,R4
ADD A,#04
MOV R4,A
MOV A,R2
JB ACC.3,NEXT1
RL A
MOV R2,A
AJMP KEY1
NEXT1: MOV R4,#88H
RET
;数码管显示组程序
DISP: MOV R0,#7AH
MOV R3,#01H
DISPB1: MOV DPTR,#7F02H
MOV A,#0H
MOVX @DPTR,A
MOV DPTR,#7F01H
MOV A,@R0
ADD A,#014H
MOVC A,@A+PC
MOVX @DPTR,A
MOV A,R3
MOV DPTR,#7F02H
MOVX @DPTR,A
ACALL DELAY
INC R0
MOV A,R3
JB ACC.6,DISPB2
RL A
MOV R3,A
AJMP DISPB1
DISPB2: MOV R3,#01H
RET
SEGPT2: Db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h
db 7fh,6fh,77h,7ch,39h,5eh,79h,71h
db 00h,02h,08h,00h,59h,0fh,76h
;延时子程序
DELAY: MOV R4,#0FFH
DELAY1: DJNZ R4,DELAY1
RET
END
C语言:
#include<reg52.h>
#include<intrins.h>
#include<absacc.h>
typedef unsigned int uint;
typedef unsigned char uchar;
#define com8255 XBYTE[0x7fff]
#define PA8255 XBYTE[0x7cff]
#define PB8255 XBYTE[0x7dff]
#define PC8255 XBYTE[0x7eff]
sbit gw=P1^0;
sbit sw=P1^1;
uchar code scancode[4]={0xfe,0xfd,0xfb,0xf7};
uchar code ledlight[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar temp;
void delay(uint i)
{
uint j;
while(i--)
{
for(j=0;j<125;j++)
;
}
}
void init8255(void)
{
com8255=0x82;
}
void scan()
{
uchar tem;
PC8255=0x00;
tem=PB8255;
if(~tem)
{
delay(10);
PC8255=0x00;
tem=PB8255;
if(~tem)
PC8255=scancode[0];
tem=PB8255;
if(~tem)
{
switch(tem)
{
case 0xfe:temp=0;break;
case 0xfd:temp=4;break;
case 0xfb:temp=8;break;
case 0xf7:temp=12;break;
}
while(~tem)
{
PC8255=scancode[0];
tem=PB8255;
}
}
PC8255=scancode[1];
tem=PB8255;
if(~tem)
{
switch(tem)
{
case 0xfe:temp=1;break;
case 0xfd:temp=5;break;
case 0xfb:temp=9;break;
case 0xf7:temp=13;break;
}
while(~tem)
{
PC8255=scancode[1];
tem=PB8255;
}
}
PC8255=scancode[2];
tem=PB8255;
if(~tem)
{
switch(tem)
{
case 0xfe:temp=2;break;
case 0xfd:temp=6;break;
case 0xfb:temp=10;break;
case 0xf7:temp=14;break;
}
while(~tem)
{
PC8255=scancode[2];
tem=PB8255;
}
}
PC8255=scancode[3];
tem=PB8255;
if(~tem)
{
switch(tem)
{
case 0xfe:temp=3;break;
case 0xfd:temp=7;break;
case 0xfb:temp=11;break;
case 0xf7:temp=15;break;
}
while(~tem)
{
PC8255=scancode[3];
tem=PB8255;
}
}
}
}
void Delay10us() //@12.000MHz
{
unsigned char i;
_nop_();
_nop_();
i = 27;
while (--i);
}
void display()
{
if(temp<10)
{
gw=0;
sw=1;
PA8255=ledlight[temp];
}
else if(temp>=10)
{
PA8255=ledlight[temp/10];
sw=0;
Delay10us();
sw=1;
PA8255=ledlight[temp-10];
gw=0;
Delay10us();
gw=1;
}
}
void main()
{
init8255();
while(1)
{
scan();
display();
}
}
自由状态:
按下键时:
实验结果分析:
本实验通过8155芯片的扩展功能,建立描述线与数据线同步功能,加上16个按键,而且按键和位选口选用PB口,同时此处为了节省接口线,直接将显示输出和扫描输出何用PA口。按键显示时,分别对应显示0-F。
心得体会:
本次试验相对于其它几个实验是比较难的,在做实验的过程中,刚开始时没有头绪的,在做实验的过程中渐渐地了解了一些,但是做实验的过程中遇见了很多问题,通过查资料和同学交流对此次实验有了一定的了解。我觉得理论知识比较抽象和实验结合,有利于理论知识的了解。
展开阅读全文