四位共阳数码管的使用剖析
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
软件准备
将单片机的I/O接口设置成推挽输出。
P1M0=0X00;
P1M1=0XFF;
P3M0=0X00;
P3M1=0XFF;
控制思路:
第三四位作为秒表的秒针部分,每秒钟变化一次。当第四位由0变到9时,第四位自动清零,第三位由0变成1,实现加一。
软件的实现分为两部分。首先先实现后两位的秒针功能,先将前两位置之。下面是编程的设想。
TH0 = 0xF0;//设置定时初值
TR0=1;
while(TF0==0) ;
TF0=0;
}
void main()
{
unsigned int j,k,l;
code unsigned char shuzi[]={0x24,0xed,0x31,0xa1,0xe8,
0xa2,0x22,0xe5,0x20,0xa0};
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
1
25
3
1
0
0
0
0
1
0
1
85Βιβλιοθήκη Baidu
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
1
81
下面是对D位数码管的控制,以测试段选的有效性。
/********************************推挽设置*************************/
P1M0=0X00;
P1M1=0XFF;//设置P1,P3接口的工作方式为推挽输出。
P3M0=0X00;
P3M1=0XFF;
/*****************************************************************/
#include<stc12c2052.h>
#define weixuan P1
sbit a= P3^5;
sbit b =P3^4;
sbit c =P3^3;
sbit d= P3^2;
void yanshi(unsigned int a )
{
unsigned int i;
while(--a)
{
for(i=0;i<600;i++) ;
四位数码管的探究
硬件准备
四位共阳数码管一块,1K电阻4只。数码管的引脚图如下所示:
使用的单片机是STC12C2052,位选可以使用P1接口控制。
参照下面数据手册的内容,可以看出P3.5,3.4,3.3,3.2均能够作为I/O接口以推挽方式使用。由于数码管所能承受的电流较小,所以外加1K的限流电阻。
单片机P3.5,3.4,3.3,3.2四个接口可以作为数码阳极一端,利用推挽方式输出高电平,P1接口作为数码管的段选,输出低电平,驱动每一段数码管,这就为设想的实现取得了理论的基础。证明了使用20脚单片机控制数码管产生时钟的效果是切实可行的。下面关键的部分就成了数码管的编程阶段了。
while(9)
{
unsigned int j;
d=1;
for(j=0;j<=9;j++)
{
weixuan=shuzi[j];
yanshi(1000);
}
}
}
这样的话,第D位会大约每一秒显示一个数字,从0到9不断地循环。证明了段选的设置是真实有效的。接下来的任务就是对ABC位进行控制。
下面是实际的焊接之中,考虑到实际电路的连接顺序,采用下面的连接。
8
0
0
1
0
0
0
0
0
0x20
9
1
0
1
0
0
0
0
0
0xa0
下面是通过动态扫描的方法,利用单片机控制数码管的后两位(C和D),来实现数码管从00显示到99的一个程序。单片机每4ms输出一个信号,控制数码管显示一个数字,利用人眼的视觉暂停效果来实现显示变化的过程。由于外接电阻1K,所以单片机在亮度上不是很好,在以后的操作中还是需要改善的。
}
}
void main()
{
code unsigned char shuzi[]={0x11,0xd7,0x25,0x85,0xc3,0x89,0x09,0xd5,0x01,0x81};
P1M0=0X00;
P1M1=0XFF;//设置P1,P3接口的工作方式为推挽输出。
P3M0=0X00;
P3M1=0XFF;
引脚
1.7
1.6
1.5
1.4
1.3
1.2
1.1
1.0
1
2
3
4
11
5
7
10
1
2
3
4
11
5
7
10
十六
0
0
0
1
0
0
1
0
0
0x24
1
1
1
1
0
1
1
0
1
0xed
2
0
0
1
1
0
0
0
1
0x31
3
1
0
1
0
0
0
0
1
0xa1
4
1
1
1
0
1
0
0
0
0xe8
5
1
0
1
0
0
0
1
0
0xa2
6
0
0
1
0
0
0
1
0
0x22
7
1
1
1
0
0
1
0
1
0xe5
a=0;b=0;c=0;d=0;
while(1)
{
for(j=0;j<10;j++)//十位循环
{
for(k=0;k<10;k++)//个位循环
{
for(l=0;l<125;l++)//125*8ms=1000ms=1s
{
c=1;weixuan=shuzi[j];t0yanshi();c=0;//4ms
两位数码管源程序:
#include<stc12c2052.h>
#define weixuan P1
sbit a= P3^5;
sbit b =P3^4;
sbit c =P3^3;
sbit d= P3^2;
void t0yanshi()//延时4ms
{
TMOD=0X01;//十六位
TL0 = 0x60;//设置定时初值
d=1;weixuan=shuzi[k];t0yanshi();d=0;//4ms
}
}
}
}
}
接下来将会是对数码管的A,B,C,D四位的控制。由于上面的基础,相信四位控制显示0000——9999的过程将不会很复杂。
下面将使用单片机控制数码管产生时钟的效果。由于单片机的计时是由软件延时的方法产生,所以说误差会有很大。因此本作品仅供娱乐。初期的想法是加入闹钟的概念。但是由于闹钟的定时不易调整,只能通过计算机编写软件定闹,这样就不是时钟的简洁的目的。另外,由于当单片机控制蜂鸣器响的时候,单片机控制数码管的部分势必会停止,这样又会影响时钟的准确性。因此,首先要实现的只是单片机的简易时钟功能或者说只是一个最大为1小时的秒表。
由于数码管的引脚是共阳极,所有的阳极都是连接在一起的,因此不能同时给所有的阳极供电,如果那样的话,所有的数码管会有相同的显示方式。考虑到这一情况,只能采用和点阵屏类似的扫描方法,即将数码管分成四个一位的情况,然后每个4ms扫描一次的方法。
P3.5
P3.4
P3.3
P3.2
A
B
C
D
显示
P1.7
P1.6
P1.5
将单片机的I/O接口设置成推挽输出。
P1M0=0X00;
P1M1=0XFF;
P3M0=0X00;
P3M1=0XFF;
控制思路:
第三四位作为秒表的秒针部分,每秒钟变化一次。当第四位由0变到9时,第四位自动清零,第三位由0变成1,实现加一。
软件的实现分为两部分。首先先实现后两位的秒针功能,先将前两位置之。下面是编程的设想。
TH0 = 0xF0;//设置定时初值
TR0=1;
while(TF0==0) ;
TF0=0;
}
void main()
{
unsigned int j,k,l;
code unsigned char shuzi[]={0x24,0xed,0x31,0xa1,0xe8,
0xa2,0x22,0xe5,0x20,0xa0};
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
1
25
3
1
0
0
0
0
1
0
1
85Βιβλιοθήκη Baidu
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
1
81
下面是对D位数码管的控制,以测试段选的有效性。
/********************************推挽设置*************************/
P1M0=0X00;
P1M1=0XFF;//设置P1,P3接口的工作方式为推挽输出。
P3M0=0X00;
P3M1=0XFF;
/*****************************************************************/
#include<stc12c2052.h>
#define weixuan P1
sbit a= P3^5;
sbit b =P3^4;
sbit c =P3^3;
sbit d= P3^2;
void yanshi(unsigned int a )
{
unsigned int i;
while(--a)
{
for(i=0;i<600;i++) ;
四位数码管的探究
硬件准备
四位共阳数码管一块,1K电阻4只。数码管的引脚图如下所示:
使用的单片机是STC12C2052,位选可以使用P1接口控制。
参照下面数据手册的内容,可以看出P3.5,3.4,3.3,3.2均能够作为I/O接口以推挽方式使用。由于数码管所能承受的电流较小,所以外加1K的限流电阻。
单片机P3.5,3.4,3.3,3.2四个接口可以作为数码阳极一端,利用推挽方式输出高电平,P1接口作为数码管的段选,输出低电平,驱动每一段数码管,这就为设想的实现取得了理论的基础。证明了使用20脚单片机控制数码管产生时钟的效果是切实可行的。下面关键的部分就成了数码管的编程阶段了。
while(9)
{
unsigned int j;
d=1;
for(j=0;j<=9;j++)
{
weixuan=shuzi[j];
yanshi(1000);
}
}
}
这样的话,第D位会大约每一秒显示一个数字,从0到9不断地循环。证明了段选的设置是真实有效的。接下来的任务就是对ABC位进行控制。
下面是实际的焊接之中,考虑到实际电路的连接顺序,采用下面的连接。
8
0
0
1
0
0
0
0
0
0x20
9
1
0
1
0
0
0
0
0
0xa0
下面是通过动态扫描的方法,利用单片机控制数码管的后两位(C和D),来实现数码管从00显示到99的一个程序。单片机每4ms输出一个信号,控制数码管显示一个数字,利用人眼的视觉暂停效果来实现显示变化的过程。由于外接电阻1K,所以单片机在亮度上不是很好,在以后的操作中还是需要改善的。
}
}
void main()
{
code unsigned char shuzi[]={0x11,0xd7,0x25,0x85,0xc3,0x89,0x09,0xd5,0x01,0x81};
P1M0=0X00;
P1M1=0XFF;//设置P1,P3接口的工作方式为推挽输出。
P3M0=0X00;
P3M1=0XFF;
引脚
1.7
1.6
1.5
1.4
1.3
1.2
1.1
1.0
1
2
3
4
11
5
7
10
1
2
3
4
11
5
7
10
十六
0
0
0
1
0
0
1
0
0
0x24
1
1
1
1
0
1
1
0
1
0xed
2
0
0
1
1
0
0
0
1
0x31
3
1
0
1
0
0
0
0
1
0xa1
4
1
1
1
0
1
0
0
0
0xe8
5
1
0
1
0
0
0
1
0
0xa2
6
0
0
1
0
0
0
1
0
0x22
7
1
1
1
0
0
1
0
1
0xe5
a=0;b=0;c=0;d=0;
while(1)
{
for(j=0;j<10;j++)//十位循环
{
for(k=0;k<10;k++)//个位循环
{
for(l=0;l<125;l++)//125*8ms=1000ms=1s
{
c=1;weixuan=shuzi[j];t0yanshi();c=0;//4ms
两位数码管源程序:
#include<stc12c2052.h>
#define weixuan P1
sbit a= P3^5;
sbit b =P3^4;
sbit c =P3^3;
sbit d= P3^2;
void t0yanshi()//延时4ms
{
TMOD=0X01;//十六位
TL0 = 0x60;//设置定时初值
d=1;weixuan=shuzi[k];t0yanshi();d=0;//4ms
}
}
}
}
}
接下来将会是对数码管的A,B,C,D四位的控制。由于上面的基础,相信四位控制显示0000——9999的过程将不会很复杂。
下面将使用单片机控制数码管产生时钟的效果。由于单片机的计时是由软件延时的方法产生,所以说误差会有很大。因此本作品仅供娱乐。初期的想法是加入闹钟的概念。但是由于闹钟的定时不易调整,只能通过计算机编写软件定闹,这样就不是时钟的简洁的目的。另外,由于当单片机控制蜂鸣器响的时候,单片机控制数码管的部分势必会停止,这样又会影响时钟的准确性。因此,首先要实现的只是单片机的简易时钟功能或者说只是一个最大为1小时的秒表。
由于数码管的引脚是共阳极,所有的阳极都是连接在一起的,因此不能同时给所有的阳极供电,如果那样的话,所有的数码管会有相同的显示方式。考虑到这一情况,只能采用和点阵屏类似的扫描方法,即将数码管分成四个一位的情况,然后每个4ms扫描一次的方法。
P3.5
P3.4
P3.3
P3.2
A
B
C
D
显示
P1.7
P1.6
P1.5