单片机动态数码馆_单片机数码管动态数码管显示不同数字 - CSDN
  • 本文旨在介绍单片机入门的基础知识,为初接触或即将接触单片的新手提供一个入门指导。本文章会陆续推出,隔几天一个章节。所使用单片机为ATMEL公司的AT89C52,软件为PROTEUS和KEIL;...单片机轻松入门之五数码管的动态

    本文旨在介绍单片机入门的基础知识,为初接触或即将接触单片的新手提供一个入门指导。本文章会陆续推出,隔几天一个章节。所使用单片机为ATMEL公司的AT89C52,软件为PROTEUS和KEIL;只提供原理图和KEIL环境下的注释,希望对广大即将接触单片机的人有所帮助,如果有错误欢迎回帖指出或加入QQ143586739. 微信公众号:micropoint8.

    单片机轻松入门之五数码管的动态显示

    上次说了数码管的静态显示,这次介绍动态显示。动态显示是每隔一段很小的时间依次点亮一个数码管,再利用人视觉的暂留效应,从而看起来数码管显示是连续的。相对而言,动态显示的电路、程序稍微复杂,但是可以节约单片机的接口资源。动态显示涉及位选和段选。位选就是选通显示的数码管,段选就是控制该片数码管所要显示的内容。

    本次实验让4片数码管显示“1234”,实验中用到了74LS373锁存器。

    实验原理图如下:


    实验程序如下:

    #include<reg52.h>
    #define uchar unsigned char;
    #define uint unsigned int;
    sbit du=P2^0; //位定义段选端
    sbit we=P2^1; //位定义位选端


    uchar code tabledu[]={0x3f,0x06,0x5b,0x4f,
    0x66,0x6d,0x7d,0x07,
    0x7f,0x6f,0x77,0x7c,
    0x39,0x5e,0x79,0x71}; //段选数据表

    uchar code tablewe[]={0xfe,0xfd,0xfb,0xf7}; //位选数据表

    uchar i,j,z;
    uint numd,numw;

    void delay(z)   //延时子函数
    {

       for(j=z;j>0;j--)
          for(i=110;i>0;i--);
    }
    void display() //显示子程序
    {
         P0=tabledu[numd]; //控制段显示
        delay(10);
        du=1; //打开段选信号
        du=0; //锁存信号
        P0=tablewe[numw]; //控制位选
        delay(10);
        we=1; //打开位选信号
        we=0; //锁存信号
        numd++; //段选自加
        if(numd==5)
        numd=1;
        numw++; //位选自加
        if(numw==4)
        numw=0;
    }

    void main()
    {
          numd=1;
       numw=0;
       while(1)
       {
        
        display(); //调用显示子程序
        delay(30);

       }

    }

    试验结果图:

    仿真软件在截图时,老显示不全,所以图片上无法看出连续显示。但是在实验板上效果很好。


    更多电子知识请关注微信公众号:


    展开全文
  • 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
    

     

    展开全文
  • 本资源提供了单片机动态数码管显示的程序和相应的proteus仿真图,可供大家学习参考。
  • 51单片机动态数码管显示

    万次阅读 2019-05-17 19:34:33
    首先来看一下开发板上的电路原理图: 本开发板上使用的是,通过P22、P23、P24控制3-8译码器来对数码管进行位选,通过P0口经过573的驱动控制数码管的段选,通过P13控制573的使能端,为低电平时573才会有输出。...

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

     

    本开发板上使用的是,通过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段.接下来再检测各段引脚,仍使用数字万用表二极管档,将黑表笔固定接在⑨脚,用红表笔依次接触②、③、④、⑤、⑥、⑦、⑧、⑩引脚时,数码管的其他段先后分别发光,据此便可绘出该数码管的内部结构和引脚排列图。

               

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

    展开全文
  • 二、请设计一个单片机5位动态扫描数码显示,要求P2端口输出数码管段代码,P3口控制数码管的公共端,实现位点亮控制。5位显示内容为“89C51” 。 1、 正确连接电路(10分) 2 只能显示部分内容(10分) 3 能完整...

    二、请设计一个单片机5位动态扫描数码显示,要求P2端口输出数码管段代码,P3口控制数码管的公共端,实现位点亮控制。5位显示内容为“89C51” 。

    1、 正确连接电路(10分)

    2 只能显示部分内容(10分)

    3 能完整稳定显示所有内容(20分)。

    4 正确完整的程序代码(10分)

    #include"reg52.h"
    
    
    main()
    {
    	while(1)
    	{
    		P3=0xff,P2=0xda,P3=0Xfe;
    		P3=0xff,P2=0xb6,P3=0Xfd;
    		P3=0xff,P2=0x9c,P3=0Xfb;
    		P3=0xff,P2=0xf6,P3=0Xf7;	
    		P3=0xff,P2=0xfe,P3=0Xef;
    		
    	}
    }
    展开全文
  • 这是一个简单的动态显示共阳极数码管的汇编程序,74HC573完成段选,位选由单片机I/O端口完成。 Proteus电路图 只要看该部分电路连线即可,完整JD51单片机电路图见后方资料。 汇编程序 ORG 00H START: SETB P2.5;...
  • 基于51单片机数码时钟

    千次阅读 2019-02-20 10:38:46
    我是使用独立键盘控制,7位数码管显示来完成的数字时钟的显示部分,用蜂鸣器部分来完成声音的控制。 首先我是使用中断来完成该项目的时间调控和时间进位,并且在中断之中加入了声音调控的功能,与此同时,程序还一直...
  • 前言 大一开始学C语言,上了...首先来说一下段码吧, 单片机的一个数码管上有八个LED灯,分别为七条线和一个点。这八个LED灯分别由abcdefg和dp代替 如图 我们先把a b c d e f g dp写在草稿纸上,不过我们得倒着写也...
  • AT89S51单片机 P0端口接动态数码管的字形码笔段,P2端口接动态数码管的数位选择端,P1.7接一个开关,当开关接高电平时,显示“12345”字样;当开关接低电平时,显示“HELLO”字样。
  • 包含工程代码、PDF电路图和AD原理图、使用芯片、模块的参考手册和资料,下载软件,系统实现的功能,毕业设计,自娱自乐的首选资料
  • 51单片机数码管的静态与动态显示

    万次阅读 多人点赞 2018-12-23 19:25:23
    操作数码管的显示其实与操作led灯的操作本质上差不多,可以把一个数码管当做操作8段led灯来让它显示我们所预想的效果,如下图所...数码管的显示分为静态显示和动态显示 数码管的静态显示其实就是一直给数码管的特定...
  • 单片机数码管段码

    2012-07-07 22:02:40
    单片机LED共阳极段码表【0-F】 DB 0c0H,0f9H,0a4H,0b0H,99H,92H,82H,0f8H [0-7] DB 80H,90H,88H,83H,0c6H,0a1H,86H,8eH [8-F] 单片机LED共阴极段码表【0-F】 DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H [0...
  • 本程序为数码管动态扫描显示: ...可传入任意三位及以下位数的正整数让数码管显示对应的数字,如传入256,则数码管显示256,需要注意的是对于不同的单片机数码管段和位的引脚可能不同,因此可能要修改所控制的引脚。
  • 动态数码显示技术用protues仿真,用keil编程,已经验证过了,可以,51单片机的设计仿真等
  • 数码之家-小七之单片机学习,用非常容易理解的语言讲课初级入门超好资料
  • ag段数码管用来显示数字,h显示小数点。为了便于封装,数码管的外部一共10个引脚,5和10连在一起接公共端,其余各对应一个发光二极管: 例如,如果我们想显示数字“0”,那么就需要a~f这六个数码管亮;如果显示数字...
  • 单片机教程第一课:单片机概述 2 单片机教程第二课:单片机的内部、外部结构(一) 2 单片机教程第三课:几个基本概念 4 单片机教程第四课:第一个小程序 8 单片机教程第五课:延时程序分析 10 单片机教程第六课:...
  • #include<reg52.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int sbit P2_6=P2^6; //数码管位选74HC573锁存端 sbit P2_7=P2^7; ...
  • 51单片机:数码管的动态显示 51单片机,用三个7段共阴极数码管动态显示0~99,每隔0.5s刷新一次数字。用keil与Proteus联合仿真 硬件设计 以AT89C51单片机为核心,包括74HC573锁存器,三个7段共阴极数码管。 1.74HC573...
  • 51单片机开发系列三 数码管动态扫描显示 象棋小子 1048272975 数码管由于发光亮度强,指示效果好,非常适合于电梯楼层等数值显示应用中。对于一位数码管,可以采用静态显示,但实际应用中都是需要显示多位数值,...
1 2 3 4 5 ... 20
收藏数 2,853
精华内容 1,141
关键字:

单片机动态数码馆