电子信息工程学系实验报告
课程名称:单片机原理及接口
实验项目名称:LED 数码管显示实验 实验时间: 2011.10.31
班级:通信 姓名: 学号:
实 验 目 的:
熟悉keil 仿真软件、proteus 仿真软件、软件仿真板的使用。
了解并熟悉一位数码管与多位LED 数码管的电路结构、与单片机的连接方法及其应用原理。
学习proteus 构建LED 数码管显示电路的方法,掌握C51中单片机控制LED 数码管动态显示的原理与编程方法。
实 验 环 境:
KEIL C51单片机仿真调试软件,proteus 系列仿真调试软件 实 验 内 容 及 过 程: 1.LED 显示器结构与原理:
LED 显示器是由发光二极管显示字段的显示器件。
在单片机应用系统中通常使用的是七段LED ,这种显示器有共阴极与共阳极两种。
阴极LED 显示器的发光二极管阴极共地,当某个发光二极管的阳极为高电平时,该发光二极管则点亮;共阳极LED 显示器的发光二极管阳极并接。
如显示“2”,则共阴时段选码为“5BH ”,共阳时为“A4H ”。
2.显示码的知识:d 的显示码。
(1)显示d ,则数码管中b,c,d,e,g 要亮,其他灯灭;
(2)因为是共阴数码管,所以送‘1’亮,则b,c,d,e,g=1;a,f,dp=0; (3)则01011110. 3.多位LED 数码显示器
七段LED 数码管与单片机连接时,只要将一个8位并行输出口与显示器的发光二极管引脚相连即可。
8位并行输出口输出不同的字节数据即可获得不同的数字或字符,通常将控制发光二极管的8位字节数据称为段选码。
多位七段LED 数码管与单片机连接时将所有LED 的段选线并联在一起,由一个八位I /O 口控制,而位选线分别由相应的I /O 口线控制。
如:8位LED 动态显示电路只需要两个八位I /O 口。
其中一个控制段选码,另一个控制位选。
a
f b
e
g
c
d
dp
1 2 3 4 5
10 9 8 7 6
g f a b
e d c dp
(a) 共阴极 (b) 共阳极 (c) 管脚配置
成 绩:
指导教师(签名):
LED显示器有静态显示与动态显示两种方式。
(1) LED静态显示方式
各位LED的位选线连在一起接地或接+5V;每位LED的段选线(a- dp)各与一个八位并行口相连。
在同一时间里每一位显示的字符可以各不相同。
缺点,I/O端口占用多。
(2)LED动态显示方式
由于所有位的段选码皆由一个I/O控制,因此,在每个瞬间,多位LED只可能显示相同的字符。
要想每位显示不同的字符,必须采用动态扫描显示方式。
即在每一瞬间只使某一位显示相应字符。
在此瞬间,位选控制I/O口在该显示位送入选通电平(共阴极送低电平、共阳极送高电平)以保证该位显示相应字符,段选控制I/O口输出相应字符段选码。
如此轮流,使每位显示该位应显示字符,并保持延时一段时间,以造成视觉暂留效果。
不断循环送出相应的段选码、位选码,就可以获得视觉稳定的显示状态。
由人眼的视觉特性,每一位LED在一秒钟内点亮不少于30次,其效果和一直点亮相差不多。
实验内容:
(1)打开proteus新建空白文件,点击P进入零件拾取界面,例如:输入A T89C51,点击OK,用鼠标拖动到合适的位置。
LED;电容CAP;晶振CRYSTAL;电阻CAP;电阻包RESPACK-8;BUTTON按钮;点击右键Place,Terminal选取电源POWER 接地GROUND,进行连线,保存。
选用共阴的LED显示器,将P0作为段选,P2作为位选,连接8位LED数码管。
2.开启keil并在project中选择New Project,新建项目,然后在File中选择New…。
3.保存为shiyan4,选择,选择,点击确定,弹出一个对话框选择“否”。
4.在新建的空页中编写程序,并保存为shiyan4.c。
然后编译,加载,运行调试。
5.双击Target1出现Source Group 1点击鼠标右键选择Add files to group ‘Source Group 1’,选中shiyan4点击Add 击Close
6.点击如图操作点击运行,如果显示无错误就编译成功
7.双击A T89C51点击选择shiyan4.hex点击OK 点击左下角的运行。
实验结果及分析:
(1) 动态显示三部曲:在左边第3位显示5
#include<reg51.h> main() {P0=0x6d; P2=0xfb;}
(2)在左边第2位循环显示1-8
unsigned char code tab[]={0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,};
main()
{int i;
while(1) {P2=0xFD;
for(i=0;i<8;i++) {P0=tab[i]; mDelay(1000);}}}
(3)同时显示12345678
unsigned char code tab2[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,}; main()
{int i;
while(1) {for(i=0;i<8;i++) {P2=tab2[i];
P0=tab1[i]; mDelay(5);}}}
(4)一个开关控制(开始)8跑马8次
unsigned char code tab1[]={0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,}; unsigned char code tab2[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,}; main()
{int i,j;
{if(P17==0)
{for(j=0;j<8;j++)
{for(i=0;i<8;i++) {P2=tab2[i]; P0=tab1[i]; mDelay(1000); }}}}}
实验心得:
在实验中要注意选用的LED是共阴的还是共阳的,其代码都有很大的区别,再者要注意大括号的使用,做到不缺补漏,还有应应用for语句进行循环编译,这样会使得程序的编写更加简易,但同时要注意while()的位置问题,要安放得当。