四位共阳数码管的使用剖析.docx
《四位共阳数码管的使用剖析.docx》由会员分享,可在线阅读,更多相关《四位共阳数码管的使用剖析.docx(17页珍藏版)》请在冰豆网上搜索。
四位共阳数码管的使用剖析
四位数码管的探究1
硬件准备1
软件准备2
控制思路:
2
卞面是实际的焊接之中,考虑到实际电路的连接顺序,采用下面的连接。
4
两位数码管源程序:
00-994
异曲同工:
00099995
更进一步:
四位数字时钟7
四位数码管的探究
硬件准备
四位共阳数码管一块,1K电阻4只。
数码管的引脚图如下所示:
四位共阳数码管
A1110BC7
ABCD
BB5BB
C接高电平3接低电平时5(夷<1按高电平3授低电平时如2亮
A.B.C.D均连接Vcc
KS7I
REP3.0匚
TxD/P3.1匚
XTAL2I
XTALI匚rm)/P3.v匚EH/P3.3匚
ECI/T0"3・4匚PTO1/PCA0/TPP3.5I
Gnd匚
123456789^
)sop—20、DIP—20
0987654321OG11X1X1111X1X111
VC€
P1.7/SCLK
Pl.fi/MTSO
Pl.5/MO5I
Pl.1/^
Pl.3
Pl.2
Pl.L/CLK0CI1
Pl.O/CLKOCIO
P3.7/PCA0/PW0
使用的单片机是STC12C2052,位选町以使用P1接II控制。
参照下面数据手册的内容,可以看出P3・5,3.4,3.3,3.2均能够作为I/O接口以推挽方式使
用。
由于数码管所能承受的电流较小,所以外加1K的限流电阻。
单片机P3.5,3.4,3.3,3.2四个接口可以作为数码阳极一端,利用推挽方式输出高电平,
pi接11作为数码管的段选,输出低电平,驱动每一段数码管,这就为设想的实现取得了理论的基础。
证明了使用20脚单片机控制数码管产生时钟的效果是切实可行的。
下面关键的部分就成了数码管的编程阶段了。
P1口设定
P1M0(7:
0]
P1M1[7:
0]
I/OUl模式(Pl.K如做AQ使用,需先将英设置成开漏或高阻输入〉
0
0
准双向口(传统8051I/O口模式>・灌电流可达20mA•拉电流为230uA・由于制造误差,实际为250uA〜150uA
0
1
推挽输出(强上拉输出.可达20mA.要加限流电阻)
1
0
仅为输入(奇阻),如果该UO口需作为A/D使用,可选此模式
1
1
开jW(OpenDrain).如果该IS口需作为A/D使用.可选此換式
P3口设定P3M0[7:
0]
P3M1[7:
0]
I/O口模式
0
0
准双向口(传统8051I/O口模式).淞电流可达20mA・拉电流为230pA・由于制造误差•实际为250uA~15OuA
0
1
推挽输出(强卜•拉输出・可达20mA.耍加限流电R1)
1
0
仅为输入(高阻)
1
1
JTi^fOpenDrain),内部上拉电阻断开,耍外加
卜面将使用单片机控制数码管产生时钟的效果。
由于单片机的计时是由软件延时的方法产
生,所以说误差会有很人。
因此本作品仅供娱乐。
初期的想法是加入闹钟的概念。
但是由于闹钟的定时不易调整,只能通过计算机编写软件定闹,这样就不是时钟的简洁的目的。
另外,由于当单片机控制蜂鸣器响的时候,单片机控制数码管的部分势必会停止,这样又会影响时钟的准确性。
因此,首先要实现的只是单片机的简易时钟功能或者说只是一个最人为1小时的秒表。
软件准备
将单片机的"O接II设置成推挽输出。
P1MO=OXOO;
P1M1=OXFF;
P3M0=0X00;
P3M1=OXFF;
控制思路:
第三四位作为秒表的秒针部分,每秒钟变化一次。
当第四位由0变到9时,第四位自动清零,第三位由0变成1,实现加一。
软件的实现分为两部分。
首先先实现后两位的秒针功能,先将前两位置之。
卜面是编程的设想。
由于数码管的引脚是共阳极,所有的阳极都是连接在一起的,因此不能同时给所有的阳极供电,如果那样的话,所有的数码管会有相同的显示方式。
考虑到这一情况,只能采用和点阵屏类似的扫描方法,即将数码管分成四个一位的情况,然后每个4nis扫描一次的方法。
四位共阳数码管
A1110BC7
ABCD
日日汨日
I
1
1
11
111
/45
11
C授高电平3接低电平d授高电平3恢低电平时dp2亮
A.B.C.D均连接Vcc
P3.5
P3.4
P3.3
P3.2
A
B
C
D
显示
P1.7
P1.6
P1.5
P1.4
P1.3
P1.2
P1.1
P1.0
十六
引脚
1
2
4
5
7
10
11
Dp
0
0
0
0
1
0
0
0
1
11
1
1
1
0
1
0
1
1
1
D7
2
0
0
1
0
0
1
0
I
25
3
1
0
0
0
0
1
0
1
85
4
1
1
0
0
0
0
1
1
C3
5
1
0
0
0
1
0
0
1
89
6
0
0
0
0
1
0
0
1
09
7
1
1
0
1
0
1
0
1
D5
8
0
0
0
0
0
0
0
1
01
9
1
0
0
0
0
0
0
I
81
卜•面是对D位数码管的控制,以测试段选的有效性。
#include
#defiiieweixuanPl
sbita=P3A5;
sbitb=P3A4;
sbitc=P3A3;
sbitd=P3A2;
voidyanshi(unsignedinta)
{
unsignedinti;
while(—a)
{
fbr(i=0;i<600;i++);
}
}
voidmam()
{
codeunsignedcharshuzi[]={0xll,0xd7,0x25,0x85,0xc3,0x89,0x09,0xd5,0x01,0x81};
PlM0=0X00;
P1M1=OXFF;//设置Pl,P3接「I的工作方式为推挽输
P3M0=0X00;
P3Ml=0XFF;
while(9)
{
unsignediiitj;
d=l;
for(j=0j<=9;j++)
{
weixuan=shuzi[j];
yanslii(lOOO);
}
}
}
这样的话,第D位会人约每一秒显示一个数字,从0到9不断地循环。
证明了段选的设置是真实有效的。
接下来的任务就是对ABC位进行控制。
F面是实际的焊接之中,考虑到实际电路的连接顺序,釆用
的连接。
引脚
1.7
1.6
1.5
1.4
1.3
1.2
1.1
1.0
1
2
3
4
11
5
7
10
四位共阳数鸥签
A1110BC7
ABCD
日曰;日日
!
!
ii
>2
111
J4f
c接高电平3接低电平时d小亮日按高电平3按低电平时如2亮
A.B.C.D均连接Vcc
1
2
3
4
0
0
0
1
0
1
1
1
1
0
2
0
0
1
1
3
1
0
1
0
4
1
1
1
0
5
1
0
1
0
6
0
0
1
0
7
1
1
1
0
8
0
0
1
0
9
1
0
1
0
11
5
7
10
十六
0
1
0
0
0x24
1
1
0
1
Oxed
0
0
0
1
0x31
0
0
0
1
Oxa!
1
0
0
0
0xe8
0
0
1
0
0xa2
0
0
1
0
0x22
0
1
0
1
Oxe5
0
0
0
0
0x20
0
0
0
0
OxaO
下面是通过动态扫描的方法,利用单片机控制数码管的后两位(C和D),来实现数码管从00显示到99的一个程序。
单片机每4ms输出一个信号,控制数码管显示一个数字,利用人眼的视觉暂停效呆来实现显示变化的过程。
由于外接电阻1K,所以单片机在亮度上不是很好,在以后的操作中还是需要改善的。
两位数码管源程序:
00-99
#include2c2052.h>^defineweixuanPlsbita=P3A5;
sbitb=P3A4;
sbitc=P3A3;
sbitd=P3A2;
voidtOyansliiQ址时4nis
TMOD=OXOi;//十六位
TLO=0x60;//设置定时初值
THO=OxFO;//设置定时初值
TR0=l;
xvhile(TF0==0);
TF0=0;
}
voidmam()
unsignedintj,kj;
codeunsignedcharshuzi[]={0x24,0xed.0x31.Oxa1.0xe8.
0xa2.0x22,0xe5,0x20,0xa0};
/********************************扌非挽设置*************************/
PlM0=0X00;
P1M1=OXFF;//设置Pl,P3接II的工作方式为推挽输出。
P3M0=0X00;
P3Ml=0XFF:
严****************************************************************/a=O;b=O;c=O;d=O;
xvhile(l)
血(J=O;jv10J-H-)p(坏
fbr(k=O;k<10:
k++)个位馆坏
for(l=0;1<125;!
++)//!
25*8ms=1000nis=1s
c=l;weixuaii=shuzi[j];tOyaiishi();c=O;4msd=l;weixuaii=shuzi[k];tOyansluQ;d=O:
4ms
}
接下来将会是对数码管的A.B,C,D四位的控制。
由于上面的基础,相信四位控制显示0000——9999的过程将不会很复杂。
异曲同工:
0000——9999
#include2c2052.h>
书defineweixuanPl
sbita=P3A5;
sbitb=P3A4;
sbitc=P3A3;
sbitd=P3A2;
voidtOyansliiQ延时4nis
{
TMOD=0X01;//+六位
TLO=0x60;//设置定时初值
THO=OxFO;〃设置定时初值
TR0=l;
while(TF0==0);
TFO=O:
}
voidmam()
{
unsignedchari,kJaiLii;
codeunsignedcharshuzi[]={0x24,0xed.0x31.Oxa1,0xe8,
0xa2.0x22,0xe5,0x20,0xa0};
/********************************ift|&[«-^**************************/
PlM0=0X00;
P1M1=OXFF;//设置Pl,P3接门的工作方式为推挽输出。
P3MOOXOO;
P3Ml=0XFF:
*****************************************************************/
a=O;b=O;c=O;d=O;
xvhile(l)
{
fbr(k=O;k<10;k++)7千位
{
fbr(l=0;l<10;l++)//百位
{
for(m=0;m<10|•位
//4ms*4=16nis;
fbi(n=O;n<10;n++)、(I
{
foi(i=0;i<62;i-H-)//62ms*16=992ms1s
{
a=l;weixuan=shuzi[k];tOyanshi();a=O:
4msb=1;weixuan=shuzi[l];tOyansluQ;b=O;4ms
c=l;weixuan=shuzi[m];tOvanshi();c=O;4msd=1;weixuan=shuzi[n];tOyanshi();d=O;4ms
}
更进一步:
1小时定时器
#include2c2O52.h>^defineweixuanPlsbita=P3A5;
sbitb=P3A4;
sbitc=P3A3;
sbitd=P3A2;
voidtOyansliiQ址时4ms
TMOD=0X01//+A位
TLO=0x60;〃设置定时初值
THO=OxFO;〃设置定时初值
TR0=l;
while(TF0==0);
TF0=0;
}
voidtlyansliiQ//lnis
TMOD=0X10;
TLl=0xl8;〃设置定时初值
THl=0xFC;〃设置定时初值
TR1=1;
while(TFl==0);
TF1=O;
}
voidmam()
unsignedchari,kdaiLii;
codeunsignedcharshuzi[]={0x24,0xed.0x31.Oxa1.0xe8.0xa2.0x22,0xe5,0x20,0xa0};
/********************************扌非挽设置**************************/
PlM0=0X00;
P1M1=OXFF;/置Pl,P3接II的工作方式为推挽输出o
P3M0=0X00;
P3Ml=0XFF:
a=O;b=O;c=O;d=O;
while(l)
{
fbr(k=0;k<6;k++)7T-位
for(l=0;l<10;l++)/7百位
{
fbr(m=O;m<6;m++)k7<
{
fbi(n=O;n<10;ii-h-).7个位
{
for(i=0;i<55;i++)//19*551045nis=ls
{
a=l;weixuan=shuzi[k];tOyanshi();a=O:
4ms
b=1;weixuan=shuzi[l];tOyanslu();b=O:
4msc=l;weixuan=shuzi[m];tOvanshi();c=O;4msd=l;weixuan=shuzi[n];tOyanshi();d=O;4msif(i<25)
{
b=l;weixuan=^0x20;tlyansliiQ;b=0;inis
c=l;weixuau=^0x20;tlyaiisliiQ;c=0;1ms
烁d=1;weixuan=^0x2O;tlyansliiQ;d=O;1ins
}
}
}
}
}
小数点可能是由3位共同控制的,暂时还没有发现时那两位控制的,所以干脆使用三位控制。
如果小数点的控制也使用4ms的延时,那么每一位数码管显示的时间间隔将会是28ms,经过实际的测试发现能够明显感觉出闪烁来。
由于小数点的显示是连续的,即连续亮25个周期,灭25个周期,所以使用1ms的延时并不会有什么影响。
欲穷千里目
下面是24h定时器的源程序。
由于实验板的面积有限,不能加入两个调整时间的开关,因此不能实现调整时间,在未来的实验中将会解决这一问题。
增加调节小时,分钟的程序。
#include2c2052.h>
^defineweixuanPl
sbita=P3A5;
sbitb=P3八4;
sbitc=P3A3;
sbitd=P3A2;
voidtOyansliiQ延时Inis
{
TMOD=0X01;〃十六位
TL0=0xl8;//设置定时初值
TH0=OxFC;//设置定时初值
TRO=1;
while(TF0==0);
TF0=0:
}
voidtlyansliiQ//lnis
{
TMOD=0X10;
TLl=0xB4;//设置定时初值
TH1=OxFE;〃设置定时初值
TR1=1;while(TFl==O);
TF1=O;
}
voidmam()
{
unsignedcharkJjnji;mti;
codeunsignedcharshuzi[]={0x24.0xed.0x31.Oxa1.Oxe&
0xa2.0x22,0xe5,0x20,0xa0};
P1MOOXOO;
P1M1=OXFF;/设置Pl,P3接口的工作方式为推挽输出。
P3MOOXOO;
P3Ml=0XFF:
J*****************************************************************/
a=O;b=O;c=O;d=O;
xvhile(l)
{fbr(k=0;k<2;k++)//T位
{
fbr(l=0;l<10;l++)//百位
{
if(k=2&&k==4)break;fbr(m=0;m<6;m++)1、
{
fbi(n=O;n<10;n++丿个仆for(i=0;i<12000;i-H-)//5ms*12000=lniui
{
a=l;weixuan=shuzi[k];tOyansliiQ;a=O/1ms
b=1;weixuan=shuzi[l];tOyanslii();b=O:
1msc=l;weixuan=shuzi[m];tOyanshi();c=O;//lmsd=1;weixuan=shuzi[n];tOyanshi();d=O;//1msif(i/l00%2==0),7小数点闪烁
{
b=1;weixuan=^0x2O;tlyansliiQ;b=0;//33Ous
c=1;weixuau=^0x20;tlyaiisliiQ;c=O;33Ousd=l;weixuan=^0x20;tlyansliiQ;d=0y/330us
}
}
}
}
}
}
}
}
〃注意如果小数点闪烁的程序中同时设置小数点控制为bcd=l,那么将会造成电流较小从而小数点的闪烁过暗。