Ⅰ 单片机c51输出数码管显示为什么共阳极0是0xc0,共阴极是0x7e
这是根据数码管的特性决定的(因为一个段位的数码管是由8个二极管组成的),因为共阳极的数码管,公共脚接的是电源VCC,所以,想要把那一个二极管点亮就必需将这个点接地,它就会发亮了,例如:要显示数字“0”,就要把“a、b、c、d、e、f”这几个发光二极管接地,其它二极管接VCC,它就会显示成一个“0”了,把它转换成二进制码:1100 0000,所以它的十六进制为:0xc0,而共阴极的段位数码管正确的二进制码应该是:0011 1111,十六进制为:0x3f.
Ⅱ C51单片机的数码管显示问题
#include <REGX52.H>
#define uint unsigned int
#define uchar unsigned char
uchar shi,ge,t,num,xms;
sbit wela=P2^7;
sbit la=P2^6;
sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uchar xms)//这里最好把uchar改为uint,当然不改应该也没问题,你下面的i跟xms类型不一样,在这里应该是没问题,最好还是统一一下
{
int i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display(uchar shi,uchar ge)
{
shi=num/10;
ge=num%10;
la=1;
P0=table[shi];
la=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(5);
wela=1;
P0=0xfd;
wela=0;
//delay(5);
la=1;
P0=table[ge];
la=0;
delay(5);
}
void main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
if(key1==0)
{
delay(10);//这里消抖也是,也就是说,用按键的话,数码管就是会闪
因为时间有点长对吧,数码管来不及立刻显示,此时用肉眼就能看到闪,所以应该避免不了吧,除非你消抖时间也改短一点,你试试看。看看效果
if(key1==0)
num++;
if(num==60)
num=0;
while(!key1);
delay(10); //按一下十位闪一下就是这里延时太长了,可以不用延时,
数码管动态显示要求扫描很快,你上面就是延时了5ms,如果时间再长一点,那你就能看到数码管不停的闪。所以这里10ms太长了,可以不用。
但为什么个位没闪,应该是在display时,先是现实十位,然后把十位灭掉,再显示个位,一直等到在显示十位时,个位才灭,就是说在这支前,个位是亮的,由于你这延时了10ms,导致此时十位没有很快的显示出来,所以等过了10ms之后,十位才由暗变亮,你就可以看到十位闪了一下。
当你按住key1时,key1一直是0,那么!key1=1;所以程序一直执行while(!key1);这句语句,那么结合上面所说十位就亮不了了,只有个位亮。
你可以试着改改delay函数中的值大小,自己观察一下,display中的delay值可以更小的,3ms,2ms,自己试试吧
}
if(key2==0)
{
delay(10);
if(key2==0)
num--;
if(num==-1)
num=59;
while(!key2);
delay(10);
}
if(key3==0)
{
delay(10);
if(key3==0)
num=0;
while(!key1);
delay(10);
}
if(key4==0)
{
if(key4==0)
{
TR0=~TR0;
}
while(!key4);
}
display(shi,ge);
}
}
void time() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
if(t==20)
{
t=0;
num++;
if(num==60)
num=0;}}
Ⅲ 51单片机数码管如何依次点亮
51单片机数码管依次点亮:选择数码管操作称为位选,根据自己的开发板原理图找到位选对应的管脚,以共阴极为例。要在编程时执行选中操作,只要给对应管脚低电平即可。段选同样。如果每个单独连接占用管脚太多,很浪费硬件资源,所以采用多位串联控制。
数码管通常有两种不同的接法,共阴极和共阳极,共阴极顾名思义就是讲八个二极管的阴极连接在一起,这样根据二极管导通原理,通过控制不同二极管阳极电平就可以控制数码管显示不同的数字。单个数码管是由八个发光二极管连接而成,通过控制不同led点亮,可以使之显示不同的数字。
注意区分两个概念即段选和位选;位选指数码管对应的位,例如图共有八个数码管,位选就是选中哪一个数码管操作,段选则是控制数码管显示什么数字。静态显示为了缩短代码长度,一般都是采用总线式编程,显示数字共阴共阳互为反。
Ⅳ C51单片机数码管动态显示工作原理是什么
数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类。
��① 静态显示驱动:静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动,要知道一个89S51单片盯脊机罩稿可用的I/O端口才32个呢:),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。
��② 动态显示驱动:数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会凯闷渗亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。
Ⅳ C51单片机如何让四位数码管分别显示四位不同的数字
每一次只能让一个数码管位选,其他的关闭,给数码管赋值。重复4次就可以了。
假设要显示“1234”:
#include<reg52.h>
sbit k1 = P1^1;
sbit k2 = P1^2;
sbit k3 = P1^3;
sbit k4 = P1^4;//k1-k4 4个位选开关,我假设你的电路是低电平有效
uchar code table[]={0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8;
0x80,0x98};//共阳极1-9
void delay( char t )//延时函数
{
char x,y;
for( x = t;x > 0;x-- )
{
for( y = 100;y > 0;y-- );
}
}
void main()//主函数
{
int i = 1234;
int temp;
while(1)
{
temp = i;//temp = 1234;
//显示第4位
k1 = k2 = k3 = k4 = 1;//关闭所有未选
k4 = 0;//打开第4位位选
P2 = table( temp%10 );//假设P2口控制数码管
temp = temp / 10;//temp = 123
delay( 5 );
//显示第3位
k1 = k2 = k3 = k4 = 1;//关闭所有未选
k3 = 0;//打开第3位位选
P2 = table( temp%10 );//,假设P2口控制数码管
temp = temp / 10;//temp = 12
delay( 5 );
//显示第2位
k1 = k2 = k3 = k4 = 1;//关闭所有未选
k4 = 0;//打开第4位位选
P2 = table( temp%10 );//,假设P2口控制数码管
temp = temp / 10;//temp = 1;
delay( 5 );
//显示第1位
k1 = k2 = k3 = k4 = 1;//关闭所有未选
k4 = 0;//打开第1位位选
P2 = table( temp%10 );//假设P2口控制数码管
delay( 5 );
}
}
Ⅵ c51单片机按键每按一次同时数码管显示数字加一是什么
-x0dx0a建立孝镇一个数组,用于存放 0-9的段码。x0dx0aint Shuzu[]={---------};x0dx0a如果会用指针x0dx0aint *P;x0dx0aP=Shuzu; //指针指向数组!x0dx0a用外部中断,x0dx0a每中断一次,中断服务程序将数组元素加一P0=Shuzu[ax++](或指针加一:P0=*P++)x0dx0a以上假设P0口驱动数码管!x0dx0a至于数码管使用的是共阳还是共阴,就把相对的数值存在数组中!x0dx0a-x0dx0a外部中断0的中断程序入口x0dx0avoid TI_0() interrupt 0x0dx0a{x0dx0a --------x0dx0a}x0dx0a都提示到这里了,下面自己该会吧?x0dx0a如果是新手的新手---想要我帮你写全部程序--x0dx0a那至少你得把你单片机芯片型号说给我巧亏粗才能帮你!x0dx0a还有数码管是用单片机哪个IO口!x0dx0a数码管是怎么空含连接的?(串/并)
Ⅶ C51单片机,控制数码管每隔3秒,循环数字1234,5678,9876,1368
用四位一体的共阴数码管,用定时器T0定时,实现3秒切换显示四组数字。仿真实现,仿真图如下
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴段码
uchar code disb[]={0xfe,0xfd,0xfb,0xf7};//位码
uchar buf[]={1,2,3,4,5,6,7,8,9,8,7,6,1,3,6,8};//显示四组数字
uchar t0n;//T0定时器中断计数
void delay()//延时子程序
{
uint y;
for(y=400;y>0;y--);
}
void display(uchar x)//显示子程序,x为显示起始位
{
uchar j;
for(j=0;j<4;j++)
{
P2=disb[j];//输出位码
P0=tab[buf[j+x]];//输出段码
delay();
}
}
void main()//主程序
{
uchar x;
TMOD=0x01;//T0方式1
TH0=0x3C;//晶振12MHz,定是50ms,时间常数,X=3CB0H
TL0=0xB0;
IE=0x82;
TR0 =1;
while(1)
{
display(x);
if(t0n>=60)
{
t0n=0;
x+=4;
if(x>12)x=0;
}
}
}
//定时器T0中断程序
void T0_ISR() interrupt 1
{
TH0=0x3C;
TL0=0xB0;
t0n++;
}
Ⅷ c51单片机 怎样实现静态数码管动态显示的数字等于点亮LED灯的个数
c51单片机,静态数码管显示数字等于点亮LED灯的个数,这个很容易实野档郑现的。在P3口接8个LED灯,且负极接P3口,亮1个灯时,蠢渗P3=0xFE,再依次向左移位一次,从低位向左增加一个0,则亮灯数加一,同时,用一个变量计颂颂数,并送数码管显示就行了,一位共阳数码管接在P0口。仿真图如下。