单片机原理及应用综合性实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机原理及应用综合性实验报告
单片机原理及应用综合性实验报告
姓名:学号
班级:
指导教师:
单片机原理及应用实验报告实验项目名称:键盘、数码管显示综合实验
实验日期:2014.12.22 实验成绩:
实验评定标准:
一、实验目的
1.通过实验,掌握单片机在输入输出口线不够用时,怎样扩展接口的方法来支
持8位LED显示和16键盘集成实现。
2.熟悉8255、8279等芯片性能;掌握其编程方法。
3.掌握键盘子程序调试方法,掌握按一个键并将键值显示出来的编程方法,这
是诊断硬件、测试硬件、产品开发、软件编程必须掌握的方法。
二、实验器材
PC机一台以及Keil、Proteus软件
表1 以8155为扩展方式的器件表
表2 实验原理图元件清单表
三、实验内容
(一)基本内容
1.编写并调试出一个键盘实验子程序
2.用子程序调用方法,分别调用键盘子程序和显示子程序,将按一个键的键值,
在数码管上显示出来。
3.通过8155芯片的扩展功能,建立描述线与数据线同步功能,如图3.1。
图3.1 键盘显示器原理图
图3.2 数码管管脚及电路连接图
(二)扩展内容
模拟控制以红、绿、黄3个发光二极管表示交通信号灯。
还有有两位数码倒计时显示。
具体要求:
上电红灯亮并且数码管倒计时30秒,最后5秒黄灯闪烁,倒计时完毕,绿灯亮并且数码管倒计时60秒,最后5秒黄灯闪烁,如此循环。
四、实验步骤
(一)仿真实验过程:
1. 打开Keil 程序,执行菜单命令“Project ”à“New Project ”创建“键盘数码
管显示综合实验”项目,并选择单片机型号为AT89C52.BUS 。
GND a
b c d e f g dp
g f e d c b a (a)
图4.1 创建工程
图4.2 选择单片机类型
2.执行菜单命令“File”à“New”创建文件,输入源程序,保存为“键盘数码
管显示综合实验.A51或键盘数码管显示综合实验.c”。
在“Project”栏的File 项目管理窗口中右击文件组,选择“Add Files to
Group ‘Source Group1’”
将源程序“键盘数码管显示综合实验.A51或键盘数码管显示综合实验.c”添
加到项目中。
图4.3 创建文件
图4.4 添加源程序
3.执行菜单命令“Project”à“Options for Target ‘Target 1’”,在弹出的对
话框中选择“Output”选项卡,选中“Greate HEX File”。
图4.5 创建HEX文件
4.执行菜单命令“Project”à“Build Target”,编译源程序。
如果编译成功,
则在“Output Window”窗口中显示没有错误,并创建了“键盘数码管显示综合实验.HEX”文件。
图4.6 编译源程序
(二)软件仿真
在proteus仿真平台上建立如图3.1参考图系统,检查无误后,就编一段测
试程序,仿真测试或固化测试均行,下面分别叙述。
①仿真调试
在PE 状态下输入以下程序
②固化调试
固化后,按0-F 键数码管应有显示。
并将程序上载到虚拟芯片上调试及运行。
(三)扩展功能实现
在proteus仿真平台上建立如图4.7参考图系统,并将程序上载到虚拟芯片上调试及运行。
图4.7 交通灯仿真图
五、实验结果及分析(一)实验结果
1.数码管显示键值运行结果
图5.1 实验运行结果图
图5.2 按键对应键值在数码管上显示(十六进制)
2.交通灯运行结果
图图5.3 交通红、黄、绿灯倒计时显示
(二)实验结果分析 1. 数码管显示键值结果分析
如图5.4所示,为键盘显示流程图,即为键盘控制数码管实现将按键值显示出来的程序思路。
在未按下任何键时,正常显示“1,2,3,4,5,6”。
将键盘以列划分,形成0、1、2、3列,键盘扫描按列纵向扫描完16个键盘,当按下对应的键时,便在第一个数码管上显示出如图3.1显示的当前对应的键值。
图5.4 键盘显示程序框图
2.交通灯结果分析
如下图5.5所示,是交通灯的程序流程图,从此图可以知道交通灯运行的过程,交通灯是两位数码管通过控制两个共阴脚进行静态显示,从而实现倒计时显
图5.5 交通灯程序流程图
(三)实验心得体会
1.这次的综合实验虽然比较复杂,但是通过这次努力地分析实现过程和询问老
师,也通过自己以前参加比赛自学单片机的精神查找资料,最终完成了此次的实验,也完成了扩展功能,加强了我的过程设计能力,让我也更加熟悉proteus的仿真搭建。
2.通过此次实验,我掌握了单片机在输入输出口线不够用时,怎样用扩展接口
的方法来支持8位LED显示和16键盘集成实现,也熟悉了8255等芯片性能,掌握了其编程方法。
3.我也掌握了键盘子程序调试方法,掌握按一个键并将键值显示出来的编程方
法,这是诊断硬件、测试硬件、产品开发、软件编程必须掌握的方法。
比较可惜的是这次实验没能够进行硬件实践,硬件和软件仿真会有很大差别,仿真出来正确,可能实践出来就是不对的,如果做出来一个东西自己会很有成就感。
4.这次实验的线路比较复杂,一不小心可能就会出现错误,最开始我把程序下
载到数码管显示键值的电路图的单片机上时,显示不出来,经过仔细检查了好久之后才排除了线路中的错误。
所以在实验过程中,细心仔细是必要的,否则会做很多无用功。
5.由于仿真和实际是有很大差别的,在做扩展功能交通灯时,最开始我写数码
管倒计时显示时,在仿真上仿真是正确显示的,但是担心真正实践运用时会出现不知道的错误,后来就把程序改成了静态显示程序。
总之,这次实验收获很多,以后我也会自主地加强自己的仿真能力,也尝试加强自己的动手能力。
附录:实验程序
(一)数码管显示键值: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,#7300H ;8155命令口地址
MOV A,#89H ;置8155PA、PB口为输出,PC口为输入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 ;0→键号寄存器R4
MOV R2,#01H ;扫描模式01H→R2
KEY1: MOV DPTR,#7100H
MOV A,R2
MOVX @DPTR,A ;扫描模式→8155PB口
INC DPTR
mov dptr,#7200H;
MOVX A,@DPTR ;读8155PC口
JB ACC.0,KEY2 ;0列无键闭合,转判1列
MOV A,#00H ;0列有键闭合,0→A
AJMP KEY5
KEY2: JB ACC.1,KEY3 ;1列无键闭合,转判2列
MOV A,#01H ;1列有键闭合,列线号01H→A
AJMP KEY5
KEY3: JB ACC.2,KEY4 ;2列无键闭合,转判3列
MOV A,#02H ;2列有键闭合,02H→A
AJMP KEY5
KEY4: JB ACC.3,NEXT ;3列无键闭合,转判下一行
MOV A,#03H ;3列有键闭合,03H→A
KEY5: ADD A,R4 ;列线号+(R4)作为键值→A
MOV R4,A ;键值→R4
RET ;返回
NEXT: MOV A,R4;
ADD A,#04 ;键号寄存器加4
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,#7100H ;8155 PB口地址
MOV A,#0h ;熄灭所有LED
MOVX @DPTR,A
MOV DPTR,#7000H ;8155 PA口地址
MOV A, @R0 ;取显示数据
ADD A,#014H ;加偏移量
MOVC A, @A+PC ;查表取段码
MOVX @DPTR,A ;段码→8155 PA口
MOV A,R3
MOV DPTR,#7100H ;8155 PB口地址
MOVX @DPTR,A ;扫描模式→8155 PB口
ACALL DELAY ;延时
INC R0
MOV A,R3
JB ACC.6,DISPB2 ;判6位LED显示完否
RL A ;扫描模式左移1位
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
(二)扩展内容:交通灯显示
#include
#define uchar unsigned char
#define uint unsigned int
uchar t=0;
uchar w=0;
code uchar tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管共阴
//code uchar tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管共阳sbit d1=P1^1; //d1作为高位数码管
sbit d2=P1^2; //d2作为低位数码管
sbit red=P0^2;
sbit green=P0^1;
sbit yellow=P0^0;
uint a=30;
uint b=30;
uint c=60;
uint i; //用于动态显示字符
uint j; //用于动态显示字符
void init()
{ TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void delay(uint z)
{ uint i;
for(i=0;i<z;i++);< p="">
}
void display(int c)
{ uint a=c;
i=a/10;
j=a%10;
//以下是动态显示,
d1=0;d2=1; //若是共阳,位选d1,d2取值相反P2=tab[i];
delay(30);
P2=0x00;
delay(30);
d1=1;d2=0; //若是共阳,位选d1,d2取值相反P2=tab[j];
delay(30);
P2=0x00;
delay(30);
}
void timer0() interrupt 1
{
TR0=0;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
t++;
if(t%10==0)
{
a=a-1;t=0;
}
if(a<=5 && t%2==0)
{
yellow=~yellow;
if(a==0)
{ w++;
red=~red;green=~green;yellow=0; if(w%2==1) a=c;
else a=b;
}
}
}
void main()
{ green=0;
yellow=0;
red=1;
init();
while(1)
{
display(a);
}
}
</z;i++);<>。