2015-09-05 16:26:35 yunfeiyang62 阅读数 19952
  • 静态和动态控制数码管-第1季第7部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第7个课程,全面讲解了静态数码管、无38译码器式动态数码管、有38译码器式动态数码管等各种数码管驱动方式,学完本课程将会对数码管的驱动方式彻底熟悉和掌握。

    2936 人正在学习 去看看 朱有鹏

51单片机 数码管的静态显示和动态显示

数码管(Segment Displays)由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极。数码管实际上是由七个发光管组成8字形构成的,加上小数点就是8个。这些段分别由字母a,b,c,d,e,f,g,dp来表示。

数码管原理图:

数码管共阴极接法:

数码管共阳极接法:


数码管中有位选和段选,位选就是选择哪个数码管,段选就是被选择的数码管要显示什么数字!

根据数码管的段选,可以总结出数码管的显示数据表:

符号

不显示

0

1

2

3

4

5

6

7

8

9

A

B

C

D

E

F

.

编码

0x00

0x3F

0x06

0x5B

0x4F

0x66

0x6D

0x7D

0x07

0x7F

0x6F

0x77

0x7C

0x39

0x5E

0x79

0x71

0x80


数码管的静态显示:

/*======================================================*/
/*	时间:2015年8月3日 21:19:03 						*/
/*	功能:数码管的静态显示								*/
/*	目的:51单片机学习 									*/
/*		^_^……!											*/
/*======================================================*/

#include 
#include "commLib.h"

sbit WLE  = P2^7;		// 位选
sbit DLE  = P2^6;		// 段选

#define DIGITAL_ARR_NUM		18
unsigned char code digital[DIGITAL_ARR_NUM] = {				// 数码管显示数据表
/*	 0,    1,    2,    3,    4,     5,   6,    7,    8, 	*/
	0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 
/*	 9,    A,    B,    C,    D,    E,    F,    .,   不显示 	*/
	0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x80, 0x00
};

int main(void)
{
	unsigned int i;
	
	// 位选
	WLE = 1;		// 位选端锁存器置高,送数据
	P0 = 0xC0;		// 送数据
	WLE = 0;		// 位选端锁存器置低,保存数据
	
	while(1)
	{
		for (i = 0; i < DIGITAL_ARR_NUM; i++)
		{
			// 段选
			DLE = 1;			// 段选端锁存器置高,送数据
			P0 = digital[i];	// 送数据
			DLE = 0;			// 位选端锁存器置低,保存数据
			
			delay(500);			// 延时500ms
		}
	}

	return 0;
}

效果截图:


数码管的动态显示:
/*======================================================*/
/*	时间:2015年8月6日 20:45:09 						*/
/*	功能:数码管的动态显示								*/
/*	目的:51单片机学习 									*/
/*		^_^……!											*/
/*======================================================*/

#include 
#include "commLib.h"

sbit WLE  = P2^7;		// 位选
sbit DLE  = P2^6;		// 段选

#define DIGITAL_ARR_NUM		18
unsigned char code digital[DIGITAL_ARR_NUM] = {				// 数码管显示数据表
/*	 0,    1,    2,    3,    4,     5,   6,    7,    8, 	*/
	0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 
/*	 9,    A,    B,    C,    D,    E,    F,    .,   不显示 	*/
	0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x80, 0x00
};

int main(void)
{
	unsigned int i;
	
	while (1)
	{
		for (i = 0; i < 6; i++)
		{
			P0 = 0xFF;				// 消影(必须有)
			WLE = 1;				// 位选端锁存器置高,送数据
			P0 = ccCrol(0xFE, i);	// 送数据
			WLE = 0;				// 位选端锁存器置低,保存数据
			
			DLE = 1;				// 段选端锁存器置高,送数据
			P0 = digital[i];		// 送数据
			DLE = 0;				// 位选端锁存器置低,保存数据
			
			delay(1);
		}
	}
	
	return 0;
}

效果截图:



