51单片机学习之陆 —— 1.5 数码管的动态显示

发布者:Xinmei最新更新时间:2016-12-28 来源: eefocus关键字:51单片机  数码管  动态显示 手机看文章 扫描二维码
随时随地手机看文章

1  学习回顾,上节课学习了静态显示

   我们显示了第一位数码管,并让其显示了8

   现在我们试着多一些花样

  1 点亮所有数码管让其显示6

    编程 

    代码

    

    注意上面已经写好了函数leddata

    P0 = ox00;让所有数码管都打开

    P0 = leddata[3];让数码管显示三

    这时就达成了我们的目的了

  2  让数码管从0到9循环显示间隔500毫秒

    编程

    代码:

    

#include  // 52系列单片机头文件

 2 #define uint unsigned int 

 3 #define uchar unsigned char 

 4 sbit du = P2^6;   //声明U1锁存器的锁存端

 5 sbit we = P2^7;   //声明U2锁存器的锁存端

 6 uchar i;

 7 

 8 unsigned code leddata[]={ 

 9  

10                 0x3F,  //"0"

11                 0x06,  //"1"

12                 0x5B,  //"2"

13                 0x4F,  //"3"

14                 0x66,  //"4"

15                 0x6D,  //"5"

16                 0x7D,  //"6"

17                 0x07,  //"7"

18                 0x7F,  //"8"

19                 0x6F,  //"9"

20                 0x77,  //"A"

21                 0x7C,  //"B"

22                 0x39,  //"C"

23                 0x5E,  //"D"

24                 0x79,  //"E"

25                 0x71,  //"F"

26                 0x76,  //"H"

27                 0x38,  //"L"

28                 0x37,  //"n"

29                 0x3E,  //"u"

30                 0x73,  //"P"

31                 0x5C,  //"o"

32                 0x40,  //"-"

33                 0x00,  //熄灭

34                 0x00  //自定义

35  

36                          };

37                         

38 void delay(uint xms)

39 {

40     uint  x, y;

41     for(x=xms; x>0; x--)

42         for(y=114; y>0; y--);

43 }

44 

45 void main()

46 {

47     while(1)

48     {

49     

50         we = 1;   //打开U2锁存器

51         P0 = 0x00; //送入位选信号

52         we = 0;    //关闭U2锁存器 其数据已被锁存

53         

54         

55         du = 1;            //打开U1锁存器

56         P0 = leddata[i];        //送入端选信号

57         du = 0;            //关闭U1锁存器

58         

59         delay(500);

60         i++;

61         if(i == 10)

62             i=0;

63 

64         

65     }    

66 }

 

 

    

    

    头文件和宏定义

    

    延时函数, 当y=114时,在11.0592mhz时差不多1ms

    要延时500ms 就让x = 500即可

  while 大循环

  段选中

  P0 = leddata[i];

  其中i是定义的变量,没赋初值时自动赋初值0

  延时500ms 后i++

  由于是0 - 9 

  所以用if 判断i==10

  假如加到10就清零。

  这样就实现了我们的目标

 

 

2   数码管的动态显示

  原理 :

  

  数码管动态显示的实质就是利用了人眼视觉的暂留和二极管的余晖作用

  由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。

  2 编程 目标-第一个数码管显示1 时间500ms 熄灭 第二个显示2 时间500ms

        到第六个显示6 一直循环下去 

   

