Ⅰ 如何将52单片机的数码管点亮
#include<reg52.h>
#define uint unsigned int
uint code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uint num=0,aa=0,,shi,ge;
void display(uint ,shi,ge);//数码管位显示子函数
void init(); //定时器子函数
void delay(uint z); //延时子函数
void main()
{
init();//初始化定时器
while(1)//进入大循环等待中断的产生
{
if(aa==20)
{
aa=0;
num++;
if(num==100)num=0;
=num/100;
shi=num%100/10;
ge=num%10;
}
display(,shi,ge);
}
}
void display(uint ,shi,ge)
{
P1=0xfe;
P0=table[];
delay(5);
P1=0xfd;
P0=table[shi];
delay(5);
P1=0xfb;
P0=table[ge];
delay(5);
}
void timer0() interrupt 1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
aa++;
}
void init()
{
TMOD=1;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void delay(uint z)
{
uint a,b;
for(a=z;a>0;a--)
for(b=110;b>0;b--);
}
提醒:如果对你的数码管是共阳极的,那么uint code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
要改成int code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,
0x82,0xF8,0x80,0x90,0x88,0x83,
0xC6,0xA1,0x84,0x0E};
希望对你有帮助!
Ⅱ 给单片机什么电平,共阳极数码管的相应字段被点亮
前面半句“给单片机什么电平”真是匪夷所思……
对芹毁脊于共阳极数码嫌渗管,其段选被拉余租低时,对应的字段会被点亮。
Ⅲ 51单片机怎么点亮数码管
单片机通过驱动电路给数码管中相应各段的发光二极管加正向电压,该段发光二极管就会被点亮。
不同段的发光二极管加正向电压则亮,不加正向电压则灭,这样就可以通过各段的亮灭组合,来显示不同的数字和字符了。
单片机是通过向数码管送段形(即显示编码),来给数码管相应的各段加正向电压来实现的。
Ⅳ 51单片机怎么用按键控制一个数码管,按一下显示一个数字,顺序显示
1、首先,要把代码写好,点亮数码管。
Ⅳ 51单片机数码管如何依次点亮
51单片机数码管依次点亮:选择数码管操作称为位选,根据自己的开发板原理图找到位选对应的管脚,以共阴极为例。要在编程时执行选中操作,只要给对应管脚低电平即可。段选同样。如果每个单独连接占用管脚太多,很浪费硬件资源,所以采用多位串联控制。
数码管通常有两种不同的接法,共阴极和共阳极,共阴极顾名思义就是讲八个二极管的阴极连接在一起,这样根据二极管导通原理,通过控制不同二极管阳极电平就可以控制数码管显示不同的数字。单个数码管是由八个发光二极管连接而成,通过控制不同led点亮,可以使之显示不同的数字。
注意区分两个概念即段选和位选;位选指数码管对应的位,例如图共有八个数码管,位选就是选中哪一个数码管操作,段选则是控制数码管显示什么数字。静态显示为了缩短代码长度,一般都是采用总线式编程,显示数字共阴共阳互为反。
Ⅵ 单片机开关控制LED数码管的编码
一,什么是数码管
数码管,其实就是由多个led组合在一起的组合显示块;有共阴极的,也有共阳极的。使用的数码管不同,里面包含的led个数也会有相关的差异。我们通常使用的数码管,里面有8个led灯,大家可以参照生活中的数码管器件就一目了然了,你会发现,数码管显示的每一个数字或字母,都是一段一段组合拼接起来的,并不是像写的那样圆滑。其中,组合的每一个段,就是一个led灯。
二,点亮一个数码管
2.1.在点亮数码管之前,你还必须弄清楚,改数码管的接是共阴极还是共阳极的接法;其次,还得弄清楚是那几个(或一个) IO口是IO口 的断选位(也就是控制显示哪一个数码管,通常由IO口控制一个译码器来实现,因为这样更节约IO口资源)。
2.2.弄清楚断选位之后,还得知道,是哪些IO口控制我们的数码管上的led;
比如:
P0.0 控制数码管上的led.0;(注意:数码管上对应的led位,可以参照原理图上的或查阅相关资料获得,这里仅仅举列)
P0.1-->led.1 P0.2-->led2 ......
2.3.想要点亮数码管很容易,只要开启对应的数码管断选位,再设置数码管上led的值为点亮(有的数码管是共阴极接法,有的是共阳极接法,根据具体的设计,给出相关的高或低电平即可)就OK了。但是,我们要在数码管上显示我们想要的数字增么办呢?这个时候,就是考研创造力的时候了,有的数码管的资料会直接给出它的真值表,但有的却不一定找得到。在这个时候,我们就得根据我们想要显示的数字,点亮并熄灭对应数码管上的led来实现。(推荐:你可以自己先实验,找出0-9,或其他想要显示的字符所对应的IO口的值,来保存起来,这样你就可以重复利用啦!)
三,点亮多个数码管
3.1 我们想要点亮多个数码管,首先可以根据2.1,弄清楚你的数码管的断选位,然后周期性的改变断选位的值,以此动态逐个显示你的数码管。
3.2 在显示多个数码管时,建议周期大于100hz,这样人眼难以识别起关和开的瞬间,我们看起来就像时很多个数码管同时点亮了一样。
四,动态显示数码管
4.1 ,在动态显示数码管的值时,建议先根据2.2和2.3,把对应的数码管显示参数照准,并保存下来,这样你用起来也方便。
4.2, 动态显示数码管,我们可以在规定的时间周期,改变数码管对应led的开关个数来实现,比如说:
0 在数码管中显示的值为0xc0 1是0xf9
那么我们就可以在规定的时间里,切换该值,从而达到动态效果。
4.3 我们应该注意的时,扫描数码管(即显示多个数码管)应该与设置数码管的值(数码管中led的状态更新)区分开,扫描周期我们可以放短一点,而改变它的值的周期我们可以一秒或者是2秒改变一次。
4.4 消除余晖,大家实验后,可能会发现,你显示的值有的时候并不是想要的,它会跳动或者是亮灭不清晰,这个我们就叫做余晖效应。
产生余晖效应的原因是因为你在选则下一个数码管的时候,还保留了上一个数码管的显示值,所以我们消除余晖,只需要在改变数码管显示值的时候,先关闭所有数码管的显示,在值跟新完成后我们再打开显示。这里你不用担心关闭和开启会有闪烁,更新值的时间会很短,肉眼时几乎察觉不到滴。
5,示列代码
/*
芯片:stc89c52
器件:38译码器等
编译环境:UV4,C语言
*/
#include
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
unsigned char code LedChar[] = {undefined
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e
};//数码管显示值真值表缓存数组
unsigned char LedBuff[6] = {undefined
0xff,0xff,0xff,0xff,0xff,0xff
};//数码管显示值缓存数组
void main()
{undefined
unsigned char i =0;
unsigned int cnt = 0;
unsigned long sec = 0;
ENLED = 0;
ADDR3 = 1;
TMOD = 0x01;
TH0 = 0xfc;
TL0 = 0x67;
TR0 = 1;
while(1)
{undefined
if(TF0==1)
{undefined
TF0 = 0;
TH0 = 0xfc;
TL0 = 0x67;
cnt++;
if(cnt>=1000)
{undefined
cnt = 0;
sec++;
LedBuff[0] = LedChar[sec%10];
LedBuff[1] = LedChar[sec/10%10];
LedBuff[2] = LedChar[sec/100%10];
LedBuff[3] = LedChar[sec/1000%10];
LedBuff[4] = LedChar[sec/10000%10];
LedBuff[5] = LedChar[sec/100000%10];
}
switch(i)
{undefined
case 0:ENLED = 1;ADDR2=0;ADDR1=0;ADDR0=0;i++;P0=LedBuff[0];ENLED = 0;break;
case 1:ENLED = 1;ADDR2=0;ADDR1=0;ADDR0=1;i++;P0=LedBuff[1];ENLED = 0;break;
case 2:ENLED = 1;ADDR2=0;ADDR1=1;ADDR0=0;i++;P0=LedBuff[2];ENLED = 0;break;
case 3:ENLED = 1;ADDR2=0;ADDR1=1;ADDR0=1;i++;P0=LedBuff[3];ENLED = 0;break;
case 4:ENLED = 1;ADDR2=1;ADDR1=0;ADDR0=0;i++;P0=LedBuff[4];ENLED = 0;break;
case 5:ENLED = 1;ADDR2=1;ADDR1=0;ADDR0=1;i=0;P0=LedBuff[5];ENLED = 0;break;
default:break;
}
}
}
}
以上代码,仅供参考,您需要根据自己原理图的设计来实现。
Ⅶ keil51单片机数码管滚的显示
一,LED数码管显示的原理
数码管的发光原理实际是七段LED灯(不包括小数点)或者八段LED灯被点亮的结果。八段依次是 a,b,c,d,e,f,g,dp(表示点)。LED数码管是常见的显示器件,在很多场合都可以看到,比如,闹钟冲胡的显示,家电的显示功能,车站等等。我们看到的数码管为“8”字形,数码管又分为共阴极和共阳极两种。
1.共阴极:就是将八段数码管的阴极(负极)接地在一起,需要高电平点亮。如下图所示
2.共阳极:就是将八段数码管的阳极(正极)接(+5v)在一起,需要低电平点亮。如下图所示
3.数码管的具体显示
①共阴数码管的点亮
为使数码管的不同段显示不同的字符,需要点亮和熄灭不同段的LED灯,才可以实现。对于共阴极数码管来说,只需要给高电平LED灯就会被点亮,对应的断码就会亮起。给低电平相应的断码就会熄灭。
以显示“0”为例 只需要给“dp”和“g”给低电平熄灭就可以了
断码的顺序为:dp g f e d c b a
“0”断码用16进制表示为:3FH
其他字符的断码以此类推:如下表所示
②共阳数码管的点亮
为使数码管的不同段显示不同的字符,需要点亮和熄灭不同段的LED灯,才可以实现。对于共阳极数码管来说,只需要给低电平LED灯就会被点亮,对应的断码就会亮起。给高电平相应的断码就会熄灭。
以显示“0”为例 只需要给“dp”和“g”给高电平熄灭就可以了
断码的顺序为:dp g f e d c b a
1 1 0 0 0 0 0 0
“0”断码用16进制表示为:C0H
其他字符的断码以此类推:如下表所示
二.动态数码管的显示(共阴)
思路: 建立显存、断码、位码表格,将软件延时部分设计成子函数的结构,在主函数中利用查表的方法来获得相应的位码和段码,这种思路经常用于显示变化的字符。
显示的状态(左移动态显示,类似于常见的广告牌)
3.原理图(protues仿真图)
4.设计方法
在多个数码管的显示中点亮数码管需要 位码和段码共同作核搏用才能点亮
位码(低电平有效):表示要点亮的数码管的位置。
断码(上面讲过了):就是要点亮哪一段数码管
举例说明:
如果要在上面的六个数码管中点亮第一个数码管,且让它显示“1”,首先确定它的位置是第六个。用八个二进制表示,最低位从0开始,最高位为7 那么它的位码为:11111110 (低电平有效)
断码为0x06
其他的以此类推
先要数码管动态显示要建一个数组。下图为断码
源代码:
#include#include#define uchar unsigned char#define uint unsigned intsbit an=P2^6; sbit wei=P2^7; uchar code tab[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f, 0x6f,0x77,0x7c,0x39,0x5e,0x79,0x00,0x40}; //共阴极数码管段码表uchar idata dis_buf[6]={17,17,17,17,17,17}; //显示缓冲区数据(十进制)void delayms(uint i) //延时1ms函数{ uint j; for(;i>0;i--) for(j=120;j>0;j--) {;}}void main() //主函数{ uchar k,m,n,bitcode,segcode; while(1) { for(n=0;n<17;n++) { dis_buf[0]=dis_buf[1]; //数据移动 dis_buf[1]=dis_buf[2]; dis_buf[2]=dis_buf[3]; dis_buf[3]=dis_buf[4]; dis_buf[4]=dis_buf[5]; dis_buf[5]=n; for(m=0;m<100;m++) //100次扫描,大约600ms { bitcode=0xfe; //起始位码 for(k=0;k<6;k++) { P0=0xff; //消影 wei=1; wei=0; segcode=dis_buf[k]; //取数据 P0=tab[segcode]; //送段码散氏拦 an=1; an=0; P0=bitcode; //送位码 wei=1; wei=0; delayms(1); bitcode=_crol_(bitcode,1); //更新位码,准备显示下一位 } } } }}
Ⅷ 请大虾们帮下忙。单片机。如何点亮所有的数码管
你这个图是用138译码器控制位选的,所以不能用这种圆岁静态显示,这种连接方法是不能静态显示的。只能动态显示。
看的出来你这是郭天祥的程序吧,呵呵。并不是所有的电路板都是那样连接。我给你个程序吧。你这个图跟我的板子是一样的,正好有一个,拿去用吧。好宴盯好看看晌腔和。
这个程序是我以前做的,八只管显示0-7
#include<reg52.h>
#define
uchar
unsigned
char
uchar
code
table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07};
uchar
a;
sbit
d=P3^7;
void
delay(uchar
z)
{
uchar
x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void
main()
{
while(1)
{
for(a=0;a<8;a++)
{
P2=a;
d=0;
P0=table[a];
d=1;
delay(10);
}
}
}
Ⅸ 51单片机怎样用键盘控制数码管显示
51单片机怎样用键盘控制数码管显示的方法。
如下参考:
1.首先,编写代码并点亮数码管。