一、实验目的
理解LED七段数码管的显示控制原理,掌握数码管与MCU的接口技术,能够编写数码管显示驱动程序。
二、实验原理
LED数码管显示器内部由七个条形发光二极管和一个小圆点发光二极管组成,每个发光二极管称为一字段,因而它的控制原理和发光二极管的控制原理是相同的。根据各管的接线形式,它可分为两种,一是共阳极(发光二极管的阳极都接在一个公共点上),另一是共阴极(发光二极管的阴极都接在一个公共点上)。给LED 数码管的七个发光二极管加不同的电平,二极管显示不同亮灭的组合就可以形成不同的字形,这种组合称之为字形码。下面以1为高电平,0为低电平,给出字形码表。
三、实验仪器和设备
PC机、KEIL软件、Protues软件、实验板等。
四、实验内容
(1)用定时器以间隔0.5s在6位数码管上依次显示0、1、2、3….C、 D、E、 F,循环下去。
(2)利用动态扫描方法在六位数码管上显示出稳定的654321。
(3)提升设计:用动态扫描方法和定时器1的方式1实现数码管前两位59s循环计时。
五、实验原理图及参考程序
#include<reg52.h>
#define uintunsigned int
#define ucharunsigned char
sbit dula=P2^6;
sbit wela=P2^7;
uchar num;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint z);
void main()
{
wela=1;//11101010
P0=0xc0;
wela=0;
while(1)
{
for(num=0;num<16;num++)
{
dula=1;
P0=table[num];
dula=0;
delay(500);
}
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
#include<reg52.h>
#define uintunsigned int
#define ucharunsigned char
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delayms(uint);
void main()
{ while(1)
{P0=0xff;
wela=1;
P0=0xfe;
wela=0;
dula=1;
P0=table[1];
dula=0;
delayms(5);
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
dula=1;
P0=table[2];
dula=0;
delayms(5);
P0=0xff;
wela=1;
P0=0xfb;
wela=0;dula=1;
P0=table[3];
dula=0;
delayms(5);
P0=0xff;
wela=1;
P0=0xf7;
wela=0;dula=1;
P0=table[4];
dula=0;
delayms(5);
P0=0xff;
wela=1;
P0=0xef;
wela=0;dula=1;
P0=table[5];
dula=0;
delayms(5);
P0=0xff;
wela=1;
P0=0xdf;
wela=0;dula=1;
P0=table[6];
dula=0;
delayms(5);
}
}
void delayms(uintxms)
{ uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
六、遇到的问题及解决方法
1、电路图绘制有误
解决方法:重新检查电路图的错误,检查各个元件参数是否有误,是否缺线多线,元件是否选择正确。
2、代码有误
解决方法:仔细查看代码是否存在输入错误,逐一检查、仔细比对代码,找到错误后进行修改。
3、初始化时选择语言有误
在初始化时选择keilfor 8051而不是Asem-51
|