c51 数码管_c51数码管显示程序 - CSDN
精华内容
参与话题
  • 51单片机之数码管静态显示

    万次阅读 多人点赞 2018-10-14 14:17:59
     在对单片机编程以实现数码管静态显示数字之前,我们先来了解一下数码管的结构以及一些常识,对于数码管,有称八段数码管的,也有称七段数码管的,其实无非就是多在一个小数点h , 如上图所示, 我们就拿带小数点的...

         

           在对单片机编程以实现数码管静态显示数字之前,我们先来了解一下数码管的结构以及一些常识,对于数码管,有称八段数码管的,也有称七段数码管的,其实无非就是多在一个小数点h , 如上图所示,  我们就拿带小数点的八段数码管来说 , 其实我们没必要说对数码管很陌生,因为数码管无非就是八块发光二极管集成在了一起,另外数码管有共阴极和共阳极数码管之分,说起共阴,共阳,大家可能会有所陌生,这里我们简单介绍一下:

           共阴极数码管:    将八只发光二极管的负极通过一根总线连接在了一起 , 然后每只二极管的正极被引了出来,通过二极管的单向导通性可知,当对应数码管的二极管段接入高电平时,二极管点亮。(换句话说,也就是说想让哪一只二极管点亮,就给哪只二极管高电平。下面编程我们就以共阴数码管为例)

          共阳极数码管:    将八只发光二极管的正极通过一根总线连接在了一起 , 然后每只二极管的负极被引了出来,通过二极管的单向导通性可知,当对应数码管的二极管段接入低电平时,二极管点亮。

          好了,数码管的基本知识我们说完了,下面来说一些编程相关的,首先,我们知道数字数码管而言,那肯定是显示数字的,那么我们怎么编程实现呢?其实很简单,你想啊,数码管由八段发光二极管组成,那么我们就拿着上面的图,来画一画,比如说,显示数字 “1 ” ,那也就是让 b 和 c 亮,编程的话,即是0x06,0x06转换为二进制 ,是00000110,这样一来给了 b 和 c 段高电平,实现了点亮数字 “1”;下面我们就把数码管所能够显示的数字以及符号通过一个表格整理出来(以共阴极数码管为例);

    显示数字 十六进制 二进制 显示数字 十六进制 二进制
    0 0x3f 00111111 B 0x7c 01111100
    1 0x06 00000110 C 0x39 00111001
    2 0x5b 01011011 D 0x5e 01011110
    3 0x4f 01001111 E 0x79 01111001
    4 0x66 01100110 F 0x71 01110001
    5 0x6d 01101101 H 0x76 01110110
    6 0x7d 01111101 L 0x38 00111000
    7 0x07 00000111 P 0x73 01110011
    8 0x7f 01111111 n 0x37 00110111
    9 0x6f 01101111 u 0x3e 00111110
    A 0x77 01110111      

           这里附上一个LED代码查询小软件:

    (链接: https://pan.baidu.com/s/1lCDKtCwwabfYE7dWZ2iA-g 提取码: 5fgm),需要的可以下载使用,很方便。

    接下来我们还要来介绍一款芯片,也就是74HC573锁存器。

            你可能会问,我们静态显示数码管,直接对利用单片机的I/O口对数码管的引脚输出高低电平就好了嘛,为什么还要用到这款芯片?这里我们解释一下,单片机直接控制数码管确实很好,但是我们要明白一点,单片机一共也就 4 x 8 = 32个I/O口,而且我们单片机开发板上都不是只有单个数码管的,都是有六个八个数码管在一块的,如果都用单片机来控制,那一块单片机岂不是什么都干不了了吗,要知道,我们一块51单片机开发板上是由很多模块组成的,有很多功能需要实现,如果一个数码管显示模块就把我们的I/O口资源给用完了,那还有什么意义呢。相反,如果用上锁存器,我们只需要用到单片机的两个I/O口就可以了,完全足够了。

          下面,我们来简单介绍一下这款芯片: 对于74HC573,形象一点,我们只需要将其理解为一扇大门,只不过这扇大门是单向的,其中11引脚(LE)控制着门的开、关状态,高电平为大门打开,低电平为大门关闭。D0-D7为输入,Q0-Q7为输出,在LE = 1,即输入高电平时,输入端=输出端,输入是什么,输出也就原封不动的输出;在LE = 0 ,即输入高电平时,大门关闭,实现锁存,不再输出。了解之后,我们按照电路图,来进行编程,代码实现。

              

     

             如上图所示,在实现数码管的静态显示中,我们用到了两个锁存器,两个I/O口,P1.6和P1.7,分别是位选和段选。关于位选和段选我们解释一下:

             位选,位选,也就是位置的选择,一块单片机开发板上,有8个数码管,依次是1、2、3.....8, 这样的话,比如说我们想让第三个亮,就可以通过位选锁存器来实现;

           至于说段选,就很好理解了,就是我们常说的控制一个数码管中的  a,b,c...g 段,使其显示数字,这就是段选,即选择数码管的哪一笔段。好了,下面开始编程:

    /* ***************************************************** */
    // 工  程   : 51单片机开发板
    // 文件名   : smg.c
    // 处理器   : STC89C52RC
    // 编译环境 : Keil4 C51 
    // 系统时钟 : 11.0592MHZ
    // 版    本 : V1.0 
    // 设计者   :朱豪男
    // 生成日期	: 2018-10-14	   					
    // 修改日期	:  
    // 简单描述 : 数码管静态显示程序
    /* ***************************************************** */
    #include <reg52.h>
    
    #define uchar unsigned char
    #define uint  unsigned int
    #define data  P0		   				//P0口宏定义
    /* ***************************************************** */
    // 数码管位选数组定义
    /* ***************************************************** */
    uchar code  leddata[] = 
    {               0x3F,  //"0"
                    0x06,  //"1"
                    0x5B,  //"2"
                    0x4F,  //"3"
                    0x66,  //"4"
                    0x6D,  //"5"
                    0x7D,  //"6"
                    0x07,  //"7"
                    0x7F,  //"8"
                    0x6F,  //"9"
                    0x77,  //"A"
                    0x7C,  //"B"
                    0x39,  //"C"
                    0x5E,  //"D"
                    0x79,  //"E"
                    0x71,  //"F"
                    0x76,  //"H"
                    0x38,  //"L"
                    0x37,  //"n"
                    0x3E,  //"u"
                    0x73,  //"P"
                    0x5C,  //"o"
                    0x40,  //"-"
                    0x00,  //熄灭
                    0x00  //自定义};
    };
    /* ***************************************************** */
    // 位定义
    /* ***************************************************** */
    sbit du = P1^7;	  			//段选定义
    sbit we = P1^6;	  			//位选定义
    /* ***************************************************** */
    // 函数名称:DelayMS()
    // 函数功能:毫秒延时
    // 入口参数:延时毫秒数(ValMS)
    // 出口参数:无
    /* ***************************************************** */
    void delay(uint z)
    {
    	uint x,y;
    	for(x = 0; x < z; x++)
    		for(y = 0; y < 113; y++);
    }
    /* ***************************************************** */
    // 函数名称:main()
    // 函数功能:数码管静态显示
    // 入口参数:无
    // 出口参数:无
    /* ***************************************************** */
    void main(void)
    {
    	uchar i;
    	we = 1;					//位选开
    	data = 0x00;					//送入位选数据
    	we = 0;					//位选关
    	while(1)
    	{ 
    	    for(i = 0;i < 16 ; i++)
    	    {
    		    du = 1;		        //段选开
    			data = leddata[i];	       //送入段选数据 
    			du = 0;		       //段选关
    		  	delay(500);			      //延时
    	    }
    	}
    }
    

            代码很好理解,我们简单介绍一下,首先我们定义了个数码管位选数组,也就是十六进制代码,这便是后来数码管显示数字的核心,接着,我们用 sbit 定义了位选和段选端口,分别是 P1.6 和 P1.7 ,定义了一个延时函数,其实这一串代码很有意思,开关开关思想,贯穿始终,首先我们把位选打开,送入位选数据后,关闭锁存器,实现锁存,进入循环,随之打开段选锁存器,送入段选数据后,再次关闭段选,接下来,这个延时操作对于我们实际看到数码管的显示效果特别重要,因为程序在段选后之后,会马上消隐,显示的时间之后几个微秒,这显然不太合理,我们需要在关闭段选后加上延时,这样一来,才会让每位数码管亮度保持均匀。

    (附上效果视频,链接: https://pan.baidu.com/s/1lAu0QkltthlfjndZ-DfX8g 提取码: 2hqs)

     

     

     

     

    展开全文
  • 51单片机之动态数码管显示

    万次阅读 多人点赞 2019-05-17 19:34:33
    本开发板上使用的是,通过P22、P23、P24控制3-8译码器来对数码管进行位选,通过P0口经过573的驱动控制数码管的段选,通过P13控制573的使能端,为低电平时573才会有输出。 138译码器的真值表如下图G1,G2A,G2B都是...

    首先来看一下开发板上的电路原理图:

     

    本开发板上使用的是,通过P22、P23、P24控制3-8译码器来对数码管进行位选,通过P0口经过573的驱动控制数码管的段选,通过P13控制573的使能端,为低电平时573才会有输出。

    138译码器的真值表如下图G1,G2A,G2B都是选通脚,当G1,G2A,G2B为100的时候138译码器开始工作,A为最低位,B为中间位,C为最高位。CBA=000B时,Y0为1,其他口为0,CBA=001B时,Y1为1,其他口为0,CBA=010B时,Y2为1,其他口为0,CBA=011B时,Y3为1,其他口为0,CBA=100B时,Y4为1,其他口为0,CBA=101B时,Y5为1,其他口为0,CBA=110B时,Y6为1,其他口为0,CBA=111B时,Y7为1,其他口为0。

    由于8个数码管是共阴的,所以当Y0~Y7中的一个为1,其反值为0,相应的数码管阴极置低,再将数码管的段选位置高,就可以显示相应的值。

     

     

         使用38译码器只能在同一个时刻让一个数码管显示,想要让8个数码管同时显示。这个时候就要用到动态显示技术。

          动态显示是多个数码管,交替显示,利用人的视觉暂停作用使人看到多个数码管同时显示的效果。就像我们看的电影是有一帧一帧的画面显示的,当速度够快的时候我们看到它就是动态的。当我们显示数码管的速度够快的时候,也就可以看到它们是同时显示了。

      程序示例如下:

    #include "reg52.h"
    
       typedef unsigned char u8;
       typedef unsigned int u16;
    
       sbit LSA = P2^2;
       sbit LSB = P2^3;
       sbit LSC = P2^4;
    
    
       u8 code smgduan[16]= {0x3f, 0x06, 0x5b, 0x4f,
                        0x66, 0x6d, 0x7d, 0x07,
    					0x7f, 0x6f, 0x77, 0x7c,
    					0x39, 0x5e, 0x79, 0x71}; //0~F数码
    
     
    
       void delay(u16 i) //延时函数
       {
        while(i--);
       }
    	
    	void DigDisplay() //数码管显示函数
    	{
    	u8 i;
    	for(i=0;i<8;i++)
    	{ 
    	  switch(i)
    	  {
    		case 0:
    	  		LSC = 0;LSB = 0;LSA = 0;break; //显示第1个数码管
    		case 1:
    	  		LSC = 0;LSB = 0;LSA = 1;break; //显示第2个数码管
    		case 2:
    	 		LSC = 0;LSB = 1;LSA = 0;break; //显示第3个数码管
    		case 3:
    			LSC = 0;LSB = 1;LSA = 1;break; //显示第4个数码管
    		case 4:
    			LSC = 1;LSB = 0;LSA = 0;break; //显示第5个数码管
    		case 5:
    	  		LSC = 1;LSB = 0;LSA = 1;break; //显示第6个数码管
    		case 6:
    	  		LSC = 1;LSB = 1;LSA = 0;break; //显示第7个数码管
    		case 7:
    	 		LSC = 1;LSB = 1;LSA = 1;break; //显示第8个数码管
    	  }
    	  P0 = smgduan[i+1];//显示1~8的数值
    	  delay(100); //延时,造成视觉暂留现象
    	  P0 = 0x00; //数码管消隐
    	}
    	}	
    
       void main()
       {
       while(1)
       {
       DigDisplay();
       }
       }

     

        在上例代码中使用了C51中的code关键字。

    u8 code smgduan[16]= {0x3f, 0x06, 0x5b, 0x4f,

                        0x66, 0x6d, 0x7d, 0x07,

                               0x7f, 0x6f, 0x77, 0x7c,

                            0x39, 0x5e, 0x79, 0x71};

           这称之为编码定义,编码定义方法与C语言中的数组定义方法非常相似,不同的地方就是在数组类型后面多了一个code关键字,code即表示编码的意思。需要注意的是,单片机C语言中定义数组时是占用内存空间的,而定义编码时是直接分配到程序空间(ROM)中,编译后编码占用的是程序存储空间,而非内存空间(RAM)。

         本次实验使用的是共阴极数码管,在静态数码管试验中使用的是共阳极数码管,那在试验过程中如果不清楚数码管是共阴极或者共阳极,可以使用万用表来确定数码管是共阴极还是共阳极的。

        

         对数字万用表来说,红色表笔连接表内部电池正极,黑色表笔连接表内部电池负极,当把数字万用表置于二极管档时,其两表笔间开路电压约为1.5V,把两表笔正确加在发光二极管两端时,可以点亮发光二极管。

         如下图所示,将数字万用表置于二极管挡,红表笔接在①脚,然后用黑表笔去接触其他各引脚,假设只有当接触到⑨脚时,数码管的a段发光,而接触其余引脚时则不发光。由此可知,被测数码管为共阴极结构类型,⑨脚是公共阴极,①脚则是数码管的a段.接下来再检测各段引脚,仍使用数字万用表二极管档,将黑表笔固定接在⑨脚,用红表笔依次接触②、③、④、⑤、⑥、⑦、⑧、⑩引脚时,数码管的其他段先后分别发光,据此便可绘出该数码管的内部结构和引脚排列图。

               

          检测中,若被测数码管为共阳极类型,则需将红、黑表笔对调才能测出上述结果,在判别结构类型时,操作时要灵活掌握,反复试验,直到找出公共端为止,大家只要懂得了原理,检测出各个引脚便不在是问题了。

    展开全文
  • C51单片机数码管动态显示

    万次阅读 多人点赞 2018-08-27 21:55:34
    数码管作为最廉价的输出设备,在各种自动化设备中有很大的应用,最简单普通的显示方式为动态刷新显示,称为假动态显示,即通过分时扫描每一位,利于人眼的视觉停留现象,造成一种静态显示的效果,如下图所示: ...

    数码管作为最廉价的输出设备,在各种自动化设备中有很大的应用,最简单普通的显示方式为动态刷新显示,称为假动态显示,即通过分时扫描每一位,利于人眼的视觉停留现象,造成一种静态显示的效果,如下图所示:

    C51单片机由于运行速度很慢,在高刷新频率下,单片机的资源耗费很厉害,这样单片机就不可以再进行大量的计算工作,实际上,单片机在刷新时,只需要周期性的改变GPIO口的状态就可以了,剩下的时间其实都是在空转的状态下,我们能不能将这个空转的状态拿来用呢?当然是可以的啦,这里,我们利用单片机的定时器周期地产能中断,在中断内进行数码管的刷新工作,就可以将等待中断的这个CPU时间拿来做别的事情了。

    硬件电路:

    代码贴过来:

    主函数

    #include "shumaguan.h"
    #include "timer.h"
    
    
    sbit sw_jdq=P1^0;//定义一位继电器操作
    void main(void)
    {
      int cnt=0;//设定初值
      timer_init();//初始化定时器
      while(1)
      {
        value_now = cnt;//送初值到显示缓存
        delay(50);
        cnt++;
        sw_jdq=~sw_jdq;//切换继电器状态
        if(cnt>9999)//数值超出界线,回归最小
          cnt=-999;
      }
    }

    数码管驱动函数

    #include "shumaguan.h"
    
    #define DType	1			//define the Digital LED type, 1: VCC in common, 0: GND in common
    #if DType==1
    /*--------------------------------------------------------
    Set the digital LED display code 
    From left to right for
    0,1,2,3,4,5,6,7,8,9,a.b,c,d,e,f,dp,-, 
    --------------------------------------------------------*/
    uchar code DS_BUF[]={0xc0 , 0xf9 , 0xa4 , 0xb0 , 0x99 , 0x92 , 0x82 , 0xf8 , 0x80 , 0x90 , 0x88 , 
    0x83 , 0xc6 , 0xa1 , 0x86 , 0x8e , 0x7f , 0xbf , 0xff };
    #else
    uchar code DS_BUF[]={0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6b , 0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 
    0x7c , 0x39 , 0x5e , 0x79 , 0x71 , 0x80 , 0x40 , 0x00 };
    #endif
    uchar xdata buf_sm[4];            //set display buffer
      
    uchar frash_cnt=0;//刷新计数器
    uchar wei_buf=0x10;//位输出计数器
     
    /*--------------------------
    Compute the number from Value
    value: something to display, range from -999 to 9999, suport float
    --------------------------*/
    void calc_sm(float value)
    {
    	uint tmp=0;
    	if(value>=0)//输入值为正数,不显示负号
    	{
    		if(value>9999)//输入值大于9999,显示----
    		{
    			buf_sm[0]=17;
    			buf_sm[1]=17;
    			buf_sm[2]=17;
    			buf_sm[3]=17;
    		}
    		else if(value>=1000)//输入值大于999,只显示整数
    		{
    			tmp=value;
    			buf_sm[0]=tmp/1000;
    			buf_sm[1]=tmp%1000/100;
    			buf_sm[2]=tmp%100/10;
    			buf_sm[3]=tmp%10;
    		}
    		else if(value>=100)//显示一位小数
    		{
    			tmp=value*10;
    			buf_sm[0]=tmp/1000;
    			buf_sm[1]=tmp%1000/100;
    			buf_sm[2]=(tmp%100/10)+20;
    			buf_sm[3]=tmp%10;
    		}
    		else if(value>=10)//显示两位小数
    		{
    			tmp=value*100;
    			buf_sm[0]=tmp/1000;
    			buf_sm[1]=(tmp%1000/100)+20;
    			buf_sm[2]=tmp%100/10;
    			buf_sm[3]=tmp%10;
    		}
    		else//显示三位小数
    		{
    			tmp=value*1000;
    			buf_sm[0]=(tmp/1000)+20;
    			buf_sm[1]=tmp%1000/100;
    			buf_sm[2]=tmp%100/10;
    			buf_sm[3]=tmp%10;
    		}
    	}
    	else//输入值小于0,显示负号,其余同上
    	{
    		if((value<0)&&(value>-10))
    		{
    			tmp=value*100;
    			tmp=abs(tmp);
    			buf_sm[0]=17;
    			buf_sm[1]=(tmp/100)+20;
    			buf_sm[2]=tmp%100/10;
    			buf_sm[3]=tmp%10;
    		}
    		else if((value<=-10)&&(value>-100))
    		{
    			tmp=value*10;
    			tmp=abs(tmp);
    			buf_sm[0]=17;
    			buf_sm[1]=(tmp/100);
    			buf_sm[2]=tmp%100/10+20;
    			buf_sm[3]=tmp%10;
    		}
    		else if((value<=-100)&&(value>-1000))
    		{
    			tmp=value;
    			tmp=abs(tmp);
    			buf_sm[0]=17;
    			buf_sm[1]=(tmp/100);
    			buf_sm[2]=tmp%100/10;
    			buf_sm[3]=tmp%10;
    		}
        
    	}
      
    }
    /*
    显示部分,每执行一次,显示的位左移一位,移到最左边时,重新回到最右边,开始下一次刷新。
    定义有小数点的位+20,每次送断码,检查大于20,段与0x7f添加小数点。
    */
    void display()
    {
      if(frash_cnt<=3)
      {
        wei |=0xf0;//数码管的消隐
        
        if(buf_sm[3-frash_cnt]>=20)
        {
          duan = (DS_BUF[(buf_sm[3-frash_cnt])-20]&0x7f);//显示小数点
        }
        else
          duan = DS_BUF[buf_sm[3-frash_cnt]];//不显示小数点
        
        wei = ~wei_buf;
        wei_buf <<=1;//显示位左移一位
        frash_cnt++;
      }
      else
      {
        wei |=0xf0;//数码管的消隐
        frash_cnt=0;
        wei_buf=0x10;//显示位回到最右边
      }
    }
    /*
    数码管自用延时
    */
    void delay(uint i)
    {
      uchar j;
      for(;i>0;i--)
      for(j=0;j<120;j++);
    
    }
    

    数码管头文件

    #ifndef _shumaguan_h_
    #define _shumaguan_h_
    #include "math.h"
    #include "reg52.h"
    #define duan P0
    #define wei P2
    
    #define uchar unsigned char
    #define uint unsigned int
      
    extern uchar frash_cnt;
    extern uchar wei_buf;
    
    void calc_sm(float value);
    void display();
    void delay(uint i);
    
    
    #endif
    

    定时器配置及中断服务函数

    #include "reg52.h"
    #include "timer.h"
    #include "shumaguan.h"
    
    
    float xdata value=0 , value_now = 0;
    
    void timer_init()
    {
      TMOD = 0x02;                    //set timer0 as mode1 (16-bit)
      TL0 = T1MS;                     //initial timer0 low byte
      TH0 = T1MS;                //initial timer0 high byte
      TR0 = 1;                        //timer0 start running
      ET0 = 1;                        //enable timer0 interrupt
      EA = 1;                         //open global interrupt switch
    }
    
    
    
    /* Timer0 interrupt routine */
    void tm0_isr() interrupt 1 using 1
    {
        if(value!=value_now)//检测显示值与当前值是否匹配
        {
          value=value_now;//刷新显示值
          calc_sm(value_now);//重新计算显示值的输出缓冲区
        }
        display();//刷新数码管显示
    
    }
    

    定时器头文件

    #ifndef _timer_h_
    #define _timer_h_
    #include "reg52.h"
    #define uchar unsigned char
    #define uint unsigned int
      
    //-----------------------------------------------
    
    /* define constants */
    //#define FOSC 11059200L
    #define FOSC 12000000L
    
    #define T1MS 0   //1ms timer calculation method in 12T mode
    
    
    //-----------------------------------------------
    
    extern float xdata value , value_now;
    
    
    void timer_init();
    
    
    #endif
    

     

    展开全文
  • C51学习二)点亮数码管

    千次阅读 2017-02-24 11:58:37
    1.什么是数码管 2.共阴极和共阳极 3.段选和位选 4.用锁存芯片74HC573实现位选 1.什么是数码管 如图所示,这是二位的数码管 一个数码管,要有8个LED灯控制他显示是什么数字,7个LED控制数字,1个LED控制小数点。...

    1.什么是数码管

    2.共阴极和共阳极

    3.让数码管显示数字原理

    4.段选和位选

    5.用锁存芯片74HC573实现段选和位选

    6.代码实现


    1.什么是数码管

    图所示,这是二位的数码管

    一个数码管,要有8个LED灯控制他显示是什么数字,7个LED控制数字,1个LED控制小数点。如上图


    2.共阴极和共阳极

    上图,对于一个数码管,共阴极就是 组成数码管的二极管的阴极是连在一起的,想点亮数码管,就在单片机的对应 I/O 口给高电平。

    共阳极就是 组成数码管的二极管的阳极是连在一齐的,想点亮数码管,就在单片机的对应 I/O 口给低电平。



    3.让数码管显示数字原理

    如上图,abcdefg分别控制数码管的8条led灯,如我要显示数字 8 ,则要把abcdefd全点亮,如上图右边,就是把abcdefg都置高电平。



    3.段选和位选

    上图所示,上面八根线(a,b,c,d,e,f,g,dp)控制数码管显示的数字是多少,叫做段选

    下面四根线,控制四个数码管中,哪一个数码管被点亮,叫做位选


    位选的意义:

    由第一点的知识可知,控制一个数码管的亮灭,需要8个LED灯,换言之,控制一个数码管,就要用掉8个 I/O口,控制5个数码管就要用掉40个I/O口,

    I/O口的资源没有那么多,所以引入了位选,有了位选以后,只需要8个I/O口控制数码管的段选(数码管显示什么数字)就好,至于让哪一个数码管亮,就由位选来做。



    4.用锁存芯片74HC573实现段选和位选。

    上图所示,是一片74HC573芯片,这片芯片的作用是锁住输入的值,(D1~D8为输入端,Q1~Q8为输出端),C段(就是上图的11引脚)为片选段。

    当C段为1时,输出端=输入端,当C段为0时,当输入端改变,输出端也不会改变了,达到了锁存的作用


    如图所示上图是共阴数码管的原理图,从原理图可知,一块74HC573控制段选,另一块74HC573控制位选,分别接到最小系统的P2.6和P2.7引脚

    由于是共阴极,所以位选置0时,数码管会亮


    5.代码实现

    我们显示数字时,为了方便,我们可以下载一个 数码管计算器 ,百度数码管计算器即可。可以快速显示 响应数字怎么引脚怎么设置

    如上图,显示3 就是把对应8位 I/O口组 设置为 0x4F

    #include<reg52.h>
    sbit WE=P2^7;
    sbit DU=P2^6;
    
    void main()
    {
    	DU=1;
    	P0=0x4f; //让数码管显示数字3
    	DU=0;
    	
    	WE=1;
    	P0=0xfe;//让第一个数码管点亮,1111 1110
    	WE=0;
    	while(1);
    }


    
    
    
    
    
    
    展开全文
  • c51单片机数码管的控制

    千次阅读 2018-04-30 01:02:50
    电路图注:实际中,我单片机的74HC573电路接法与P0端接反了138译码器资料:https://pan.baidu.com/s/1COTcutsnMxMSc8tq0M2yVw 密码:1jww138译码器的真值表:74HC573资料:...如果没有,建议学过数电后...
  • 1.单个数码管的静态显示 /*-------------------------- 功能:一个数码管的静态显示 Author: Zhang Kaizhou Date: 2019-5-16 21:18:17 --------------------------*/ #include <reg52.h> sbit duan_address =...
  • C51 数码管 独立按键

    2019-01-25 21:44:57
    显示电话号码和学号 #include &lt;reg51.h&gt; ...unsigned char code bit_code[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};...unsigned char code smgduan[17]={0x3f, 0x06, 0x5b, 0x4f, 0x66, ...
  • C51数码管鬼影产生的一个解决方法 (这个方法有助于加深对于中断的理解)
  • 我在写数码管动态显示的时候发现意义相同的两个代码写出来显示的结果却不同,代码如下: ``` void display_SEG(unsigned int t) { Y_SEG_show(1, 2); while(t--); Y_SEG_show(2, 0); while(t--); ...
  • C51数码管时钟程序

    2020-07-30 23:32:36
    C51数码管时钟程序,用6个数码管分别显示时分秒
  • C51单片机数码管显示数字实现

    千次阅读 2018-12-13 17:09:54
    代码部分: #include &lt;STC15F2K60S2.H&gt; #include &lt;INTRINS.H&gt;...#define Y(n) P2=P2&...unsigned char digit[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};...
  • C51单片机学习笔记(五)——数码管的静态显示和动态显示 文章目录C51单片机学习笔记(五)——数码管的静态显示和动态显示1.数码管的显示原理 1.数码管的显示原理 数码管有一位和多位一体两类,它是由8个LED(a,b,c,d,...
  • c51数码管模块显示程序 c51数码管模块显示程序
  • C51单片机数码管的显示代码

    千次阅读 2015-03-19 10:51:57
    利用单片机数码管的数字显示: #include 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 ...
  • 老师让做AD转换的实验,并把转换结果用数码管显示出来。由于疫情的原因,没有C51的小试验箱,就只能用protues进行仿真。 一、AD部分 AD转换我用的是ADC0808芯片。ADC0808的内部结构和外部引脚分别如下图所示,内部各...
  • TM1637-c51数码管显示演示代码,显示数组0、1调试后没有改回来,用的朋友可自行修改即可,百分百能用
  • C51入门之数码管

    2019-11-11 07:22:30
    如何静态点亮一个数码管 •共阳数码管,阳极共用在一起,接VCC,阴极独立分别接IO控制脚 由于是共阳极性,所以数码管是低电平驱动点亮段画 •点亮0~9数码对应的段码,做成一个表格存入一个数组中。 code ...
  • C51驱动数码管显示0~99

    千次阅读 2009-10-19 22:35:00
    数码管显示分为静态显示和动态显示两种静态显示:显示某一字符时,二极管恒定导通或截止。 优点:编程实现简单;显示稳定;亮度高;每更新一次显示内容CPU才执行一次,节省CPU时间 缺点:由于一个接口只能接一个...
  • 数码管静态显示轮换 #include<reg52.h> typedef unsigned char u8; typedef unsigned int u16; sbit KZA=P2^2; //控制显示数码管具体位 sbit KZB=P2^3; sbit KZC=P2^4; //显示位代码 u8 code ...
  • 数码管 显示 stc89c51/52

    2020-07-30 23:31:22
    本人亲测 ,可执行,数码管任意显示数字,0,1,2,3,4,5,6,7,8,9,或多个数码管管显示
1 2 3 4 5 ... 20
收藏数 1,427
精华内容 570
关键字:

c51 数码管