#include
  2 #define uint unsigned int 
  3 #define uchar unsigned char
  4 sbit du = P2^6;
  5 sbit we = P2^7;
  6 unsigned code leddata[]={ 
  7  
  8                 0x3F,  //"0"
  9                 0x06,  //"1"
 10                 0x5B,  //"2"
 11                 0x4F,  //"3"
 12                 0x66,  //"4"
 13                 0x6D,  //"5"
 14                 0x7D,  //"6"
 15                 0x07,  //"7"
 16                 0x7F,  //"8"
 17                 0x6F,  //"9"
 18                 0x77,  //"A"
 19                 0x7C,  //"B"
 20                 0x39,  //"C"
 21                 0x5E,  //"D"
 22                 0x79,  //"E"
 23                 0x71,  //"F"
 24                 0x76,  //"H"
 25                 0x38,  //"L"
 26                 0x37,  //"n"
 27                 0x3E,  //"u"
 28                 0x73,  //"P"
 29                 0x5C,  //"o"
 30                 0x40,  //"-"
 31                 0x00,  //熄灭
 32                 0x00  //自定义
 33  
 34                          };
 35 
 36 
 37 void delay(uint xms)
 38 {
 39     uint x, y;
 40     for(x=xms;x>0;x--)
 41         for(y=114;y>0;y--);
 42 }                         
 43 
 44 void main()
 45 {
 46     while(1)
 47  {
 48     du = 1;
 49     P0 = leddata[1];
 50     du = 0;
 51     P0 = 0xff;
 52     we = 1;
 53     P0 = 0xfe;
 54     we = 0;
 55     delay(500);
 56     
 57     du = 1;
 58     P0 = leddata[2];
 59     du = 0;
 60     P0 = 0xff;
 61     we = 1;
 62     P0 = 0xfd;
 63     we = 0;
 64     delay(500);
 65     
 66     du = 1;
 67     P0 = leddata[3];
 68     du = 0;
 69     P0 = 0xff;
 70     we = 1;
 71     P0 = 0xfb;
 72     we = 0;
 73     delay(500);
 74     
 75     du = 1;
 76     P0 = leddata[4];
 77     du = 0;
 78     P0 = 0xff;
 79     we = 1;
 80     P0 = 0xf7;
 81     we = 0;
 82     delay(500);
 83     
 84     du = 1;
 85     P0 = leddata[5];
 86     du = 0;
 87     P0 = 0xff;
 88     we = 1;
 89     P0 = 0xef;
 90     we = 0;
 91     delay(500);
 92     
 93     du = 1;
 94     P0 = leddata[6];
 95     du = 0;
 96     P0 = 0xff;
 97     we = 1;
 98     P0 = 0xdf;
 99     we = 0;
100     delay(500);
101     
102  }
103     
104 
105     
106     
107 }

 

 3 分析

  

   段选中让显示1 

   打开位选让第一个数码管经行显示

   注意 在段选对P0 口经行操作后

   P0  = 0xff;

  这条语句的专业名称叫做消影

      

  同学们也可试一试不加这条语句看看(偷笑,我第一次时就没加这条语句)

  然后延时500ms

  通过以上的代码就可以实现数码管的动态显示

  

  4 补充

   当我们延时500ms时还可以明显看出数码管的交换显示

   假如我们将延时的时间调到10ms

   同学们试试

   再将时间调到1ms

   这时我们发现数码管“好像”在静态显示123456

   

 

 

  

 

以上为我的个人理解


关键字:51单片机  数码管  动态显示 引用地址:51单片机学习之陆 —— 1.5 数码管的动态显示

上一篇:51单片机学习之路 —— 1.6 单片机的中断(1)
下一篇:51单片机学习之陆 —— 1.4 数码管的显示

推荐阅读最新更新时间:2024-03-16 15:27

基于单片机的数码管动态显示器的设计方案
  1.前言   数码管静态显示系统需要占用过多的单片机口线,但是可以保证正常的亮度。为了解决占用口线较多而浪费硬件资源等问题,研究人员开发了一系列诸如74HC595的数码管驱动芯片,该类芯片可以实现串行转并行的工作方式,驱动数码管实现静态和动态显示。但是,这样一种工作方式暴露出控制系统实时性不足等问题,在某些对系统响应时间要求比较高的场合的应用产生了一定的限制。为了解决上述几个弊端,本文提出了一种基于单片机的数码管动态显示器的设计方案,以IAP15F2K61S2系列单片机做控制核心,并采用全新的软硬件电路实现数码管的动态显示。   2.控制系统硬件设计   2.1 显示器外观设计   本显示器采用六个共阳极的数码管,按照