2019-11-11 21:55:58 nknkkn 阅读数 200
  • 静态和动态控制数码管-第1季第7部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第7个课程,全面讲解了静态数码管、无38译码器式动态数码管、有38译码器式动态数码管等各种数码管驱动方式,学完本课程将会对数码管的驱动方式彻底熟悉和掌握。

    2936 人正在学习 去看看 朱有鹏

51的单片机的数码管显示

  • 基于51单片机的LED数码管动态显示 LED数码管动态显示就是一位一位地轮流点亮各位数码管,对于每一位LED数码管来说,每隔一段时间点亮一次,利用人眼的“视觉暂留"效应,采用循环扫描的方式,分时轮流选通各数码管的公共端,使数码管轮流导通显示。当扫描速度达到一定程度时,人眼就分辨不出来了。尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,认为各数码管是同时发光的。若数码管的位数不大于8位时,只需两个8位I/O口。

以下附一个 数码管
以下是一个电子秒表的代码


```c
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit we=P2^7;
sbit du=P2^6;
sbit s2=P3^0;
sbit s3=P3^1;
sbit s4=P3^2;
uchar a,b,c,d,e,f,t,x, num,num1,num2;
uchar code yidaojiu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(uint);
void play1(uchar,uchar,uchar,uchar,uchar,uchar);
void play2(uchar);
void main()
{ 
  TMOD=0x01;
  TH0=(65535-9216)/256;
        TL0=(65535-9216)%256;
  EA=1;  
  ET0=1;    
  TR0=1;
    while(s2)          
      play1(a,b,c,d,e,f);  
   }
   void play1(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f)
    {
   du=1;
   P0=yidaojiu[a];
   du=0;
    P0=0xff;   
     we=1;
   P0=0X7f;
   we=0;
    delay(3);
     du=1;
   P0=yidaojiu[b];
   du=0;
   P0=0XFF;
     we=1;
   P0=0Xbf;
   we=0;
    delay(3);

   du=1;
   P0=yidaojiu[c];
   du=0;
   P0=0XFF;
     we=1;
   P0=0XDF;
   we=0;
    delay(3);
    du=1;
   P0=yidaojiu[d];
   du=0;
   P0=0xff;
  we=1;
   P0=0Xef;
   we=0;
  delay(3);
du=1;
   P0=yidaojiu[e];
   du=0;
   P0=0xff;
  we=1;
   P0=0Xf7;
   we=0;
  delay(3);

   du=1;
   P0=yidaojiu[f];
   du=0;
   P0=0xff;
  we=1;
   P0=0Xfb;
   we=0;
  delay(3);
   }
    void delay(uint z)
   {
    uint x,y;
 for(x=z;x>0;x--)
 for(y=114;y>0;y--);
   }
    void dingshizhongduan0() interrupt 1
   { 
   char flat;
   TH0=(65535-9216)/256;
   TL0=(65535-9216)%256;
  if(s4==0)
  flat2=0;
   if(flat==0)
  num++;
  if(num==100)
  { 
   num=0;
   num1++;
  }
  if(num1==60)
  {
  num1=0;
  num2++; 
  }
  if(num2==100)
  num2=0;
  s2=1;
  a=num%10;
  b=num/10;
  c=num1%10;
  d=num1/10;
  e=num2%10;
  f=num2/10;
  }
 

2015-03-19 10:51:52 gogoky 阅读数 4819
  • 静态和动态控制数码管-第1季第7部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第7个课程,全面讲解了静态数码管、无38译码器式动态数码管、有38译码器式动态数码管等各种数码管驱动方式,学完本课程将会对数码管的驱动方式彻底熟悉和掌握。

    2936 人正在学习 去看看 朱有鹏

利用单片机数码管的数字显示:

#include<stc15f2k60s2.h>

unsigned char CS[]={0x7f,0xbf,0xdf,0xef};
unsigned char DM[]={0x77,0x41,0x3b,0x6b,0x4d,0x6e,0x7e,0x43,0x7f,0x6f};

void Delay500ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	i = 22;
	j = 3;
	k = 227;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void Delay100us()		//@11.0592MHz
{
	unsigned char i, j;

	i = 2;
	j = 15;
	do
	{
		while (--j);
	} while (--i);
}

void Delay100ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	i = 5;
	j = 52;
	k = 195;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


int main()
{
	int i,j;
	P1M1 &= ~0xff;  //P1推挽输出
   P1M0 |=  0xff;
	P0=0xff;
	j=0;
	while(1)
	{
		for(i=0;i<4;i++)
		{
			P0=CS[i];
			
			P1=DM[j];
			Delay500ms();
			
		}
		j++;
		if(j>9)
		{
			j=0;
		}
	}
	return 0;
}


2018-02-21 10:03:20 plm199513100 阅读数 1479
  • 静态和动态控制数码管-第1季第7部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第7个课程,全面讲解了静态数码管、无38译码器式动态数码管、有38译码器式动态数码管等各种数码管驱动方式,学完本课程将会对数码管的驱动方式彻底熟悉和掌握。

    2936 人正在学习 去看看 朱有鹏

/*
名称:51单片机之数码管显示实验
说明:对于数码管来说,其本质上可以理解为按照一定规则组合的多个二极管。其使用只需按照特定规则显示对应的二极管即可。要稍微注意一点的就是多个数码管的显示分为静态显示和动态显示。静态显示就是每个二极管显示的内容是一样的,通过片选信号来决定是哪个二极管该显示。动态数码管,即利用人眼的视觉停留效果,快速扫描,快速显示每个数码管的内容,使得每个数码管看起来好像是一起显示的一样。
本实验编写了几个数码管显示的简单程序。在此不做赘述了。

*/

#include <reg52.h>

#define uchar unsigned char


//共阳极段码(a在高位,dp在低位)
uchar code _data[16] = {0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,
                                                0x11,0xC1,0x63,0x85,0x61,0x71
                                                };

//共阳极段码(a在低位,dp在高位)
uchar code _data1[16] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,
                                                0x83,0xC6,0xA1,0x86,0x8E
                                                };                                              

//延时函数
void delay_ms(unsigned int n)
{
    unsigned int i=0,j=0;
    for(i=0;i<n;i++)
        for(j=0;j<123;j++);
}


//一位数码管循环显示0-F(共阳极)
void OneNixieTube()
{
    uchar i = 0;

    while(1)
    {
            for(i = 0;i<16;++i)
            {
                P2 = _data1[i];         
                delay_ms(1000);
            }



    }
}



//静态数码管循环显示0-8
void StaticNixieTube()
{
    uchar i = 0,temp = 0;
    while(1)
    {
            for(i = 0;i<16;++i)
            {

                //片选部分
                if(i%8 == 0)
                    temp = 0x01;
                else
                    temp = temp<<1;
                P0 = ~temp;                    //P0为片选输出端口,低电平有效
                //显示部分
                P2 = ~_data1[i];           //P2为显示输出端口


                delay_ms(1000);
            }
    }

}


//动态数码管显示(0-7,8-F,8个数码管分两次显示)
void DynamicNixieTube()
{
    uchar i = 0;
    unsigned int delay_time = 0;        //0-7 8-F每段的延时时间

    uchar CS[8] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};        //片选码

        while(1)
        {

            if(delay_time++ < 250)
            {
                //0-7段显示
                for(i = 0;i < 8;++i)
                {
                    P0 = CS[i];
                    P2 = ~_data1[i];

                    delay_ms(1);        //延时极小的时间间隔,人眼察觉不出来

                }
            }
            else if(delay_time++ < 500 )        //???都是循环250次,为什么0-7段显示的时间长于8-F段显示的时间???
            {
                //8-F段显示
                for(i = 0;i < 8;++i)
                {
                    P0 = CS[i];
                    P2 = ~_data1[i+8];

                    delay_ms(1);        //延时极小的时间间隔,人眼察觉不出来

                }

            }
            else
                delay_time = 0;                 //重新置零

        }
}


//数码管显示指定时间格式为 HH-MM-SS
void DisplayTime(uchar hour,uchar min,uchar sec)
{
    uchar time[8] = {0};
    uchar i = 0,j = 0;
    uchar CS[8] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};        //片选码


    //获取时间的每位信息
    if(hour >= 0 && hour <=23 )
    {
            time[0] = hour / 10;
            time[1] = hour % 10;

            time[2] = ':';
    }


    if(min >= 0 && min <= 59)
    {
        time[3] = min /10;
        time[4] = min % 10;

        time[5] = ':';

    }

    if(sec >= 0 && sec <= 59)
    {
        time[6] = sec / 10;
        time[7] = sec % 10;
    }


    //显示部分
    for(i = 0;i<7;++i)
    {
            for(i = 0;i < 8;++i)
                {
                    P0 = CS[i];             //片选

                    //显示时间
                    if(i != 2 && i != 5)
                    {
                        j = time[i];
                        P2 =  ~_data1[j];
                    }
                    else                        //显示分隔符‘-’
                    {
                        j = 0xBF;
                        P2 = ~j;
                    }

                    delay_ms(1);        //延时极小的时间间隔,人眼察觉不出来

                }
    }



}


int main()
{
    //  OneNixieTube();
    //  StaticNixieTube();
    //DynamicNixieTube()
        //DisplayTime(12,40,56);




    return 0;
}
2018-12-09 20:50:23 YouCanDoIt_ 阅读数 3523
  • 静态和动态控制数码管-第1季第7部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第7个课程,全面讲解了静态数码管、无38译码器式动态数码管、有38译码器式动态数码管等各种数码管驱动方式,学完本课程将会对数码管的驱动方式彻底熟悉和掌握。

    2936 人正在学习 去看看 朱有鹏

数码管显示分为静态数码管显示动态数码管显示
学习掌握数码管相关的内容,可以从以下三方面入手:
1.数码管电路图
2.译码器
3.进制转化

直接上图

数码管电路图

在这里插入图片描述
数码管电路的接法有共阴和共阳两种,这里采用共阴接法
从其中取出一个数码管进行分析
单个数码管
在这里插入图片描述
此处为一个8位的数码管,想要数码管显示出想要的数字,则需要对数码管进行高低电平的设置
1为高电平,0为低电平
分别对 a,b,c,d,e,f,g,dp进行1和0的编写,此处可以理解为二进制进行十六进制的转化
在这里插入图片描述
如图中所示,数字2的 八位二进制就可以表示为 0101 1011,读数为从dp依次读到a,转化为十六进制则是0x5b
数码管中各个数值对应的字节
0: 0x3f 1: 0x06 2: 0x5b 3: 0x4f 4: 0x66 5: 0x6d 6: 0x7d 7: 0x07
8: 0x7f 9: 0x6f A: 0x77 B: 0x7c C: 0x39 D: 0x5e E: 0x79 F: 0x71

在这里插入图片描述
打开电脑中的计算器中的程序员模式就可以进行检验
下面就剩译码器的问题,本次采用的138译码器,译码器的不同可能会有所差别

先来了解下138译码器的电路图
在这里插入图片描述
在138译码器中主要是P22,P23,P24管角的问题,三个管角对数码管LED1~8的控制

138译码器

管角定义
在这里插入图片描述
管角说明
在这里插入图片描述
真值表
在这里插入图片描述
看懂138译码器的真值表非常重要,H代表高电平,L代表低电平,当A0,A1,A2同时为L时,Y0(LED1)才会亮

简单代码演示

#include "reg51.h"
typedef unsigned char u8;
typedef unsigned int u16;

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

u8 code dizhi[]={0x3f,0x5e};

void main(){
   LSC=0;		   
   LSA=0;
   LSB=0;
   P0=dizhi[0];
}

通过按键实现数码管转化视频

没有更多推荐了,返回首页