• 89C51单片机按键控制数码管静态显示0~9 1.proteus仿真图 左边为共阴管,高电平点亮;右边为共阳数码管,低电平点亮 2.keli代码 #include <reg51.h> sbit key1=P3^0; sbit key2=P3^1; int CC_num[10]={0x3f...

    89C51单片机按键控制数码管静态显示0~9

    1.proteus仿真图
    在这里插入图片描述
    左边为共阴管,高电平点亮;右边为共阳数码管,低电平点亮
    2.keli代码

    #include <reg51.h>
    
    
    sbit key1=P3^0;
    sbit key2=P3^1;
    
    int CC_num[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
    int CC_I=0,CA_I=0;
    
    
    void delay_ms(int ms)
    {
    	int i,j;
    	for(i=0;i<ms;i++)
    	    for(j=0;j<110;j++);
    }
    
    
    void key1_exam()
    {
    	if(key1 == 0)
    	{
    	    //按钮延时去抖动
    	    delay_ms(20);
    	    if(key1 == 0)
    	    {
    	        if(CC_I>=9)
    			{
    				CC_I=0;
    			}
    			else
    			{
    				CC_I++;
    			}
    			P1=CC_num[CC_I];
    	    }
    	    while(!key1);  
    	}
    }
    
    
    void key2_exam()
    {
    	if(key2 == 0)
    	{
    	    //按钮延时去抖动
    	    delay_ms(20);
    	    if(key2 == 0)
    	    {
    	        if(CA_I>=9)
    			{
    				CA_I=0;
    			}
    			else
    			{
    				CA_I++;
    			}
    			P2=~CC_num[CA_I];
    	    }
    	    while(!key2);  
    	}
    }
    
    
    int main()
    {
    	P1=CC_num[CC_I];
    	P2=~CC_num[CA_I];
    	while(1)
    	{
    		key1_exam();
    		key2_exam();
    	}
    }
    
    展开全文
  •  在对单片机编程以实现数码管静态显示数字之前,我们先来了解一下数码管的结构以及一些常识,对于数码管,有称八段数码管的,也有称七段数码管的,其实无非就是多在一个小数点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)

     

     

     

     

    展开全文
  • 操作数码管显示其实与操作led灯的操作本质上差不多,可以把一个数码管当做操作8段led灯来让它显示我们所预想的效果,如下图所示。 假如我想让一个数码管显示1,把我只需把B、C两个LED灯点亮就可以了,数码管的a...

    操作数码管的显示其实与操作led灯的操作本质上差不多,可以把一个数码管当做操作8段led灯来让它显示我们所预想的效果,如下图所示。

    假如我想让一个数码管显示1,把我只需把B、C两个LED灯点亮就可以了,数码管的a~dp(数码管的点)对应字节的1~8位,假设为共阳极接法,即为1111 1001对应十六进制的F9

    数码管的显示分为静态显示和动态显示

    数码管的静态显示其实就是一直给数码管的特定位一直发送一样的数据就可以了,

    动态显示的原理其实是一位一位的操作操作每个数码管,因为对每一位的操作特别快,并且在一直轮流给数,原理其实就是利用了人眼的视觉暂留效果和发光管的余晖作用来达到效果,只是操作的比较快,我们人眼视觉分辨不出来,就会觉得是动态显示的。

    数码管的接法分为共阳极和共阴极两种接法

      共阴极接法只要我们给数码管逻辑高电平即可控制其显示对应的数字

     那么共阳极我们只需要给其逻辑低电平就可以控制其显示各个数字

    我操作的51单片机的数码管的接法如下图所示

    这四个数码管是共阳极接法,当J6跳线帽接上的时候我们对数码管给逻辑低电平就可以对数码进行操作。

    就如我上面所提到的,数码管相当于8个LED灯共阳极接在一起,然后用这4个共阳极接法数码管通过各自通过连接一个PNP型的三极管来进行开通与关断,RL1的4个电阻是为了限流,防止电流过大烧坏数码管,当Q1~Q4也就是P20~P23引脚给低电平时,三极管导通,数码管可以被点亮,也就是这四个数码管的位选端,通过P20~P23来控制哪个数码管来亮。

    而P00~P07是这4个数码管的段选端并联起来,来进行控制的。

    我们来先来实现数码管的静态显示,操作如下。

    数码管对每个位选端进行操作显示不同的数字

    操作如下(位选的注释有误,应该依次是第一到第四)

    经过大神的指正,了解了数码管数字显示不清晰有重影是没有消影导致的,在进行动态显示时,IO口从高电平到低电平,有一定的残留的电流在里面,所以要进行消影,即在送入位选数据之前,需要加一句 “P0 = 0xff”即可。

    展开全文
  • 单片机实验----控制单只数码管静态显示 知识点: 数码管的原理 学习段选、位选和断码、位码的含义 单片机控制数码管显示的方法 静态显示 运行效果: 如图 代码如下: ORG 0000H LJMP MAIN ORG 30H ;.........

    单片机实验----控制单只数码管静态显示


    知识点:

    1. 数码管的原理
    2. 学习段选、位选和断码、位码的含义
    3. 单片机控制数码管显示的方法
    4. 静态显示

    运行效果: 如图
    效果

    代码如下:

    		ORG 0000H
    		LJMP MAIN
    		ORG 30H
    ;..................................................
    ;						主程序
    ;..................................................
    ;........段选数据.........
    MAIN:  	MOV 	P0,#10110000B			;将显示‘3’的段选数据传入P0口
    		CLR	  	P1.0					;选中u2段选芯片
    		CLR   	P1.2					;时序引脚CLK为低电平,为接受数据准备
    		SETB  	P1.2					;时序为上跳沿,即将数据传给u2
    		SETB  	P1.0					;关闭u2,使u2不能再接收其他数据
    ;........位选数据.........
    		MOV   	P0,#11111110B			;将位选数据传入P0口,选择第一个数码管显示
    		CLR   	P1.1					;选中u3位选芯片
    		CLR   	P1.2					;时序引脚CLK为低电平,为接受数据准备
    		SETB  	P1.2					;时序为上跳沿,即将数据传给u3
    		SETB  	P1.1					;关闭u3,使u3不能再接收其他数据
    		LJMP  	MAIN
    		END
    
    

    电路图:
    多只数码管电路图

    数码管显示数字3原理:
    由图可以看出显示数字3,需要a,b,c,d,g段发光二极管发光。
    对应的,即P0.0,P0.1,P0.2,P0.3,P0.6要为低电平(二极管发光),其余为高电平(二极管熄灭)。
    所以P0口的数据为10110000B

    看完图,问题基于来了,u2,u3是什么呢?
    在单片机控制但只数码管的电路图中,u2,u3是两个D触发器,在这里它们的作用是将单片机传来的数据信号按照要求传送锁存

    那么问题又来了,什么是D触发器呢?什么是传送锁存呢?

    触发器是一个具有记忆功能的,具有两个稳定状态的信息存储器件,是构成多种时序电路的最基本逻辑单元,也是数字逻辑电路中一种重要的单元电路。
    在数字系统和计算机中有着广泛的应用。触发器具有两个稳定状态,即"0"和"1",在一定的外界信号作用下,可以从一个稳定状态翻转到另一个稳定状态。
    触发器有集成触发器和门电路组成的触发器。触发方式有电平触发和边沿触发两种。
    D触发器在时钟脉冲CP的前沿(正跳变0→1)发生翻转,触发器的次态取决于CP的脉冲上升沿到来之前D端的状态,即次态=D。因此,它具有置0、置1两种功能。由于在
    CP=1期间电路具有维持阻塞作用,所以在CP=1期间,D端的数据状态变化,不会影响触发器的输出状态。
    D触发器应用很广,可用做数字信号的寄存,移位寄存,分频和波形发生器等。更多信息

    在本例中,
    u2是段选触发器,实现控制数码管每段的现实;
    u3是位选触发器,他控制数码管公共引脚与电源正极的连接状态,从而选哪只数码工作(有多只数码管的时候)。

    单片机的P0口同时连接了u2,u3的输入口D0-D7,担负着数据传输的任务。
    P1.0和P1.1分别连接u2,u3的控制Ē,这两个脚分别取名CS1和CS2,他们的作用是选择u2,u3的工作状态。
    P1.2同时连接了u2和u3的时钟引脚CLK,为触发器提供所需的触发脉冲(时序脉冲)。

    单片机不与数码管直接连接,而是中间再连接上触发器,来间接控制数码管。

    那么触发器是如何控制数码管的呢?

    由上面的分析,我们知道,触发器的信号有两个,分别是Ē和CKL,只有当Ē=0和CKL上升沿到来时,触发器才工作,其他情况都不工作。

    可以将触发器比作成一座“桥”,连接着单片机和数码管,数据从“桥”上过,在“桥”连接单片机的那头有一个“管理员”,他就是Ē,管理员Ē的工作是接收数据,并判是否让断数据通过“桥”。

    在电路图中有两个触发器,那么意味着有两座桥。
    u2为“段选桥”,它与数码管的个笔画段连接,通过它的数据称为段码,控制着数码管的显示。
    u3为“位选桥”,它与数码管的公共端相连接,通过它的数据为位码,控制哪知数码管显示。

    最后一个知识点:静态显示

    在标题中,提到静态显示,那么什么是静态显示呢?有动态显示吗?

    动态显示是有的。
    数码管正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示所需要的数字或者字符。
    数码管的驱动方式有来两种:静态显示驱动和动态显示驱动。

    这里我们来介绍一下静态显示驱动:

    1. 所谓静态显示驱动,就是每个数码管的每一段码都单独占用单片机的一个I/O口,用于笔画段的编码形成。
    2. 要显示新的数据室,在通过I/O口传入新的段码。
    3. 优点:程序简单,显示度高。
    4. 缺点:数码管数量过多的时候,不适用,应为单片机没有那么多I/O口(总共32个)。

    上面是控制多只数码管,下面在附上一个控制单只数码管的电路图和源码:

    单只数码管电路图

    代码如下:

    		ORG 	0000H
    		LJMP 	MAIN
    		ORG 	30H
    MAIN:  	CLR  	P1.0
    		MOV 	P0,#10110000B			;将显示‘3’的段选数据传入P0口
    		LJMP  	MAIN
    		END
    
    

    时间:2018年10月9日19:42:13


    -END-

    展开全文
  • 数码管静态显示

    数码管静态显示

    #include<reg52.h>
    unsigned char code LEDcode[] = {   //LED灯的字模,~代表取反,共阳极和共阴极区别
        ~0x3F,~0x06,~0x5B,~0x4F,
        ~0x66,~0x6D,~0x7D,~0x07,
        ~0x7F,~0x6F,~0x77,~0x7C,
        ~0x39,~0x5E,~0x79,~0x71};
    void delayms(xms);
    void main()
    {
        unsigned int i=0;
        while(1)
        {
            P0=LEDcode[i%16];   //取余处理循环
            i++;
            delayms(250);
        }
    }
    void delayms(xms)
    {
         unsigned int i,j;
         for(i=xms;i>0;i--)
            for(j=110;j>0;j--);
    }

    不同的数码管因为共阳极和共阴极的不同而不同,还有P0,P2的顺序也不同,使用时应注意
    数码管静态显示

    展开全文
  • 51单片机 数码管静态显示和动态显示 附有代码示例
  • 学习数码管静态与动态显示,首先要清楚,同一个时刻,单片机只能使能一个数码管。 动态显示:轮流点亮数码管,利用人眼的视觉暂留现象,造成多个数码管被点亮的视觉体验。 静态显示:可理解为非动态显示,即不会...
  • 单片机c代码数码管静态显示任意数字,好东西啦
  • 不管将几位数码管连在一起,数码管显示原理都是一样的,都是靠点亮内部的发光二极管来发光,下面就来我们讲解一个数码管是如何亮起来的。数码管内部电路如下图所示,从右图可看出,一位数码管的引脚是10个,显示...
  • 数码管基础知识 ...F3461BH是一个4位8段的数码管,其中a、b、c、d、e、f、g、dp引脚分别对应8个段码,该8个引脚通过74HC573锁存器与单片机的P0端口相连。另外有com1~com4四个公共控制脚,该应用为高电平则使...
  • 51单片机静态数码管显示程序,可移植性强
  • 单片机数码管测试程序,显示0-99秒,7段数码管的
  • 单片机一个简单的数码管动态显示汇编程序,利于初学者了解单片机数码管动态显示
  • 用一个共阳极数码管循环显示数值“0~F”,显示变换时间为1s,由P1口输出要显示的数值 2、硬件设计 使用proteus Isis仿真,选择元器件,AT89C51、7SEG-COM-AN-GRN、RESPACK8 3、软件设计 源程序: #include &...
  • 数码管作为最廉价的输出设备,在各种自动化设备中有很大的应用,最简单普通的显示方式为动态刷新显示,称为假动态显示,即通过分时扫描每一位,利于人眼的视觉停留现象,造成一种静态显示的效果,如下图所示: ...
  • C51单片机学习笔记(五)——数码管静态显示和动态显示 文章目录C51单片机学习笔记(五)——数码管静态显示和动态显示1.数码管显示原理 1.数码管显示原理 数码管有一位和多位一体两类,它是由8个LED(a,b,c,d,...
  • 单片机开发板上,通过单片机控制数码管动态显示5201314,并闪烁显示
  • C51单片机学习
  • 声明:【51单片机学习过程记录】全是我自己学习、实践所记录的过程,我只是菜鸟,所有论点和观点仅代表我个人,不能确定是这个技术的真理。我的目的是学习和有可能成为可以向别人分享的经验,因此有错误我会虚心接受...
  • 51单片机_定时器查询方法_数码管静态显示
1 2 3 4 5 ... 20
收藏数 1,110
精华内容 444