[电源管理]
基于单片机的<font color='red'>数码管</font><font color='red'>动态显示</font>器的设计方案
基于51单片机的流水灯实验
K1键流水灯交替闪烁。 K2键流水灯从两边向中间移动闪烁。 K3键流水灯全部闪烁。 K4键流水灯从LED7到LED0流水闪烁。 单片机源程序如下: #include reg51.h sbit S5=P1^4; sbit S6=P1^5; sbit S7=P1^6; sbit S8=P1^7; unsigned char keyval; void key_scan(void); void forward(void); void backward(void); void Alter(void); void blink(void); void led_delay(void); void delay10ms(void);
[单片机]
基于<font color='red'>51单片机</font>的流水灯实验
三线制Microware同步串行EEPROM在MCS-51单片机
1三线制Microware串行总线   三线制Microware同步串行总线接口是松下半导体公司在其生产的COP系列和HPC系列微控制器上采用的一种串行总线。它使用的三根信号线是数据输入线SI、数据输出线SO和时钟信号线SK。由于三线制Microware总线只需3~4根数据线和控制线即可扩展具有三线制Microware总线的各种I/O器件,而并行总线扩展方法要8根数据线、8~16根地址线和2~3位控制线,因而使用三线制Microware串行总线可以简化电路设计,提高设计的可靠性。 2具有三线制Microware总线的EEPROM   EEPROM是一种可用电气方法在线擦除和再编程的只读存储器,它既有RAM在联机操作中可读可改写的特性
[单片机]
三线制Microware同步串行EEPROM在MCS-<font color='red'>51单片机</font>
单片机控制无刷电机初步调试成果和学习经历
调了一天多的无刷电机,用的无刷电调,其实本来应该是用32做的,但是不知道原理, 于是用了比较熟悉的51单片剂一下来进行调试 一下,查询的资料,还是蛮简单的,但是实际操作并没有那么容易, 在网上查也没有能用的程序,尤其是51,因为基本用无刷的都是无人机 四六轴。所以今天贴上我的程序,分享给大家,希望能对各位减少时间学习,快速上手,本程序实现的功能是在第一次给无刷电机上电后,首先拉高油门,然后降低油门,最后满开油门,注意,,,,注意,,,,注意,一定不要用带螺旋桨的无刷电机来实验,危险,开机后会全速运行,我开全速是为了用涵道,所以全速,, 废话不多说,贴程序 51单片机源程序如下: /**********************
[单片机]
单片机控制无刷电机初步调试成果和学习经历
51单片机与上位机串口通信程序设计
51  单片机  与上位机串口通信程序设计  1. 发送:向总线上发命令  2. 接收:从总线接收命令,并分析是地址还是数据。  3. 定时发送:从内存中取数并向主机发送.  经过调试,以上功能基本实现,目前可以通过上位机对 单片机 进行实时控制。  程序如下:  //这是一个 单片机 C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收     //和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的   #include  reg51.h   #include  stdio.h   #include  string.h   #define INBUF_LEN 4 //数据长度  unsigned ch
[单片机]
8051单片机数据说明
深入理解并应用C51对标准ANSIC的扩展是学习C51的关键之一。因为大多数扩展功能都是直接针对8051系列CPU硬件的。 具体说明如下(8031为缺省CPU)。 一、Keil C51扩展关键字 C51 V4.0版本有以下扩展关键字(共19个): _at_idata sfr16 alien interrupt small bdata large _task_ Code bit pdata using reentrant xdata compact sbit data sfr 二、内存区域(Memory Areas): 1、 Pragram Area: 由Code说明可有多达64kBytes的程序
[单片机]
基于51单片机的智能小车系统设计
原理图: 程序运行图: 部分程序: /******************************************************************************* * 文件名称:main.c * 说明:本文件为小车控制的主函数 * 功能:1.看门狗定时器初始化 2.调用函数,进行小车直流电机的开环控制 *******************************************************************************/ #include AT89X52.h #include kongzhi.h /********************
[单片机]
浅谈C8051单片机在变风量空调控制系统中的应用
1、前言:   变风量(Variable Air Volume, 简称VAV)空调系统是通过变风量箱去调节送入房间的风量和新回风混合比,并相应调节空调机组的风量或新回风混合比来控制某一空调区域温度的一种空调系统。变风量空调系统可以根据空调载荷的变化及室内要求参数的改变,自动调节空调送风量(达到最小送风量时调节送风温度),以满足室内人员的舒适要求或者其它的工艺要求。同时根据实际送风量自动调节送风机的转速,最大限度的减少风机动力、节约能量。与定风量空调系统相比,变风量空调系统具有节能性、舒适性、环保性、灵活性等优点。 2、硬件电路设计   2.1、风阀与水阀执行电路的设计   本控制器将温度、湿度、CO2传感器检测到的模拟信号
[单片机]
浅谈C80<font color='red'>51单片机</font>在变风量空调控制系统中的应用
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved